dsh-ctx-trim:會話頭部一鍵手動壓縮上下文

前言

長會話跑上一段時間,上下文很容易漲到二十幾萬 token。DSH 自帶的自動壓縮只會把最後那條消息留下,前面的內容全丟。你想自己決定「切到哪一輪、留多少原文」,卻又找不到入口。dsh-ctx-trim 就是補這個入口的:它會在會話標題右邊加一個「上下文」按鈕,點一下彈兩檔壓縮,摘要在本地完成,不調模型。

這是什麼

dsh-ctx-trim 是一個 DSH 客戶端插件,維護者是 AlexSh1ne。它解決的問題很單一:在不打斷流程的前提下,讓開發者手動選定一種壓縮力度,把會話頭部的上下文換成本地摘要。它針對的是「自動壓縮太粗暴且沒有控制權」的場景,不是通用的會話管理工具。

核心功能:兩檔壓縮

按鈕點開後面板裏顯示兩行數字,對應兩個檔位:

檔位 保留 下限 多餘的動作
正常壓縮 最近 30% token 的原文 至少 6k —
深度壓縮 最近 10% token 的原文 至少 2.5k 切下的原文打包進 ~/.dsh/im/ctxpacks/

切點兩端都落在結構邊界上:不切在工具調用中間,也不切在壓縮標記中間。所以壓完的會話仍然是一條合法的對話。

摘要從哪來:本地摘要不調模型

摘要按下面的順序取:

1、優先用同 profile 裏 dsh-live-compact/plan.js 的本地摘要器,裝了這個插件就用它,沒裝就跳過;
2、都沒有時用內置摘錄:每條只留開頭,並保留硬性條款行。

全程不調用模型,因此不產生費用,也不需要等生成。還有一個保護:如果摘要算出來比切掉的原文還大,這次直接放棄不落盤,寧可不動,也不寫一條更長的上下文。

它怎麼保證「空閒才能壓」

插件走的是 DSH 公開的壓縮事務:

compaction/start → compaction/summary → user/message(replace) → compaction/end → flush

外層套了 agent.runMaintenance,跟正在跑的回合互斥。所以當你點擊按鈕時如果這一輪還沒結束,它會明確提示會話正在跑、等這一輪結束再壓,不會把日誌寫壞。

安裝與啓用

用官方安裝命令,不要 npm i dsh-ctx-trim 裝進普通項目:

dsh plugin --profile <你的profile> add dsh-ctx-trim

裝完刷新頁面,會話標題右邊就會出現「上下文」按鈕。

直接用 npm 從普通項目安裝會踩坑,它會去解析 @deepseek-ai/* 的 peer 依賴,撞出一串 ERESOLVE。所有 DSH 插件的入口都是 dsh plugin add,插件市場也走這條。

典型用法

點按鈕 → 面板裏看兩行數字 → 點其中一檔 → 等它跑完。沒有額外配置項,保留比例是寫死的兩檔。

插件還掛了兩個路由,客戶端在用,你也可以自己 curl:

# 看一眼這個會話現在多少條、兩檔各會切多少
curl "http://<host>:<port>/dsh-ctx-trim/status?sessionId=session-xxx"

先試跑、不落盤,看會切多少、摘要多大:

curl -X POST http://<host>:<port>/dsh-ctx-trim/run \
  -H 'content-type: application/json' \
  -d '{"sessionId":"session-xxx","mode":"normal","dry":true}'

確認沒問題再真壓:

curl -X POST http://<host>:<port>/dsh-ctx-trim/run \
  -H 'content-type: application/json' \
  -d '{"sessionId":"session-xxx","mode":"deep"}'

接口只收 application/json,瀏覽器從別的站發來的跨站請求(帶 sec-fetch-site: cross-site)直接 403。

適用場景與限制

適合需要在長會話裏自己控制保留範圍的 DSH 開發者,尤其是不想依賴自動壓縮、希望保留最近一段原文的人。

它有幾個明確限制,用之前要知道:

  • 只在會話空閒時能壓,回合進行中會被拒絕,這是故意的;
  • 沒有撤銷按鈕,被摺疊的原文還在 session log 裏,但界面上看不見了;
  • 只有 Web 端有按鈕;
  • 保留比例是寫死的兩檔,暫不支持自定義;
  • 沒有用 ctx.compaction.compactRegion,它寫死 owner:'current-turn',空閒會話上必拋 no open turn。

安全方面要注意:路由不做身份校驗(它拿不到 GUI 的登錄態),只擋跨站。也就是說,誰能連上宿主端口、又知道某個會話的 id,誰就能壓那個會話。別把 DSH 端口暴露到不受信任的網絡,需要外網訪問就在前面用 --trusted-host 那一套加一層。另外,插件以當前 dsh 進程權限運行,安裝前應先檢查源碼與許可證。

兼容與已知實測

  • DSH >=0.2.0-rc.2 <0.3.0-0
  • Node >=22.13.0
  • 許可:MIT
  • 已在 DSH 0.2.1-rc.5 + Web profile 上實測:353 條 / 263k token 壓到 194 條 / 127.8k token。

結尾

dsh-ctx-trim 的價值不在於壓縮算法多新,而在於給了你一個入口:手動選一檔,摘要在本地生成,切點落在結構邊界上。如果你在長會話裏受夠了自動壓縮把歷史清空,值得裝一個試試。目錄頁見 https://www.skillhub.cn/plugins/AlexSh1ne/dsh-ctx-trim,源碼見 https://github.com/AlexSh1ne/dsh-ctx-trim。

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

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

小夜