4.4 SessionProcessor:Agentic Loop 的核心
4.4.1 流式处理的状态机
async process(streamInput: LLM.StreamInput) {
while (true) {
const stream = await LLM.stream(streamInput)
for await (const value of stream.fullStream) {
input.abort.throwIfAborted() // 检查是否被用户中止
switch (value.type) {
// ═══ 思考链处理 ═══
case "reasoning-start":
// 创建新的 ReasoningPart
reasoningMap[value.id] = {
type: "reasoning", text: "",
time: { start: Date.now() },
}
break
case "reasoning-delta":
// 追加思考链文本增量
reasoningMap[value.id].text += value.text
await Session.updatePart({ part, delta: value.text })
break
case "reasoning-end":
// 完成思考链,记录结束时间
part.time.end = Date.now()
await Session.updatePart(part)
break
// ═══ 文本生成处理 ═══
case "text-start":
currentText = { type: "text", text: "", time: { start: Date.now() } }
break
case "text-delta":
currentText.text += value.text
await Session.updatePart({ part: currentText, delta: value.text })
break
// ═══ 工具调用处理 ═══
case "tool-input-start":
// 创建 ToolPart,状态 = pending
toolcalls[value.id] = await Session.updatePart({
type: "tool", tool: value.toolName,
state: { status: "pending", input: {}, raw: "" },
})
break
case "tool-call":
// 参数完整,状态 → running
// ★ 此处执行 Doom Loop 检测 ★
break
case "tool-result":
// 执行成功,状态 → completed
break
case "tool-error":
// 执行失败,状态 → error
break
// ═══ 步骤边界 ═══
case "start-step":
snapshot = await Snapshot.track() // 创建文件快照
break
case "finish-step":
// 统计 token、成本
// 检查是否需要 Compaction
break
}
}
// 本轮完成后的判断逻辑...
}
}4.4.2 工具执行循环
4.4.3 Snapshot 触发时机
4.4.4 Retry 机制
4.4.5 错误恢复策略
Last updated
