DEEPSEEK HARNESS / 68-PAGE REFERENCE SYNTHESIS

它不是一个 Agent,
而是一座组装 Agent的工厂。

DeepSeek Harness 把模型、提示词、工具、权限、记忆、界面和运行环境拆成插件,再用一个可回放的 Agent Loop 把它们组织成可靠产品。

Profile / Bundle决定“装哪些零件”
Cordis 插件树连接服务、依赖和生命周期
Agent Loop推动一轮轮思考与行动
LLM + Tools推理并改变外部世界
Session Log保存可回放的真实过程
Host / Client变成 Web、桌面或 SDK
READING COVERAGE 68 / 68 FOCUS: ARCHITECTURE & BEHAVIOR CODE-LEVEL DETAILS OMITTED
01

整体架构:七层、四条主线

从“怎么装起来”一直到“用户看到什么”。点击架构图中的模块,可查看它从哪里接收信息、又把什么交给下一层。

关键控制点运行时主干产品与外部世界
01 组合与启动
02 插件运行时
03 Agent 主干
04 能力与控制
05 记忆与状态
06 产品宿主

点击任意模块

输入查看它接收什么。

输出与价值查看它产生什么,以及为什么存在。

LINE A能力注入

Profile 决定装什么,Context 决定当前 Agent 能看见什么。

LINE B控制推进

Agent Loop 领取输入,反复运行模型与工具,直到不再欠工作。

LINE C事实落账

所有模型可见内容和行动结果都先成为 Session 事件。

LINE D产品投影

Host / Client 把日志与实时事件变成用户看到的产品。

02

一次请求,到底怎么跑完

一个 Turn 是“完成这一轮用户意图”,一个 Step 是“一次模型请求 + 这次模型要求执行的工具”。一次 Turn 可以包含很多 Step。

最重要的顺序:先把本步真正使用的上下文和输入落入 Session,再从 Session 派生并冻结请求,然后才调用模型。这样“模型看见过什么”可以被精确重建。
03

记忆:不是一个库,而是一套生命周期

Harness 没有把“记忆”缩成一个向量数据库。它区分原始事实、模型当前能看到的内容、产品需要的派生状态、搜索索引和恢复缓存。

M1

原始事实记忆

所有已经发生并需要在重启后仍成立的事实,按顺序追加到 Session Log。

JSONL / SessionEvent
只追加,不回写历史
M2

模型工作记忆

从原始日志折叠出 Surface:这是模型下一步真正会看到的消息序列。

Surface
current / replaced
M3

上下文抽取与组装

每个 Step 汇入系统规则、动态环境、当前历史、工具清单和新输入。

Prompt Assembly
per step / per scope
M4

压缩记忆

上下文过长时,先裁剪大工具结果,再把较老的一段 Surface 总结成一个新节点。

Compaction
summary + replace
M5

派生工作状态

Projection 增量折叠事件,得到标题、目标、计划、对话 UI、Token 等当前值。

Projection Cache
state + watermark
M6

检索与大内容外置

Query 建立语义文本与全文索引;Spill 把过大的正文外置,日志保留定位符和预览。

Search Index / Spill
locator + retrieval hint
M7

恢复与续跑

重启后读取日志、修复中断边界、重放事件并恢复 Projection,然后继续新的 Turn。

Replay / Resume
single writer

记忆从产生到再次被使用

01 CAPTURE发生事实消息、模型输出、工具动作与结果
02 APPEND追加日志成为带顺序号的持久事件
03 FOLD更新视图Surface 与 Projection 增量变化
04 ASSEMBLE抽取上下文当前历史 + 规则 + 环境 + 工具
05 COMPACT必要时压缩旧上下文被摘要节点替代
06 PERSIST批量持久化flush 提供崩溃存活检查点
07 REPLAY恢复再使用读日志并重建同一模型世界

它不等于什么

  • 不是“把所有聊天扔进向量库”
  • 不是让模型凭空记住上次运行
  • 不是用摘要覆盖并删除原始事实
  • 不是 UI 状态本身充当持久事实

它实际是什么

  • 日志保存事实,Surface 决定模型所见
  • Projection 保存“当前状态”的快速视图
  • Compaction 降低上下文压力但保留原始日志
  • Query / Spill 负责找回和承载不适合内联的内容
04

工具与安全:能力经过一条可拦截流水线

模型只是在消息里“提出工具调用”。真正执行之前,Harness 会把它变成受控任务,逐层校验、决策、隔离并记录。

