ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

像智能体一样观察:Anthropic 团队谈 Claude Code 工具设计的演进与艺术

像智能体一样观察:Anthropic 团队谈 Claude Code 工具设计的演进与艺术 1. 从一次工具调用失败说起智能体工具设计到底难在哪如果你正在用 Claude Code 或者自己搭 Agent大概率遇到过这种场景明明给模型配了工具它却死活不调用或者调用了却传错参数再或者一口气把整个代码库塞进上下文token 烧得飞快还答非所问。这不是模型笨而是工具接口设计出了问题。Claude Code 团队成员 Thariq 在一篇长文里把这件事讲得很透构建智能体框架最难的部分之一就是构筑它的动作空间Action Space。Claude 通过工具调用来采取行动但工具怎么设计、给几个、粒度多粗直接决定了智能体的行为质量。他把这个过程比作解数学题——纸笔是底线但算得慢计算器更快但你得会用高级功能电脑最强但你得会写代码。你给智能体的工具应该根据它自身的能力量身定制。这个判断对做 Agent 开发的人非常关键。很多人一上来就想给模型配 50 个专用工具结果模型在工具选择上反复纠结反而降低了任务完成率。Claude Code 目前大约只有 20 个工具而且团队一直在反思是不是真的需要这么多。添加新工具的门槛很高因为每多一个工具模型的思考负担就多一分。那怎么判断该不该加工具核心方法是“像智能体一样观察”——仔细读它的输出、不断实验、观察它在什么情况下卡住。这篇文章我就沿着 Claude Code 工具设计的演进脉络把 Anthropic 团队的取舍逻辑拆开给你可复制的工具描述模板和配置片段再带你在本地环境验证工具调用链路。适合正在做 Agent 开发、MCP 工具封装、或者想理解 Claude Code 内部机制的同学。2. 前置准备用 TaoToken 快速拿到可调用的 Claude 环境要验证工具调用链路你得先有一个能稳定调用 Claude API 的环境。我试过几种方式最省事的是通过 TaoToken 接入——它兼容 Anthropic 的 API 格式Base URL 和 Key 配好就能直接用不用折腾环境变量和区域问题。先注册并拿到 API Key。打开官网 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content 注册后在控制台里创建一个 Key。控制台地址是 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 进去之后左侧菜单找 API Keys点新建复制那串 sk- 开头的字符串。这个 Key 只显示一次记得存好。接下来确认你要用的模型 ID。Claude Code 场景下常用的是 claude-sonnet-4-5 和 claude-opus-4-5 这两个。你可以在模型对话页面先试一下连通性https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 选一个模型发一句“你好”能正常回复说明 Key 和网络都没问题。如果你打算长期跑编码任务或者搭 Agent建议看一下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它针对高频调用做了额度优化比按量计费更适合持续开发场景。接入文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里面有完整的 API 格式说明和示例。API 端点本身是 https://taotoken.net/api 注意这个地址不加 UTM 参数直接作为 Base URL 用。环境准备好之后我们进入正题怎么设计工具描述让模型愿意调、调得对。3. 可复制的工具描述模板与配置片段Claude Code 团队在工具设计上踩过的坑总结下来有几个关键原则。第一工具描述要结构化别让模型猜。第二能用渐进式披露就别加新工具。第三工具的参数设计要匹配模型当前的能力曲线。先看一个工具描述模板。这是我在本地验证时用的 JSON 配置放在~/.claude/settings.json或者项目级的.claude/settings.json里{ tools: [ { name: search_codebase, description: 在本地代码库中搜索指定关键词。当需要查找函数定义、变量引用或特定字符串时使用此工具。返回匹配的文件路径、行号和上下文片段。, input_schema: { type: object, properties: { query: { type: string, description: 搜索关键词或正则表达式 }, file_pattern: { type: string, description: 可选限定搜索的文件类型如 *.py 或 *.ts }, max_results: { type: integer, description: 可选最大返回条数默认 20 } }, required: [query] } } ] }这个模板的关键点在于description 里写清楚了“什么时候用”和“返回什么”而不是只写“搜索代码”。Claude Code 团队发现模型对工具的理解高度依赖描述里的场景说明。如果你只写“搜索文件”模型可能在该用 Grep 的时候去调 Bash。再来看 Claude Code 本身的配置。如果你用 Claude Code CLI可以在~/.claude.json里配置模型和 API 端点{ apiKey: sk-你的TaoToken密钥, baseUrl: https://taotoken.net/api, model: claude-sonnet-4-5, maxTokens: 8192 }如果你用的是 Cline 或者 Roo Code 这类编辑器插件配置方式类似。以 Cline 为例在设置里选 “Anthropic” 作为 Provider然后填Base URL:https://taotoken.net/apiAPI Key: 你的 TaoToken KeyModel ID:claude-sonnet-4-5这里有个细节要注意Base URL 后面不要加/v1TaoToken 的端点已经处理好了路径。如果你填成https://taotoken.net/api/v1可能会遇到 404。对于 Codex 用户auth.json的配置是这样的{ openai_api_key: sk-你的TaoToken密钥, api_base: https://taotoken.net/api }三件套记住Base URL、Key、Model ID缺一不可。很多接入失败都是因为 Model ID 写错比如把claude-sonnet-4-5写成claude-3-5-sonnet模型名对不上就会报 model not found。工具描述写好后怎么验证模型真的会调用下一节我用一个具体例子走一遍。4. 验证工具调用链路从请求到成功结果验证工具调用最直接的方式是发一个必须用工具才能回答的请求。我构造了这样一个场景让 Claude 在一个本地目录里找包含 “TODO” 的 Python 文件。先准备测试环境mkdir -p ~/agent-test/src echo # TODO: refactor this function ~/agent-test/src/main.py echo print(hello) ~/agent-test/src/utils.py然后写一个最小的调用脚本。用 Python 的 anthropic SDKimport anthropic client anthropic.Anthropic( api_keysk-你的TaoToken密钥, base_urlhttps://taotoken.net/api ) response client.messages.create( modelclaude-sonnet-4-5, max_tokens1024, tools[ { name: search_codebase, description: 在本地代码库中搜索指定关键词。当需要查找函数定义、变量引用或特定字符串时使用此工具。, input_schema: { type: object, properties: { query: {type: string, description: 搜索关键词}, file_pattern: {type: string, description: 文件类型过滤} }, required: [query] } } ], messages[ {role: user, content: 在 ~/agent-test 目录下找出所有包含 TODO 的 Python 文件} ] ) print(response)运行后你会看到返回的 content 里有一个tool_use块类似{ type: tool_use, id: toolu_01ABC..., name: search_codebase, input: { query: TODO, file_pattern: *.py } }这说明模型正确理解了工具用途并构造了参数。接下来你需要把工具执行结果回传tool_result { type: tool_result, tool_use_id: toolu_01ABC..., content: 找到 1 个匹配~/agent-test/src/main.py 第 1 行: # TODO: refactor this function } response2 client.messages.create( modelclaude-sonnet-4-5, max_tokens1024, tools[...], messages[ {role: user, content: 在 ~/agent-test 目录下找出所有包含 TODO 的 Python 文件}, {role: assistant, content: response.content}, {role: user, content: [tool_result]} ] ) print(response2.content[0].text)成功的话模型会返回类似“在 main.py 第 1 行找到了一个 TODO 注释”的总结。整个链路跑通说明你的工具描述和参数设计是有效的。这里有个观察如果我把工具描述改成“搜索文件”模型有概率不调用工具而是直接回复“我无法访问你的文件系统”。这就是描述里场景说明的重要性。Claude Code 团队在 AskUserQuestion 工具的演进中也发现了类似规律——他们最初尝试修改 ExitPlanTool 或输出格式都不稳定最终创建专用工具才解决了问题。5. 常见报错排查401、local proxy failed、reading choices接入和验证过程中有几个报错特别常见。我按实际遇到的频率排个序逐个说排查方法。401 Unauthorized这是最常见的。原因通常是 Key 没填对或者 Base URL 写错了。检查三件事Key 是不是完整复制了sk- 开头那串Base URL 是不是https://taotoken.net/api不要加/v1请求头里的x-api-key或Authorization格式对不对。如果你用的是 Claude Code CLI检查~/.claude.json里的apiKey字段有没有多余空格。local proxy failed / connection refused这个报错通常出现在你本地配了代理但代理没启动或者环境变量HTTP_PROXY指向了一个不存在的端口。排查方法先echo $HTTP_PROXY看看有没有值如果有但你不确定它是否可用临时 unset 掉再试。另外检查防火墙有没有拦截对taotoken.net的请求。reading choices 相关报错如果你用的是 OpenAI 兼容的 SDK 去调 Claude可能会遇到reading choices这类错误。原因是 Claude 的响应格式和 OpenAI 不一样Claude 返回的是content数组而不是choices。解决办法是换用 Anthropic 的 SDK或者确认你用的中转层做了格式转换。TaoToken 的 API 是 Anthropic 原生格式所以直接用anthropicSDK 最稳。OAuth 相关报错Claude Code CLI 在某些版本会尝试 OAuth 登录如果你已经配了 API Key可能会冲突。解决办法是在~/.claude.json里明确设置authType: apiKey或者运行claude config set authType apiKey。如果还是报 OAuth 错误检查有没有残留的~/.claude/credentials.json有的话先备份再删除。模型返回空内容或截断检查max_tokens是不是设得太小。Claude Code 场景下建议至少 4096复杂任务设 8192。另外如果你用了流式输出确认客户端正确处理了content_block_delta事件。工具调用不触发模型不调用工具九成是工具描述的问题。把 description 改得更具体加上“当需要……时使用此工具”这样的场景说明。另外确认tools参数传的是数组每个工具都有name、description、input_schema三个字段。排查完这些基本能覆盖 90% 的接入问题。如果还搞不定去接入文档 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 里对照示例检查或者在模型对话页面 https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 直接测试模型是否正常响应。6. 工具设计的艺术渐进式披露与能力匹配回到 Claude Code 团队的核心观点工具设计是艺术不是科学。没有一套死板规则能保证成功它高度依赖你用的模型、智能体的目标以及运行环境。渐进式披露Progressive Disclosure是他们最常用的技巧。简单说就是不要一次性把所有上下文塞给模型而是让它通过探索逐步发现。Claude Code 的技能文件可以递归引用其他文件模型需要什么就去读什么。这比加新工具更优雅因为不增加模型的思考负担。另一个关键洞察是当模型能力提升时曾经需要的工具反而可能成为束缚。Claude Code 最初用 TodoWrite 工具帮模型保持专注甚至每 5 轮插入系统提醒。但到了 Opus 4.5模型不仅不需要提醒还觉得这是限制。于是团队用 Task 工具取代了 TodoWrite——Todo 的核心是“保持专注”Task 的核心是“辅助智能体间的协作”。这对做 Agent 开发的启示很直接不要假设你的工具设计是永久的。每次模型升级都要重新观察它的行为看之前的工具是否还合适。Claude Code 团队建议专注于支持一组能力曲线相似的模型避免为不同能力的模型设计同一套工具。如果你要长期跑编码任务或者搭多智能体系统Coding Plan 的额度模型更适合持续调用https://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。配合 API Keys 页面 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 管理多个 Key可以按项目隔离调用量。最后说一个我踩过的坑不要试图给模型配一个“万能工具”。Claude Code 团队试过只给 Bash 或代码执行结果模型在复杂任务上表现不稳定。工具粒度太粗模型需要自己构造复杂命令粒度太细模型在工具选择上浪费时间。找到平衡点的方法只有一个——多实验多读输出像智能体一样观察。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进