用 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

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

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

小夜