前言¶
DeepSeek Harness(dsh)把智能体能力拆成插件:模型、工具、会话、界面都可以替换或叠加。官方口号是「Everything is a Plugin」。模型能写代码,不等于会话里真能跑通一段脚本;很多时候你需要它在本机执行 Python 或 Node.js,把 stdout、stderr 和退出码原样拿回来,再决定下一步。
社区插件 dsh-plugin-interpreters 就是做这件事的。它向模型暴露 run_python 和 run_node 两个工具,用本机解释器通过 stdin 执行代码。本文按插件目录页、GitHub 仓库(含 README、package.json、源码)和 npm 包交叉核对后整理:它是什么、装完能做什么、怎么配解释器路径。
需要先说明:下面提到的插件目录(deepseek-harness-plugin.com)是社区收录站点,不是 DeepSeek / 幻方的官方应用商店。安装前应自己看源码和许可证。
这是什么¶
dsh-plugin-interpreters 是一款会话与消息类 DSH 插件,由 GitHub 用户 HuanLinOTO 维护。仓库内部插件名是 dsh-interpreters,npm 包名是 @huanlin/dsh-plugin-interpreters,当前发布版本为 0.1.0(2026-08-13 上架)。仓库创建于 2026-08-12,默认分支 master,GitHub 主题标签为 dsh-plugin。
它解决的问题很具体:给当前会话里的模型两个可调用工具——
run_python:用配置好的 Python 可执行文件跑一段代码run_node:用配置好的 Node.js 可执行文件跑一段代码
代码从 stdin 写入(等价于 python - / node -),执行结果以结构化字段返回,包括 stdout、stderr、退出码、耗时,以及是否超时、是否被取消。设置页「插件配置」分区会多一张「解释器路径」卡片,用来指定解释器位置和超时时间;工具描述里会写上当前路径,模型能看见自己将调用哪一个可执行文件。
许可证以仓库 LICENSE 和 package.json 为准,均为 AGPL-3.0(版权声明为 Copyright (C) 2026 Huanlin)。GitHub 和目录页把 SPDX 标成 NOASSERTION,是识别结果,不改变源码里的 AGPL 文本。要求 Node.js ≥ 18。客户端清单声明 platform 为 web,README 也按 web profile 安装。
截至 2026-08-17,GitHub API 显示该仓库 9 星;目录页仍显示 6 星,属于收录缓存,以仓库实时数据为准。
核心功能¶
两个模型可调用工具¶
源码 src/tools.ts 用 @deepseek-ai/dsh-tools 的 defineTool 注册工具。两个工具的参数相同:
| 参数 | 是否必填 | 含义 |
|---|---|---|
code |
是 | 要执行的源代码 |
cwd |
否 | 子进程工作目录 |
返回值(canonical JSON)字段如下:
| 字段 | 含义 |
|---|---|
ok |
退出码为 0,且未超时、未被取消时为 true |
exit_code |
进程退出码;启动失败时为 -1 |
stdout / stderr |
捕获到的标准输出 / 标准错误 |
duration_ms |
墙钟耗时(毫秒) |
timed_out |
是否因超时被杀掉 |
cancelled |
是否因 abort 信号被杀掉 |
展示给会话的文本由 renderRunCodeOutput 拼出来,大致是:先一行 Exit code: … (…ms),超时或取消时再补一行说明,然后分别列出 stdout / stderr。仓库测试里,对 node 执行 console.log("hello world") 会得到 ok: true、exit_code: 0、stdout 为 hello world。
通过 stdin 执行,不走命令行参数¶
src/runner.ts 使用 Node.js 的 spawn(executable, ['-']),把 code 写入子进程 stdin 后关闭写入端。README 写明这样做没有命令行长度限制。解释器路径可以是 python、node 这种 PATH 里的名字,也可以是绝对路径,例如测试里用过的 /usr/bin/python3。
执行时还有几条从源码能直接读到的边界:
- 默认超时 30000 毫秒,到期用
SIGKILL结束进程 - 调用方可传入
AbortSignal,中止时同样SIGKILL - stdout、stderr 各自最多保留 1 MB,超出后追加
[stdout truncated at 1 MB]或对应的 stderr 提示 - 超时、取消、解释器不存在这类情况写成返回值(
timed_out/cancelled/exit_code: -1),而不是把异常抛给工具层
这是本机 spawn,不是独立沙箱。子进程继承当前 dsh 进程的权限,能访问 cwd 指向的目录和解释器本身能碰到的资源。
解释器路径可配,工具描述会跟着变¶
默认配置写在 cordis.patch.yml:
pythonPath: 'python' # Python 可执行文件路径
nodePath: 'node' # Node.js 可执行文件路径
timeoutMs: 30000 # 执行超时(毫秒)
空字符串或非法超时会回退到上述默认值。运行时在设置页「插件配置」里改,持久化到 $DSH_HOME/settings.yaml 的 interpreters 命名空间。卡片文案(中文)是:
- 标题:解释器路径
- 说明:配置 run_python / run_node 工具使用的解释器路径
- 三个字段:Python 可执行文件路径、Node.js 可执行文件路径、执行超时(毫秒)
改完配置后,host 会注销旧工具再按新配置注册。模型侧看到的 description 会带上当前路径,例如 Python 工具会写 The Python interpreter is located at: /opt/python3.12。没有 settings 服务的 headless 组装会退回 cordis.patch.yml 里的组合层配置,此时 set 接口会报 settings 不可用。
配置卡片走插件自己挂的 HTTP 前缀 /interpreters/api(POST /interpreters/api/get 与 POST /interpreters/api/set),因为 DSH 默认的 settings RPC 白名单不含 interpreters 这个命名空间。对使用者来说,只要在设置页保存即可,不必手调这条路由。
安装与启用¶
社区目录页给出的安装命令是:
dsh plugin add github:HuanLinOTO/dsh-plugin-interpreters
仓库 README 推荐装到 web profile,并同时提供 npm 包名(与 package.json 一致):
dsh plugin --profile web add @huanlin/dsh-plugin-interpreters
官方 dsh CLI 的插件命令形态是 dsh plugin --profile <profile> add …,会转到对应 profile 目录里执行 pnpm。客户端声明为 web,日常应装进 web profile。目录页省略了 --profile,若当前环境要求显式指定,按 README 加上 --profile web。
需要可复现安装时,目录页建议固定 commit 哈希:
dsh plugin add github:HuanLinOTO/dsh-plugin-interpreters#commit
把 commit 换成仓库里实际的提交 SHA。本地开发可以用 link: 指向检出目录,README 示例为:
dsh plugin --profile web add "link:D:/Projects/deepseek-harness/dsh-interpreters"
路径按自己的工作副本修改。
目录页和 dsh 插件机制都提醒:插件以当前 dsh 进程的权限运行,安装时可能执行代码。 从 GitHub 安装时,pnpm 还可能要求允许 prepare 构建脚本。安装前打开仓库看 LICENSE(AGPL-3.0)和 src/ 下的 runner.ts、tools.ts。
典型用法¶
安装并启动 web profile 之后,会话里的模型会看到 run_python、run_node。工具描述会写明当前解释器路径,以及可以用可选参数 cwd 指定工作目录。
一次调用对应一次 spawn。以仓库单测用过的 Node 代码为例,参数可以是:
{
"code": "console.log(\"hello world\")"
}
成功时 ok 为 true,stdout 为 hello world。语法错误会得到非零 exit_code 和 stderr;解释器路径写错则 exit_code 为 -1,stderr 里带 spawn 失败信息。
多版本 Python / Node 并存时,不要依赖 PATH 里碰巧排在最前的那个。在设置页把路径写成绝对路径,例如 /usr/bin/python3,保存后工具描述会更新。需要跑较久的脚本时,把「执行超时(毫秒)」调大;默认 30 秒,超时进程会被 SIGKILL。
如果只改 cordis.patch.yml、不走设置页,改的是组合层种子配置;用户层仍以 $DSH_HOME/settings.yaml 里 interpreters 为准。两者同时存在时,运行时解析结果以 settings 叠加后的值为准。
适用场景与注意事项¶
比较适合这些用法:
- 让模型在本机验证一小段 Python 或 Node 脚本,根据真实输出继续改
- 指定虚拟环境、pyenv、nvm 安装的解释器,而不是系统默认的
python/node - 需要 stdout、stderr、退出码分开看,而不是只看「跑没跑成功」
使用前要接受几条限制:
- 权限与安全。 插件和它拉起的解释器都跑在当前 dsh 进程权限下。
code由模型生成,cwd也可由模型传入。不要在未审查的会话里对不可信任务打开这两个工具。 - 不是沙箱。 源码没有容器、seccomp 或独立用户隔离,只有超时、输出截断和 abort。需要隔离执行应另找沙箱类方案,不要把本插件当成安全边界。
- 平台。
package.json把客户端标为 web;headless 且没有 settings 时,只能用组合层默认路径,设置页卡片不会生效。 - 许可证。 AGPL-3.0 对再分发和网络提供服务有源码义务,二次封装前应阅读
LICENSE。 - 输出上限。 单路 1 MB,超出会截断。不适合当日志收集器。
- 版本仍早。 npm 目前只有 0.1.0,API 和配置通道(README 里曾写 TypertRemote
/api,源码已改为自建/interpreters/api)还可能继续改,以仓库当前src/为准。
小结¶
dsh-plugin-interpreters 给 DeepSeek Harness 补了两块很薄、但常用的能力:本机 Python 和 Node 解释器,以及一张能改路径的配置卡。它不包装复杂工作流,执行模型就是 spawn + stdin + 回收 stdout/stderr/exit。
目录页:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-plugin-interpreters/
GitHub:https://github.com/HuanLinOTO/dsh-plugin-interpreters
npm:https://www.npmjs.com/package/@huanlin/dsh-plugin-interpreters