dsh-kimi-bridge: Bridging Kimi CLI into DeepSeek Harness

前言

用 dsh(DeepSeek Harness)做智能体工作流时,常会遇到这样的需求:主智能体想找一个外部编码智能体出第二意见,或者把一段编码任务并行交出去。如果走 Kimi CLI,手工做法是自己 spawn kimi -p、捕获输出流、轮询状态、再把结果接回 dsh 会话——这类脚手架代码重复且容易出错,正是 harness 插件该替你消掉的东西。

下面介绍的 dsh-kimi-bridge 做的就是这件事:把 Kimi CLI 变成 dsh 里可直接调用的工具,并在 WebUI 里提供对应的观察界面。

这是什么

dsh-kimi-bridge 由 pandashere 维护,许可证为 MIT,当前版本 0.1.0。一句话定位:这是一个 host + browser 双面的 DeepSeek Harness 插件,把 Kimi CLI(kimi-code)桥接进 harness,是 dsh-codex-bridge 的 Kimi 对应版本,两者架构相同。

「双面」指插件同时覆盖两端:host 端向 dsh 注册工具,浏览器端由 /plugins/dsh-kimi-bridge/client.js 提供界面。DSH 的理念是「一切皆插件」,外部 CLI 的能力就是通过这个机制接进会话的。

四个工具

call_kimi

call_kimi 在当前会话的工作目录运行 kimi -p <prompt> --output-format stream-json,支持两种模式:

  • async:立即返回,多次调用可以并行;
  • block:等待最终答案;传入 kimi_session_id 时改为等待一个先前启动的会话,取消阻塞等待会中止对应的 kimi 会话。

参数结构如下:

call_kimi: { prompt, mode?: async|block, model?, timeout_ms?, kimi_session_id? }

每次 call_kimi 都是一次性运行全新的 kimi -p。CLI 本身不支持运行中的实时 steering;kimi-code 的思考过程不写入 stream-json,插件也不会从 stderr 猜测推理内容。

kimi_status 与 kimi_abort

kimi_status 列出当前 dsh 会话的全部 kimi 会话,包括状态、prompt 预览和进度。kimi_abort 接收 { kimi_session_id },对进程组先发 SIGTERM,超过 killGraceMs 后升级为 SIGKILL。

kimi_steer

kimi_steerkimi -S <session_id> -p … 继续一个已结束(settled)的父会话:

kimi_steer: { kimi_session_id, prompt, mode?: async|block, model?, timeout_ms? }

新记录通过 parent 链接回父会话,并继承父会话的模型。Kimi 会话绑定工作目录:插件把 cwd 锁定到会话工作目录,保证续接发生在同一目录。会话是线性的——父记录必须是最新记录,一个会话同一时间只能有一个活动续接。

WebUI:Kimi 标签页

插件在会话面板里注册一个 Kimi 标签页,位于 Codex 之后。

左列是当前 dsh 会话的全部 kimi 会话,带状态点、prompt 预览和相对时间,点击选中。右列显示状态徽章、meta(id/kimiId/cwd/model/duration/exit/error)、prompt,以及 Activity | Text 两个视图:

  • Activity:Agent Loop 瀑布图,包含消息、带参数的工具行、可折叠的工具输出和 turn 分隔符;
  • Text:流式 transcript 与最终答案。

状态变化通过会话投影通道实时推送(kimi/session 事件、kimi/sessions 投影),标签页随之即时更新;刷新页面后通过历史回放恢复。

reviewOnly:默认只读白名单

先说清设计立场:这是一个 UX 通道,不是安全边界。kimi -p 内部以 permission:"auto" 运行,CLI 没有沙箱标志可用。

因此插件默认 reviewOnly: true:kimi 在一个受管 home 下运行,其 [tools] 白名单只含只读工具——ReadReadMediaFileGrepGlob,没有 Bash/Write/Edit/MCP——并且在工具执行前再次强制。把它改成 false 意味着切换到用户不受限的 home,这是显式的运维选择,不应被称作沙箱。reviewOnly 是工具白名单,不是沙箱;真正沙箱化的 workspace-write 需要 OS 级隔离(container/namespace)。

凭据方面:插件不把凭据复制进仓库或 dsh telemetry;reviewOnly 模式下,受管 Kimi home 通过符号链接指向 CLI 现有的认证文件,CLI 仍是凭据的所有者。Kimi 自身的遥测通过子进程环境变量 KIMI_DISABLE_TELEMETRY=1 禁用。

安装与启用

先确认环境:Node.js 22 或更新(engines: node >=22)、@deepseek-ai/dsh@0.1.0-rc.6,以及一个已认证、可用的 kimi CLI(或在配置里设置 kimiPath)。

第一步,在插件目录里构建、校验并打包:

npm install
npm run check   # typecheck + tests + compliance
npm pack

