用 dsh-plugin-interpreters 让 DeepSeek Harness 在本地跑 Python 和 Node 代码

前言

DeepSeek Harness(dsh)把智能体能力拆成插件:模型、工具、会话、界面都可以替换或叠加。官方口号是「Everything is a Plugin」。模型能写代码,不等于会话里真能跑通一段脚本;很多时候你需要它在本机执行 Python 或 Node.js,把 stdout、stderr 和退出码原样拿回来,再决定下一步。

社区插件 dsh-plugin-interpreters 就是做这件事的。它向模型暴露 run_pythonrun_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、退出码、耗时,以及是否超时、是否被取消。设置页「插件配置」分区会多一张「解释器路径」卡片,用来指定解释器位置和超时时间;工具描述里会写上当前路径,模型能看见自己将调用哪一个可执行文件。

许可证以仓库 LICENSEpackage.json 为准,均为 AGPL-3.0(版权声明为 Copyright (C) 2026 Huanlin)。GitHub 和目录页把 SPDX 标成 NOASSERTION,是识别结果,不改变源码里的 AGPL 文本。要求 Node.js ≥ 18。客户端清单声明 platformweb,README 也按 web profile 安装。

截至 2026-08-17,GitHub API 显示该仓库 9 星;目录页仍显示 6 星,属于收录缓存,以仓库实时数据为准。

核心功能

两个模型可调用工具

源码 src/tools.ts@deepseek-ai/dsh-toolsdefineTool 注册工具。两个工具的参数相同:

参数 是否必填 含义
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: trueexit_code: 0、stdout 为 hello world

通过 stdin 执行,不走命令行参数

src/runner.ts 使用 Node.js 的 spawn(executable, ['-']),把 code 写入子进程 stdin 后关闭写入端。README 写明这样做没有命令行长度限制。解释器路径可以是 pythonnode 这种 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.yamlinterpreters 命名空间。卡片文案(中文)是:

  • 标题:解释器路径
  • 说明:配置 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/apiPOST /interpreters/api/getPOST /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.tstools.ts

典型用法

安装并启动 web profile 之后,会话里的模型会看到 run_pythonrun_node。工具描述会写明当前解释器路径,以及可以用可选参数 cwd 指定工作目录。

一次调用对应一次 spawn。以仓库单测用过的 Node 代码为例,参数可以是:

{
  "code": "console.log(\"hello world\")"
}

成功时 ok 为 true,stdouthello world。语法错误会得到非零 exit_code 和 stderr;解释器路径写错则 exit_code 为 -1,stderr 里带 spawn 失败信息。

多版本 Python / Node 并存时,不要依赖 PATH 里碰巧排在最前的那个。在设置页把路径写成绝对路径,例如 /usr/bin/python3,保存后工具描述会更新。需要跑较久的脚本时,把「执行超时(毫秒)」调大;默认 30 秒,超时进程会被 SIGKILL

如果只改 cordis.patch.yml、不走设置页,改的是组合层种子配置;用户层仍以 $DSH_HOME/settings.yamlinterpreters 为准。两者同时存在时,运行时解析结果以 settings 叠加后的值为准。

适用场景与注意事项

比较适合这些用法:

  • 让模型在本机验证一小段 Python 或 Node 脚本,根据真实输出继续改
  • 指定虚拟环境、pyenv、nvm 安装的解释器,而不是系统默认的 python / node
  • 需要 stdout、stderr、退出码分开看,而不是只看「跑没跑成功」

使用前要接受几条限制:

  1. 权限与安全。 插件和它拉起的解释器都跑在当前 dsh 进程权限下。code 由模型生成,cwd 也可由模型传入。不要在未审查的会话里对不可信任务打开这两个工具。
  2. 不是沙箱。 源码没有容器、seccomp 或独立用户隔离,只有超时、输出截断和 abort。需要隔离执行应另找沙箱类方案,不要把本插件当成安全边界。
  3. 平台。 package.json 把客户端标为 web;headless 且没有 settings 时,只能用组合层默认路径,设置页卡片不会生效。
  4. 许可证。 AGPL-3.0 对再分发和网络提供服务有源码义务,二次封装前应阅读 LICENSE
  5. 输出上限。 单路 1 MB,超出会截断。不适合当日志收集器。
  6. 版本仍早。 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

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

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

小夜