T1

记录请求

模型提出 tool call,先写入 Session,让“为什么执行”可回放。

T2

解析与校验

确认工具存在、参数结构正确、当前 Agent 能看到它。

T3

策略与审批

权限、Hook、审批可允许、拒绝、询问或改写调用。

T4

隔离执行

沙箱、文件守卫、超时和取消共同约束真实动作。

T5

规范化结果

无论成功、失败还是被拒绝,都变成统一、可序列化结果。

T6

落账与反馈

写入 tool/result,交给 UI 展示,也成为模型下一步上下文。

模型可见边界

Tool Schema 决定模型知道哪些能力;作用域限制决定某个 Agent 实际能看到哪些工具。

执行许可边界

权限、审批与单调守卫决定一次请求能否被执行;默认失败会向安全方向收敛。

执行世界边界

文件、命令、终端与 LSP 共用可替换的执行世界,因此可整体搬到远程或沙箱。

中间件规则

Waterfall 监听器只有调用 next() 才会继续;不调用就意味着在这里短路。

并行规则

明确声明可并行的工具可进入滚动池;其他调用形成独占屏障,保留模型顺序。

可审计结果

最终权威结果冻结后再发通知并落入 Session,后续模型与 UI 读取同一事实。

05

Cordis:为什么所有模块能拼在一起

Cordis 不是业务模块,而是 Harness 的“插座、配电盘和生命周期管理员”。它让模块只声明自己需要什么、提供什么,以及何时撤销。

root context
├─ ctx.sessions Session service
├─ ctx.llm LLM adapter
├─ ctx.tools Tool registry
│   ├─ filesystem tool
│   ├─ shell tool
│   └─ web tool
├─ workspace context
│   ├─ scoped settings
│   └─ filesystem provider
└─ agent context
    ├─ tool restrictions
    ├─ prompt contributions
    └─ policy listeners
Context

一个能力容器,也是一层作用域。子层继承父层能力,并可提供自己的局部版本。

Service

稳定的能力名称,例如 sessions、llm、tools。消费者面向名称,不绑定具体实现。

Inject

插件声明依赖。服务没准备好就等待;依赖消失时插件也能停用。

Events

模块之间的协议。既可广播事实,也可形成可拦截的决策流水线。

Fiber

插件的生命周期盒子,拥有其监听器、注册项、定时器和清理动作。

Registry

工具、提示词、UI 模块等通过注册表贡献条目,避免中心模块出现无限分支。

真正的可插拔:不仅是“能装进去”,还要做到依赖可判断、作用域可隔离、事件可拦截、副作用可撤销、实现可替换。
06

同一内核,如何变成不同产品

Web、Desktop、SDK、Headless、ACP 并不是五套 Agent。它们选择不同 Profile、传输和客户端能力,但复用同一运行时主干。

产品入口

  • Web:浏览器交互产品
  • Desktop:内置运行时和安全 IPC
  • SDK:程序化 JSON-RPC
  • Headless:一次性运行
  • ACP:自动化协议宿主

共享 Harness Runtime

  • Cordis 插件树
  • Agent Loop
  • LLM + Tools
  • Session + Projection
  • Policy + Sandbox

用户可见产品

  • Conversation 对话
  • 工具调用卡片
  • 审批与提问
  • 侧栏、Slots、设置
  • 实时流与历史恢复
HOST拥有运行时

创建会话、驱动 Agent、提供存储与远程接口。

TRANSPORT搬运调用与流

把服务方法、会话事件和实时流送到客户端。

CLIENT消费成品状态

读取 Projection 与实时事件,不自己重演所有业务规则。

SLOTS允许界面扩展

插件将功能放进指定位置,中心页面无需认识所有插件。

07

模块索引:每个部分是干什么的

这里按职责而不是仓库目录归类。可搜索模块名或职责,也可按系统分组过滤。

主干

Profile / Bundle

定义一套产品要加载的默认插件和配置层。

协作:把最终插件树交给 App Boot。
主干

Cordis

提供服务容器、依赖注入、事件与可逆生命周期。

协作:连接几乎所有模块。
主干

Agent Core

定义 Agent 身份、状态、Inbox 和实时协调事件。

协作:被 Agent Loop、Host 和插件共同观察。
主干

Agent Loop

执行 Turn / Step 状态机,协调 Prompt、LLM、Tools、Session。

协作:是流程调度者,不是能力实现者。
主干

