dsh-acp-window-guard:爲 billion-context(ACP)補上窗口與通道護欄

前言

在 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 配置,解決三件事:

  1. 避免匿名或未歸因請求按 ACP 默認 modelContextLimit(200000)推算窗口,導致壓縮目標偏小、上游仲裁失敗。
  2. 在 declaredWindow 缺失時,讓本地「可證超窗」邏輯仍有 1M token 量級兜底,超長請求在本地 422 拒掉,而不是裸發。
  3. 從 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 代理啓動時應用插件邏輯):

  1. 退出 DSH 桌面端(以便 bundle 寫回 profile)。
  2. 結束舊 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
  1. 重新打開 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
羽毛球分组比赛记分
小程序二维码

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

小夜