整个 Claude Agent SDK 只有一个主入口:query()。本篇完整拆解它的三个核心参数(prompt / ClaudeAgentOptions / 消息流)、五种 permission_mode 的适用场景与安全边界、内置工具组合策略,以及 async for 消息流的正确消费方式——帮你从第一行代码就建立对 SDK 的完整心智模型。
query() 函数。query() 开始from claude_agent_sdk import query, ClaudeAgentOptions
async for message in query(
prompt="找出 auth.py 里会崩溃的 bug 并修复",
options=ClaudeAgentOptions(
allowed_tools=["Read", "Edit", "Glob"],
permission_mode="acceptEdits",
),
):
if hasattr(message, "result"):
print(message.result)query() 的三个核心参数prompt——你想让 Agent 做什么,用自然语言描述即可。Claude 根据任务自己决定调哪些工具、用什么顺序。options(ClaudeAgentOptions)——控制 Agent 行为边界:allowed_tools:预授权工具列表,列在里面的工具 Claude 可以直接调用,不需要每次询问permission_mode:权限模式(见下)system_prompt:给 Claude 的角色定制指令query() 是异步生成器,async for 消费每一条消息,Claude 思考、工具调用、工具结果、最终输出都会依次流出ClaudeAgentOptions 里最容易踩坑的参数:| 模式 | 行为 | 适用场景 |
|---|---|---|
acceptEdits | 自动批准文件读写,其他操作询问 | 本地开发 |
dontAsk | 只允许 allowed_tools 里的工具,其余全拒 | 锁定式无人值守 |
bypassPermissions | 所有工具直接执行,不询问 | 完全隔离的 CI 沙盒 |
auto(TS 专属) | 模型分类器自动判断每个工具调用 | 带安全防护的自主 Agent |
default | 需要你提供 canUseTool 回调处理审批 | 自定义审批流程 |
allowed_tools + dontAsk 白名单锁死,绝不用 bypassPermissions 跑在你的真实文件系统上。allowed_tools 里能填哪些?SDK 内置了一整套:["Read", "Glob", "Grep"] → 只读分析,最安全["Read", "Edit", "Glob"] → 分析 + 改代码["Read", "Edit", "Bash", "Glob", "Grep"] → 全自动化(写代码 + 跑测试 + 修复)query() 不是等 Claude 跑完才返回——它是流式的,每个阶段都吐出消息:async for message in query(prompt="...", options=...):
if isinstance(message, AssistantMessage):
for block in message.content:
if hasattr(block, "text"):
print(block.text) # Claude 的思考过程
elif hasattr(block, "name"):
print(f"工具调用: {block.name}") # 工具名
elif isinstance(message, ResultMessage):
print(f"完成: {message.subtype}") # 最终结果["Read", "Glob"] + dontAsk,确认行为符合预期再逐步开放 Write/BashacceptEdits 是本地开发甜点:既不需要每个操作都手动确认,又保留了对危险命令的询问bypassPermissions 但必须跑在 Docker 容器里,别直接在宿主机跑参考文档
code.claude.com
code.claude.com
This story was produced automatically by a channel. One sentence is all it takes for Neodrop to keep producing for you.