前言¶
在 DSH 裏跑大上下文對話時,如果宿主進程掛着 billion-context(ACP) 做代理與壓縮,按理說不該再出現「一百多萬 token 直接打上游」或「消息卡十五秒無首字後失敗」。實際環境裏常見兩類現象:上游返回 prompt is too long(code 11115),或本地沒有把超長請求攔住卻最終 400。
根因往往不在模型本身,而在於 ACP 對「可用窗口」的估算路徑不一致:有的請求帶齊插件上下文頭,有的走匿名鏈 pfa-* 或旁路 fetch,默認配置只有 20 萬級窗口,再疊加升級後補丁被覆蓋,超窗保險會整段失效。下面介紹社區插件 dsh-acp-window-guard(維護者 Lumid0uce,分類 admin-security),在啓動時用冪等步驟抬高配置下限、重打 dsh-native.js 補丁,並在 fetch 層把模型請求釘回 ACP /bili/ 通道。
這是什麼¶
dsh-acp-window-guard 是 DeepSeek Harness 的 Cordis patch 型插件(當前資料中版本 0.3.0,MIT 許可證)。它面向已使用 billion-context(ACP) 的 DSH 配置,解決三件事:
- 避免匿名或未歸因請求按 ACP 默認
modelContextLimit(200000)推算窗口,導致壓縮目標偏小、上游仲裁失敗。 - 在
declaredWindow缺失時,讓本地「可證超窗」邏輯仍有 1M token 量級兜底,超長請求在本地 422 拒掉,而不是裸發。 - 從 0.2.0 起在
globalThis.fetch上安裝橋接,防止部分輪次(資料中提及手機 App 消息等場景)模型請求繞過 ACP。
插件全程 try/catch,任一步失敗只記日誌,不阻塞宿主啓動。上游 issue #5907 與 PR #5910 修合後,作者說明可卸載本插件;屆時 bundle 補丁可能與上游重疊並出現 pattern not found(不拋錯)。
問題背景:窗口從哪裏來¶
ACP 的「可用窗口」爲 contextWindow − maxTokens。contextWindow 常見兩種來源(資料中的表格歸納):
| 來源 | 數值 | 結果 |
|---|---|---|
宿主透傳 x-bili-plugin-context-window |
1,000,000 − 128,000 | 約 872,000,壓縮後行爲正常 |
| 拿不到頭(匿名鏈、部分子代理調用等) | 配置默認 200000 − 預留 32768 | 167,232,仍可能判超窗並觸發 forwarding once for the upstream to arbitrate |
此外,bodyProvablyOverWindow 在 declaredWindow === undefined 時直接返回 undefined,本地超窗保險不生效,百萬級 prompt 會原樣外出。插件針對的就是「窗口算小 + 保險啞火 + 請求旁路」這一組合。
核心功能¶
啓動時執行兩類冪等操作(可通過 cordis.patch.yml 的 config 調整或關閉部分能力):
1. 抬高 ACP 配置裏的 context 下限¶
把 ~/.config/billion-context/billion-context.json 的 modelContextLimit 抬到 minContextLimit(默認 1000000),修改前備份爲 .bak-window-guard-<ts>。
2. 維護 dsh-native.js 超窗補丁¶
在 profile 內 billion-context 包的 dist/agent/dsh-native.js 中,將兩處
bodyProvablyOverWindow2(body,init,effectiveContextWindow(ctx))
改爲帶 ??MIN_ASSUMED_WINDOW_TOKENS 的形式(兼容 bodyOverWindowDetail2 的 0.1.213 命名);上游覆蓋文件後會自動重打。patchAcpCode: false 可只改配置、不動代碼。
3. fetch 橋接(0.2.0+)與身份頭(0.3.0)¶
- fetch bridge:對模型端點(
/chat/completions、/completions、/responses、/messages)且目標不在 ACP 的請求,改寫爲{ACP代理}/bili/{原始URL}。啓動日誌可見bridge: installed:<origin>或fetch bridge installed;fetchBridge: false可關閉。 - 0.3.0:改寫時補上
x-bili-plugin、x-bili-plugin-conversation等頭,減輕漏網請求被當成匿名鏈;日誌中期望hook: on,bili.log不再頻繁出現new anonymous session pfa-…。
可選的環境變量 ACP_GUARD_BASEURL=1 會改動 ~/.dsh/settings.yaml 裏 provider 的 loopback baseURL,但桌面端退出時會寫回配置,默認關閉;日常一般只需運行時 bridge。
安裝與啓用¶
資料中的安裝方式是將插件目錄掛進當前 DSH profile 的 node_modules,並在 package.json 裏聲明 link 依賴與 bundle(Windows 示例 profile 名爲 desktop,macOS/Linux 換成本機 profile 目錄名)。修改 package.json 前請先備份。
Windows(junction + package.json)示例:
$src = "C:\path\to\dsh-acp-window-guard"
$dst = "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\dsh-acp-window-guard"
New-Item -ItemType Junction -Path $dst -Target $src
在 ~/.dsh/profiles/desktop/package.json 中:
dependencies增加:"dsh-acp-window-guard": "link:<$src 的絕對路徑>"dsh.profile.bundles數組追加:"dsh-acp-window-guard"
Unix 環境將 junction 換爲 ln -s 即可,路徑按本機 profile 調整。
生效順序(僅在下一次 ACP 代理啓動時應用插件邏輯):
- 退出 DSH 桌面端(以便 bundle 寫回 profile)。
- 結束舊 billion-context 節點進程並重新啓動代理,例如 Windows:
Get-CimInstance Win32_Process -Filter "Name='node.exe'" |
Where-Object { $_.CommandLine -match 'billion-context' } |
ForEach-Object { Stop-Process -Id $_.ProcessId -Force }
Start-Sleep -Seconds 2
node "$env:USERPROFILE\.dsh\profiles\desktop\node_modules\billion-context\dist\index.js" start --host 127.0.0.1 --port 18790
- 重新打開 DSH。
運行環境要求(package.json):Node ^22.19.0 || >=24.0.0。
驗證方式¶
查看 ACP 日誌 ~/.local/state/billion-context/bili.log:
- 匿名鏈窗口應從約 167232 變爲約 967232(1,000,000 − 32,768);有歸因會話仍約 872000。
- 被本地攔下的裸發請求:HTTP 422,響應頭
x-bili-gate: oversize-refusal-unattributed。
資料還給出了直連代理與 /bili/ 重寫通道的 curl 對照(非 /bili/ POST 得 403,/bili/http://… 形式得 200),用於確認代理只接受改寫通道。
不想裝插件時,倉庫內腳本可手工等價執行(冪等):
- Windows:
pwsh scripts/reapply-acp-window-patch.ps1(-CheckOnly只查不改) - macOS / Linux:
bash scripts/reapply-acp-window-patch.sh(--check只查不改)
配置項¶
cordis.patch.yml 內 config 常用字段:
| 鍵 | 默認 | 說明 |
|---|---|---|
minContextLimit |
1000000 |
期望的最小 modelContextLimit |
patchAcpCode |
true |
是否維護 dsh-native.js 補丁 |
dryRun |
false |
只報告,不寫盤 |
configFile |
自動 | 覆蓋 ACP 配置路徑(亦認 BILI_CONFIG_FILE / XDG_CONFIG_HOME) |
acpBundlePath |
自動 | 覆蓋 dsh-native.js 路徑 |
fetchBridge |
默認開啓 | 設爲 false 關閉 fetch 兜底 |
回滾¶
從 .bak-window-guard-* 恢復 billion-context.json 與 dsh-native.js 即可;或設置 patchAcpCode: false 停止改代碼。資料中含 PowerShell 的 Copy-Item 回滾示例,路徑需按本機 profile 下的 billion-context 包位置替換。
適用場景與注意¶
適合誰: 已在 DSH profile 中啓用 billion-context,並出現超長 prompt 報錯、匿名會話窗口異常偏小,或日誌顯示部分輪次完全未經 ACP 的開發者。
權限與安全: 插件以當前 DSH 進程權限運行,會修改用戶目錄下的 ACP 配置與(可選)node_modules 內 JS 文件。安裝前應閱讀 GitHub 倉庫 源碼與 MIT 許可證,確認可接受對 ACP 的二進制鄰近補丁策略。社區插件目錄 SkillHub 條目 與 GitHub 無 DeepSeek / 幻方官方從屬關係,屬社區「一切皆插件」生態。
版本提示: 0.2.1 起兼容 billion-context 0.1.213 的 bodyOverWindowDetail2 命名;命令輸出中的 shape 字段可確認命中哪一版補丁邏輯。
結尾¶
經過上面的步驟,dsh-acp-window-guard 把 ACP 的窗口下限、本地超窗拒發和 fetch 通道路由收成啓動期可重複的護欄,專門針對匿名窗口與旁路請求兩類長期痛點。上游 billion-context 合入正式修復並升級後,可按 README 建議卸掉插件,僅保留無害的配置抬高亦可。
- 社區目錄:https://www.skillhub.cn/plugins/Lumid0uce/dsh-acp-window-guard
- 源碼與說明:https://github.com/Lumid0uce/dsh-acp-window-guard