用 dsh-tool-calculator 給 DeepSeek Harness 裝上安全計算器

前言

DeepSeek Harness(命令名 dsh)是 DeepSeek AI 開源的智能體運行時,官方倉庫把它的架構概括成一句話:一切皆插件。模型、工具、技能、會話、沙箱和界面都可以在 Cordis 內核上組合或替換。社區裏另有一份獨立的插件目錄站點 deepseek-harness-plugin.com,它和 DeepSeek / 幻方沒有官方從屬關係,收錄的是社區倉庫,不要把它當成官方應用商店。

智能體做算術並不穩。讓模型心算 15 + 27 * sqrt(9),偶爾會把優先級算錯,偶爾會直接猜一個數。DSH 內置的 bash 工具可以走 echo $((15 + 27 * 3)),但倉庫 README 指出兩條限制:每次計算都要起一個 bash 進程,在 Windows 上尤其貴;bash 算術也不支持 sqrtsinlogpow 這類函數,模型只好再去猜,或者臨時寫一段腳本。

dsh-tool-calculator 做的是另一條路:在進程內註冊一個 calculator 工具,用手寫遞歸下降解析器求值表達式,不 eval、不 new Function、不拉起子進程。本文按社區目錄頁、插件 GitHub 倉庫的 README / package.json / src/evaluate.ts / 測試用例,以及 DeepSeek Harness 官方倉庫交叉覈對後整理。

這是什麼

dsh-tool-calculator 是一款 工具與能力 類 DSH 插件,由 GitHub 組織 omdsh-dev 維護,倉庫地址是 omdsh-dev/dsh-tool-calculator。目錄頁一句話定位是:安全的數學表達式求值器,零依賴、遞歸下降解析,絕不執行任意代碼。README 補充了三個約束:零依賴、零進程、純函數

目錄頁與 GitHub 倉庫目前都顯示 6 顆星。許可證爲 MIT(LICENSE 文件版權行寫作 Copyright (c) 2026 whiteicey),主要語言是 TypeScript。目錄頁標註收錄日期爲 2026-08-03,最近一次推送時間爲 2026-08-14。package.json 裏的包名是 @deepseek-ai/dsh-tool-calculator,版本 0.0.1privatetrue;peer 依賴指向 @deepseek-ai/cordis ^4.0.1@deepseek-ai/dsh-tools@deepseek-ai/dsh-invariants。README 寫明已遷移並驗證到 DSH 0.1.0-rc.6(npm)的 profile / bundle 插件系統。

它解決的問題很具體:把「算一個確定的數」從模型心算和 bash 算術裏拿出來,變成一次工具調用。入口是 evaluate(expression: unknown): number,非字符串直接拋 calculator: expression must be a string,求值結果必須是有限數字,NaN / Infinity(除零、負數開方等)一律拒絕。

核心功能

插件在 Cordis 入口 src/index.ts 裏調用 ctx.tools.register(),註冊名爲 calculator 的工具。工具只有一個必填參數 expression(字符串),超時 timeoutMs 爲 1000 毫秒,canonical 返回值是數字。README 給出的示例是:

calculator { expression: "15 + 27 * sqrt(9)" }  →  96

註冊後會進入 Code Mode SDK,可以寫成 await tools.calculator(...)。工具名滿足 DeepSeek 函數名約束:不超過 64 字符,字符集爲 [A-Za-z0-9_-]

支持的運算以 README 和 src/evaluate.ts 白名單爲準:

類別 項目
算術 + - * / % **(冪,右結合:2 ** 3 ** 2 = 512)
單參函數 abs ceil floor round sqrt log log2 log10 exp sin cos tan
多參函數 pow(x, y) max(a, b, ...) min(a, b, ...)
常量 PI E
分組 ( ),一元正負 +5 -5

優先級是:**(右結合)> 一元 ± > * / % > + -。函數與常量合計 15 個函數加 2 個常量,標識符按名查白名單,查不到就拋 Unknown identifiermax / min 是變參;其餘函數有參數個數契約,例如 sqrt(9, 1)pow(2)abs() 都會因參數個數被拒絕。

安全模型是這款插件真正想強調的部分。解析器分詞法層和語法層,不用 eval,也不用 new Function。詞法層只識別數字字面量、標識符和運算符;引號、分號、反引號、{} [] 會直接報錯。求值只走白名單節點,白名單用 Object.hasOwn 判斷,避免落到 Object.prototype 上的 constructor / toString / __proto__ 一類繼承屬性。表達式長度上限是 500 個字符。倉庫的 tests/evaluate.spec.ts 裏既有功能用例,也有針對構造器逃逸、process 全局、globalThis、引號注入、分號語句等輸入的拒絕用例。

實現上沒有第三方運行時依賴:package.jsondevDependencies 只有 TypeScript、Vitest 和 @types/node,求值函數本身不拉網絡、不起子進程。

安裝與啓用

社區目錄頁給出的安裝命令如下,在 DeepSeek Harness 終端裏運行即可:

dsh plugin add github:omdsh-dev/dsh-tool-calculator

dsh CLI 會從 GitHub 解析插件並裝進當前配置。如需可復現安裝,目錄頁建議固定 commit 哈希:

