dsh-context-rescue:上下文爆窗時的 DSH 會話急救

前言

在 DeepSeek Harness(DSH)裏跑長會話時,常見一種卡死:每條請求都返回 400,提示請求超過模型上下文窗口;手動 /compact 往往也救不回來——壓縮若沿同一條超限的投影重發,字節級相同就會再失敗;若壓縮被代理層接管,還可能直接被拒絕。現有插件多數是事前預防(滾動換窗、裁剪工具輸出、代理側壓縮),很少在會話已經死鎖之後才介入。下面介紹社區插件 dsh-context-rescue(維護者 Lequait,分類:工作流):識別溢出、把最老歷史摺疊成結構化摘要、對同一步重試一次;摘要階段不調用模型,可與其它壓縮類插件共存。

這是什麼

dsh-context-rescue 是掛在 DSH 上的工作流插件,bundle id 爲 context-rescue。它針對「上下文爆窗」:在請求失敗或(可選)發出前預檢時,按階梯縮小會話投影,再讓 agent 循環用變小後的歷史重發同一步。README 說明其失效背景與上游討論 DSH #10138 相關——網關用自然語言拒絕時,宿主分類器可能打不上 CONTEXT_WINDOW_EXCEEDED,自帶溢出分支不執行,重發請求不變就會循環失敗;本插件掛在 agent/request-error 上,不依賴錯誤碼是否準確。

