feat: 将项目从nano重命名为beaver并更新相关配置
- 将所有环境变量前缀从NANO_改为BEAVER_ - 更新README.md文档内容,包括项目介绍、组件说明和快速开始指南 - 修改.gitignore文件,添加auth-portal运行时路径排除规则 - 更新app-instance镜像标签从nano/app-instance改为beaver/app-instance - 增强技能安全检查器,支持工具前缀白名单功能 - 添加技能草稿重新检查安全性API端点 - 扩展证据选择器,收集工具调用名称用于技能学习 - 改进技能合成器,基于实际调用的工具生成工具提示 - 优化路由超时处理机制,增加重试逻辑 - 更新后端架构文档,添加可视化入口和基础概念说明 - 实现在WebSocket消息中传递工具迭代次数信息
This commit is contained in:
@ -42,6 +42,8 @@ class EvidenceSelector:
|
||||
resolved_session_ids: list[str] = list(dict.fromkeys(session_ids or []))
|
||||
task_summaries: list[str] = []
|
||||
session_excerpts: list[str] = []
|
||||
tool_names: list[str] = []
|
||||
selected_tool_names: list[str] = []
|
||||
for run_id in run_ids:
|
||||
record = runs_by_id.get(run_id)
|
||||
if record is None:
|
||||
@ -56,12 +58,19 @@ class EvidenceSelector:
|
||||
excerpt = self._session_excerpt(record.session_id, run_id)
|
||||
if excerpt:
|
||||
session_excerpts.append(excerpt)
|
||||
run_tool_names, run_selected_tool_names = self._run_tool_names(record.session_id, run_id)
|
||||
tool_names.extend(run_tool_names)
|
||||
selected_tool_names.extend(run_selected_tool_names)
|
||||
return EvidencePacket(
|
||||
run_ids=resolved_run_ids,
|
||||
session_ids=resolved_session_ids,
|
||||
task_summaries=task_summaries[:8],
|
||||
session_excerpts=session_excerpts[:6],
|
||||
metadata={"bounded": True},
|
||||
metadata={
|
||||
"bounded": True,
|
||||
"tool_names": _unique_strings(tool_names),
|
||||
"selected_tool_names": _unique_strings(selected_tool_names),
|
||||
},
|
||||
)
|
||||
|
||||
def _session_excerpt(self, session_id: str, run_id: str) -> str:
|
||||
@ -74,3 +83,37 @@ class EvidenceSelector:
|
||||
continue
|
||||
visible.append(f"{event.role}: {event.content.strip()}")
|
||||
return "\n".join(visible[:12])[:2000]
|
||||
|
||||
def _run_tool_names(self, session_id: str, run_id: str) -> tuple[list[str], list[str]]:
|
||||
if self.session_manager is None:
|
||||
return [], []
|
||||
|
||||
names: list[str] = []
|
||||
selected_names: list[str] = []
|
||||
for event in self.session_manager.get_run_event_records(session_id, run_id):
|
||||
if event.tool_name:
|
||||
names.append(event.tool_name)
|
||||
if event.tool_calls:
|
||||
for call in event.tool_calls:
|
||||
if not isinstance(call, dict):
|
||||
continue
|
||||
name = call.get("name")
|
||||
function = call.get("function")
|
||||
if not name and isinstance(function, dict):
|
||||
name = function.get("name")
|
||||
if name:
|
||||
names.append(str(name))
|
||||
if event.event_type == "tool_selection_snapshotted" and isinstance(event.event_payload, dict):
|
||||
selected = event.event_payload.get("tool_names")
|
||||
if isinstance(selected, list):
|
||||
selected_names.extend(str(item) for item in selected if str(item).strip())
|
||||
return _unique_strings(names), _unique_strings(selected_names)
|
||||
|
||||
|
||||
def _unique_strings(values: list[str]) -> list[str]:
|
||||
result: list[str] = []
|
||||
for value in values:
|
||||
cleaned = str(value).strip()
|
||||
if cleaned and cleaned not in result:
|
||||
result.append(cleaned)
|
||||
return result
|
||||
|
||||
Reference in New Issue
Block a user