工具系统

工具只是一个函数吗?

执行函数只是工具的一部分。完整工具还包括给模型看的 schema、参数与输出验证、并发声明、权限与策略扩展点、取消信号、会话事件以及 UI 展示意图。工具系统的价值,是把不可信的模型提议变成受控的真实副作用。

问题 01

一条工具调用经历哪些阶段?

答案:调用先被记录,再解析和校验参数;pre-execute 决定允许、拒绝或询问;单调 guard 只能进一步收紧权限;execute waterfall 包裹真实执行;post-execute 可接受、阻断或替换结果;最终结果冻结、记录并通知观察者。

  1. 记录调用tool/call 在执行前进入会话,UI 可以立即显示 pending 状态。
  2. 解析与校验把模型 JSON 转成已验证参数;未知工具或非法参数走规范化错误路径。
  3. 准入与 Guardwaterfall 处理 allow / deny / ask;guard 只能拒绝,后续插件不能重新放行。
  4. 包裹执行tools/execute 适合超时、重试和指标;内部调用注册工具的 execute()。
  5. 结果处理post-execute 检查或替换结果,finalizeContent 执行定义拥有的最终内容约束。
  6. 提交结果冻结权威结果,触发 tools/result,写入 tool/result 并把附加上下文排入下一 Step。
策略、超时、沙箱、文件保护和结果改写都通过执行管线扩展,不需要把这些职责塞进 agent-loop。

问题 02

为什么能力要拆成 Definition、Provider 和 Consumer?

答案:因为“能力是什么”“能力怎样实现”“模型怎样使用”有不同的变化原因。Definition 固定调用语义;Provider 可以在本地、远程或沙箱中实现;Consumer 决定是否以及怎样把它暴露成模型工具。三者分开后,替换后端不需要改模型协议。

Definition 是稳定接口,Provider 拥有执行环境,Consumer 面向模型。只有三种角色齐全,才是一项完整的可替换能力。

由此可以推导:增加“远程 shell”通常只需增加 Provider;增加“只允许读取的命令工具”通常是新的 Consumer;改变请求与结果语义才会触及 Definition。

问题 03

模型一次返回多个工具调用时,能全部并行吗?

答案:只有工具针对本次参数明确返回并发安全,才会进入有上限的滚动并发池;未声明、抛错或不可见的工具都按 exclusive 处理。exclusive 调用形成屏障,前面的并发组必须排空,后面的调用才能开始。

结果即使并发完成,仍按模型原始调用顺序写入会话
并发优化真实执行时间,但不改变模型观察到的调用/结果顺序。取消时停止补充新调用,并等待已启动调用收束。

问题 04

工具权限究竟在哪里决定?

答案:没有单一的“权限开关”。工具可见性先限制模型能提议什么;pre-execute 处理会话级允许、拒绝或询问;guard 提供不可逆的最终拒绝;具体 Provider 和文件系统策略再限制真实副作用。每层回答不同问题。

“模型没看到工具”与“模型提出了调用但被拒绝”是两种不同事实;前者收窄能力面,后者产生可解释的调用结果。

安全边界:提示词不能替代执行时策略。模型遵守规则属于概率行为;Provider、guard 与沙箱限制真实副作用,才是可执行的安全约束。