前言¶
在 DeepSeek Harness(DSH)裏用 PTC 的 run_code 寫一小段 TypeScript,再調用宿主暴露的工具,是常見工作流。不少工具的首參是可選對象:模型往往會寫成 await tools.job_list() 或 await tools.job_list(undefined),而不是顯式傳 {}。PTC worker 在把調用交給宿主前,會對綁定參數做 lossless JSON 快照;undefined 沒有可序列化表示,調用會在 worker 側被拒絕,宿主收不到請求,報錯通常是 binding arguments must be lossless JSON。手動改成 await tools.job_list({}) 可以繞過,但很難保證模型每次都寫對。下面介紹 Cordis 插件 dsh-ptc-noargs(維護者 TLEWA,分類:工作流):在不大改 runtime 的前提下,對 run_code 裏 TypeScript function-body 的執行副本注入一行 prelude,把「省略首參」和「顯式 undefined」歸一成 {}。
這是什麼¶
dsh-ptc-noargs 是一個最小的 Cordis 插件,面向 DSH PTC 的 run_code 綁定場景。它監聽共享工具流水線的 tools/execute waterfall;僅當工具是 run_code、程序爲 TypeScript function-body、且參數裏含 code 時,在實際執行的 code 前追加 prelude,用包裝後的 tools 命名空間攔截無參或首參爲 undefined 的調用。
- 倉庫:TLEWA/dsh-ptc-noargs
- 插件目錄頁:skillhub.cn/plugins/TLEWA/dsh-ptc-noargs
- 當前包版本(package.json):
0.1.0 - 許可證:MIT
- peer:
@deepseek-ai/cordis >=4.0.0-rc <5;引擎要求node >=20、dsh >=0.2.2-rc.1(README 寫明在 DSH 0.2.2-rc.1 驗證)
插件不修改 PTC runtime、不修改工具定義,也不改模型與日誌裏的原始 code;只有執行副本帶 prelude。
問題與原理¶
報錯從哪來¶
在 run_code 中若寫成:
await tools.job_list()
await tools.job_list(undefined)
PTC worker 會因 binding 參數無法做 lossless JSON 序列化而失敗,典型錯誤爲:
binding arguments must be lossless JSON
顯式傳對象可以繞過,例如 await tools.job_list({}),但這依賴模型習慣,不穩定。
插件怎麼做¶
prelude 會克隆 tools,對每個函數做薄包裝:首參省略或爲 undefined 時改爲 {},其餘參數原樣傳遞;用戶代碼仍使用名字 tools。null 不會被改寫。插件只處理 run_code 的 PTC 綁定,不適用於原生工具執行器下的普通工具調用。
支持範圍與限制¶
安裝前建議通讀 README 中的限制,避免誤判「沒生效」:
- 僅支持 TypeScript function-body(PTC 默認模式);Python、REPL、script 模式會跳過。
- prelude 佔一行,用戶代碼行號整體後移 1 行;報錯棧中的行號也會偏移。
- 依賴
tools/execute上可替換arguments的執行對象;上游若收緊行爲,插件會安全跳過(warn,不阻斷調用)。 - 已在 DSH 0.2.2-rc.1 驗證;更低版本需自行覈對
engines。
安裝與啓用¶
插件應放在穩定目錄,不要只留在臨時工作區。DSH 社區插件目錄(SkillHub)與 GitHub 倉庫相互獨立,並非 DeepSeek / 幻方官方應用商店;安裝方式以倉庫 README 爲準。
方式一:桌面端插件頁(推薦,通常無需重啓)¶
- 打開 插件 → 添加插件,輸入插件的本地目錄路徑(需先自行將倉庫放到穩定位置,README 示例使用
git clone到固定路徑,此處不重複克隆命令)。 - 安裝後點 立即啓用;管理器顯示「運行中」即已生效。
方式二:CLI(link: 或 .tgz)¶
若 dsh 不在 PATH,可改用 DSH 安裝目錄下的 resources\runtime\cli\bin\dsh.cmd(Windows 路徑以 README 爲準)。
dsh plugin --profile desktop add "link:C:\Users\<you>\.dsh\local-plugins\dsh-ptc-noargs"
也可在插件目錄執行 npm pack,用生成的包安裝(不依賴源碼目錄繼續存在):
dsh plugin --profile desktop add "C:\path\to\dsh-ptc-noargs-0.1.0.tgz"
CLI 安裝後需重啓 DSH;插件頁熱加載通常不用重啓。
卸載¶
dsh plugin --profile desktop remove dsh-ptc-noargs
從插件管理器卸載後立即恢復行爲;CLI 卸載後需重啓。插件不寫入 DSH 安裝目錄;link: 安裝主要在 profile 的 package.json / Cordis 組合中增加一項,卸載後應恢復原狀。
安全提示:插件隨當前 DSH 進程權限運行。安裝前應閱讀 lib/ 與 cordis.patch.yml、確認 MIT 許可證與來源歸屬,再啓用。
典型用法與驗證¶
啓用後,在 run_code 的 TypeScript function-body 中可繼續使用模型常用的無參寫法:
await tools.job_list()
await tools.list_agents()
預期返回正常結果,而不是 binding arguments must be lossless JSON。README 中的對照還包括 await tools.job_list(undefined)、await tools.get_goal() 等;未啓用時同一 await tools.job_list() 會恢復該報錯。
開發者在插件倉庫內可跑單元測試:
node test/prelude.test.mjs
README 說明 12 項測試覆蓋省略首參、undefined、null、非 TS runtime 跳過等情形。
適用場景¶
- 經常在
run_code裏編排 DSH 工具、且模型愛寫tools.foo()/tools.foo(undefined)的開發者。 - 希望少改提示詞、少教模型「空對象也要寫
{}」的工作流場景。 - 不需要 Python / REPL / script 模式下的同類修補(本插件會跳過)。
若你關心 PTC 以外的體驗,同一維護者還在 README 中列出其他 DSH 項目(如 dsh-better-choice、dsh-fastload 等),可按需從 GitHub 查閱,與本插件無安裝依賴。
結尾¶
dsh-ptc-noargs 用一行 prelude 在 run_code 執行路徑上歸一化首參,專門對付 binding arguments must be lossless JSON,改動面刻意保持很小。查閱說明與源碼:GitHub;在 DSH 裏從社區目錄進入:SkillHub 插件頁。