dsh-recall 插件介紹:把大工具結果搬出上下文,用 recall(id) 按需取回

前言

DSH(DeepSeek Harness)的運行方式決定了上下文會持續膨脹:每一步的工具結果都會留在會話裏,之後每一步都要重新發一遍。真正喫掉上下文的不是所有結果,而是少數幾個特別大、之後再沒人讀第二次的結果。dsh-recall 就是針對這個點做的插件:大的 tool result 頭尾留在對話裏,中間部分搬到本地 SQLite,模型用 recall("<id>") 把需要的片段取回來。

它由 sh-222 維護,分類在社區目錄裏是「記憶」,當前星標爲 1(目錄頁同時顯示 1 forks),屬於個人維護的小項目,不是 DeepSeek 官方出品。下面介紹它的機制、安裝方式和配置項。

這是什麼

一句話定位:一個 context-reclaim 插件。它不刪不改工具產出,只把超出閾值的結果中間段落移出對話,換成一個短的對象 ID 和一行說明,原全文仍保存在會話日誌和本地存儲裏。

它對已有做法的區別:DSH 自帶的 spill 策略和 15% 壓縮只保留頭部,尾部的檢索提示和摘要會被丟掉;dsh-recall 頭尾都留,並支持模型按字符區間或關鍵字把內容取回。它不是全文壓縮,也不是刪掉舊消息。

核心功能

觸發條件:在下一次工具調用時,凡是「比最新 keep 條數更老」且「長度超過 thresholdChars」的 tool result,會被重寫成 頭部 + [recall] 說明 + 尾部;中間部分按 md5(session:seq:chars)[:8] 命名存爲對象,例如 #4d3661d2。模型在對話裏看到的是這樣的佔位:

XXXX… (600 chars of head) …

[recall] read call_A — 4000 chars total. The head and tail are above and below; the middle 3160
chars are stored as object #4d3661d2. Fetch any part with recall("4d3661d2") (optionally
recall("4d3661d2", start, count)), or search it with recall("4d3661d2", query).

XXXX… (240 chars of tail, or the whole stock spill notice when there is one)

配套能力:

  • 尾部整段保留,尤其是 stock spill notice(Full formatted result stored at: …)連同左括號一起保留,模型不會丟失定位線索。
  • 可選 token 預算閘門(budgetTokens),只在當前 surface 真的超過預算時才搬,避免短會話被提前壓縮。
  • recall 工具支持三種調用:取前 8 000 字符、按字符區間取(單次上限 24 000)、按關鍵字搜索返回最多 20 行命中行及其字符偏移。偏移的單位與說明裏引用的一致,可直接回填到區間調用。
  • 存儲是一個 SQLite 文件,payload 做 deflate 壓縮並以原文 SHA-256 作鍵,同一份輸出讀兩次只存一份;用 PRAGMA application_id 拒絕外來數據庫文件。
  • 版本保留策略存在:maxAgeDays 和 maxBytes 按最舊優先淘汰。
  • 記賬用的是 DSH 自己的 token meter,而不是 chars / 4 估算。
  • 重寫走 DSH 自帶的 compaction/prune + surfaceOp: {op:'replace'} 路徑,持久化日誌裏保留原文,會話恢復後重放結果一致。
  • 存儲按 (session, seq) 判斷是否已搬過,因此工具只是打印 [recall] 字樣不會讓真正的搬運被跳過。
  • tool result 裏的圖片塊不受影響的只有文本被縮短。
  • composer 下方有一個 strip,顯示搬出量、留在上下文外的 token 數、recall 命中次數和磁盤佔用。需要 web profile(dsh.client.platform: web)。

根據 README 中對 8 504 條實測 tool result 的統計:超過 6 KB 的結果佔 4.6%,而這些結果佔了全部 tool result 字符量的 40.7%,其中 76% 之後再也沒有被打開過。作者把上限說得比較直白:tool result 大約佔上下文的 46%,即使全部搬走,上限也只在上下文的 18% 左右。緩存讀取計價接近輸入價的路線上纔有 20–25% 的實際收益,緩存便宜的一方路線上只有個位數。

安裝與啓用

Web / TUI profile 下用官方命令安裝:

dsh plugin --profile web add github:sh-222/dsh-recall

裝完需要重啓 harness,插件只在啓動時加載。

Electron 的 desktop profile 按設計不支持 CLI 管理,需要手動改 ~/.dsh/profiles/desktop/package.json,加入依賴和 bundle 行,然後安裝:

