TauriTavern/docs/Agent/ToolSystem.md
Darkatse 4260e7293e feat(agent): support extension tools across chat and sessions
Register WebView tools through a dedicated provider with shared tool selection, naming, and result handling. Keep extension availability independent from saved profile selections.

Clarify model-facing feedback and consolidate behavioral tests and architecture documentation.
2026-09-22 00:55:32 -04:00

7.1 KiB
Raw Blame History

工具

工具把模型的请求转成一次有结果的操作。模型读取工具描述,发出调用;runtime 检查本次 Invocation 的工具集合,执行操作,再将结果送回下一轮上下文。

身份与调用名称

工具目录使用稳定的 ToolId。内置工具是 builtin:<name>,MCP 工具是 mcp/<registration-id>:<name>,扩展工具是 extension/<extensionId>:<name>。Profile 的工具配置和运行记录使用这些 ID。

模型调用名称在 Invocation 创建时生成,与稳定 ID 的映射保存在工具快照中。内置工具如 workspace_read_file 保留固定名称;扩展使用注册的 name,MCP 使用服务器与工具名,按模型协议规范字符和长度,重名时加 __2 等短后缀。

工具准备按目录、Chat/Session 场景和 Profile 选择生成 bindings,Invocation 再单独应用完成协议,形成包含描述、参数、名称映射及预算的快照。输出修订沿用原快照。每个 Invocation 的调用计数独立,由 ToolRequestGate 检查后明确分派到 Builtin、MCP 或 Extension。

新 Profile 默认启用 Shell。

内置工具

下表使用源码中的工具名。参数以 descriptor 定义 和 api.agent.tools.list() 返回的 schema 为准。

工作 工具
读取聊天 chat.search、chat.read_messages
读取激活世界书 worldinfo.read_activated
读取工作文件与 Skill workspace.list_files、workspace.search_files、workspace.read_file
修改文件 workspace.write_file、workspace.apply_patch
Shell 与数据处理 workspace.shell,内含 jq、Python 与 JavaScript
发布与结束 workspace.commit、workspace.finish
委派与交接 agent.delegate、agent.await、agent.handoff、task.return
掷骰 dice.roll

聊天工具读取 Run 输入对应的历史范围;文件读取使用 1-based 行号,聊天消息索引使用 0-based。较长文本可以分段读取。完整工具集合会按 Profile 收窄,return-mode 子 Agent 使用 task.return 作为结束工具。

可调用 Agent 目录随提示词提供,协作方式与错误反馈见 多 Agent 协作。

参数

一次调用携带一组具名参数。线上要么是 JSON object,要么是它的 JSON 字符串编码,「没有参数」在各家实现里有多种等价写法(字段缺失、null、""、"null"、"{}")。ToolArguments 是唯一的换算位置:先剥掉字符串编码,再用同一条规则判断,因此两种编码得到同一个参数集合,全可选参数的工具可以直接无参调用。

既不是 object、也不属于上述空集合写法的内容(截断的 JSON、数组、标量)原样保留。runtime 在预算计入之后、分派之前拒绝这类调用,返回可恢复的 tool.invalid_arguments 并回显开头一段原文;工具本身只接收已经确定为 object 的参数。

各渠道回放统一使用对象参数:合法对象保持原值,非法参数回放为 {},拒绝原因由配对的 tool error 承载。持久化仍保留非法参数原文。

Shell

workspace.shell 提供 Bashkit 内置命令、jq、Python 子集与 JavaScript。参数为 command 与可选 workdir(默认 /)。每次调用创建新环境,共享工作区文件保留;不执行宿主外部程序。退出状态与输出沿普通工具结果返回,执行与文件契约见 Workspace。

结果如何进入下一轮

AgentToolResult 包含调用 ID、工具 ID、文本、结构化结果、错误信息和资源引用。模型读取其中的 content,错误结果带有明确的错误标记;结构化元数据保留在记录中,不自动展开为模型文字。

面向模型的文字各司其职:提示词说明职责与完成方式,工具说明用途与参数,结果报告事实,错误说明问题与已知的纠正办法。以理解成本衡量简洁,保留必要的内容边界和后续指引;内部配置、身份与审计细节留在记录中。

MCP 与扩展共用结果审计和长结果处理。超过 Profile 内联阈值 时,原始 JSON 留作审计,完整可读内容写入只读 tool-results/ 文件;模型收到开头预览、字符上限、不完整说明及文件路径,并按可用工具给出读取、分页或搜索指引。中断历史保留调用与结果的配对;结果未知时,提醒重复操作前检查状态。

模型能够修正的请求错误也返回 tool result,例如参数不合法、读取范围不正确或文件已变化。存储和运行状态错误则向 Run 收尾流程传播。聊天中显示的正文通过工作区提交产生。

MCP 与 Skill

MCP Manager 管理服务器、发现目录和调用权限;Agent 使用已发现的目录,调用前由 MCP 服务确认权限。配置与连接行为见 MCP。

Skill 提供工作方法、材料和脚本,通过只读 skills/ 视图与 workspace.shell 使用,组织与作用域见 Skill。

扩展工具

扩展在启动时注册普通 JS 函数,适用于 Chat、Session 或两者,见 注册扩展工具。Tauri host 负责 WebView 通信与回执等待,通过 tt-ports::extension_tools::ExtensionTools 向 runtime 提供目录和调用能力。

执行时按稳定 ID 查找当前启用的函数,工具快照不保存函数实例。扩展返回普通 JSON,MCP 响应按自身协议整理,随后进入共同的结果处理链路。

添加一个工具

先看相近的内置工具,实现它的参数描述和执行逻辑,再在 BuiltinAgentToolRegistry 注册。工具返回内容供模型继续工作;需要文件修改、提交或任务控制时,通过现有 AgentToolEffect 交给 runtime 记录和处理。

需要网络、文件或脚本引擎等外部能力时,沿用仓库的 port 与 adapter 边界。验证应从可观察的调用结果和副作用入手,见 测试。