dsh plugin add github:omdsh-dev/dsh-tool-calculator#commit

#commit 換成實際提交哈希。倉庫 README 針對 DSH 0.1.0-rc.6 的 profile bundle 還補充了按 profile 安裝的寫法。web 和 headless 是兩套不同的 profile:裝到 web 不會自動覆蓋 headless,dsh run 默認走 headless。

# 交互式(web)profile
dsh plugin --profile web add github:omdsh-dev/dsh-tool-calculator

# 一次性任務(headless)profile
dsh plugin --profile headless add github:omdsh-dev/dsh-tool-calculator

也可以先 npm pack 再按本地 tarball 安裝:

git clone https://github.com/omdsh-dev/dsh-tool-calculator
cd dsh-tool-calculator
npm install && npm pack
dsh plugin --profile web add ./deepseek-ai-dsh-tool-calculator-*.tgz
dsh plugin --profile headless add ./deepseek-ai-dsh-tool-calculator-*.tgz

包內 dsh.bundle 指向 cordis.patch.yml,安裝後會把 tool-calculator 條目以 - insert: 的形式插入 profile 的 layer stack。README 特別提醒:DSH 0.1.0-rc.6 的 patch 是按 id 定位的,裸寫 - id: 會報 entry not found,必須用 - insert: 列表包起來。Windows 路徑請用正斜槓,例如 C:/...

驗證安裝:

dsh --profile web --dump-config | grep tool-calculator

package.json 聲明的 Node 引擎是 ^22.19.0 || >=24.0.0。README 推薦用 npx -p @deepseek-ai/dsh@0.1.0-rc.6 dsh web 啓動(lib 生產模式),不要 npm install -g 做全局安裝。

目錄頁和 README 都寫了同一條安全提示:插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。 安裝前應檢查源代碼倉庫和許可證。

典型用法

安裝完成後,agent 會自動拿到 calculator 工具,一般不需要再配一層開關。倉庫給出的運行驗證命令是:

dsh run "使用 calculator 工具計算 1+2*3"

按運算符優先級,這個表達式的結果應是 7。再看 README 裏的完整示例:

15 + 27 * sqrt(9)

先算 sqrt(9) = 3,再算 27 * 3 = 81,最後 15 + 81 = 96。括號會改變順序,測試裏 (2 + 3) * 4 得到 20,而 2 + 3 * 4 得到 14。冪是右結合,2 ** 3 ** 2 等於 512,不是 64

需要角度制的三角函數時,倉庫寫明接口與 Math.sin / Math.cos 一致,用的是弧度。例如 30 度應寫成:

sin(30 * PI / 180)

本地跑測試:

pnpm test

package.json 裏對應腳本是 vitest run tests,也可以走 npm test。測試文件目前有 tests/evaluate.spec.ts(求值與拒絕用例)和 tests/register.spec.ts(工具註冊)。

適用場景與注意事項

比較適合這幾類用法:編碼智能體需要一個確定的算術結果,而不是讓模型心算;表達式裏帶 sqrtlogpow 或三角函數,bash 算術覆蓋不到;希望計算發生在當前進程內,不要爲一次加減去拉起 shell。omdsh-dev 另外維護了合集倉庫 dsh-toolkit,其中也包含同名的 calculator 工具;若只需要計算器,裝這一份獨立插件即可。

使用時有幾條已經寫進 README 和源碼的邊界,不要當成缺陷以外的「隱藏能力」:

  1. 不支持科學計數法。 1e51e-56.02e23 會被詞法層拒絕,錯誤信息是 Scientific notation is not supported
  2. 不支持大整數。 求值走 JavaScript 的 IEEE 754 雙精度,安全整數範圍大約 ±9e15,超出後會有精度損失。
  3. 三角函數用弧度。 需要角度時自己乘 PI / 180
  4. 結果必須是有限數字。 除零、負數開方等得到 NaNInfinity 時,接口會拋錯而不是把特殊值傳回給模型。
  5. 表達式最長 500 字符。 超長輸入直接拒絕。

DeepSeek Harness 目前仍是 developer preview,官方 README 寫明會有破壞性變更。本插件按 README 適配的是 0.1.0-rc.6 的 bundle / patch 語義,換版本前應對照倉庫的版本適配說明。社區目錄不是官方應用商店,安裝命令以目錄頁原文 dsh plugin add github:omdsh-dev/dsh-tool-calculator 爲準。

再次強調:插件跑在當前 dsh 進程裏,權限與宿主相同。即使這款插件的求值路徑刻意避開了 eval / new Function,安裝動作本身仍可能執行倉庫裏的代碼。裝之前讀一下源碼和 MIT 許可證,需要可復現環境時把 commit 哈希釘死。

結語

dsh-tool-calculator 把一件很小、但模型經常算錯的事收成工具:在 DSH 進程內安全地求值數學表達式。它不替代 bash,也不擴展成通用腳本引擎;白名單、有限數字、500 字符上限,都是爲了讓「算一個數」這件事可預期。

目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/dsh-tool-calculator/

GitHub:https://github.com/omdsh-dev/dsh-tool-calculator

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

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

小夜