{
  "dependencies": { "dsh-recall": "github:sh-222/dsh-recall" },
  "dsh": { "profile": { "bundles": ["…", "dsh-recall"] } }
}
cd ~/.dsh/profiles/desktop && pnpm install --ignore-scripts

升級和卸載:

dsh plugin --profile web remove dsh-recall   # 或直接改掉 bundle 行再 pnpm install

卸載不會動 ~/.local/share/dsh-recall/ 裏的存儲,不需要時自己刪掉即可。

運行環境要求:dsh >= 0.2.0-0(package.json 聲明);對象存儲需要 Node >= 22.5(使用標準庫 node:sqlite);strip 需要 web profile,宿主側對 profile 無要求。Node 較舊時插件仍能加載、recall 工具仍能應答,只是報告存儲不可用。

配置

以下配置項來自插件源碼中的 Config 校驗定義,加載時逐個校驗,出現未知配置鍵直接報錯而不是靜默忽略:

配置項 默認值 說明
thresholdChars 2500 超過該長度的 tool result 才被搬走
headChars 600 保留在對話開頭的字符數
tailChars 240 保留在對話結尾的字符數
keep 2 最新的 N 條 tool result 始終不處理
budgetTokens 0 只在 surface 超過該 token 預算時搬;0 表示只看閾值
spillNoticeChars 600 爲完整保留 stock spill notice 額外佔用的尾部字符上限;0 表示關閉
maxAgeDays 0 超過該天數的對象刪除;0 表示永久保留
maxBytes 0 超出該字節數時按最舊優先淘汰;0 表示不設上限
enabled true 置 false 只關掉搬移動作,recall(id) 仍可用
stateDir ~/.local/share/dsh-recall 對象存儲所在目錄

校驗規則裏有一條很實用:headChars + tailChars 必須小於 thresholdChars,否則搬完比原文還長,插件直接拒絕啓動。源碼註釋說明 2 500/600 這個默認值是實測拐點——閾值 6 000 只覆蓋 23.5% 的 tool result 體量,2 500 覆蓋 53.0%。

典型用法

安裝並重啓後,插件在後臺自動工作,不需要額外命令。模型拿回內容靠三種 recall 調用:

recall("4d3661d2")                  # 取前 8 000 字符
recall("4d3661d2", 8000, 1600)      # 取 8000 起的 1600 個字符,單次上限 24 000
recall("4d3661d2", query: "FATAL")  # 返回最多 20 行命中行及其字符偏移

搜索命中的偏移可以直接作爲區間調用的起點,兩者用的是同一個 Unicode 碼點單位,代理對不會被切開。

想確認這套交換值不值得,看 composer 下方的 strip:搬出次數、留在上下文外的 token 數、recall 命中次數和磁盤佔用。如果 recall 命中次數長期爲零,說明搬出去的東西沒人取,此時可以把 thresholdChars 調高或給 budgetTokens 設一個更緊的值。

適用場景與注意

適合:長會話、工具輸出量大、按 token 計價或緩存讀取成本不低的場景;希望保留完整會話日誌、不刪除任何原始輸出的團隊。

需要注意:

  • 插件以當前 dsh 進程權限運行,可以直接讀寫本地目錄。安裝前先讀一遍源碼,確認 index.js、store.js、client.js 與 cordis.patch.yml 的內容符合預期,並查看倉庫的許可證。
  • 這是一個個人維護項目,星標和 fork 數都很低,升級和問題響應取決於維護者;倉庫版本(package.json 中 0.5.0)與本地 dsh 版本的匹配情況要自己驗證。
  • 存儲不可用時插件不會讓 profile 掛掉,只會記一行日誌並讓 recall 報告存儲不可用,這屬於降級行爲而非故障。
  • strip 需 web profile;其他 profile 上插件仍能搬動和取回,只是沒有那個狀態條。
  • 淘汰策略(maxAgeDays / maxBytes)一旦生效,指向已刪除對象的指針會失效,這是任何容量上限的固有代價,所以默認一律不刪。
  • 收益有上限,大約是上下文 18% 的量級;在緩存便宜的路線上,優先減少新增輸入和步數更划算。

鏈接

  • 目錄頁:https://www.skillhub.cn/plugins/sh-222/dsh-recall
  • GitHub:https://github.com/sh-222/dsh-recall

社區目錄是獨立站點,與 DeepSeek / 幻方沒有官方從屬關係;dsh-recall 也只是社區插件,不是官方應用商店上架產品。

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

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

小夜