第 12 讲:LLM 适配器与流式通信

DeepSeek Harness 源码解析 · 第 12 讲

DeepSeek Harness 源码解析系列 第 12 讲:LLM 适配器与流式通信 基于 DeepSeek Harness 源码 · 2026-08-27 一、概述 前一讲我们解析了 System Prompt 的组装机制,理解了 Harness 如何将用户指令、技能描述、上下文信息合并成完整的对话提示。今天进入 LLM 通信层——Harness 如何把组装好的消息发送给远程模型,又如何把流式响应解析回结构化数据。 LLM 通信是整个 Agent 循环的"最后一公里",它涉及三个关键阶段: LLM 通信三阶段 🔹 序列化 (Serialize) — 将 Harness 内部的消息格式转换为 OpenAI 兼容的 JSON 请求体 🔹 传输与 SSE 解析 (Transport + SSE) — 发起 HTTP 请求,逐帧解析 Server-Sent Events 流 🔹 翻译 (Translate) — 将 SSE 原始载荷翻译为 Harness 的 StreamChunk 协议 二、LlmRuntime:适配器注册中心 LlmRuntime 是 LLM 层的入口点,负责管理所有 LLM 适配器的注册、配置解析、模型路由和流式分发。源码位于 packages/llm/llm/src/index.ts。 📄 packages/llm/llm/src/index.ts(LlmRuntime:注册 + prepareCall) export class LlmRuntime extends Service { private adapters = new Map<string, AdapterRegistration>() // provider → 适配器注册表(路由核心) private directory = new Map<string, LlmConfigurableProvider>() // 可配置 provider 目录 private discoveries = new Map< // 模型发现回调(provider → 发现函数) string, (request: LlmModelDiscoveryRequest) => Promise<readonly LlmDiscoveredModel[]> >() constructor(ctx: Context) { super(ctx, 'llm') // 在 Cordis 中注册为 "llm" 服务 } /** 为给定 provider 路由注册适配器(全有或全无)。 */ registerAdapter(providers: string[], adapter: LlmAdapter): AdapterRegistrationHandle { const owned = new Set<string>() // 本次注册当前持有的路由集合 let released = false // disposer 是否已执行 const dispose = this.ctx.effect(function* (this: LlmRuntime) { // 注册为 fiber effect,随会话销毁 if (providers.length === 0) throw new LlmError('an adapter must register at least one provider', 'INVALID_ADAPTER') this.commitRoutes(owned, this.prepareRoutes(providers, adapter, owned)) // 提交:provider 重复则整体拒绝 yield () => { // disposer:销毁时释放路由 released = true for (const provider of owned) this.adapters.delete(provider) owned.clear() this.emitAdaptersUpdated() // 通知拓扑观察者(非否决式) } }.bind(this), 'llm.registerAdapter()') const handle = (() => voi…

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