第 3 课:query() 一键自动化
query() 是什么?
query() 是 SDK 最简单的用法:给 AI 一个任务,AI 自己完成,返回结果。就像发一条微信:"帮我干个活"。
最简单的 query()
import anyio
from claude_agent_sdk import query, AssistantMessage, TextBlock
async def main():
async for msg in query(prompt="用 ls 命令列出当前目录的文件"):
if isinstance(msg, AssistantMessage):
for block in msg.content:
if isinstance(block, TextBlock):
print(block.text)
anyio.run(main)
就三步:调用 query → 循环接收消息 → 处理消息。
DevOps 实战:自动跑测试
import anyio
from claude_agent_sdk import (
query, ClaudeAgentOptions,
AssistantMessage, ResultMessage, TextBlock, ToolUseBlock
)
async def run_tests():
"""让 AI 自动跑测试并分析结果"""
options = ClaudeAgentOptions(
system_prompt="""你是一个 CI/CD 助手。你的职责是:
1. 执行测试命令
2. 分析测试结果
3. 如果有失败,分析失败原因并给出修复建议
4. 输出简洁的测试报告""",
allowed_tools=["Bash", "Read"], # 只允许执行命令和读文件
max_turns=10,
)
print("🔄 开始自动测试...\n")
async for msg in query(
prompt="运行 pytest tests/ -v,分析结果,给出测试报告",
options=options,
):
if isinstance(msg, AssistantMessage):
for block in msg.content:
if isinstance(block, TextBlock):
print(block.text)
elif isinstance(block, ToolUseBlock):
print(f" 🔧 {block.name}: {block.input}")
elif isinstance(msg, ResultMessage):
if msg.total_cost_usd:
print(f"\n💰 本次费用: ${msg.total_cost_usd:.4f}")
anyio.run(run_tests)
ClaudeAgentOptions 参数详解
options = ClaudeAgentOptions(
# === 必知参数 ===
system_prompt="...", # 系统提示词(角色设定)
allowed_tools=["Bash"], # 白名单:允许哪些工具
max_turns=10, # AI 最多操作几轮
# === 常用参数 ===
model="claude-sonnet-4-5-20250929", # 指定模型
cwd="/path/to/project", # 工作目录
permission_mode="default", # 权限模式
# === 高级参数(后面课程会讲)===
hooks={...}, # Hook 安全管控(第 5 课)
mcp_servers={...}, # 自定义工具(第 4 课)
agents={...}, # 多 Agent(第 7 课)
)
permission_mode 权限模式
| 模式 | 行为 | 适合场景 |
|---|---|---|
"default" |
AI 每次用工具都要确认 | 生产环境 |
"acceptEdits" |
自动批准文件编辑 | 开发环境 |
"bypassPermissions" |
跳过所有权限检查 | 纯自动化脚本 |
DevOps 建议:用 "default" + Hooks 做精细化控制(第 5 课会讲)。
更多 DevOps 场景
场景二:代码质量检查
async def lint_check():
options = ClaudeAgentOptions(
system_prompt="你是代码质量检查工具。运行 lint 命令,分析问题,按严重程度排序。",
allowed_tools=["Bash", "Read"],
max_turns=5,
)
async for msg in query(
prompt="运行 ruff check src/ 检查代码质量,列出所有问题",
options=options,
):
# 处理消息...
pass
场景三:日志分析
async def analyze_logs():
options = ClaudeAgentOptions(
system_prompt="""你是日志分析专家。分析日志文件:
1. 找出所有 ERROR 和 WARNING
2. 按时间线排列
3. 分析错误原因
4. 给出解决建议""",
allowed_tools=["Bash", "Read", "Grep"],
max_turns=15,
)
async for msg in query(
prompt="分析 /var/log/app/error.log 最近 1 小时的错误",
options=options,
):
# 处理消息...
pass
场景四:配置文件检查
async def check_config():
options = ClaudeAgentOptions(
system_prompt="你是配置审计员。检查配置文件的安全性和正确性。特别注意敏感信息泄露。",
allowed_tools=["Read", "Grep"], # 注意:不给 Bash!只读不执行
max_turns=5,
)
async for msg in query(
prompt="检查 config/ 目录下所有配置文件,找出硬编码的密码和密钥",
options=options,
):
# 处理消息...
pass
注意这里只给了 Read 和 Grep,不给 Bash——因为检查配置不需要执行任何命令。最小权限原则。
消息类型一览
query() 返回的消息有几种类型:
async for msg in query(prompt="...", options=options):
if isinstance(msg, AssistantMessage):
# AI 说话了 或者 要用工具
for block in msg.content:
if isinstance(block, TextBlock):
# AI 说了一段话
print(block.text)
elif isinstance(block, ToolUseBlock):
# AI 要用工具
print(f"工具: {block.name}, 参数: {block.input}")
elif isinstance(msg, ResultMessage):
# 任务结束了
print(f"费用: ${msg.total_cost_usd:.4f}")
本课小结
- query() 是最简单的 SDK 用法:一次性任务,AI 自己完成
- ClaudeAgentOptions 控制 AI 的行为:工具、轮数、权限、提示词
- DevOps 场景:测试、lint、日志分析、配置检查
- 最小权限原则:只给 AI 需要的工具
课后练习
- 写一个脚本,让 AI 自动检查当前 Git 仓库的状态并生成报告
- 试试不同的
max_turns值,看看对 AI 行为的影响 - 把
allowed_tools设为空列表[],看看 AI 还能做什么