System Prompt

按顺序、作用域和动态环境组装系统规则、上下文与工具清单。

协作:每个 Step 在请求准备前组装。
主干

LLM Runtime

路由模型适配器,把不同提供方输出统一为标准流。

协作:接收冻结请求,返回文本、思考与工具调用。
记忆

Session

保存只追加事件日志,是模型历史、恢复和审计的事实源。

协作:所有持久事实都通过 session/event 广播。
记忆

Surface

把原始日志折叠为模型当前可见的消息序列,支持替换旧范围。

协作:由 Agent Loop 派生模型请求。
记忆

Session Projection

按事件增量计算标题、目标、计划、UI 节点等当前状态。

协作:Host 与 Client 读取成品视图。
记忆

Projection Cache

保存投影检查点和水位线,恢复时只需重放后续尾部。

协作:加速列表、冷读和恢复,不替代日志。
记忆

Persistence

通过会话句柄保存、读取、flush 和管理单写者所有权。

协作:默认 JSONL 后端提供崩溃后恢复。
记忆

Compaction

在 Token 压力下裁剪工具结果并把旧 Surface 总结为摘要节点。

协作:保留原始日志,只改变后续模型所见。
记忆

Token Meter

估算当前请求压力与各 Surface 节点成本,触发压缩决策。

协作:供 Agent Loop 与 Compaction 使用。
记忆

Session Query

统一查询在线和持久会话,支持事件过滤、全文搜索与谱系。

协作:可由 SQLite 索引提供快速检索。
记忆

Spill

把超大纯文本完整外置,向模型保留预览、定位符和取回提示。

协作:工具结果与会话引用都可使用。
记忆

Title / Telemetry

监听 Session 事件,派生标题和运行统计,不改变事实日志。

协作:作为独立消费者更新产品辅助信息。
能力

Tools

管理模型可见工具、作用域限制、执行模式与结果规范化。

协作:承接 LLM tool call,结果回到 Session。
能力

Filesystem

定义文件读写世界和文件操作策略事件,可替换为远程提供方。

协作:Shell、LSP、编辑工具可共享同一世界。
能力

Shell / Subprocess

启动一次性命令并管理取消、输出与退出状态。

协作:执行前可由 Sandbox 包装。
能力

Terminal / PTY

提供可持续、可交互的终端会话,而非一次性命令。

协作:Host 显示终端,工具读写其状态。
能力

Code Runtime

在受控运行时里执行代码,并可转运嵌套工具调用。

协作:仍然经过统一工具与策略流水线。
能力

LSP

向 Agent 提供代码导航、诊断和语义信息。

协作:与文件系统和工作区绑定。
能力

Web

提供网页读取、交互或网络资源能力。

协作:作为工具能力受审批和结果记录约束。
能力

Workflow / Jobs

组织多步流程或后台任务,并提供收集、停止和状态查询。

协作:把长任务纳入可观察控制流。
能力

Commands

让用户直接触发产品命令,不必先走一轮模型推理。

协作:可启动压缩、设置或其他显式操作。
能力

Subagent / Agent Team

把工作委派给其他 Agent;Team 进一步提供 roster、任务板和邮箱。

协作:子会话拥有持久谱系和受限作用域。
策略

Approval

在高风险动作前发起一次性用户确认;不可回答时向拒绝收敛。

协作:位于工具执行前置阶段。
策略

Permission Presets

把常见允许、拒绝和询问规则组合成部署策略。

协作:影响工具准入,但不改变工具实现。
策略

Sandbox 沙箱

限制进程、路径和系统资源,建立真实执行边界。

协作:包装 Shell、Terminal 等进程入口。
策略

Hooks

在请求、工具或其他生命周期点注入组织级策略和观察逻辑。

协作:借助 Waterfall 拦截或委托。
策略

Goal / Plan / Todo

分别表达长期目标、阶段计划和具体任务状态,并写入会话事实。

协作:Projection 为 UI 提供当前状态。
策略

User Questions

让 Agent 在需要选择时暂停并结构化地向用户提问。

协作:答案作为新的输入唤醒 Agent。
策略

Schedule

表达未来或重复执行的工作安排。

协作:到点后把新工作交回 Harness。
产品

Web Server / Gateway

对外提供调用、流和会话控制接口。

协作:把 Host 内部服务映射给 Client / SDK。
产品

Conversation

把 Session Projection 与实时流组装成用户看到的对话节点。

