一分钟读懂
先建立三个直觉,后面每一节都在为这三句话补细节。
它是什么
裸的大模型只会「你说一句、我答一句」;Harness 是给它装上手和脚的通用底座——能读文件、跑命令、上网、委派子任务,把一件事真的做完。
它怎么拼
整个 Harness 像一套乐高。不止能力是积木,连「指挥模型干活的循环」本身也是一块可拆换的积木,没有一块是焊死的。
它怎么靠谱
模型看到的每一句话都被写进黑匣子日志,可回放、可审计、省 Token,还能随时「分叉 / 恢复」会话。
从「会聊天」到「会办事」
大模型很会说话,但要修 bug、跑测试、写调研,光会说不够,还得能动手。
🤖 裸大模型
只会「聊天」
你问一句,它答一句,不动手
🦾 智能体
会「办事」
读文件 · 跑命令 · 上网 · 委派子任务
😫 自建智能体的五座大山
- 循环逻辑琐碎——请求构造、工具调度、重试,都要自己写
- 能力难插拔——换一个文件系统就得逐处改造
- 上下文膨胀——历史越长,Token 越贵越慢
- 可观测性差——它为什么这么决定,事后难复盘
- 生态碎片化——换个框架就得重写一遍
💡 Harness 的一招鲜
统一的 插件协议 + 事件系统 + 会话日志
把五座大山一次性推平:能力可插拔、循环可替换、每步可回放、上下文省着用。
设计理念:一切皆插件
一条主线 + 四条纪律。
一切皆插件
模型适配器、工具注册表、会话日志、沙箱、审批,连智能体循环本身都是可替换插件。没有焊死的核心。
注册即副作用——装上的东西,卸载时自动还原。
依赖声明式——插件先说「我要什么」,等齐了才启动。
模型可见即已记录——模型看到了什么,日志里就一定有什么。
面向扩展点编程——新行为挂到文档化的扩展点上。
架构:五层,自底向上
底层是内置的 Cordis 框架;每层之间用「服务 + 事件」解耦。
flowchart TB
subgraph L1["🔌 接入层"]
direction LR
A1["Web UI"] --- A2["CLI · dsh"] --- A3["Python SDK"] --- A4["ACP / JSON-RPC"]
end
subgraph L2["🧩 应用组装层"]
B1["Profile / 组合包 Bundle / patch 补丁"]
end
subgraph L3["🧰 能力 seam 层"]
C1["fs · shell · subprocess · terminal · lsp · web · skill · subagent · workflow · sandbox …"]
end
subgraph L4["🦴 核心主干层"]
D1["session · system-prompt · tools · agent · agent-loop · scope · llm"]
end
subgraph L5["⚙️ 框架层"]
E1["Cordis —— Context / inject / Events / Effects"]
end
L1 --> L2 --> L3 --> L4 --> L5
插件树 = 一摞「透明胶片」
越靠上越有话语权,后叠的可以覆盖先叠的。悬停每一层看看它是什么。
能力 seam:插座 · 插头 · 电器
一项能力怎么设计成「能换」?就像标准插座:换厂家的插头,电器照常用。
flowchart TB P["🔌 Service Provider
具体实现 · 本地 / 沙箱"] -->|"实现"| D["🔳 Service Definition
接口契约(「能执行命令」)"] C["🔋 Consumer
使用方 · bash 工具"] -->|"只依赖接口"| D
事件:四种「喊法」
出了事就喊一嗓子,谁关心谁听。点击切换四种分发模式:
会话日志:一台黑匣子
模型做的每一步都记成事件,只增不改。一份日志,四处受用:
flowchart TB
LOG["📼 会话日志(黑匣子 · 只增不改)"]
LOG --> R1["回放 · 逐字重演"]
LOG --> R2["生成上下文 · 按需重算"]
LOG --> R3["分叉 / 恢复 · fork / resume"]
LOG --> R4["排查 · 审计 · 遥测"]
压缩 compaction——对话太长时,把历史「挤水分」成摘要,而不是原样全发。
溢出 spill——不常用的工具结果「挪到仓库」存起来,需要时再取。
智能体循环:思考—动手—看结果
步骤 = 想一次 + 动手一次;轮次 = 从接下活到干完。
组装提示词
sequenceDiagram
autonumber
participant U as 👤 用户
participant D as 🎛️ 驱动器
participant M as 🧠 模型
participant T as 🛠️ 工具
participant L as 📼 日志
U->>D: 下达任务
D->>L: turn/start(开一轮)
D->>M: 组装提示词 + 请求
M->>D: 回复(可能要求调工具)
D->>T: 调用工具(pre → 并发 execute → post)
T->>D: 工具结果
D->>L: step/end(一步结束)
Note over D: 还有活 → 回到模型;干完 → turn/end
能力工具生态
模型适配器像发动机,可以换;工具像工具箱,按需带上。
文件系统
read write edit glob grep read_image
Shell / 终端
bash pwsh terminal_*
代码运行 / LSP
run_code lsp
联网
web_search web_fetch
会话检索
session_search session_event_* session_trace
规划
todo_write exit_plan_mode create_goal get_goal update_goal
定时 / 后台
schedule_* job_list job_output job_kill
子智能体
subagent list_agents send_message interrupt_agent
编排
workflow ralph
自我改装
cordis_define cordis_inspect_* cordis_run cordis_stop
多智能体:包工头派活
主智能体把子任务派给若干子智能体,每个只带自己的工具箱。
flowchart TB M["🧑✈️ 主智能体(包工头 / 总指挥)"] M -->|派活| S1["子智能体 A
工具箱 ①"] M -->|派活| S2["子智能体 B
工具箱 ②"] M -->|派活| S3["子智能体 C
工具箱 ③"]
workflow
流水线总包:拆任务给一大批子智能体,分阶段并发干,最后收口汇总。
Ralph
换个新脑子重看:每轮开一个不带记忆的新智能体,避免旧思路越陷越深。
goal
长期目标 + 进度条:贴在会话上的持久目标,带「进行中/暂停/卡住/完成」状态。
安全:沙箱「安全屋」
智能体要干的危险动作,都被关进屋里,只能在划定的工作区内动手。
flowchart TB
subgraph ROOM["🏠 沙箱「安全屋」"]
direction LR
B1["bash"] --- B2["文件读写"] --- B3["PTY"] --- B4["LSP"]
end
AGENT["🦾 智能体"] -->|"只能在屋内动手"| ROOM
沙箱:bwrap / Landlock / Seatbelt / Windows ACL(与宿主共享内核,非容器)。
审批:操作需审批时,UI 先问你;ask_user_question 可反问你。
凭据:环境变量优先;API key 只写,只存脱敏描述符。
守卫:防重复调用、工具超时强制执行器,防循环空转。
对比分析
| 维度 | DeepSeek Harness | 通用自研循环 | Claude Cowork* |
|---|---|---|---|
| 核心定位 | 通用智能体运行时 | 项目内胶水代码 | 桌面智能体工作台 |
| 架构范式 | 一切皆插件(Cordis) | 定制化单体 | 工具 / 技能 + 托管代理 |
| 扩展方式 | 挂载插件 / patch | 改源码 | 生态插件 / MCP |
| 循环可替换 | 循环本身是插件 | 通常写死 | 产品内置 |
| 自我改装 | 运行时 cordis_* | 无 | 未公开同等能力 |
| 多智能体 | subagent / workflow / ralph / goal | 视实现而定 | 托管代理 |
| 开源 | 是(MIT) | 是 | 否 |
* 竞品信息据公开报道,仅供参考。
接入:同一台引擎,不同的遥控器
Web UI
npx @deepseek-ai/dsh web
默认 127.0.0.1:3080
CLI
dsh web · dsh --profile headless "task" · dsh plugin
Python SDK
deepseek-harness-sdk + runtime-bin,经 JSON-RPC 通信
ACP
Agent Client Protocol 服务器,面向自动化
插件开发
npm 包统一 @deepseek-ai/dsh-*,约 50 分组 / 200+ 包
应用场景
代码重构 · CI 诊断 · 报告撰写 · 大规模审计
参考资料
0.1.0-rc.5 为准;开发者预览阶段演进极快,具体接口与默认值请以官方最新文档为准。对同类产品的对比基于公开报道,仅供参考。