前言¶
DeepSeek Harness(dsh)是 DeepSeek AI 开源的智能体运行时,架构口号是「一切皆插件」:模型适配、工具、会话、审批策略,乃至界面,都做成可替换的插件层。它目前仍是开发者预览,官方仓库写明会有破坏兼容性的变更。
另一边,Multica 用本机守护进程去调度已经安装好的 AI 编程工具:Claude Code、Codex、Cursor Agent 都可以被它发现并执行任务。DeepSeek Harness 也在它的检测列表里,命令名就是 dsh。问题在于:dsh 默认的 Web UI 或交互式会话,并不能直接被 Multica 当一条运行时调用。两边需要一层约定好的协议,而不是去改 DeepSeek Harness 本体。
dsh-multica-runtime 就是这层外部桥接。它叠在 @deepseek-ai/dsh-base 之上,用带版本号的 JSONL 协议走 stdio,让 Multica 守护进程把 dsh 当成一条可探测、可取消、可恢复会话的运行时。本文按插件目录页、GitHub 仓库 README / 源码,以及 Multica 官方文档核对后整理。
社区插件目录 deepseek-harness-plugin.com 是独立站点,与 DeepSeek / 幻方没有官方从属关系,不要把它当成官方应用商店。
这是什么¶
dsh-multica-runtime 是一款「开发与运行时」类 DSH 插件。目录页标注维护者为 forrestchang,收录日期 2026-08-15。GitHub 仓库地址写的是 forrestchang/dsh-multica-runtime,当前实际归属组织 multica-ai,访问前者会跳转到 multica-ai/dsh-multica-runtime。仓库主题带 dsh 和 dsh-plugin,截至本文核对(2026-08-18)GitHub 显示 46 星。
它解决的问题可以收成一句话:在不修改、不内嵌 DeepSeek Harness 源码的前提下,给 Multica 提供一条可调用的 dsh 运行时。README 把它称为 out-of-tree runtime bridge,仓库只包含 Multica 集成层,依赖的 @deepseek-ai/dsh-* 包来自公开 npm。当前 checkout 验证过的版本是 @deepseek-ai/dsh@0.1.0-rc.6 及同系列包。
npm 包名是 @multica-ai/dsh-runtime,版本 0.1.0-private.1,package.json 里 private 为 true,license 字段是 UNLICENSED。GitHub 也没有挂 SPDX 许可证。目录页写「可以查看源码并免费安装使用」,和这份许可证声明并不等同,安装前应自己读源码和许可条款。
核心功能¶
不改 DSH 本体的组合方式¶
DeepSeek Harness 的运行实例由 profile 组成:先叠 @deepseek-ai/dsh-base,再叠外部 bundle。这个插件在 package.json 里声明了 dsh.bundle.patch,指向 cordis.patch.yml。补丁做了几件和 Web UI 不同的事:
- 关掉
hmr,避免一次任务结束后热更新和进程退出打架。 - 关掉
telemetry-otel,README 写明 DSH 遥测由这份 bundle patch 禁用。 - 会话落盘目录优先读环境变量
MULTICA_DSH_SESSION_ROOT。 - 插入
headless-runner,挂载包名@multica-ai/dsh-runtime,不暴露 HTTP 监听。 - 系统提示写明这是无界面运行时,不要调用
ask_user_question;真正需要用户拍板时,把选项写进最终回复。
源码里审批请求被处理成一次性放行(allowed-once),没有交互式问答界面。这和 Multica「守护进程拉起 CLI、拿结果」的模型一致。
带版本号的 JSONL 协议¶
协议版本写死为 1,一问一行 JSON,走 stdin / stdout。诊断信息只写 stderr,stdout 只承载协议帧。Multica 只有在 dsh --profile multica --probe 返回协议版本 1 之后,才会把这条运行时登记上去。
探测成功时,stdout 会写出类似下面的一帧(字段来自源码常量,plugin_version 当前是 0.1.0-private.1):
{"v":1,"type":"probe","runtime":"dsh","plugin_version":"0.1.0-private.1","protocol_version":1}
stdio 模式下,进程先发 ready 帧,再等待唯一一条 execute 命令。ready 里声明的能力包括:会话恢复、协作取消、模型发现、思考强度、token 用量、工具事件,以及 MCP 的 stdio 与 streamable-http 两种传输。
一次进程只接受一条 execute。后续同 request_id 的 cancel 会把正在跑的 agent 取消掉。命令体超过 8 MiB、或版本号不是 1,会以 protocol_error 拒绝。
execute 可带的字段包括工作目录 cwd(必须是绝对路径)、提示词、可选的 resume_session_id、模型与思考强度,以及一组 MCP 服务器配置。恢复会话时,若原会话的工作目录和本次 cwd 不是同一目录,会以 DSH_RESUME_REJECTED 失败,而不是默默换目录继续。
运行过程中,桥接层把 DSH 会话事件翻译成协议帧:text、thinking、tool_call、tool_result、usage,最后一条 result(completed / failed / aborted / cancelled)。工具输出超过 256 KiB 会被截断并标记 truncated。
模型、MCP 与任务令牌¶
模型列表不是写死在插件里的,而是问 DSH 自己的 LLM 服务。Multica 文档要求用 dsh --profile multica --list-models 拿到目录,模型 id 形如 deepseek-official/deepseek-chat,选择时要用完整 id。环境变量 MULTICA_DSH_MODEL 也可以指定默认模型,取值同样是这种 provider/model 形式。
MCP 方面,Multica 在智能体配置里填写的 server,会经协议传给这次执行。桥接层再转成 DSH 的 @deepseek-ai/dsh-mcp-client:本地进程用 stdio,远程用 streamable-HTTP。Multica 的工具对照表里,DeepSeek Harness 这一行「Multica 管理 MCP」和「会话恢复」都是勾选的;Skill 注入目录是 .dsh/skills/。
DSH 默认会从子进程环境里清掉看起来像密钥的变量。这个插件开了一个很窄的口子:只放行 Multica 下发、且以 mat_ 开头的 MULTICA_TOKEN,好让任务里的 multica 命令还能带上任务归属。模型服务商的 API Key 不会走这条路径。DEEPSEEK_API_KEY 由 DSH 自己的凭据机制在进程运行时读取,README 明确要求不要写进这个仓库。
安装与启用¶
目录页给出的安装命令如下,在 DeepSeek Harness 终端里执行:
dsh plugin add github:forrestchang/dsh-multica-runtime
需要可复现安装时,目录页建议固定 commit 哈希:
dsh plugin add github:forrestchang/dsh-multica-runtime#commit
把 #commit 换成实际提交哈希。当前 dsh CLI 管理插件时必须带 --profile。Multica 文档和本仓库 README 都把插件装进名为 multica 的 profile,守护进程也是用这条 profile 做探测。实际使用请写成:
dsh plugin --profile multica add github:forrestchang/dsh-multica-runtime
从本地 checkout 安装时,先构建再按绝对路径添加。README 中的步骤是:
pnpm install
pnpm check
pnpm build
dsh plugin --profile multica add /absolute/path/to/multica-dsh-runtime
pnpm check 会依次做类型检查、测试和构建。路径必须换成你本机仓库的绝对路径。
Multica 侧还要求本机已经装好 dsh 本身。官方安装说明是:先装 Node.js,再执行 npm install -g @deepseek-ai/dsh。有两处版本表述需要分开看:Multica 文档写的是 Node.js 20+;本仓库 package.json 的 engines 是 ^22.19.0 || >=24.0.0。若按本仓库源码构建,应按后者准备 Node。
启动守护进程前设置 DEEPSEEK_API_KEY,或在 dsh 自己的设置里保存。dsh 安装路径不在 PATH 上时,把启动器绝对路径交给守护进程:
export MULTICA_DSH_PATH=/absolute/path/to/dsh
插件目录页提醒:插件以当前 dsh 进程的权限运行,安装时可能执行代码。装之前检查源码仓库和许可证。
典型用法¶
装进 multica profile 之后,先确认协议探测通过。守护进程只有在这条命令成功后才会注册 DeepSeek Harness:
dsh --profile multica --probe
查看运行时自己报上来的模型目录:
dsh --profile multica --list-models
stdio 模式是 Multica 真正拉起任务时用的入口,一般不用手敲;需要排障时可以单独运行:
dsh --profile multica --stdio
本机终端里确认 dsh 能找到、并且已经配置好模型凭据后,再让 Multica 重新检测:
multica daemon start
守护进程已在运行则重启:
multica daemon restart
然后打开 Multica 的运行时页面,目标电脑下面应出现 DeepSeek Harness,状态为在线。之后创建或编辑智能体时就可以选这条运行时。模型请从 list-models 的完整 id 里选;不选则走 dsh 的默认模型。
适用场景与注意事项¶
适合已经在用 Multica 调度本机编码智能体、同时希望任务跑在 DeepSeek Harness 上的人。它不是给 dsh Web UI 换皮肤,也不是通用 MCP 网关。仓库定位很窄:只做 Multica 和 dsh 之间的桥。
使用前值得记住这几条:
- 权限与许可证。 插件以当前 dsh 进程权限运行。
package.json许可证为UNLICENSED,GitHub 未声明 SPDX 许可证,不要默认按 MIT 来理解再分发。 - 预览版兼容性。 DeepSeek Harness 处于开发者预览,官方说明会有破坏性变更。本仓库当前验证的是
@deepseek-ai/dsh@0.1.0-rc.6。dsh 升级后应重新跑pnpm check和--probe。 - 无交互审批。 运行时是 headless:不会弹出询问,审批按一次性放行处理。不适合必须在每一步人工确认的工作流。
- 一次进程一条任务。 重复的
execute会被协议拒绝。会话恢复还要求工作目录一致。 - 密钥不要进仓库。 API Key、MCP 密钥、会话日志、生成的 profile 都不要提交。stdout 是协议通道,排障看 stderr。
- Node 与 PATH。 终端里能跑
dsh,不等于 Desktop 或后台守护进程也能找到它。必要时用MULTICA_DSH_PATH指定绝对路径。
小结¶
dsh-multica-runtime 把 DeepSeek Harness 接到 Multica 的方式很克制:不改上游、不内嵌源码,只用 profile 上的一层 bundle,经 stdio 暴露版本为 1 的 JSONL 协议。探测通过、模型列表能拉到、API Key 就绪之后,Multica 就可以把 dsh 当成和其他编码 CLI 并列的一条本机运行时。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-multica-runtime-forrestchang/
GitHub:https://github.com/forrestchang/dsh-multica-runtime (当前跳转到 https://github.com/multica-ai/dsh-multica-runtime)