fix(tier2): 服务态从 Toolkit.tool_groups 抠九工具(修 chat run 起手即崩)

B1 控制面真驱 :8200 暴露:每个 chat run 起手即抛 RuntimeError「无法从 Toolkit 抠出
FunctionTool 列表」→ 服务态生成零产出(M3 没写任何文件、SSE 只有心跳、4 次 attempt 全 null
verdict)。P4 只验了服务能启 + BackendStore 往返,从没真跑过一回合 chat,故此 bug 一直潜伏。

根因:_extract_function_tools 按 tools/_tools/function_tools 扁平探测,但 2.0.2 Toolkit 把工具按组
存 self.tool_groups(构造传入的 tools 被包进 "basic" 组,group.tools 是 list[ToolBase];源码
tool/_toolkit.py:127-135 + :515)。修:先从所有 tool_groups 收 .tools(得九个 FunctionTool),
旧扁平探测降为兜底。

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
zizi 2026-06-24 08:39:19 +00:00
parent 9945e2aa9a
commit 01a3229a9e

View File

@ -113,7 +113,20 @@ def _extract_function_tools(toolkit: Any) -> list:
2.0.2 Toolkit 内部把工具存在 `tools`(dict[str, ToolBase])或等价结构;不同小版本字段名可能微调,
故按几个候选名探测,全失败则诚实抛(让启动期就暴露,而非运行期静默少工具)。
"""
# Toolkit 把注册的工具放在内部映射里(2.0.2:Toolkit.tools 为 dict[name->ToolBase])。按候选探测,容错。
# 2.0.2 Toolkit 把注册的工具按【组】存在 self.tool_groups:每个 ToolGroup 的 .tools 是 list[ToolBase];
# build_toolkit 传给 Toolkit(tools=...) 的九工具被 __init__ 包进默认 "basic" 组(源码核验
# tool/_toolkit.py:127-135 建 basic 组 tools=tools or []、:515 for tool in group.tools)。
# 故从所有组收 .tools 即得九个 FunctionTool 实例(MCP 客户端在 group.mcps、不走这里——服务态 MCP 另议)。
# 2026-06-24 实证修复:此前按 tools/_tools/function_tools 扁平探测全空 → 每个 chat run 起手即抛、
# 服务态生成零产出(B1 控制面真驱时暴露;P4 只验了服务能启,从没真跑过一回合 chat)。
groups = getattr(toolkit, "tool_groups", None)
if groups:
extracted: list = []
for group in groups:
extracted.extend(getattr(group, "tools", None) or [])
if extracted:
return extracted
# 兜底:旧扁平探测路径(不同小版本若把工具放扁平映射时仍可用)。
for attr in ("tools", "_tools", "function_tools"):
container = getattr(toolkit, attr, None)
if isinstance(container, dict) and container:
@ -121,7 +134,7 @@ def _extract_function_tools(toolkit: Any) -> list:
if isinstance(container, (list, tuple)) and container:
return list(container)
raise RuntimeError(
"无法从 tier2 Toolkit 抠出 FunctionTool 列表(探测 tools/_tools/function_tools 均空):"
"无法从 tier2 Toolkit 抠出 FunctionTool 列表(tool_groups[*].tools 与 tools/_tools/function_tools 均空):"
"AgentScope 2.0.2 Toolkit 内部结构可能与预期不符,请核对 build_toolkit 产物结构后调整 _extract_function_tools。"
)