本节摘要:做出一个能干活的 Agent,核心不在代码量,而在三组设计决策:模型参数(adaptive thinking 与 effort 的取舍)、工具表面(tool surface)的设计(Bash vs 专用工具、何时该把一个动作提升为专用工具)、以及长程上下文管理(上下文编辑、压缩、记忆三件套)。本节讲清这些决策的启发式规则:从 Bash 起步广覆盖,在需要门控/渲染/审计/并行时提升为专用工具;用程序化工具调用(PTC)把多次往返压成一段脚本;用工具搜索与技能让固定上下文保持精简;用上下文编辑、压缩、记忆管理跑几小时的长程 agent。读完本节,你能设计出一个工具表面合理、上下文可控、成本可承受的 Claude agent。
内容来源:Anthropic 官方 Claude API 文档
shared/agent-design.md(随 Claude Code 分发,从泄露素材库提取),汉化并套用体系化模板。
阅读完本节,你应当能够:
设计 Agent 的第一组决策是模型参数。两个关键旋钮:
| 参数 | 何时用 | 效果 |
|---|---|---|
adaptive thinking(thinking: {type: "adaptive"}) |
想让 Claude 自己决定何时思考、思考多深 | 模型按请求难度决定思考深度,在工具调用间自动穿插思考,无需调预算 |
effort(output_config: {effort: ...}) |
调「彻底 vs 省 token」的权衡 | effort 越低,工具调用越少越合并、前导越短、确认越简;medium 常是好的平衡;正确性重于成本时用 max |
💡 经验法则:
mediumeffort 常是速度与彻底的有利平衡。只在正确性比成本更重要时(如安全审查、关键决策)才上max。adaptive thinking 则基本可以默认开——它让模型自己判断,不会在简单请求上浪费思考。
这是 Agent 设计最重要的决策。Claude 不知道你应用的安全边界、审批策略、UX 表面——它只发工具调用,你的外壳(harness)执行。工具调用的形状决定了外壳能做什么。
一个 Bash 工具给 Claude 极广的程序化能力——几乎能干任何事。但它给外壳的只是一个不透明的命令字符串,每个动作形状都一样。把一个动作提升为专用工具,外壳就获得了一个带类型参数的动作专属钩子,可以拦截、门控、渲染、审计。
何时该把一个动作提升为专用工具:
send_email 工具容易门控;bash -c "curl -X POST ..." 则不行。edit 工具能在文件自 Claude 上次读后已变时拒绝写入。Bash 无法强制这个不变量。glob、grep 可标记为并行安全。同样的动作走 Bash 时,外壳无法区分并行安全的 grep 与并行不安全的 git push,只能串行化。💡 经验法则:从 Bash 起步获取广度。在需要门控、渲染、审计、并行该动作时,提升为专用工具。
除了自定义工具,Anthropic 提供一组官方工具,分为客户端侧(你执行)与服务端(Anthropic 执行)两类:
| 工具 | 侧 | 何时用 | 效果 |
|---|---|---|---|
| Bash | 客户端 | 执行 shell 命令 | Claude 发命令,你的外壳执行;提供参考实现 |
| 文本编辑器 | 客户端 | 读写编辑文件 | Claude 经你的实现查看、创建、编辑文件 |
| computer use | 客户端或服务端 | 与 GUI、网页、可视界面交互 | Claude 截图并发鼠标键盘命令;可自托管或 Anthropic 托管 |
| 代码执行 | 服务端 | 在你不想管的沙箱里跑代码 | Anthropic 托管容器,内置文件与 bash 子工具,无需客户端执行 |
| 网页搜索/抓取 | 服务端 | 需要训练截止后的信息或某 URL 内容 | Claude 发查询/URL,Anthropic 执行并返回带引用的结果 |
| 记忆 | 客户端 | 跨会话保存上下文 | Claude 读写 /memories 目录,你实现存储后端 |
客户端侧工具由 Anthropic 定义(名字、schema、Claude 的使用模式)但由你的外壳执行,Anthropic 提供参考实现。服务端工具完全在 Anthropic 基础设施上运行——在 tools 里声明,Claude 处理其余。
标准工具调用下,每次工具调用都是一次往返:Claude 调工具 → 结果进上下文 → Claude 推理 → 调下一个工具。三个顺序动作(读档案 → 查订单 → 查库存)就是三次往返,每次都加延迟与 token,而中间数据大多再也不用。
程序化工具调用(Programmatic Tool Calling, PTC) 让 Claude 把这些调用组合成一段脚本。脚本在代码执行容器里跑——脚本调工具时,容器暂停、调用执行(客户端或服务端)、结果返回给运行中的代码(而非 Claude 的上下文)。脚本用正常控制流(循环、过滤、分支)处理结果,只有脚本最终输出返回 Claude。
| 何时用 PTC | 效果 |
|---|---|
| 多次顺序工具调用,或大中间结果想过滤后再进上下文 | Claude 写代码把工具当函数调;在代码执行容器跑;token 成本随最终输出而非中间结果缩放 |
💡 PTC 的价值:把「N 次往返 + N 份中间结果进上下文」压成「1 段脚本 + 1 份最终结果」。中间结果留在容器里不污染上下文窗口,既省 token 又降延迟。
当工具或指令多到放不进固定上下文时,有两个模式让细节按需加载:
| 特性 | 何时用 | 效果 |
|---|---|---|
| 工具搜索(tool search) | 工具很多但每次只有几个相关;不想把所有 schema 都放进上下文 | Claude 搜索工具集,只加载相关 schema;工具定义是追加而非替换,保留缓存 |
| 技能(skills) | 任务专属指令应只在相关时加载 | 每个 skill 是带 SKILL.md 的文件夹;skill 的描述默认在上下文,任务需要时才读完整文件 |
两者都让固定上下文保持精简,按需加载细节。技能在第 5 章会深入讲。
跑几小时的长程 agent,上下文会膨胀到不可持续。三种模式各有用途:
| 模式 | 何时用 | 效果 |
|---|---|---|
| 上下文编辑(context editing) | 上下文跨多轮变陈旧(旧工具结果、已完成思考) | 按可配阈值清除工具结果与思考块;保持转录精简而不做摘要 |
| 压缩(compaction) | 对话可能达到或超过上下文窗口 | 早期上下文在服务端摘要成 compaction 块;关键是要回传整个 response.content |
| 记忆(memory) | 状态需跨会话持久(不只在一次对话内) | Claude 读写记忆目录里的文件;挺过进程重启 |
三者如何选:上下文编辑与压缩在会话内运作——编辑修剪陈旧回合,压缩在接近上限时摘要。记忆用于跨会话持久。许多长程 agent 三者并用。
提示缓存(第 2 章 03 节)的铁律对 agent 有特殊影响,有三个变通:
| 约束 | Agent 专属变通 |
|---|---|
| 会话中途改 system prompt 会失效缓存 | 改为追加 {"role": "system", ...} 消息到 messages(支持模型上,无需 beta 头);前缀保持不变 |
| 会话中途换模型会失效缓存 | 为子任务派生子代理(subagent) 用更便宜模型;主循环保持一个模型 |
| 会话中途增删工具会失效缓存 | 用工具搜索动态发现——它追加工具 schema 而非替换,保留前缀 |
medium 常是好平衡,正确性优先时用 max。role:system 消息、换模型用子代理、增删工具用工具搜索。下一节讲托管代理(managed agents)——把这些 agent 设计原则交给 Anthropic 平台托管:agent 是版本化配置、session 是每次运行、平台替你跑有状态的 agent 循环。