前言¶
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