协作:展示消息、工具卡片、状态与错误。
产品

Client Modules

注册客户端功能、资源和生命周期。

协作:与服务端模块一样支持组合和卸载。
产品

Slots / Sidebar

为插件提供固定 UI 插入点和右侧栏扩展。

协作:中心界面只定义位置,不硬编码所有功能。
产品

Storage / Workspace

管理产品数据域和当前工作区上下文。

协作:为设置、文件、会话和插件提供归属。
产品

Settings / Credentials

保存可配置项和敏感凭据,并把二者分开处理。

协作:供模型适配器、工具和 Host 使用。
产品

Extensions / Skills

通过插件和指令包扩展模型能力、工作流与产品行为。

协作:最终仍挂入 Cordis 服务和事件体系。
产品

Webhook / Attachments

接入外部触发与文件材料,把它们安全地转为会话输入。

协作:创建或唤醒 Session,并保存来源。
08

把它串起来:一次“修改登录错误”任务

用一个完整案例观察模块协作。注意:同一事实会同时服务于模型下一步、UI 展示、持久化和恢复。

01
用户发来任务

“登录页偶尔报错,帮我定位并修复。”消息进入 Agent Inbox。

参与模块Host · Agent Core · Inbox
02
Agent Loop 开启 Turn

记录轮次开始,领取本次输入,设置运行状态。

参与模块Agent Loop · Session
03
组装“本步能知道什么”

合并系统规则、工作区信息、当前历史、可用工具和权限范围。

参与模块System Prompt · Workspace · Tools
04
输入落账并派生请求

实际采用的系统消息和用户消息进入 Session,再从 Surface 得到冻结请求。

参与模块Session · Surface · Token Meter
05
模型决定先搜索代码

LLM 流式返回解释和搜索工具调用;UI 同时显示实时进度。

参与模块LLM Runtime · Live Stream · Client
06
工具调用经过策略

确认工具可见、参数有效、文件读取被允许,然后在工作区执行搜索。

参与模块Tools · Permission · Filesystem
07
结果回到 Session

搜索结果规范化为 tool/result;若内容过大,完整正文 Spill 到外部,模型拿到预览和定位符。

参与模块Tools · Spill · Session
08
进入下一 Step

新的模型请求自动带上刚才的工具结果。模型据此读取文件、提出修改并运行测试。

参与模块Agent Loop · LLM · FS · Shell
09
高风险动作可能暂停

如果需要超出策略的写入或命令,Approval 向用户询问;答案再回到 Agent。

参与模块Approval · User Questions · Inbox
10
上下文太长时压缩

先裁剪很长的测试输出,再把早期调查过程总结成一个 Surface 节点;原始日志仍然存在。

参与模块Token Meter · Compaction · Session
11
任务结束并形成产品状态

记录 Step / Turn 结束;Projection 得到最新对话、标题、计划和状态,Client 立即更新。

参与模块Session · Projection · Conversation
12
下次恢复继续

若应用重启,读取 JSONL,配平中断边界,重放日志和投影,即可恢复当时的模型世界。

参与模块Persistence · Replay · Projection Cache
09

最后,只记住这五件事

掌握这五条,你就能解释大部分 DeepSeek Harness 设计。

DeepSeek Harness 的最小心智模型

它用插件树定义能力,用 Agent Loop 推动工作,用 Session Log 保存事实,用 Surface / Projection 生成不同读法,再由 Host 把同一核心变成不同产品。

  1. 它的核心不是某个模型,而是可组装运行时。
  2. Agent Loop 只协调,不把模型、工具、存储写死。
  3. Session Log 是真源,模型所见必须可从日志重建。
  4. 压缩改变“以后看什么”,不删除“过去发生什么”。
  5. 安全、UI、搜索、遥测都是事件与投影的消费者或拦截器。
遇到新能力

先问:它应该注册成哪个 Service / Tool?属于哪个作用域?

遇到新策略

先问:它应该拦截哪个 Waterfall,而不是修改哪个核心函数?

遇到新状态

先问:这是需要恢复的事实,还是可以从日志派生的 Projection?

遇到上下文过长

先区分大工具结果、可压缩旧历史和必须保留的近期尾部。

遇到新产品形态

先复用 Runtime,改变 Profile、Host、Transport 与 Client 组合。

依据:DeepSeek Harness reference 左侧目录 68 / 68 页;本页区分文档直接事实与跨模块架构归纳,省略源码签名和实现级细节。