前言¶
長會話裏,模型最先撞上的往往不是任務本身,而是上下文窗口。對話一長,早期的文件路徑、決策和報錯會被硬截斷悄悄丟掉;另一種常見做法是系統到了閾值就自動摘要,摘要寫得好不好,模型自己看不見。DeepSeek Harness(DSH)內置了自動壓縮後端,思路接近後者:用自動生成的摘要替換一段範圍。
billion-context-dsh 走的是另一條路。它把壓縮做成模型可調用的工具:由模型決定何時壓縮、壓縮哪一段,並自己寫出摘要。自動策略只 nudge(提醒),不替模型摘要。社區目錄把它歸在「會話與消息」。需要說明的是,DeepSeek Harness 插件庫是獨立社區站點,和 DeepSeek / 幻方沒有官方從屬關係;DSH 官方倉庫的核心理念是「一切皆插件」,這個插件是社區移植,不是官方應用商店裏的內置件。
本文按社區目錄詳情頁、GitHub 倉庫 README / docs/INSTALL.md / package.json,以及 npm 發佈頁覈對後整理:它是什麼、裝完怎麼掛、模型側有哪些工具。
這是什麼¶
billion-context-dsh 是 DeepSeek Harness 的 CompactionEngine 後端,實現的是 Active Context Pruning(ACP,主動上下文裁剪):給模型一個 compress 工具,讓它把一段會話範圍寫成高保真摘要,同時把關鍵細節(路徑、決策、錯誤信息)留下來,回收上下文空間。維護者是 Tyan66666,倉庫與 npm 包均使用 MIT 許可證,主要語言是 TypeScript,要求 Node.js ≥ 20。
這裏的 ACP 不要和 DSH 官方包 @deepseek-ai/dsh-acp 搞混。後者是面向編輯器等客戶端的 Agent Client Protocol 橋;本插件的 ACP 來自 opencode-acp 那套「模型決定何時壓縮、壓縮什麼」的設計,壓縮內核原樣複用 acp-kernel,適配層移植自 billion-context-pi(Pi 編碼代理上的同名方案)。倉庫說明:內核與 Pi 側默認行爲保持一致,DSH 適配層(會話事件投影、持久化 surface 事務、模型工具、nudge、配置)是本倉庫的工作。
版本以倉庫和 npm 爲準。2026-08-17 查詢時,GitHub package.json 與 npm 包 均爲 v0.2.2;社區目錄頁仍寫着 v0.1.7,星標也停在 11,而 GitHub 倉庫爲 20 星。目錄頁會滯後,安裝和能力邊界請以倉庫 README 爲準。插件與 DSH 本身都還在公開測試版,README 明確寫了:不要用於工程化 / 生產環境,預期會有破壞性變更。
核心功能¶
摘要由模型自己寫¶
DSH 內置的自動壓縮會再跑一次摘要流程,用生成結果替換一段範圍。ACP 不這麼做:模型調用 compress 時就把摘要寫進去,沒有第二次 LLM 摘要調用。倉庫把它寫成成本上的差異——壓縮內容是當前對話模型的產物,而不是另一路靜默摘要器。
只提醒,不替模型按下壓縮¶
壓力策略在 agent/pre-step 注入 nudge:效率提示、上下文分解、壓縮規則,以及一張可壓縮範圍表(surface seq)。compactIfNeeded 返回 null,也就是自動路徑不會自己摘要。是否調用 compress、壓哪一段,仍由模型決定。引擎默認把過限 nudge 線放在用量約 70%、緊急 nudge 放在約 85%,刻意低於宿主 compaction-basic 常見的 80% 自動壓縮線,讓提醒先出現。增長路徑還可以在中前期觸發:某層 pending ≥ 5 萬 token 且較上次檢測增長 ≥ 2.25 萬 token(這條沒有百分比下限)。這些閾值來自倉庫 README 與 docs/INSTALL.md,不是實測會話數據。
壓縮可恢復,原文還在日誌裏¶
DSH 的每次模型請求都從 append-only 會話日誌(surface)派生。compress 落地的是持久化 surfaceOp: { op: 'replace' }:模型寫的摘要成爲 checkpoint 節點,原文仍留在日誌中。因此可以:
decompress:只讀恢復被遮蔽的原文search_context:在塊摘要和原文裏按關鍵詞查找- 重啓後從日誌重建塊賬本,不另寫旁車文件
引用用的是 surface seq,不需要給每條消息打 m00001 這類標籤。範圍邊界會自動平衡到 tool-call / result 配對點,seq 上帶 #callId 片段也可以。
四個模型工具,外加 /acp¶
默認會在 ctx.tools 註冊四個工具,並在命令欄掛 /acp:
| 名稱 | 作用 |
|---|---|
compress |
用模型書寫的摘要替換一段 seq 範圍;對某塊的摘要節點再壓一次,就是分層蒸餾(tier 2/3) |
decompress |
按塊恢復原文 |
search_context |
搜索壓縮塊的摘要與原文 |
acp_status |
看佔用、壓縮塊、可壓縮範圍、窗口來源 |
/acp |
在命令欄做 status / compress / decompress |
分層蒸餾會把 tier 和內核塊 id 寫進日誌,重啓後內核狀態可以從日誌再水合,並繼續蒸餾。命令欄的 /acp compress 只做普通 T1 範圍壓縮;碰到已有壓縮塊的摘要節點時,源碼會拒絕,要求改用 compress 工具做蒸餾。
上下文窗口可以自動探測¶
modelContextLimit 省略時,會走 agent.ctx.llm.resolveModelInfo 探測模型真實窗口,失敗則回退 128000。顯式寫了這個值就會跳過探測。INSTALL 提醒:分母配小(例如百萬窗口模型寫成 128K)會讓使用率虛高,nudge 過頻。
安裝與啓用¶
社區目錄頁給出的安裝命令是:
dsh plugin add github:Tyan66666/billion-context-dsh
需要可復現安裝時,目錄頁建議固定 commit:
dsh plugin add github:Tyan66666/billion-context-dsh#<commit>
DSH 官方 CLI 的完整形態是 dsh plugin --profile <profile> add <source>。倉庫從 v0.2.0 起聲明瞭 dsh.bundle manifest,README 推薦的一鍵安裝是從 npm 裝進 web profile(發佈物帶預構建的 dist):
dsh plugin --profile web add billion-context-dsh
裝完需要重啓 dsh,bundle 層在啓動時纔會組合進去。這一點值得單獨說:GitHub 倉庫的 .gitignore 忽略了 dist/,package.json 也沒有 prepare 構建腳本;官方文檔也寫過,從 git 安裝拿到的是源碼而不是構建產物。目錄頁的 github: 命令仍可按原文使用,但若加載失敗,優先改用上面的 npm 包名,或先在本地 npm run build 再按 docs/INSTALL.md 的 tarball / symlink 方式掛。
插件以當前 dsh 進程的權限運行,安裝時可能執行代碼。裝之前請自己看源碼和許可證。
掛上壓縮後端¶
每個 agent 只能有一個上下文管理器。同一 realm 裏兩個後端同時 provide ctx.compaction 會衝突,所以要先禁用宿主的 compaction-basic,再插入本引擎。倉庫推薦全局掛到 host 平面,對 standard / code / minimal / cordis / 自定義預設都生效。編輯 profile 補丁,例如 ~/.dsh/profiles/web/cordis.patch.yml:
- id: compaction-basic
disabled: true
- insert:
- id: compaction-acp
name: 'billion-context-dsh'
config:
modelContextLimit: 128000 # 可選;省略則自動探測,失敗回退 128000
bundle 自帶的 cordis.patch.yml 只插入無 config 的默認行。需要改窗口或提示詞時,按上面手寫組合行。只想在某一個 agent preset 的 compaction realm 裏替換默認後端,同樣是先 disabled: true,再插入 compaction-acp。
INSTALL 還寫了一層細節:shipped 預設(standard / code / cordis)內部仍可能帶着 realm 級 dsh-compaction-basic 兜底,ACP 的工具和 nudge 可用,但系統自動摘要仍可能在壓力過高時觸發。若某個模式要完全由模型決定壓縮時機,文檔的做法是複製該預設,並把副本里 compaction-basic 的 auto 設爲 false。shipped 安裝本身不可直接改。
可選的 config.prompts 能覆蓋 nudge 首句、範圍表、系統提示段和四個工具描述。模板用命名佔位符(如 {pct}),拼寫錯誤會在引擎啓動時拋錯,而不是把字面 {pct} 漏進模型上下文。未配置時直接用 acp-kernel 的渲染。
典型用法¶
下面步驟來自倉庫 docs/INSTALL.md 的驗證清單和工具約定,可以按原文復現。
1. 確認工具掛上了¶
新開一個會話,讓模型列出可用工具,或看工具目錄。應出現 compress、decompress、search_context、acp_status。也可以直接讓模型調用 acp_status,返回塊數、已壓縮 token、估計佔用和窗口來源。
命令欄等價寫法:
/acp status
2. 在長會話裏壓縮一段範圍¶
上下文漲起來之後,模型會按 nudge 裏的範圍表調用 compress。參數形狀是一段或多段 surface seq,外加模型自己寫的摘要(源碼要求摘要至少 50 個字符):
compress({ content: [{ startSeq, endSeq, summary }] })
成功時文檔預期返回類似 Compressed N block(s),會話可見上下文變短,acp_status 的 blocks 增加。命令欄也可以壓一段 T1 範圍(摘要不要碰到已有壓縮塊的 checkpoint 節點):
/acp compress <startSeq> <endSeq> <summary...>
3. 恢復和檢索¶
壓縮不是刪除。需要原文時:
decompress({ blockId })
/acp decompress <blockId>
在塊內查找:
search_context({ query })
重啓同一會話後,再跑一次 acp_status,塊賬本應從日誌裏的 compaction/summary 事件重建出來。
4. 把安裝指南交給當前會話¶
README 還寫了一種用法:本倉庫本身就跑在 DSH 上,把 docs/INSTALL.md 交給會話裏的 agent,讓它讀指南、看 profile、改組合配置並驗證掛載。前提是配置在 ~/.dsh 下,需要批准一次文件權限;裝完再讓它調用 acp_status 自證。
適用場景與注意事項¶
適合已經在用 DSH、會話經常跨很多輪工具調用的人:編碼智能體、需要反覆對照早期報錯和文件路徑的長任務。它解決的是「窗口滿了之後,早期細節被靜默丟掉或被另一路摘要器改寫」這一類問題,不是把上下文窗口真的擴到無限大。插件名裏的 billion 來自上游 ACP 方案的命名,本倉庫沒有給出 DSH 側自己的壓測數字。
使用前注意這幾條:
- 測試版。README 要求不要把本插件和 DSH 用於生產;破壞性變更是預期行爲。
- 同一 realm 不要掛兩個壓縮後端。衝突對象是
ctx.compaction。全局方案要禁用 host 的compaction-basic;單模式方案要先處理該 realm 裏的dsh-compaction-basic。 - shipped 預設可能仍有自動摘要兜底。只插 host 平面時,standard / code / cordis 的 realm 級 basic 仍可能在高壓時自動摘要,和「純模型驅動」不完全一致。
- 窗口分母不要配錯。
modelContextLimit寫小了,nudge 會過頻。 - 權限與來源。插件以當前 dsh 進程權限運行。安裝前檢查 GitHub 源碼和 MIT 許可證;需要可復現環境時固定 commit 或使用已發佈的 npm 版本。
- 縮寫衝突。本文的 ACP 是 Active Context Pruning。DSH 另有 Agent Client Protocol 相關插件,不是同一件事。
- 和 Pi 版能力不完全相同。上游
billion-context-pi還帶acp_delegate一類委派工具;DSH 這個移植暴露的是壓縮四件套和/acp,不要按 Pi 文檔去找委派接口。
小結¶
billion-context-dsh 把 DSH 的上下文壓縮從「系統到點就自動摘要」換成「模型自己決定壓什麼」。壓縮結果是 checkpoint,原文留在 append-only 日誌裏,可以恢復、可以搜索,重啓後賬本還能從日誌重建。它是社區維護的 MIT 插件,不是 DeepSeek 官方商店應用;和宿主一樣仍在測試期,適合先在自己的 profile 裏驗證,而不是直接鋪到生產會話。
目錄頁:https://deepseek-harness-plugin.com/zh-CN/plugins/billion-context-dsh/
GitHub:https://github.com/Tyan66666/billion-context-dsh