Anthropic 把 Claude Code 打磨了两年的 Agent 引擎拆出来做成了 SDK。2026 年搜索量暴增 50,000%,6月15日计费独立拆分——官方正式承认"Agent 自动化"已是独立赛道。本文用 Python 带你从零写一条带安全护栏、自动日志、并行子Agent 的完整流水线。
为什么你需要关注 Claude Agent SDK
先看两个数字:2025 年 5 月,"claude agent sdk" 月搜索量 50 次;2026 年 4 月,这个数字是 14,800 次——接近 50,000% 的同比增长。这不只是搜索数据的狂欢,背后是开发者社区在用脚投票。
2026 年 6 月 15 日,Anthropic 做了一件影响所有 AI Agent 开发者的事:把 Claude Agent SDK 和 GitHub Actions 的 API 用量从交互式 Claude Code 的配额池里彻底独立拆分出来。翻译成人话:官方承认"无人值守 Agent 自动跑任务"不是"人机对话"的边角料,而是和"开发者坐在终端前敲命令"同等重要的第一公民场景。
Claude Agent SDK 到底是什么?
一句话定义:它是 Claude Code 的引擎层,打包成你可以编程调用的 Python/TypeScript 库。你给它一个 system prompt(告诉 Agent 它是谁、要遵守什么规则)、一组工具(内置的 + MCP 扩展的)、一个目标("审查这 200 个文件的安全漏洞并生成报告"),然后它就跑 autonomously 的 agent loop:
- 模型分析当前状态,决定调用哪个工具
- SDK 执行工具调用,拿到结果
- 结果喂回上下文窗口
- 模型基于新信息继续推理,决定下一步
- 循环直到任务完成或撞到上限
这整个过程全自动,不需要你守在屏幕前点"允许"。你写一次代码,它跑 N 次任务。
它的前身叫 "Claude Code SDK",2025 年 9 月发布,当月就紧急改名——因为太多开发者以为"这只是个写代码的工具"。实际上它可以做任何事:调 API、查数据库、发通知、操作文件系统、搜网页、生成报告。只要你能用工具函数表达的任务,它都能跑。
和原始 Anthropic API 的差别有多大?
如果你用过 /v1/messages 的原生 API,一定写过这样的循环:messages.create() → 检查 stop_reason → 解析 tool_use → 自己执行函数 → 构造 tool_result → 再调 messages.create() → 循环。还要自己管上下文窗口、自己写重试逻辑、自己做会话持久化。一个完整的 agent harness 轻松 600 行起。
Claude Agent SDK 的等价代码:20 行。而且这个 harness 已经被地球上所有 Claude Code 用户日夜测试了两年。
安装:
Python 版会自动打包 Claude Code CLI 二进制,你不需要额外装 Claude Code。只需要设置环境变量 ANTHROPIC_API_KEY 就可以开始写代码。
第一个 Agent:从零到跑通的完整过程
我们先从最简单的例子开始,带你理解 Agent loop 的每个环节。这个 Agent 的任务是"审查一个 Python 文件,找出可能导致崩溃的 bug 并修复"。
运行后会看到什么?
假设 utils.py 里有个函数用 len(numbers) 做除数但没检查空列表,Agent 的实际输出流会是:
关键理解:
AssistantMessage不是"最终结果"——它是 Agent 的实时思考流。你能看到它每步在想什么、为什么调这个工具ResultMessage.subtype区分正常完成和异常终止。生产环境必须检查 subtype,不能假设都是 successmax_turns绝不是可选的。SDK 默认值是无限!一个陷入循环的 Agent 如果不设上限,会一直烧 API 额度直到你手动 kill 进程
权限模式速查表:
| 模式 | 行为 | 适用场景 |
|---|---|---|
acceptEdits | 自动通过文件编辑和常用命令,其他需审批 | 受信任的开发工作流 |
plan | 只读模式,所有写操作需 callback 审批 | 先看方案再执行 |
dontAsk | 只跑 allowed_tools 里的工具,其余一律拒绝 | 锁定式 headless 生产环境 |
auto | 模型分类器自动判断是否批准 | 需要安全护栏的自治 Agent |
bypassPermissions | 跳过所有权限检查 | 沙箱 CI、完全可信环境 |
生产环境必须用 dontAsk + 精确 allowed_tools 列表。用 acceptEdits 或 auto 跑无人值守任务,Agent 可能卡在权限弹窗上永远等不到你点"允许"。
实战一:自定义工具——让 Agent 调你的业务 API
内置工具覆盖了文件操作(Read/Write/Edit)、搜索(Glob/Grep)、Shell(Bash)、网络(WebSearch/WebFetch),但真正的生产环境 Agent 需要调你的业务系统——数据库、内部 API、第三方服务。这时需要自定义工具。
最重要的模式——isError: True
这可能是 Claude Agent SDK 自定义工具开发中唯一最重要的一行代码。假设你的工具函数抛了未捕获异常:
- 整个 Agent loop 直接停机
- Claude 永远看不到错误信息
query()调用 直接失败,你拿到的是一个异常而不是结果
但如果你在 try/except 里捕获异常并返回 isError: True:
- Agent loop 继续运行
- Claude 看到错误信息作为数据
- Claude 可以决定重试或换备用方案
这就是"把错误当数据"和"错误杀死进程"的区别。生产环境的 Agent 可能跑几个小时处理几百个文件——中间一个工具调用失败不应该让整个任务报废。
踩坑提醒——MCP 工具名格式:
MCP 工具在 allowed_tools 中的命名严格遵守 mcp__<服务器名>__<工具函数名> 格式,双下划线分隔。写错一个下划线、或者服务器名和注册时不一致,工具就调不到——而且不会有明确的报错,Agent 只会当作这个工具不存在。
排查技巧:在 Agent 启动时打印注册的 MCP 工具列表确认命名。
实战二:Hooks 拦截器——5 行代码防住一个生产事故
Hooks 是 Claude Agent SDK 最被低估的功能。它让你在 Agent 执行的关键节点插入自定义回调——相当于给 Agent 装了一层透明的"安检门"。
原理很简单:Agent 做事分阶段(启动→推理→调工具→收结果→继续推理→完成),每个阶段切换时 SDK 触发一个事件。你可以注册 hook 来监听这些事件,在回调里做三件事:
- 放行:返回空对象
{},Agent 正常继续 - 拒绝:返回
permissionDecision: "deny",阻止这个操作 - 修改:返回
permissionDecision: "allow"并附带修改后的输入
场景一:阻止 Agent 修改敏感文件
假设你的项目里有 .env 文件存 API Key,你绝对不想 Agent 在任何情况下修改它。5 行代码解决:
重要细节:Hooks 拒绝一个操作后,Agent 不会直接报错退出——它会被告知"这个操作被拒绝了,原因是什么",然后尝试换一种方法完成任务。比如你拒绝了直接修改 .env,Agent 可能会建议"我无法修改 .env,但可以生成一个 .env.example 模板供你手动填入"。
场景二:全量审计日志
生产环境里你需要在事后回溯 Agent 做了哪些操作。PostToolUse hook 是最佳方案——它在工具执行完之后触发,不影响执行流程,纯粹做记录:
场景三:拦截危险 Shell 命令
这是 hooks 最有价值的场景——阻止 Agent 执行破坏性命令:
可用 Hook 事件完整列表:
| 钩子事件 | Python | TypeScript | 触发时机 | 典型用途 |
|---|---|---|---|---|
PreToolUse | ✅ | ✅ | 工具调用前 | 拦截危险操作、修改参数 |
PostToolUse | ✅ | ✅ | 工具执行后 | 审计日志、结果验证 |
PostToolUseFailure | ✅ | ✅ | 工具执行失败 | 错误处理、告警 |
UserPromptSubmit | ✅ | ✅ | 用户提交提示词 | 注入额外上下文 |
Stop | ✅ | ✅ | Agent 执行结束 | 清理资源、发通知 |
SubagentStart | ✅ | ✅ | 子Agent 启动 | 分配隔离环境 |
SubagentStop | ✅ | ✅ | 子Agent 完成 | 收集结果、验证输出 |
PreCompact | ✅ | ✅ | 上下文压缩前 | 归档完整对话 |
PermissionRequest | ✅ | ✅ | 权限弹窗出现 | 自定义权限处理 |
Notification | ✅ | ✅ | 状态变化 | 推送 Slack/微信通知 |
SessionStart | ❌ | ✅ | 会话初始化 | 初始化日志 |
SessionEnd | ❌ | ✅ | 会话终止 | 清理临时文件 |
PostToolBatch | ❌ | ✅ | 批量工具调用解析后 | 批量注入规范 |
StopFailure | ❌ | ✅ | 异常终止 | 告警通知 |
⚠️ Python SDK 不支持 SessionStart/SessionEnd 作为回调钩子。如需在 Python Agent 启动时执行初始化逻辑,在收到第一条 receive_response() 消息时触发。
实战三:子Agent 编排——让多个 Agent 并行干活
单个 Agent 处理复杂任务时会遇到上下文窗口瓶颈:一个超长任务的所有中间推理会塞满 token 预算。子Agent 是这个问题的标准解法——把大任务拆成独立子任务,每个子Agent 在自己的隔离上下文里跑,互不干扰。
场景:代码 PR 审查拆成 3 个并行子任务
子Agent 的核心行为规则:
- 独立上下文窗口:每个子Agent 有自己的 token 预算,不会互相污染。主 Agent 给子Agent 的是"任务描述 + 必要上下文",不是整个对话历史
- 权限不自动继承:子Agent 不会自动获得父 Agent 的权限配置。你必须为子Agent 单独设置
allowed_tools和permission_mode - 生命周期可追踪:子Agent 启动触发
SubagentStart,完成触发SubagentStop。你可以在这两个钩子里挂接自己的逻辑
生产模式:钩子驱动的并行任务汇总
生产部署——6 项上线前必检清单
在把 Agent 推到生产环境之前,以下 6 项必须逐一确认。漏掉任何一项都可能导致夜间报警电话:
1. 设 max_turns(默认是无限!)
SDK 的 max_turns 默认值不是 20,不是 50,是无限。一个陷入循环的 Agent(比如重复读同一个文件、反复调用同一个失败的 API)会一直烧 API 额度直到你手动 kill 进程。建议设 20-50,根据任务复杂度调整。
2. 设 max_budget_usd 做双保险
即使设了 max_turns,Agent 每轮的 token 消耗也不可控。max_budget_usd 直接限制单次执行的美元花费上限,比按轮次限制更精确。
3. 生产环境用 dontAsk + 精确 allowed_tools
这是最重要的权限配置原则。用 acceptEdits 跑无人值守任务,Agent 遇到不在白名单里的工具时会弹出权限请求——然后因为没有人在屏幕前点"允许",Agent 会永远卡住。dontAsk 模式下,不在 allowed_tools 里的工具调用会被直接拒绝,Agent 会收到拒绝通知并尝试换方法。
4. MCP Server 单个工具调用的超时控制
自定义 MCP Server 里的每个工具函数必须有自己的超时机制。一个卡住的 API 调用如果不设 timeout,会拖死整个 Agent loop——Agent 会永远等那个工具返回结果。建议每个外部调用包 asyncio.wait_for。
5. 审计日志不可省略
最少要在 PostToolUse 钩子里记录:什么时间、用了哪个工具、操作了哪些文件、结果是否成功。Agent 跑完 2 小时后你发现文件被改坏了,没有审计日志你根本不知道是哪一步出的事。
6. 理解 6.15 计费变化
2026 年 6 月 15 日起,Agent SDK 和 GitHub Actions 的用量从交互式 Claude Code 配额中独立拆分。如果你在 Pro/Max 订阅上跑大量 headless Agent 任务,可能会比预期更早撞到配额上限。官方建议:重度 Agent SDK 用户走 API credit 直接按 token 计费,把订阅当开发环境用。
踩坑清单——来自生产线真实教训
这些坑每个都在真实项目中踩过,提前知道能省你大量调试时间:
| 坑 | 症状 | 正确做法 |
|---|---|---|
| 自定义工具抛未捕获异常 | Agent 直接退出,无任何错误提示 | 必须 try/except → return {"isError": True, ...} |
max_turns 未显式设置 | Agent 陷入无限循环,API 费用飙升 | 生产环境永远显式设 max_turns=20 起 |
| MCP 工具名写错下划线 | 工具静默不可用,Agent 不知道它的存在 | 严格 mcp__服务器名__函数名,双下划线 |
allowed_tools 语义误解 | 以为没列的工具不能调,实际是走权限流程 | 用 dontAsk 模式才能真正拒绝未列工具 |
Python SDK 无 SessionStart | 初始化逻辑没地方挂,hook 注册了不触发 | 用首条消息触发初始化,或加载 settings.json |
| 子Agent 权限假设继承 | 子Agent 操作被拒,不知道为什么 | 每个子Agent 独立配置 allowed_tools |
| Hook 回调里写同步阻塞代码 | Agent loop 卡死不动 | Hook 回调必须 async,IO 用 asyncio.to_thread() |
permission_mode 用 acceptEdits 跑 headless | Agent 卡在权限弹窗永远等不到批准 | headless 必须用 dontAsk 或 bypassPermissions |
常见问题
Q: Claude Agent SDK 和直接调 Anthropic Messages API 有什么区别?
Messages API 是单轮推理——你发 prompt,拿 completion。要做多轮工具调用,你得自己写整个 loop:解析 tool_use → 执行 → 构造 tool_result → 再调 API → 重复。还要自己管上下文窗口、会话持久化、重试逻辑。Agent SDK 把这些全封装了,20 行代码替代 600 行自建 harness。
Q: 可以用 Claude Agent SDK 调其他模型吗?
不能。Claude Agent SDK 是为 Claude 系列模型(Sonnet 4.6、Opus 4.7、Opus 4.8)设计的,底层的 agent loop 行为依赖 Claude 的工具调用格式。如果你需要多模型灵活性,LangGraph 或 crewAI 是更合适的选择。
Q: Agent SDK 和 MCP 是什么关系?
MCP 是协议——定义工具暴露的标准方式。Agent SDK 是客户端——消费 MCP Server 的运行时。你可以把 MCP Server 想象成 USB 接口的标准,Agent SDK 是插 USB 的设备。写一次 MCP Server,所有 MCP 兼容客户端都能用。
Q: 子Agent 为什么需要独立配置权限?
安全隔离。主 Agent 有文件编辑权限不代表子Agent 也应该有——你可能想让子Agent 只读文件但能搜索,或者限制子Agent 只能操作特定目录。权限不继承是设计上的安全默认,这确保了即使一个子Agent 的行为失控,也不会影响其他正在执行的并行任务。
小结:你今天就能用的三个起点
如果你只有 10 分钟,不用通读全文,做这三件事就能立刻提升 Agent 的可靠性:
- 给现有 Agent 加一行
max_turns=20——这是最便宜的保险,防一个死循环烧掉整月 API 预算 - 把自定义工具的异常改成
return {"isError": True}——从此工具调用失败不会杀死整个 Agent,Claude 会把错误当数据继续推 - 加一个
PreToolUsehook 拦截rm -rf——5 行代码防止一个误操作毁掉整个项目目录
这三件事做完,你的 Agent 就从"玩具级"提升到了"敢在半夜无人值守跑"的生产级水平。后续可以逐步叠加审计日志、MCP 自定义工具、并行子Agent 编排,最终建成完全自动化的 Agent 工厂。
*参考来源:*
- Anthropic Claude Code 官方 Agent SDK 文档:code.claude.com/docs/en/agent-sdk
- Totalum "Claude Agent SDK in 2026" 深度分析:totalum.app/blog/claude-agent-sdk-totalum-2026
- Augment Code SDK 技术指南:augmentcode.com/guides/claude-agent-sdk-agent-loops-tool-calls
- Hermes Agent v0.19.0 "Quicksilver" Release:github.com/NousResearch/hermes-agent/releases/tag/v2026.7.20
#AI创业 #Agent工坊 #ClaudeAgentSDK #AI自动化 #一人公司
本文由AI辅助创作,经人工审核编辑发布
更多一人公司案例与工具,微信搜索「AI创业内参」关注我们



