Profile / Bundle
定义一套产品要加载的默认插件和配置层。
DeepSeek Harness 把模型、提示词、工具、权限、记忆、界面和运行环境拆成插件,再用一个可回放的 Agent Loop 把它们组织成可靠产品。
从“怎么装起来”一直到“用户看到什么”。点击架构图中的模块,可查看它从哪里接收信息、又把什么交给下一层。
输入查看它接收什么。
输出与价值查看它产生什么,以及为什么存在。
Profile 决定装什么,Context 决定当前 Agent 能看见什么。
Agent Loop 领取输入,反复运行模型与工具,直到不再欠工作。
所有模型可见内容和行动结果都先成为 Session 事件。
Host / Client 把日志与实时事件变成用户看到的产品。
一个 Turn 是“完成这一轮用户意图”,一个 Step 是“一次模型请求 + 这次模型要求执行的工具”。一次 Turn 可以包含很多 Step。
Harness 没有把“记忆”缩成一个向量数据库。它区分原始事实、模型当前能看到的内容、产品需要的派生状态、搜索索引和恢复缓存。
所有已经发生并需要在重启后仍成立的事实,按顺序追加到 Session Log。
从原始日志折叠出 Surface:这是模型下一步真正会看到的消息序列。
每个 Step 汇入系统规则、动态环境、当前历史、工具清单和新输入。
上下文过长时,先裁剪大工具结果,再把较老的一段 Surface 总结成一个新节点。
Projection 增量折叠事件,得到标题、目标、计划、对话 UI、Token 等当前值。
Query 建立语义文本与全文索引;Spill 把过大的正文外置,日志保留定位符和预览。
重启后读取日志、修复中断边界、重放事件并恢复 Projection,然后继续新的 Turn。
模型只是在消息里“提出工具调用”。真正执行之前,Harness 会把它变成受控任务,逐层校验、决策、隔离并记录。
模型提出 tool call,先写入 Session,让“为什么执行”可回放。
确认工具存在、参数结构正确、当前 Agent 能看到它。
权限、Hook、审批可允许、拒绝、询问或改写调用。
沙箱、文件守卫、超时和取消共同约束真实动作。
无论成功、失败还是被拒绝,都变成统一、可序列化结果。
写入 tool/result,交给 UI 展示,也成为模型下一步上下文。
Tool Schema 决定模型知道哪些能力;作用域限制决定某个 Agent 实际能看到哪些工具。
权限、审批与单调守卫决定一次请求能否被执行;默认失败会向安全方向收敛。
文件、命令、终端与 LSP 共用可替换的执行世界,因此可整体搬到远程或沙箱。
Waterfall 监听器只有调用 next() 才会继续;不调用就意味着在这里短路。
明确声明可并行的工具可进入滚动池;其他调用形成独占屏障,保留模型顺序。
最终权威结果冻结后再发通知并落入 Session,后续模型与 UI 读取同一事实。
Cordis 不是业务模块,而是 Harness 的“插座、配电盘和生命周期管理员”。它让模块只声明自己需要什么、提供什么,以及何时撤销。
一个能力容器,也是一层作用域。子层继承父层能力,并可提供自己的局部版本。
稳定的能力名称,例如 sessions、llm、tools。消费者面向名称,不绑定具体实现。
插件声明依赖。服务没准备好就等待;依赖消失时插件也能停用。
模块之间的协议。既可广播事实,也可形成可拦截的决策流水线。
插件的生命周期盒子,拥有其监听器、注册项、定时器和清理动作。
工具、提示词、UI 模块等通过注册表贡献条目,避免中心模块出现无限分支。
Web、Desktop、SDK、Headless、ACP 并不是五套 Agent。它们选择不同 Profile、传输和客户端能力,但复用同一运行时主干。
创建会话、驱动 Agent、提供存储与远程接口。
把服务方法、会话事件和实时流送到客户端。
读取 Projection 与实时事件,不自己重演所有业务规则。
插件将功能放进指定位置,中心页面无需认识所有插件。
这里按职责而不是仓库目录归类。可搜索模块名或职责,也可按系统分组过滤。
定义一套产品要加载的默认插件和配置层。
提供服务容器、依赖注入、事件与可逆生命周期。
定义 Agent 身份、状态、Inbox 和实时协调事件。
执行 Turn / Step 状态机,协调 Prompt、LLM、Tools、Session。
按顺序、作用域和动态环境组装系统规则、上下文与工具清单。
路由模型适配器,把不同提供方输出统一为标准流。
保存只追加事件日志,是模型历史、恢复和审计的事实源。
把原始日志折叠为模型当前可见的消息序列,支持替换旧范围。
按事件增量计算标题、目标、计划、UI 节点等当前状态。
保存投影检查点和水位线,恢复时只需重放后续尾部。
通过会话句柄保存、读取、flush 和管理单写者所有权。
在 Token 压力下裁剪工具结果并把旧 Surface 总结为摘要节点。
估算当前请求压力与各 Surface 节点成本,触发压缩决策。
统一查询在线和持久会话,支持事件过滤、全文搜索与谱系。
把超大纯文本完整外置,向模型保留预览、定位符和取回提示。
监听 Session 事件,派生标题和运行统计,不改变事实日志。
管理模型可见工具、作用域限制、执行模式与结果规范化。
定义文件读写世界和文件操作策略事件,可替换为远程提供方。
启动一次性命令并管理取消、输出与退出状态。
提供可持续、可交互的终端会话,而非一次性命令。
在受控运行时里执行代码,并可转运嵌套工具调用。
向 Agent 提供代码导航、诊断和语义信息。
提供网页读取、交互或网络资源能力。
组织多步流程或后台任务,并提供收集、停止和状态查询。
让用户直接触发产品命令,不必先走一轮模型推理。
把工作委派给其他 Agent;Team 进一步提供 roster、任务板和邮箱。
在高风险动作前发起一次性用户确认;不可回答时向拒绝收敛。
把常见允许、拒绝和询问规则组合成部署策略。
限制进程、路径和系统资源,建立真实执行边界。
在请求、工具或其他生命周期点注入组织级策略和观察逻辑。
分别表达长期目标、阶段计划和具体任务状态,并写入会话事实。
让 Agent 在需要选择时暂停并结构化地向用户提问。
表达未来或重复执行的工作安排。
对外提供调用、流和会话控制接口。
把 Session Projection 与实时流组装成用户看到的对话节点。
注册客户端功能、资源和生命周期。
为插件提供固定 UI 插入点和右侧栏扩展。
管理产品数据域和当前工作区上下文。
保存可配置项和敏感凭据,并把二者分开处理。
通过插件和指令包扩展模型能力、工作流与产品行为。
接入外部触发与文件材料,把它们安全地转为会话输入。
用一个完整案例观察模块协作。注意:同一事实会同时服务于模型下一步、UI 展示、持久化和恢复。
“登录页偶尔报错,帮我定位并修复。”消息进入 Agent Inbox。
记录轮次开始,领取本次输入,设置运行状态。
合并系统规则、工作区信息、当前历史、可用工具和权限范围。
实际采用的系统消息和用户消息进入 Session,再从 Surface 得到冻结请求。
LLM 流式返回解释和搜索工具调用;UI 同时显示实时进度。
确认工具可见、参数有效、文件读取被允许,然后在工作区执行搜索。
搜索结果规范化为 tool/result;若内容过大,完整正文 Spill 到外部,模型拿到预览和定位符。
新的模型请求自动带上刚才的工具结果。模型据此读取文件、提出修改并运行测试。
如果需要超出策略的写入或命令,Approval 向用户询问;答案再回到 Agent。
先裁剪很长的测试输出,再把早期调查过程总结成一个 Surface 节点;原始日志仍然存在。
记录 Step / Turn 结束;Projection 得到最新对话、标题、计划和状态,Client 立即更新。
若应用重启,读取 JSONL,配平中断边界,重放日志和投影,即可恢复当时的模型世界。
掌握这五条,你就能解释大部分 DeepSeek Harness 设计。
它用插件树定义能力,用 Agent Loop 推动工作,用 Session Log 保存事实,用 Surface / Projection 生成不同读法,再由 Host 把同一核心变成不同产品。
先问:它应该注册成哪个 Service / Tool?属于哪个作用域?
先问:它应该拦截哪个 Waterfall,而不是修改哪个核心函数?
先问:这是需要恢复的事实,还是可以从日志派生的 Projection?
先区分大工具结果、可压缩旧历史和必须保留的近期尾部。
先复用 Runtime,改变 Profile、Host、Transport 与 Client 组合。
依据:DeepSeek Harness reference 左侧目录 68 / 68 页;本页区分文档直接事实与跨模块架构归纳,省略源码签名和实现级细节。