- 支持 tool.call 和 tool.result 消息类型处理 - 引入 Tool 调度与执行逻辑,支持超时与结果截断 - 增加 ToolRegistry 和 ToolExecutor 管理工具定义与执行 - 更新上下文构建与消息映射逻辑,适配工具闭环处理 - 扩展配置与环境变量,支持 Tool 调用相关选项 - 增强单元测试覆盖工具调用与执行情景 - 更新文档和 OpenAPI,新增工具相关说明与模型定义
2.0 KiB
2.0 KiB
工具调用(子 Run 模式)最小闭环
本次改动新增 Tool 子系统,保持 RunLoop/Provider 的事件驱动模型不变,通过“子 Run”执行工具并把结果回灌到父 Run。
关键链路
- Provider 产生
tool.call(Streaming 中的tool.delta聚合),RunLoop 落库tool.call并生成子 Runrun:{parent}:{tool_call_id}。 ToolRunJob执行具体工具(当前内置get_time),写入tool.result与子 Run 的run.status。- 父 Run 轮询等待子 Run 结果(超时/失败即终止),将
tool.result追加到上下文后再次调用 Provider,直至产出最终agent.message。 - 幂等:
tool.call、子 Runrun.status与tool.result均带 dedupe_key;同一个 tool_call_id 只会执行一次。
消息/事件
- 新增消息类型:
tool.call(role=AGENT,payload 含 tool_call_id/name/arguments)、tool.result(role=TOOL,payload 含 parent_run_id/run_id/status/result)。 - Provider 事件新增
tool.delta,RunLoop 内部聚合后才触发子 Run;finish_reason=tool_calls会结束本轮流并进入工具执行。
配置要点
AGENT_TOOL_MAX_CALLS_PER_RUN:单个父 Run 允许的工具调用次数(默认 1,超过直接失败)。AGENT_TOOL_WAIT_TIMEOUT_MS/AGENT_TOOL_WAIT_POLL_MS:父 Run 等待子 Run 结果的超时与轮询间隔。AGENT_TOOL_TIMEOUT_SECONDS/AGENT_TOOL_RESULT_MAX_BYTES:工具执行超时标记与结果截断保护。AGENT_TOOL_CHOICE:传递给 OpenAI 的 tool_choice(默认 auto)。- ToolRunJob 队列参数:
AGENT_TOOL_JOB_TRIES/AGENT_TOOL_JOB_BACKOFF/AGENT_TOOL_JOB_TIMEOUT。
预留/限制
- 目前仅支持单工具调用闭环;多次调用的上限可调但仍是串行流程。
- 工具列表可通过
ToolRegistry扩展(当前内置get_time纯函数)。 - 结果超时为父 Run 级别的软超时,PHP 层未强制中断长耗时函数(后续可接入外部超时控制)。