dsh-Context-Drawer:上下文到閾值先落盤,再騰出模型可見空間

前言

在 DSH 裏跑長會話——多輪任務、反覆改文件、反覆跑測試——上下文窗口遲早會被歷史消息佔滿。表現通常是模型開始遺忘早期約束,或者觸發上下文告警。靠人工壓縮不現實,靠模型自己「忘記」也不可控。

dsh-Context-Drawer 把這件事做成一個確定的小工具:只在上下文到達閾值時,先把更早的消息歸檔到磁盤上一個與本次會話關聯的文件夾,落盤成功後再從模型可見上下文裏釋放最舊的已結束輪次。聊天記錄原文和會話追加日誌全程不動。

下面介紹它的定位、行爲、配置和安裝方式。

這是什麼

dsh-Context-Drawer 是 yue7ye 維護的 DeepSeek Harness(DSH)插件,版本 0.1.0,MIT License。它只做一件事:當對話上下文達到閾值(默認 50% 的模型窗口)時,將更早的消息追加寫入「與該會話關聯的文件夾」,隨後把最舊的已結束輪次從模型可見上下文中移除。它沒有界面、沒有按鈕、不寫記憶、不做 prompt 注入,也不修改聊天記錄和追加式會話日誌。

在社區插件目錄中,它被歸入「記憶」分類。但從功能看,它更像一個上下文管理插件:真正被調整的只有「模型能看到的上下文」,磁盤存檔和會話日誌保持完整。

DSH 的理念是「一切皆插件」,插件由第三方維護。本文提到的目錄頁是獨立社區站點,與 DeepSeek / 幻方無官方從屬關係,不是官方應用商店。

核心功能

插件在每一輪對話的第一步估算上下文佔用:優先使用 provider 返回的真實用量,沒有則用字符估算。當佔用達到模型窗口的 thresholdRatio(默認 0.5)時,執行歸檔與釋放。

1、把「上一個存檔水位之後」的新消息追加到 {archiveDir}/{sessionShort}/{date}.md,先 fsync 確保落盤;
2、文件安全寫入磁盤後,才通過表面層的 replace 事件,把最舊的已結束輪次從模型可見上下文中移除。

釋放有三條約束:

  • 最近 keepRecentTurns 輪(默認 6)永遠保留;
  • 單次最多釋放 releaseMaxTurns 輪(默認 40);
  • 釋放到接近 releaseTargetRatio(默認 0.45)即停止。

存檔是純文本 Markdown,隨時可以打開查看。會話日誌和聊天記錄保持完整:被釋放的部分只是對模型不可見,磁盤上的存檔始終有它。

狀態寫在 ~/.dsh/context-drawer/state/state.json,每個會話一條水位記錄,用於防止重複歸檔。

默認存檔路徑:

~/上下文存檔/{sessionShort}/{YYYY-MM-DD}.md

sessionShort 是會話 id 去掉 session- 前綴後的前 8 個字符。一個會話一個子文件夾,因此可以隨時分辨某個文件屬於哪次對話。

安裝與啓用

官方提供兩種方式。一種是從 DSH 插件市場搜索 dsh-Context-Drawer 安裝;另一種是用命令:

dsh plugin --profile <profile> add dsh-context-drawer

命令中的 <profile> 需要替換成實際使用的 profile 名稱。插件要求 DSH 版本不低於 0.2.0-rc.2(見 engines 字段),安裝前可先確認當前環境版本。

啓用後插件通過 bundle patch 注入,配置寫在 cordis.patch.yml:

- insert:
    - id: context-drawer
      name: dsh-context-drawer
      config:
        archiveDir: C:/deepseek/上下文存檔   # optional; default ~/上下文存檔
        thresholdRatio: 0.5

archiveDir 是可選字段,不填則使用默認的 ~/上下文存檔;thresholdRatio 控制觸發歸檔的佔用比例。

可配置項

除 archiveDir、thresholdRatio 外,cordis.patch.yml 還支持以下可選字段:

  • thresholdTokens:絕對 token 閾值,配置後按 token 數觸發;
  • modelWindow:模型窗口大小,默認 1048576;
  • charsPerToken、baselineTokens:字符估算參數;
  • keepRecentTurns:始終保留的最近輪數,默認 6;
  • releaseMaxTurns:單次最多釋放輪數,默認 40;
  • releaseTargetRatio:釋放目標比例,默認 0.45;
  • format:存檔格式,可選 md、jsonl、txt;
  • includeRoles:歸檔時包含的角色;
  • minTextLength、maxEntryChars:文本長度過濾;
  • timeZone:時間戳時區,默認 Asia/Shanghai;
  • stateDir:狀態目錄。

插件沒有獨立文檔,字段含義以源碼爲準。

典型用法

倉庫自帶一個離線測試腳本,可以用來復現歸檔與釋放流程。進入插件目錄執行:

node test.mjs

README 描述的測試用例是:離線 mock 會話包含 10 個已結束輪次 → 觸發閾值 → 歸檔 20 條消息並釋放 8 個輪次 → 第二次觸發只追加新增消息 → 非第一步和低佔用時不做任何操作。

適用場景與注意

適合需要在長會話中持續工作、又希望保留完整會話歷史的 DSH 使用者:歸檔發生在磁盤,聊天記錄原文不受影響,之後可以按需打開存檔文件查看。

注意事項:

  • 插件以當前 DSH 進程權限運行,具備讀寫存檔目錄和修改模型可見上下文的能力,安裝前應檢查源碼與許可證(MIT)後再啓用;
  • 它只釋放「已結束」的輪次,當前正在進行的輪次不會被歸檔;
  • 觸發條件是閾值,實際釋放量由 keepRecentTurns、releaseMaxTurns、releaseTargetRatio 共同約束;
  • 需要 DSH 版本 >= 0.2.0-rc.2。

結尾

dsh-Context-Drawer 的價值在於把「上下文滿了怎麼辦」變成一次確定的落盤與釋放,而不是讓模型在長會話裏逐漸丟失早期信息。目錄頁:https://www.skillhub.cn/plugins/yue7ye/dsh-Context-Drawer;源碼:https://github.com/yue7ye/dsh-Context-Drawer。

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

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

小夜