用 dsh-multica-runtime 把 DeepSeek Harness 接到 Multica

前言

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。仓库主题带 dshdsh-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.1package.jsonprivate 为 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 的 stdiostreamable-http 两种传输。

一次进程只接受一条 execute。后续同 request_idcancel 会把正在跑的 agent 取消掉。命令体超过 8 MiB、或版本号不是 1,会以 protocol_error 拒绝。

execute 可带的字段包括工作目录 cwd(必须是绝对路径)、提示词、可选的 resume_session_id、模型与思考强度,以及一组 MCP 服务器配置。恢复会话时,若原会话的工作目录和本次 cwd 不是同一目录,会以 DSH_RESUME_REJECTED 失败,而不是默默换目录继续。

运行过程中,桥接层把 DSH 会话事件翻译成协议帧:textthinkingtool_calltool_resultusage,最后一条 resultcompleted / 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.jsonengines^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 之间的桥。

使用前值得记住这几条:

  1. 权限与许可证。 插件以当前 dsh 进程权限运行。package.json 许可证为 UNLICENSED,GitHub 未声明 SPDX 许可证,不要默认按 MIT 来理解再分发。
  2. 预览版兼容性。 DeepSeek Harness 处于开发者预览,官方说明会有破坏性变更。本仓库当前验证的是 @deepseek-ai/dsh@0.1.0-rc.6。dsh 升级后应重新跑 pnpm check--probe
  3. 无交互审批。 运行时是 headless:不会弹出询问,审批按一次性放行处理。不适合必须在每一步人工确认的工作流。
  4. 一次进程一条任务。 重复的 execute 会被协议拒绝。会话恢复还要求工作目录一致。
  5. 密钥不要进仓库。 API Key、MCP 密钥、会话日志、生成的 profile 都不要提交。stdout 是协议通道,排障看 stderr。
  6. 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)

羽毛球分组比赛记分
小程序二维码

欢迎使用《羽毛球分组比赛记分》微信小程序

小夜