npm run check 依次跑类型检查、测试和合规校验;npm pack 生成独立 bundle 的 tarball dsh-kimi-bridge-0.1.0.tgz。如果你要改源码,npm run build 会分别用 tsc 编译 host 端、用 esbuild 打包浏览器端。

第二步,把 tarball 安装进 web profile 并重启 dsh web

npx @deepseek-ai/dsh@0.1.0-rc.6 plugin --profile web add ./dsh-kimi-bridge-0.1.0.tgz
npx @deepseek-ai/dsh@0.1.0-rc.6 web

第三步,验证浏览器端已就位。浏览器侧代码由 /plugins/dsh-kimi-bridge/client.js 提供,可以对照运行中的默认 Web profile 检查:

curl -s http://127.0.0.1:3080/plugins/dsh-kimi-bridge/client.js | head

经过上面的步骤,会话面板里应能看到 Kimi 标签页。注意不支持以源码目录 link 方式安装,因为 host 端的 peer 依赖由 DSH profile 提供。更新时用新的 package version 重新打包,移除已安装的 bundle,加入新 tarball 并重启。卸载命令如下:

npx @deepseek-ai/dsh@0.1.0-rc.6 plugin --profile web remove dsh-kimi-bridge

配置项

README 明确列出以下配置项及默认值:

配置项 默认值 含义
kimiPath kimi kimi 可执行文件(绝对路径或 PATH 查找)
reviewOnly true [tools] 白名单为只读的受管 home 下运行 kimi
kimiHome '' 配置与认证的来源 home('' = KIMI_CODE_HOME,否则 ~/.kimi-code
reviewHomeDir '' 受管 review home('' = $DSH_HOME/kimi-review-home
maxTimeoutMs 1800000 任何会话超时的硬上限(30 分钟)
defaultTimeoutMs 600000 每个 kimi 会话的默认存活时间(10 分钟)
maxParallel 3 并发 kimi 进程的全局上限
maxSessionsPerSession 8 每个 dsh 会话的活动 kimi 会话上限
maxRetained 16 每个 dsh 会话保留的已结束记录数(最旧淘汰)
maxPromptChars 16384 prompt 长度上限(argv prompt;拒绝 NUL,超长 prompt 直接拒绝)
maxTranscriptChars 16384 事件与投影中记录的 transcript 上限
maxLoopSteps 32 Agent Loop 窗口保留的步数
maxLoopBytes 16384 Loop 窗口的序列化字节上限(UTF-8,淘汰最旧的已完成步骤)
allowedAgents roots 谁可以调用 call_kimirootsall
killGraceMs 10000 SIGTERM 到 SIGKILL 的宽限期

两个超时项值得单独说明:kimi 的 print 模式可能出现长等待,所以插件用 defaultTimeoutMs(默认 10 分钟)约束单个会话的默认存活时间,用 maxTimeoutMs(默认 30 分钟)作为任何会话的硬上限。allowedAgentsmaxParallelmaxSessionsPerSession 则用来约束资源放大。

已知限制

  • Agent Loop 窗口是近期活动而非审计记录:超过 maxLoopSteps(32)/ maxLoopBytes(16384)时物理淘汰旧步骤,标签页只显示保留窗口(dsh 会话日志本身仍保留完整快照)。
  • reviewOnly 是工具白名单,不是沙箱;真正的 workspace-write 沙箱需要 OS 级隔离。
  • 仅支持 POSIX 进程组(detached + 负 pid kill);Windows 移植需要 Job Object / taskkill /T 树终止。

适用场景与注意

适合的场景很具体:你想让 dsh 主智能体把 Kimi 用作第二意见或并行的编码通道;或者你已经在用 dsh-codex-bridge,想以同样的架构接入 Kimi。

几点注意:

1、插件以当前 dsh 进程的权限运行。安装任何第三方插件前,都应先检查源码与许可证——本项目为 MIT。
2、环境要求:Node.js 22 或更新、@deepseek-ai/dsh@0.1.0-rc.6、已认证且可用的 kimi CLI(否则设置 kimiPath)。
3、reviewOnly 默认为 true,属于工具白名单而非沙箱;需要更大自由度时改为 false 是显式的运维选择。

小结

回到开头的问题:让 dsh 智能体用上 Kimi,原本需要一套 spawn、抓流、轮询、回填的手工脚手架;dsh-kimi-bridge 把它收敛为四个工具加一个标签页——调用可异步并行,会话可续接,Agent Loop 可观察,默认只读白名单兜底。源码与文档在 GitHub:https://github.com/pandashere/dsh-kimi-bridge,许可证 MIT。社区的 DSH 插件目录(独立站点,与 DeepSeek、幻方没有官方从属关系)也可以按插件名检索。

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

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

Xiaoye