docs.anthropic.com
Claude Code SDK 文档
Anthropic 官方 Claude Code SDK 完整参考,涵盖 CLI 用法、API 接口、输出格式与会话管理

Claude Code 命令行的 --output-format 有三种模式:text 适合管道和文件,json 适合提取元数据(token 用量、stop reason),stream-json 适合长任务实时处理。本篇完整拆解三种模式的输出结构、适用场景和实用脚本组合,包括 CI 审查机器人、批量文档生成和带 session-id 的多轮有状态自动化工作流。
--output-format 三种模式全解——把 Claude 嵌进任何脚本的正确姿势query() 函数——SDK 的 Python/TypeScript 程序化入口。claude 命令,然后把输出管道给下一个工具。--output-format 的三种模式。选错了,你的脚本要么因为 ANSI 转义符乱码挂掉,要么因为格式不固定漏掉关键信息。claude 命令的默认输出是给「人眼看」的:带颜色、带进度状态、有交互提示。claude --print "解释这个函数" | grep "返回值"grep 匹配失败,脚本静默出错,你花半小时 debug。--output-format 就是为这个场景设计的。1| 模式 | 命令 | 输出内容 | 适用场景 |
|---|---|---|---|
text | --output-format text | 纯文本,无颜色,无结构 | 管道进文本工具、写入文件 |
json | --output-format json | 单条 JSON 对象,命令结束后输出 | 需要元数据(token 用量、stop reason)的场景 |
stream-json | --output-format stream-json | 多行流式 JSON,每行一个事件对象 | 实时处理、长任务进度跟踪 |
text 模式:最简单的管道搭档claude --print "用一句话解释什么是 context window" \
--output-format text# 写进文件
claude --print "写一个 Python 函数说明文档" \
--output-format text > docstring.txt
# 管道给 wc 统计字数
claude --print "解释 transformer 架构" \
--output-format text | wc -w
# 过滤关键行
claude --print "列出项目的5个主要风险" \
--output-format text | grep "^[0-9]"text 模式,也需要搭配 --print(或 -p)flag。没有 --print,claude 会启动交互式会话而不是直接运行后退出。json 模式:拿到完整元数据json 模式。result=$(claude --print "分析这段代码有什么潜在 bug" \
--output-format json \
< code.py)
# 提取回答文本
echo $result | python3 -c "import sys,json; print(json.load(sys.stdin)['result'])"
# 提取 token 用量
echo $result | python3 -c "
import sys, json
data = json.load(sys.stdin)
usage = data.get('usage', {})
print(f\"输入: {usage.get('input_tokens', 0)} tokens\")
print(f\"输出: {usage.get('output_tokens', 0)} tokens\")
"json 模式输出的对象结构:{
"type": "result",
"subtype": "success",
"result": "这是 Claude 的回答正文...",
"session_id": "sess_01abc...",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 342,
"output_tokens": 156,
"cache_read_input_tokens": 0,
"cache_creation_input_tokens": 0
},
"is_error": false
}stop_reason 有三个值需要重点处理:end_turn:正常结束,Claude 主动停止生成max_tokens:达到 token 上限被截断——你可能漏掉了后半段回答stop_sequence:命中了你设置的停止序列stop_reason 是判断「Claude 是不是给了完整回答」的唯一可靠手段。stream-json 模式:逐事件实时处理claude --print "对这个仓库做全面的安全审计" \
--output-format stream-json \
< context.txt | while IFS= read -r line; do
type=$(echo "$line" | python3 -c "import sys,json; print(json.load(sys.stdin).get('type',''))" 2>/dev/null)
case "$type" in
"assistant")
# 有新的文本片段
text=$(echo "$line" | python3 -c "
import sys, json
data = json.load(sys.stdin)
for block in data.get('message', {}).get('content', []):
if block.get('type') == 'text':
print(block['text'], end='')
")
printf "%s" "$text"
;;
"result")
echo ""
echo "--- 完成 ---"
;;
"system")
# session_id 等元数据
;;
esac
donestream-json 的事件流结构如下,每行是独立的 JSON 对象:{"type":"system","subtype":"init","session_id":"sess_01...","tools":[...]}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"开始分析..."}]}}
{"type":"assistant","message":{"role":"assistant","content":[{"type":"text","text":"第一个风险是..."}]}}
...
{"type":"result","subtype":"success","result":"完整回答...","usage":{...}}assistant 事件是流式到达的,可以实时渲染进度result 事件包含汇总元数据(token 用量、session_id)--session-id 结合:有状态的脚本--session-id 传递已有会话 ID,实现多轮对话的自动化:# 第一轮:建立上下文
session=$(claude --print "你是一个代码审查助手,专注于 Python 安全问题" \
--output-format json | python3 -c "import sys,json; print(json.load(sys.stdin)['session_id'])")
# 第二轮:基于上下文继续
claude --print "审查这个函数" \
--session-id "$session" \
--output-format json \
< function.py
# 第三轮:追问
claude --print "上面的第2个问题能详细解释吗" \
--session-id "$session" \
--output-format textjson 和 stream-json 的输出里都包含 session_id 字段,可以直接提取后传入下一条命令,串成多步工作流。#!/bin/bash
review=$(git diff HEAD~1 | claude --print "审查这次提交有什么问题" \
--output-format json)
if echo "$review" | python3 -c "
import sys, json
data = json.load(sys.stdin)
print('ok' if 'LGTM' in data.get('result','') else 'needs-review')
" | grep -q "needs-review"; then
echo "::warning::Claude 发现潜在问题,请检查审查意见"
echo "$review" | python3 -c "import sys,json; print(json.load(sys.stdin)['result'])"
fifor file in src/**/*.py; do
claude --print "为这个模块生成 README" \
--output-format text \
< "$file" > "docs/$(basename $file .py).md"
doneclaude --print "分析这份错误日志的根本原因" \
--output-format stream-json \
< error.log | python3 -c "
import sys, json
for line in sys.stdin:
data = json.loads(line)
if data.get('type') == 'assistant':
for block in data['message']['content']:
if block['type'] == 'text':
print(block['text'], end='', flush=True)
" | tee analysis.txtattempt=1
max_attempts=3
while [ $attempt -le $max_attempts ]; do
result=$(claude --print "$prompt" --output-format json)
stop=$(echo "$result" | python3 -c "import sys,json; print(json.load(sys.stdin)['stop_reason'])")
if [ "$stop" = "max_tokens" ]; then
echo "回答被截断,尝试 $attempt/$max_attempts,增加上下文..."
# 用 session_id 追问剩余部分
session=$(echo "$result" | python3 -c "import sys,json; print(json.load(sys.stdin)['session_id'])")
result=$(claude --print "请继续上面未完成的回答" --session-id "$session" --output-format json)
fi
if [ "$(echo "$result" | python3 -c "import sys,json; print(json.load(sys.stdin)['stop_reason'])")" = "end_turn" ]; then
break
fi
attempt=$((attempt + 1))
donetextjsonstream-json--max-turns 参数——在让 Claude 自主运行多步工具调用时,如何精确控制它能走多远。Anthropic 官方 Claude Code SDK 完整参考,涵盖 CLI 用法、API 接口、输出格式与会话管理
claude 命令的全部 flag 说明,包括 --output-format、--print、--session-id、--max-turns 等参数的详细描述
在脚本、CI/CD 管道和自动化工具中嵌入 Claude Code 的完整指南,包含 TypeScript 与 Python 代码示例
围绕这条内容继续补充观点或上下文。