gateway 收 /v1/chat/completions
→ agentCommand(按 sessionKey 准入) src/agents/agent-command.ts:199
→ runEmbeddedAgent run-orchestrator.ts:110
→ runPreparedEmbeddedLoop run-loop.ts:254 while(true) 外层
→ runEmbeddedAttempt run/attempt.ts:64(装配工具+提示词+历史)
→ Agent.prompt agent.ts:444(重入保护:二次调用抛错)
→ runAgentLoop → runLoop agent-loop.ts:68/141/214 ← 主循环
外层 while(true): # 重试/compaction/排队消息的宿主
# 预算:24+8/档案,min 32,max 160 次
while (hasMoreToolCalls): # agentic 主循环
① abort 检查
② pending/steering 消息提交进 transcript
③ streamAgentResponse 调 LLM(流式)
流中 toolcall_end → 工具提前入队执行
④ stopReason 判定:
toolUse → 执行工具 → 结果(含 isError)回填 → 继续
error/aborted → providerFailed 终止
stop → 看 endTurn / terminate 钩子
⑤ tool results 追加回 context.messages
⑥ turn_end 事件 → prepareNextTurn 钩子(可换模型/思维档)
排空 followUp 队列;无新消息 → agent_end
| 项 | 值 / 语义 | 出处 |
|---|---|---|
| stopReason 词表 | stop | length | toolUse | error | aborted | llm-core/src/types.ts:357 |
| 继续循环的条件 | 还有 tool calls 未消化,或 endTurn===false 续跑 | agent-loop.ts:317-322 |
| 工具形态 | 进程内函数 execute(id, args, signal);MCP 工具包装成同形态;串行/并行可配 | agent-loop.ts:443/498-510 |
| 工具失败 | 不是异常:isError:true 结果回填给模型,让它自我纠错 | agent-loop.ts:1140-1147 |
| 重试预算 | 24 基数 +8/档案,min 32 / max 160 次 | run/helpers.ts:51-54 |
| idle 看门狗 | 云端 120s / 自托管 300s | docs/concepts/agent-loop.md:205 |
| compaction 触发 | tokens > contextWindow − reserve(16384),保留最近 20000 tokens | compaction.ts:196-199 |
| compaction 语义 | 不是 stopReason:在 assistant 消息后发生,成功后 continue() 续跑 | agent-session-prompting.ts:88 |
| transcript 持久化 | JSONL→SQLite,只追加不重写;compaction 也作为 entry 落盘 | session-manager-entries.ts:515-530 |
| 并发隔离 | 每会话一个 lane(并发=1)串行;跨会话并行;Agent.prompt 重入直接抛错 | command-queue.ts:121-126 |
provider 流 → agent-stream-response.ts(text_delta/toolcall_end 事件)→ Agent 事件总线 →
gateway onAgentEvent。另有一条旁路:OPENCLAW_RAW_STREAM=1 +
OPENCLAW_RAW_STREAM_PATH 时,订阅 handler 把 text/thinking delta 和 message_end
以 JSONL best-effort 追加到共享文件(embedded-agent-subscribe.raw-stream.ts:24-52)——
这就是 Easel tail 的 /tmp/easel-raw-stream.jsonl。每行带 runId/sessionId,
多会话交错写入时靠 runId 闩锁认领自己的行。