前言¶
在 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、用宿主配對規則規劃切點,再依次嘗試:
- T1:用宿主暴露的 pruner 裁剪工具輸出(零模型)。
- T2:調用宿主壓縮引擎
compactIfNeeded(agent, 'context-overflow', signal);若代理返回拒絕(如dsh_compaction_refused),本進程內永久跳過該檔。 - T3:機械摺疊——寫入
compaction/start→compaction/prune→ 帶surfaceOp: replace的用戶消息(結構化摘要)→compaction/end。 - 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>
典型用法¶
- 自動:保持默認
enabled: true、mode: auto。會話因上下文 400 或網關「payload … no upstream can accept」類拒絕時,插件在錯誤鉤子上摺疊並重試一步。 - 事前減壓:依賴
preflight: true(默認),在投影已超窗時於 pre-step 摺疊,減少一次白走的失敗請求。 - 與宿主壓縮共存但禁用 T2:設置
mode: "fold"或zeroModelOnly: true,只走剪枝與機械摺疊,不調用宿主壓縮引擎。 - 手動診斷:執行
/rescue-status或調用context_rescue的status;需要立刻壓歷史時用/rescue或context_rescue_fold。 - 只看不動:
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