构建一个代理框架中最具挑战性的部分之一,就是设计它所使用的工具。
Claude 完全通过工具调用来执行操作,Claude API 提供了多种构建工具的方式,包括使用 bash、技能(skills)和代码执行等原语。(关于程序化工具调用的更多内容,可以参考 @RLanceMartin 的新文章。)
那么,如何设计代理的工具呢?是给它一个通用工具,比如 bash 或代码执行,还是为每个用例设计多个专用工具?
要理解模型的思维方式,可以想象自己面对一个复杂的数学问题。你会希望拥有哪些工具?这取决于你的技能水平!
最基本的是纸和笔,但只能手动计算。计算器更好,但需要懂得使用高级功能。最快最强的是电脑,但你必须会写代码并执行它。
这个思路对设计代理工具非常有用。你需要给代理配备与其能力相匹配的工具。但如何判断它的能力?你需要关注它的输出,反复试验,学会像代理一样思考。
如果你在构建代理,也会面临类似问题:何时添加工具,何时移除,如何判断效果。以下是我们在构建 Claude Code 时的经验,包括最初的错误。
用 AskUserQuestion 工具提升提问能力

设计 AskUserQuestion 工具的目标是提升 Claude 提问(引导用户回答)的能力。
虽然 Claude 可以直接用文本提问,但我们发现回答过程耗时较长,如何降低沟通摩擦,提高交流效率?
尝试一:修改 ExitPlanTool
最初尝试在 ExitPlanTool 中添加一个问题数组参数,和计划一起返回。实现简单,但让 Claude 混淆了——既要给出计划,又要提出问题。如果用户的回答和计划冲突怎么办?是否需要调用两次 ExitPlanTool?我们意识到这种方法不可行,回到起点。(关于 ExitPlanTool 的更多内容见我们的提示缓存文章)
尝试二:改变输出格式
接着尝试让 Claude 输出一种特定的 markdown 格式,用于提问,比如列出带备选项的项目符号问题。我们可以解析并格式化为用户界面。
Claude 通常能生成这种格式,但不够稳定,经常附加额外句子、遗漏选项或放弃结构。
尝试三:AskUserQuestion 工具
最终我们设计了一个工具,Claude 可以随时调用,尤其在计划阶段。调用时弹出模态窗口显示问题,阻塞代理循环直到用户回答。
这个工具让 Claude 产生结构化输出,确保给用户多个选项,也方便用户组合使用,比如在 Agent SDK 或技能中调用。
最重要的是,Claude 喜欢调用这个工具,输出效果良好。毕竟再好的工具,如果 Claude 不懂得调用,也无用。
这就是 Claude Code 中提问功能的现阶段形态吗?我们认为不会。随着 Claude 能力提升,工具也必须进化。下一节展示了一个曾经有用但后来成了阻碍的工具案例。
功能升级:任务与待办事项

Claude Code 刚发布时,我们发现模型需要一个待办事项列表来保持进度。待办事项可以在开始时写入,完成后勾选。我们提供了 TodoWrite 工具,用于写入和更新待办事项并展示给用户。
但 Claude 经常忘记任务。为此,我们每隔 5 轮插入系统提醒,提示目标。

随着模型进步,待办列表限制了它们的发展。提醒让 Claude 觉得必须遵守列表,无法灵活调整。Opus 4.5 也更擅长使用子代理,但子代理如何协调共享待办?
因此,我们用任务工具替代了 TodoWrite。任务不仅帮助模型保持进度,更支持子代理间通信。任务可以包含依赖关系,支持更新共享,模型可以修改和删除任务。
随着模型能力提升,曾经需要的工具可能变成束缚。必须不断重新评估工具需求。这也是为什么我们倾向支持少量能力相近的模型。
设计搜索接口
最重要的工具是让 Claude 自行寻找上下文的工具。
Claude Code 内部首发时使用了 RAG(检索增强生成):向量数据库预先索引代码库,代理每次响应前检索相关片段提供给 Claude。RAG 快速强大,但需要索引和配置,且在不同环境中可能不稳定。更重要的是,Claude 是被动接受上下文,而非主动寻找。
既然 Claude 能上网搜索,为什么不能搜索代码库?通过给 Claude 一个 Grep 工具,它可以自己搜索文件,构建上下文。
随着 Claude 变得更聪明,给它合适工具后,它能更好地构建上下文。
引入 Agent Skills 后,我们正式采用渐进式披露(progressive disclosure)理念,让代理通过探索逐步发现相关上下文。
Claude 可以读取技能文件,技能文件又能引用其他文件,模型递归读取。技能常用于扩展搜索能力,比如指导如何调用 API 或查询数据库。
一年间,Claude 从几乎不能构建上下文,进化到能跨多层文件嵌套搜索,找到所需精确上下文。
渐进式披露成为我们新增功能时常用的技巧,无需新增工具。下一节解释原因。
渐进式披露:Claude Code 指南代理
Claude Code 目前有约 20 个工具,我们团队经常评估是否都必需。新增工具门槛高,因为这给模型增加了思考选项。
例如,我们发现 Claude 对自身使用方法了解不足。问它如何添加 MCP 或斜杠命令时,它无法回答。
我们本可以把所有信息放入系统提示,但用户很少问,放进去会导致上下文膨胀,影响 Claude Code 的核心任务——写代码。
于是我们采用渐进式披露:给 Claude 一个文档链接,按需加载搜索。虽然有效,但 Claude 会拉取大量文档内容,回答本可一句话解决。
因此我们构建了 Claude Code Guide——一个子代理,用户询问 Claude Code 相关问题时调用。子代理在自己的上下文中搜索文档,遵循详细搜索和提取指令,只返回答案,主代理上下文保持简洁。
这不是完美方案(Claude 仍可能对自身设置感到困惑),但我们成功扩展了 Claude 的行动空间,而无需新增工具。
像代理一样看问题是一门艺术
为模型设计工具既是科学也是艺术,强烈依赖所用模型、代理目标和运行环境。
我们的建议是:多试验,多阅读输出,勇于尝试。最重要的是,学会像代理一样思考。


