第 4 讲:Turn flow 与 Agent 生命周期

DeepSeek Harness 源码解析 · 第 4 讲

DeepSeek Harness 源码解析系列 第 4 讲:Turn flow 与 Agent 生命周期 基于 DeepSeek Harness 源码 · 2026-08-19 一、Turn 是什么 在 DeepSeek Harness 中, turn(回合) 是 Agent 执行的最小完整单位。用户发送一条消息,Agent 经过一轮或多轮 LLM 调用和工具执行,最终产出结果——这就是一个 turn。整个流程由 ReactLoopAgent 驱动,它维护了 Agent 从创建到销毁的完整生命周期。 理解 turn flow 就是理解 Agent 的"心跳"——每一次 LLM 调用、每一个工具执行、每一步决策,都在 turn 的边界内有序发生。 二、Agent 生命周期状态机 Agent 有三种内部状态(Phase),通过状态机在 idle → running → idle 之间切换: 📄 packages/core/agent-loop/src/agent.ts (第 38-47 行) type Phase = | { kind: 'idle'; lastTurn: number } // 空闲态:没有驱动任务在运行 | { kind: 'maintenance' // 维护态:执行非 turn 任务(如 compaction) abort: AbortController // 维护任务的可取消信号 lastTurn: number // 上次 turn 编号,维护态保留 wakeRequested: boolean // 是否有唤醒请求被延迟等待维护结束 } | { kind: 'running'; abort: AbortController; turn: number; step: number; wakeRequested: boolean } // 运行态:正在执行 turn,包含当前 turn/step 编号 设计意图: 三种状态覆盖了 Agent 的全部行为场景。维护态(maintenance)允许在 turn 之间执行后台任务(如上下文压缩),而不会与正常的 turn 执行冲突。每个运行态都有独立的 AbortController ,支持精确的取消控制。 📄 packages/core/agent/src/runtime-types.ts (第 43-50 行) /** * Agent 生命周期状态,每次状态切换时通过 agent/status 事件广播: * idle 表示没有驱动任务;running 表示正在执行 turn。 * Disposal(销毁)是独立于状态机的清理流程。 */ export type AgentStatus = 'idle' | 'running' 对外暴露的状态只有两种: idle 和 running。维护态对外仍然显示 idle,这意味着外部观察者不会感知到后台维护任务的存在——这是一种信息隐藏设计。 三、Turn 驱动循环 3.1 kick() — 引擎启动 当 Agent 收到唤醒信号(followup/steer), wakeDriver() 将状态从 idle 切换为 running,然后调用 kick() 启动主循环: 📄 packages/core/agent-loop/src/agent.ts (第 210-223 行) private async kick(): Promise<void> { try { while (await this.turn()) {} // 循环执行 turn,直到 turn() 返回 false(无更多工作) } catch (_error) { // 已报告的异常和取消在驱动边界被捕获,不向外传播 } finally { // turn 结束后回到 idle 态,保留 turn 编号 if (this.phase.kind === 'running') { const { turn, wakeRequested } = this.phase this.setPhase({ kind: 'idle', lastTurn: turn }) // 如果有延迟的唤醒请求且 inbox 还有待处理消息,重新唤醒 if (wakeRequeste…

阅读全文:DeepSeek Harness 源码解析 第 4 讲