P4.7 — 业务 tool 统一分发:两方向完整对比
决策文档。2026-07-08。给用户定 P4.7"统一 tool 分发层建在哪"。基于亲验事实(非设计文档转述)。不是实施计划——定了方向后才写实施计划。
✅ 决策(2026-07-08,用户拍板):方向 A —— 复用现有 gateway 作统一层 + 一层薄 MCP 适配把业务 tool 暴露给 Hermes。理由见下方决策矩阵与推荐段:最简充分、不碰活 gateway、直达 draft-tool 目标;E2 主 draft pipeline 迁移不临近(phase-4.5 明确不迁),AI SDK 统一 tool 层的债短期不触发,留到 E2 真迁主 pipeline 时再建(那时才有真实消费者)。
一句话问题
Specialist 在客户 chat 里现在调不了任何业务 tool(order_lookup 等)。P4.7 要接通。核实发现"统一分发"有两种建法,本文对比。用户方案锚点:"Hermes 基础 tool 不碰,业务 tool 统一管理+分发,再分发给 Hermes agent"——两方向都遵守这个正交分离,区别只在统一层建在哪、复用多少。
亲验事实(两方向共同的地基,不可推翻)
- 业务 tool 执行链已存在且是活的:
ToolGatewayService(policy+approval+manifest 校验)→RuntimeToolExecutor手写 switch dispatcher(executeOrderLookup/executeShopify/executeJumio/… 真实 HTTP+凭证俱全)。共享 agent 经agent/tool_gateway_client.py→POST /v1/runtime/tool-gateway/execute(RunnerTokenGuard)真实调用。不走 AI SDK。 - AI SDK 统一 tool 层零实现:
LlmService(AI SDK v7)签名预留tools?/stopWhen?透传字段,但零业务调用点、没 importtool()、没多步循环。generateObject是 structured output ≠ tool calling。 - Hermes 不认 AI SDK:Hermes 是独立 Python 二进制,tool 机制是 OpenAI-function-calling 兼容 + MCP(stdio/HTTP/SSE 一等公民)。AI SDK 的
execute回调(NestJS TS 进程内)物理上进不了 Hermes 循环。 - Hermes 进程内执行 tool,不吐回 tool_call:
hermes chat单次子进程自己跑完 function-calling 循环。要 让 Hermes 调外部 tool,只能让 tool"住进 Hermes 看得见的地方"——即 MCP server(mcp_servers:里的 server 成-t可选 toolset)。 - 真 bug:
main.py:699现把json.dumps(tools_manifest)(tool 定义数组)传给只接 toolset 名的-t→ 静默失败。gateway 目前任何路径够不到 Hermes。两方向都要修这个。 - 凭证铁律(ADR-036/R6-AC3):credentialRef 绝不进 agent context。执行必须 server-side(gateway 已满足)。
- E2 phase-4.5 边界(已亲验):只迁 expert-consult chatStream 到 LlmService,主 draft pipeline
runAgentPipeline明确列 non-goal——短期仍 Hermes。
关键洞察:无论哪个方向,"分发给 Hermes"这座桥都是 MCP
因为事实 3+4:Hermes 只认 MCP。所以"业务 tool 分发给 Hermes agent"这一段,两方向的出口都是一个 MCP 适配层。差别不在这座桥,而在桥的另一头(统一层)是什么。