QueryEngine + query.ts 构成的双层 Agent 执行引擎,无限循环驱动多轮工具调用与上下文管理。
mutableMessageswhile(true) 无限循环主体isConcurrencySafe() 每个工具自声明AutoCompact检查 · snip压缩 · Microcompact · Context Collapse · Token阻塞判断
for await (message of deps.callModel({messages, systemPrompt, tools, signal}))
一旦 tool_use 块到达,立即投入 StreamingToolExecutor 排队执行
runTools(toolUseBlocks, ...) — 按并发安全性分批执行
并发安全批:读文件/Glob/Grep/MCP工具 → 并行 | 非并发:写文件/Bash → 串行
AbortController 中断 · maxTurns 限制 · Stop Hooks 阻止继续 · Token 预算耗尽
转录持久化 · 构建 SDKMessage · 提取最终结果文本 · yield result{type:'success'}
reason: 'completed'助手最终消息中无 tool_use 块(needsFollowUp = false),且 stop hooks 未阻止继续。
reason: 'aborted_streaming'检测到 abortController.signal.aborted,生成缺失工具结果的中断消息后退出。
reason: 'max_turns'达到 maxTurns 上限,附加 max_turns_reached attachment,QueryEngine 转换为 error_max_turns 结果。
reason: 'blocking_limit'Token 数超过阻塞阈值(且无法压缩),返回 PROMPT_TOO_LONG 错误消息。
reason: 'stop_hook_prevented'外部 stop hook 返回阻止信号,Agent 不继续下一轮,直接结束。
action: 'continue' nudgeTOKEN_BUDGET 特性启用时,若未达目标 token 数,自动注入 nudge 消息推动 Agent 继续工作。
当 API 返回 413 prompt_too_long 时,临时扣留错误消息,尝试对历史消息进行摘要压缩(调用独立压缩 API),然后重试原请求。仅尝试一次,失败则将原始错误返回给用户。
当模型触发 max_output_tokens 限制时:第一次尝试升级到 64k max_tokens(ESCALATED_MAX_TOKENS),之后最多重试 3 次,每次注入 meta 消息 "Output token limit hit. Resume directly—no apology..." 驱动模型继续输出。
当 API 抛出 FallbackTriggeredError(通常因主力模型过载)时,自动切换到 fallbackModel,清空当前轮次的所有消息(Tombstone),用新模型重新发起请求。同时注入系统通知消息告知用户已切换。