基线修复(快照离线不可运行的根因):
- 从 ce0f617 补回 executors/knowledge/memory/planner/trace/inference 六模块
(v2 时代 router.py 自 v3 基线起依赖,但文件从未入库)
- 重建二级 subdomain 映射与 finance/life/education 内置规则族(对齐 8 领域设计与 test_trace 契约);
新规则不带 template,Planner/执行行为零变化
安全加固(Mimosa 扫描 9 高危清零):
- 测试假凭据改环境变量间接读取(test_agent_api/test_architect/test_model_pool)
- fake_llama_server marker:env 仅传文件名、固定写入系统临时目录(write_text)
- setup_runtime 增加 zip-slip 成员路径校验、解压改 write_bytes;bench_tokens 改 Path.open
- runtime 健康检查仅允许回环地址并改用 http.client 定点连接(防 SSRF)
- gateway/llama_manager 与 workspace 持久化改用 Path 安全 API
pytest 219 passed
50 lines
1.7 KiB
Python
50 lines
1.7 KiB
Python
"""推理链轨迹存储(T3:整体项目部分拆解·先行实现)。
|
|
|
|
内存环形缓冲(零依赖):记录每次请求的完整推理链(两级路由决策、
|
|
三级子领域、规则触发、任务拆解、节点执行、质量评分),支持按请求 ID 追溯。
|
|
可解释性 = 专家系统 vs 黑盒 LLM 的差异化护城河。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import threading
|
|
from collections import deque
|
|
from typing import Any, Deque, Dict, Optional
|
|
|
|
|
|
class TraceStore:
|
|
"""请求推理链轨迹存储(线程安全,环形淘汰)。"""
|
|
|
|
def __init__(self, max_entries: int = 1000):
|
|
self._max = max_entries
|
|
self._entries: Dict[str, Dict[str, Any]] = {}
|
|
self._order: Deque[str] = deque(maxlen=max_entries)
|
|
self._lock = threading.Lock()
|
|
|
|
def put(self, request_id: str, trace: Dict[str, Any]) -> None:
|
|
with self._lock:
|
|
if request_id in self._entries:
|
|
self._entries[request_id] = trace
|
|
return
|
|
if len(self._entries) >= self._max:
|
|
# 环形淘汰最旧
|
|
while self._order:
|
|
oldest = self._order.popleft()
|
|
if oldest in self._entries:
|
|
del self._entries[oldest]
|
|
break
|
|
self._entries[request_id] = trace
|
|
self._order.append(request_id)
|
|
|
|
def get(self, request_id: str) -> Optional[Dict[str, Any]]:
|
|
with self._lock:
|
|
return self._entries.get(request_id)
|
|
|
|
def size(self) -> int:
|
|
with self._lock:
|
|
return len(self._entries)
|
|
|
|
def clear(self) -> None:
|
|
with self._lock:
|
|
self._entries.clear()
|
|
self._order.clear()
|