JSON 与流式输出
消费消息数组、JSONL 事件、最终结果和工具输出预览。
--output-format 决定消息封装形式。它与 --json-schema 不同:选择 json 只获得结构化的事件记录,并不保证模型回答正文是符合业务 schema 的对象。
三种输出
| 格式 | 行为 |
|---|---|
| text | 默认,打印最终回答文本 |
| json | 会话结束后一次输出消息对象数组 |
| stream-json | 发生事件时立即输出一行一个完整 JSON 对象 |
json 数组包含 system/session_start、assistant 与最后的 result。初始化可带 session_id/model;assistant.message.content 包含文本块等内容;result 带 is_error、duration_ms、result、usage 等执行汇总。
qwen -p "Summarize this project." --output-format json > response.json
jq -r '.[-1].result' response.json脚本应先检查 qwen 退出状态再消费结果。普通 result 是字符串,即使任务要求生成 JSON,也不能把它当作已验证对象;需要对象约束时用结构化输出。
流式消费
qwen -p "Explain this module." --output-format stream-json --include-partial-messages--include-partial-messages 增加 message_start、content_block_delta 等 stream_event,默认不启用。--input-format stream-json 则把 stdin 保留给双向消息协议,官方仍标注建设中、面向 SDK 集成;必须同时显式设置 --output-format stream-json。
Goal 的 goal_state 事件不依赖 partial 开关,见无头 Goal。不能只订阅文本 delta 就认为收到了全部状态。
工具结果上限
文本 tool_result.content 在 JSON 字符串序列化后最多 65,536 UTF-8 字节,超出使用确定性的首尾预览。此规则也适用于持久 stream-json、SDK、subagent 工具结果和 Dual Output;text 内部也只保留受限预览。
这不限制整个会话数组、单条完整 JSONL 事件、工具输入或 partial 消息大小。不要把 64KiB 当作解析器可以采用的整行最大长度。
用量提取
官方示例从 result.stats.models 按模型读取 tokens.total,从 result.stats.tools.totalCalls 与 byName 读取工具统计;示例对缺字段使用空对象或 0 回退。
jq '.[-1].stats.models // {} | to_entries | map(.value.tokens.total) | add // 0' response.json
jq '.[-1].stats.tools.totalCalls // 0' response.json保留原始事件和进程退出码有助于区分模型回答、工具错误与执行中断;不要仅将 .result 非空当作任务成功。