前言¶
給 Agent 工作流寫測試,通常要同時應付兩類不穩定因素:模型輸出和外部工具。官方的 dsh-llm-replay 已經能回放模型流;但 HTTP、MCP、數據庫這類工具在測試中仍可能真的訪問網絡、修改數據,或者依賴一臺剛好沒開機的服務,第三方接口在 CI 裏偶爾還會返回 429。
dsh-tool-cassette 是 DeepSeek Harness(下稱 DSH)的社區插件,做法很直接:第一次讓被選工具真實執行,把規範化結果錄進 cassette 文件;之後切到回放模式,真實工具正文調用爲 0,錄好的結果按精確匹配遞迴工具鏈。和手寫 mock 相比,它錄的是 DSH 規範化後的 value/error,回放時還要重新通過當前的輸出契約。下面介紹它的能力、安裝方法和使用邊界。
這是什麼¶
DSH 的理念是「一切皆插件」,dsh-tool-cassette 就是這個機制下的一個社區插件。它的定位寫在 package 描述裏:DeepSeek Harness 葉子工具正文邊界的確定性錄製、完整性校驗與離線回放插件。
幾項基本信息需要先說清楚:
- 由社區成員 Lem0nTea2002 獨立開發和維護,是非官方社區插件,與 DeepSeek 官方無隸屬關係,未獲官方審覈或背書;
- 許可證爲 MIT;
- 當前版本 0.1.0,固定兼容 DeepSeek Harness
0.1.0-rc.8(該版本當前位於 npmnext標籤),安裝與運行需持續使用同一 rc.8 CLI; - Node 引擎要求
^22.19.0 || >=24.0.0;peerDependencies 爲@deepseek-ai/cordis4.0.1、@deepseek-ai/dsh-tools0.1.0-rc.8、@deepseek-ai/schemastery3.18.1。
錄製與回放怎樣工作¶
Record:先真實跑一遍¶
Record 模式下,include 選中的工具(HTTP、MCP、數據庫、本地程序)會真實執行,插件把 DSH 規範的 value/error 寫入版本化 NDJSON cassette,內容包含 additionalContexts 和取消結果。未選中的工具按原有流程執行,錄像機不搶戲。
錄製流程是固定的:
1、獨佔創建 <file>.partial;
2、串行追加 header、call/start、call/result 幀;
3、每幀同步到磁盤;
4、全部調用完成後寫入 complete 尾幀;
5、關閉文件,以 create-only 方式原子發佈正式文件,再刪除 partial。
製品自帶完整性協議:每幀包含連續 seq、前一幀哈希和本幀 SHA-256,最後一幀爲 complete。截斷、幀重複、哈希篡改、協議版本錯誤和缺少尾幀,都會在 Replay 激活前被攔下。正式文件或 partial 已存在時錄製器拒絕啓動;錄製存在未完成調用時保留 .partial 並拒絕發佈正式文件。
需要注意,哈希鏈不含數字簽名:它能發現傳輸損壞、截斷和普通篡改,但面對能重寫全部幀與哈希的攻擊者,應由製品庫補充簽名、WORM 或不可變存儲。
Replay:四項身份精確匹配¶
Replay 時,插件按四項身份判斷是不是同一次調用:
1、工具在調用樹中的結構路徑;
2、工具名稱;
3、遞歸排序對象鍵後的無損 JSON 參數;
4、按調用開始順序分配的 ordinal。
匹配是精確的:參數對象鍵順序無關,{ "city": "武漢", "unit": "c" } 換成 { "unit": "c", "city": "武漢" } 仍能命中;但數組順序、參數值、調用順序或結構路徑一變,回放器立即返回 CASSETTE_MISMATCH。併發調用按開始順序分配 ordinal,支持倒序完成,先開始後結束的調用不會錯配。
Replay 命中後,真實工具正文調用爲 0,保存的成功 value 會重新經過當前的輸出 schema、renderer、presentation meta 和後置策略。所以回放時仍需註冊同名工具,並保持輸出契約兼容:錄像帶只負責保存結果,安檢規則仍由當前的 DSH 執行。
對不上就失敗關閉¶
第一次軌跡偏差會讓回放器進入 poisoned 狀態,後續被選工具持續失敗,真實正文不執行,避免一半讀錄像、一半碰真實服務的混合局面。其餘幾種情況也有明確處置:
- 參數、路徑、順序或工具名不一致:返回
CASSETTE_MISMATCH; - 回放存在額外調用或未消費記錄:headless/CI 進程退出碼爲 1;
- 更高優先級插件短路
tools/execute與tools/post-execute:Record 失效、Replay poison; - 被選調用在
pre-execute或 guard 階段被拒絕:按未進入 cassette 的軌跡失敗關閉。
錯誤診斷只顯示工具、路徑、ordinal 和參數指紋,不回顯原始參數、結果、原始行或絕對路徑。
配置與 CLI¶
配置只有三項¶
interface Config {
mode: 'record' | 'replay'
file: string
include: string[]
}
mode:record執行真實工具並寫製品;replay精確命中並跳過正文;file:正式 cassette 文件路徑,錄製期間使用同路徑加.partial後綴;include:顯式選擇葉子工具,支持精確名稱與*通配符;必須非空,空範圍、空路徑和重複模式在插件啓動時直接失敗。
先驗帶,再放帶¶
dsh-tool-cassette verify .dsh-cassettes/weather.tool-cassette.jsonl
dsh-tool-cassette inspect .dsh-cassettes/weather.tool-cassette.jsonl
verify 完整校驗協議、幀配對、連續 ordinal、哈希鏈與完成尾幀,用退出碼錶達結果;inspect 顯示協議版本、工具數、調用數與消費說明。校驗失敗只輸出結構性原因,不回顯原始行、工具正文或絕對路徑。
安裝與啓用¶
前置條件:已安裝 pnpm,Node 版本滿足 ^22.19.0 || >=24.0.0。插件固定兼容 DSH 0.1.0-rc.8,安裝與運行 profile 請使用同一 rc.8 CLI。
安裝命令:
pnpm dlx --package @deepseek-ai/dsh@0.1.0-rc.8 dsh plugin --profile headless add dsh-tool-cassette
安裝包會通過 cordis.patch.yml 注入一個默認禁用的 tool-cassette 條目。先做錄製:在 profile 的 cordis.patch.yml 中覆蓋它,填寫模式、文件和葉子工具範圍。
- id: tool-cassette
name: dsh-tool-cassette
disabled: false
config:
mode: record
file: .dsh-cassettes/weather.tool-cassette.jsonl
include:
- weather_lookup
- mcp_*_read
跑完一次真實調用後,把 mode 改成 replay,其餘軌跡保持一致:
config:
mode: replay
file: .dsh-cassettes/weather.tool-cassette.jsonl
include:
- weather_lookup
- mcp_*_read
經過上面的步驟,再調用 weather_lookup 時,cassette 會遞出錄製結果,真實工具正文不再執行。
如果想從源碼構建並安裝本地包:
pnpm install
pnpm run demo
pnpm pack
pnpm dlx --package @deepseek-ai/dsh@0.1.0-rc.8 dsh plugin --profile headless add .\dsh-tool-cassette-0.1.0.tgz
相對路徑基於 DSH 進程工作目錄解析。
一次離線回放演示¶
項目自帶的演示(pnpm run demo)可以完整跑一遍這個流程:
1、啓動一個純本地 HTTP 天氣工具;
2、Record 一次,工具正文與網絡請求各發生 1 次;
3、關閉 HTTP 服務;
4、Replay 同一條調用,工具正文與網絡請求都變成 0;
5、返回結果保持一致,cassette 中的記錄全部消費。
整個演示不調用模型,也不產生付費 API 請求。
另外,模型流回放由官方 dsh-llm-replay 負責,本插件只管被選工具正文邊界。兩者組合,可以搭出模型流與工具流均可回放的無密鑰測試。
適用場景與邊界¶
它適合這些情況:
- 給 Agent 工作流做離線迴歸測試;
- 在 CI 中復現一次昂貴或偶發的工具響應;
- 驗證插件升級後,當前 schema、renderer 和後置策略仍能處理舊結果;
- 調試 HTTP、MCP、數據庫或本地程序工具,不想反覆觸碰真實服務。
V1 的能力範圍是:單 Agent、單場景;顯式選擇的葉子工具;成功、結構化失敗、additionalContexts;併發開始順序與倒序完成;調用前取消不消費記錄。以下明確不支持或留待後續版本:
- 多 Agent 與併發 subagent;
- 同時選擇複合工具及其子工具;
concludesTurn: true;- 模糊匹配、參數忽略、自動更新 fixture;
- 延遲與流式取消時序仿真;
- UI、雲端製品庫、benchmark DSL、模型 judge。
還有兩點行爲要知道:回放命中後會消費對應記錄,隨後的 post 階段取消不會回滾消費位置;回放消費狀態只存在於當前進程,全部消費完畢時卸載成功,poison、額外調用或未消費記錄會讓 headless/CI 進程退出碼變爲 1。它不充當緩存、模型回放器或生產冪等層。
安全與使用注意¶
V1 爲了精確回放,會原樣保存規範化後的參數、成功 value、失敗信息、渲染內容和附加上下文。cassette 應按密鑰文件或測試數據庫快照對待:
- 默認
.gitignore已排除 cassette 與 partial; - 只在隔離的本地或 CI 工作目錄錄製;
- 分享前人工檢查全部內容;
- 錄製結束後關閉不再需要的真實憑據;
- 參數指紋沒有鹽,低熵參數仍可能被猜測。
V1 不提供自動脫敏、加密、簽名或遠端製品庫。
最後是通用提醒:作爲社區插件,dsh-tool-cassette 以當前 dsh 進程的權限運行,安裝前應先檢查源碼與許可證(MIT),確認兼容的 DSH 版本後再接入。
結尾¶
dsh-tool-cassette 解決的問題很具體:把一次真實的工具執行變成可校驗、可離線複用的測試製品,用精確匹配和失敗關閉保住對軌跡漂移的敏感度。它和官方 dsh-llm-replay 各守一邊,合起來能覆蓋模型流與工具流的離線迴歸。
- GitHub:https://github.com/Lem0nTea2002/dsh-tool-cassette
- 社區插件目錄收錄頁:https://www.skillhub.cn/plugins/Lem0nTea2002/dsh-tool-cassette (目錄爲獨立站點,與 DeepSeek、幻方無官方從屬關係)