一切皆插件:DeepSeek Harness
内容提要
DeepSeek 开源了 Agent 运行时 DeepSeek Harness(dsh),主打“一切皆插件”,其公式为 Agent = Model + Harness。内核 Cordis 仅负责插件的加载、卸载与依赖管理,模型、工具、沙箱、UI 乃至主循环均为可替换、可卸载且无残留的插件。支持 Web、headless、SDK、ACP 四种模式,通过 YAML 分层组装,模型可见数据全部落盘可追溯。当前为开发者预览,采用 MIT 协议。
延伸解读
插件化内核:Cordis 如何实现无残留卸载
Cordis 内核仅负责插件的加载、卸载与依赖管理,不承载任何 Agent 能力。每个插件通过 ctx.effect() 注册可逆副作用,卸载时自动执行撤销函数,避免孤儿监听或工具残留。依赖通过 inject 声明,服务未就绪时插件不启动,加载顺序由依赖图决定。这种设计让热更新能干净生效,而非依赖重启。
四种运行模式:同一插件树的不同组装
Standard、PTC、Minimal、Creative 并非独立 Agent,而是同一运行时加载不同插件集。Standard 提供完整工具链,适合日常编码;PTC 让模型编写代码编排多轮调用,但每次工具调用仍走审批与沙箱管线;Minimal 仅保留 shell 和文件编辑,适合基准测试;Creative 允许运行时检查与实验。模式切换通过 profile 和 YAML patch 实现。
可追溯性:模型可见数据全部落盘
Harness 将模型可见的数据作为事件追加到 JSONL 会话日志,恢复、分叉、检索和回放共用同一条事件流。投影函数 deriveMessages() 将事件折成模型上下文。失败和重试记录在 assistant/attempt 中,不会伪装成成功回复。这种设计确保每次运行都可追溯,且取消操作不会提交未实际发生的消息。
开发者预览阶段的注意事项
当前为开发者预览,MIT 协议,迭代快且可能有破坏性变更。使用时需隔离 workspace 和 DSH_HOME,避免影响日常环境。默认面向 DeepSeek 兼容 API,其他端点需适配或自写 adapter。Desktop 版独占 profiles/desktop,公共 CLI 无法管理。反馈走 GitHub Discussions,插件开发可参考 Cordis Primer 和 cookbook。
Q&A
DeepSeek Harness 是什么?它和普通 Agent 产品有什么不同?
DeepSeek Harness(dsh)是 DeepSeek 开源的 Agent 运行时,口号是“一切皆插件”,公式为 Agent = Model + Harness。它把模型之外的那一层(工具、会话、沙箱、循环、UI)做成可组装的开源基础设施,而不是像 Claude Code、Cursor 那样把扩展点锁死在核心里。
DeepSeek Harness 的内核 Cordis 是做什么的?为什么说它没有特权内核?
Cordis 是 Harness 的内核,只负责插件的加载、卸载和依赖管理,不承载任何 Agent 能力。模型适配器、工具、会话日志、沙箱、调度、UI 甚至 Agent 主循环本身都是插件,扩展方式永远只有挂插件,不需要 patch 内核。
DeepSeek Harness 支持哪几种运行模式?分别适合什么场景?
支持四种模式:Standard 完整工具,适合日常编码重构;PTC(Programmatic Tool Calling)让模型写代码编排多轮调用,适合长链路任务;Minimal 只留 shell 和文件编辑,适合模型基准和轻量任务;Creative 可检查运行时、内存里试插件,适合开发和实验。
怎么快速启动 DeepSeek Harness 的 Web UI?
需要 Node.js,运行 npx @deepseek-ai/dsh web,默认在 http://127.0.0.1:3080 拉起页面并自动打开浏览器。然后在 Settings → Models 填入 DeepSeek API Key,点 Choose workspace 选项目目录,开一个 session 即可发消息。
如何把 DeepSeek Harness 嵌入自己的 Python 程序?
安装 deepseek-harness-sdk,使用 DeepSeekHarness 上下文管理器,传入 provider、model、cwd、dsh_home、profile 等参数,调用 harness.run() 执行任务。Python 侧没有重新实现 Agent,只是拉起 dsh --profile sdk 并通过 stdio 上的 JSON-RPC 通信。
DeepSeek Harness 如何做到换模型、换工具而不改源码?
通过配置分层组装:profile 列出的 bundle 的 patch、profile 自己的 cordis.patch.yml、$DSH_HOME/cordis.patch.yml、命令行 --patch overlay 按 id 整段替换或插入。换模型只需写一个继承 LlmAdapter 的适配器,实现 stream(),再在配置里把 provider/model 指过去。
DeepSeek Harness 的事件流和可追溯性是怎么设计的?
模型可见的数据必须作为事件落盘,日志是 JSONL(可压缩成 zstd),恢复、分叉、检索、回放共用同一条事件流。事件分 Session、Agent、Capability 三个域,投影函数 deriveMessages() 把事件折成模型上下文,失败和重试记在 assistant/attempt 里。
使用 DeepSeek Harness 时需要注意哪些事项?
第一,隔离:SDK 场景不要指向日常 ~/.dsh 和重要仓库,给它一次性的 workspace 和 home。第二,默认面向 DeepSeek 兼容 API,其他 OpenAI-compatible endpoint 也可接或自己写 adapter。第三,Desktop 是 Electron 套签过名的生产 runtime,独占 $DSH_HOME/profiles/desktop,默认端口 19387。第四,反馈走 GitHub Discussions。