運行時它不 import 任何 @deepseek-ai/* 包,按宿主線上結構本地構造 surfaceOp、compaction 事務與配對規則;也不聲明宿主 peer 依賴。npm 包版本 0.2.4,要求 Node >=20、DSH >=0.2.0-rc.1。

核心功能

失敗後的四檔階梯

請求失敗且判定爲上下文溢出時,插件會計量 token、用宿主配對規則規劃切點,再依次嘗試:

  1. T1:用宿主暴露的 pruner 裁剪工具輸出(零模型)。
  2. T2:調用宿主壓縮引擎 compactIfNeeded(agent, 'context-overflow', signal);若代理返回拒絕(如 dsh_compaction_refused),本進程內永久跳過該檔。
  3. T3:機械摺疊——寫入 compaction/start → compaction/prune → 帶 surfaceOp: replace 的用戶消息(結構化摘要)→ compaction/end。
  4. T4:當超窗內容實質只有一條超大消息時,用首尾摘錄替換該條,並在檢查點中記錄原文長度與丟棄部分;系統提示詞不會被摘錄。

全檔有效則返回 { kind: 'retry' },只重試一次;否則 next() 把真實錯誤交回宿主。摘要內容爲結構化事實(錯誤、路徑、任務、操作、用戶意圖、最近結論等),不調用模型生成 prose。

發出前的預檢(preflight)

同一套邏輯也可掛在 agent/pre-step(配置 preflight,默認 true):先量即將發出的投影;若已超過模型窗口則就地摺疊(先 T1,再走零模型檢查點);若僅落在壓力帶(fitRatio × 窗口 到窗口之間)則不動,交給宿主常壓縮策略。預檢在一個 turn 內只完整測量一次,大段新粘貼會觸發重測。

兩種計數

measure() 統計 surface 節點;上游實際喫的是 session.deriveMessages() 生成的請求,兩者可能不一致。/rescue-status 與工具 context_rescue 的 action: "status" 會分別報告;摺疊後派生請求必須比摺疊前更小且在窗口以內。

工具與斜槓命令

工具 用途
context_rescue action: "status" 報告佔用與上次急救;action: "rescue" 立即走階梯
context_rescue_estimate 可選 text,分類報錯文本並報告本會話佔用
context_rescue_fold 立即機械摺疊最舊一段並報告 token 變化
命令 用途
/rescue 立即摺疊並報告;/rescue status 只報告
/rescue-status 佔用、窗口、可摺疊區間或將被摘錄的消息、上次急救結果

工具與命令不拋異常,統一返回帶 ok、reason 和計數的對象。無命令註冊表的 profile 仍保留自動急救與工具。

配置要點

全部可選;拼錯鍵或不合法值會以 config: 開頭的 warn 或 schema 拒絕啓動。常用項示例:

鍵 默認 含義
enabled true 關閉則完全不掛載
mode "auto" auto / fold(跳過 T2)/ diagnose(只報告)
zeroModelOnly false 爲 true 時不走模型壓縮引擎
preflight true 超窗時在 pre-step 就地摺疊
fitRatio 0.9 低於該比例視爲裝得下
targetRatio 0.75 摺疊目標占窗口比例
retainRatio 0.25 最近尾部保留佔比
windowFallback 196608 無法解析窗口時的回退值

完整選項見倉庫 README 與 dsh --dump-config-schema(插件通過 lib/schema.js 註冊 schema)。

救不回的情況

若系統提示詞 alone 已超過窗口,階梯會試完各檔後將該會話記爲「已無解」,避免每請求重複全量測量;換更大窗口模型或歷史形狀變化後會重新測量。手動 /rescue 或 context_rescue 的 action: "rescue" 總會再試一次。

安裝與啓用

安裝後需重啓 DSH 一次以便加載新 bundle。官方 README 給出的安裝方式如下:

# 從 Git 倉庫(分支跟隨 master)
dsh plugin --profile <profile> add git+https://github.com/Lequait/dsh-context-rescue.git#master

# 本地目錄
dsh plugin --profile <profile> add /path/to/dsh-context-rescue

# 從 npm(0.2.4 已發佈)
dsh plugin --profile <profile> add dsh-context-rescue

若通過 Discover 發現:在索引源中添加
https://github.com/Lequait/dsh-context-rescue/raw/master/market/index.json,選中條目安裝的是 index 裏釘住的 commit,而非浮動分支。也可釘住指定 commit:

dsh plugin --profile <profile> add git+https://github.com/Lequait/dsh-context-rescue.git#<commit>

典型用法

  1. 自動:保持默認 enabled: true、mode: auto。會話因上下文 400 或網關「payload … no upstream can accept」類拒絕時,插件在錯誤鉤子上摺疊並重試一步。
  2. 事前減壓:依賴 preflight: true(默認),在投影已超窗時於 pre-step 摺疊,減少一次白走的失敗請求。
  3. 與宿主壓縮共存但禁用 T2:設置 mode: "fold" 或 zeroModelOnly: true,只走剪枝與機械摺疊,不調用宿主壓縮引擎。
  4. 手動診斷:執行 /rescue-status 或調用 context_rescue 的 status;需要立刻壓歷史時用 /rescue 或 context_rescue_fold。
  5. 只看不動:mode: "diagnose" 僅檢測與報告,不改寫會話。

將一段網關報錯貼給 context_rescue_estimate(參數 text)可輔助判斷是否爲溢出類失敗及提取的尺寸信息。

適用場景與注意

適合:長工具鏈、大段日誌或文件粘貼導致 DSH 會話請求被拒、且 /compact 無效或代理拒絕壓縮的場景;需要與滾動換窗、輸出裁剪等「事前」插件疊加使用時——本插件平時不介入,僅在失敗或 pre-step 超窗時動作。

注意:

  • 插件以當前 DSH 進程權限運行,安裝前應閱讀 GitHub 倉庫 源碼與 LICENSE,自行評估信任邊界。
  • 機械摺疊會丟失細節,保留骨架與路徑線索;一次貼入多條超大內容時,舊歷史先折,本輪新消息儘量保留,僅在仍超窗時才摘錄。
  • 社區目錄 SkillHub 條目 爲獨立索引,與 DeepSeek / 幻方無官方從屬關係;DSH 生態理念是「一切皆插件」,市場 bundle 可選,Discover 依賴你自行配置的索引源。

結尾

dsh-context-rescue 補的是「會話已爆窗」這一環:零模型結構化摺疊 + 單步重試 + 可選 pre-step,與現有預防型插件互補。查閱詳情與更新:

  • 目錄頁:https://www.skillhub.cn/plugins/Lequait/dsh-context-rescue
  • GitHub:https://github.com/Lequait/dsh-context-rescue
羽毛球分组比赛记分
小程序二维码

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

小夜