dsh-api-heal:「API 密鑰無效」時的憑據自修復

前言

在 DeepSeek Harness(DSH)裏跑智能體時,上游一旦返回 401 或 403,客戶端會把錯誤歸類爲 AUTH,界面統一顯示「API 密鑰無效」。token 過期、會話失效、目錄需要重新探測等真實原因都被同一句文案蓋住了,開發者只能猜是哪家 provider 出了問題、手動去續期。

dsh-api-heal 是社區插件,監聽認證類失敗,按 provider 調用各自的續期入口,再讓 agent loop 原地重發請求;多數情況下用戶看不到報錯。下面介紹它的定位、能力與安裝方式。

這是什麼

插件不改 DSH 本體,也不改那句「API 密鑰無效」的文案;它在錯誤冒到 UI 之前嘗試修好憑據鏈,並暴露只讀狀態路由與手動工具供模型或運維調用。

核心功能

自動自愈

監聽 agent/request-error。失敗若像認證問題,就地對對應 provider 重新續期或重取憑據,返回 { kind: "retry" },讓 agent loop 原地重發同一個請求。

可通過 profile 裏 cordis.patch.yml 關閉自動行爲(autoHeal: false),此時仍可使用手動工具。

手動工具 heal_api

模型或腳本可主動調用。可選參數 provider:qoder、workbuddy-ai、our-free-model;不傳則三家依次處理。

狀態路由

只讀:GET /plugins/dsh-api-heal/status。路由在 DSH 進程啓動時註冊,重啓前訪問會 404。

三家 provider 的自愈動作

provider 自愈動作
qoder GET /plugins/dsh-qoder-connect/status 取 probeKey → POST /plugins/dsh-qoder-connect/probe body {"action":"refresh"}(觸發續期並刷新模型目錄)
workbuddy-ai GET /plugins/dsh-workbuddy-connect/ai/status 取 probeKey → POST .../ai/probe {"action":"refresh"}(重新解密桌面憑據並重拉 catalog;CN 變體若 signed-out 直接跳過)
our-free-model POST /api/our-free-model/refresh,須帶 connection 認證 cookie

our-free-model 的 /api/our-free-model/* 掛在 connection 准入圍欄後,裸 POST 會 401。插件讀取 .credentials.yaml 裏 client-connection/browser-session 的簽名密鑰,按 dsh-client-connection 同樣算法(HMAC-SHA256 + base64url,payload {version:1, authority, issuedAt, expiresAt})自鑄會話 cookie,無需瀏覽器或已登錄 Web 會話。

安裝與啓用

官方 README 面向 Windows:本機 PowerShell 5.1、執行策略 RemoteSigned 時,不宜直接用未簽名的 install.ps1,應使用 install.cmd:

E:\DSH CODE\dsh-api-heal\install.cmd

腳本會備份 profile 的 package.json,複製插件到數據目錄下的 .dsh/plugins/dsh-api-heal,以 file: 形式寫入 dependencies 並加入 dsh.profile.bundles,執行 pnpm install 並做裝後自檢。路徑以你本機克隆或解壓位置爲準,上例來自 README。

裝完後完全重啓 DSH(托盤也要退出)。驗證:

GET http://127.0.0.1:19387/plugins/dsh-api-heal/status

回滾:

E:\DSH CODE\dsh-api-heal\install.cmd -Uninstall

插件以當前 DSH 進程權限運行,安裝前請閱讀倉庫源碼與 MIT 許可證,確認符合你的安全策略。Node 引擎要求:^22.19.0 || >=24.0.0(見 package.json)。

配置

可在 profile 的 cordis.patch.yml 中覆蓋插件配置:

鍵 默認 說明
enabled true 總開關
autoHeal true 關閉後僅保留手動 heal_api
cooldownMs 60000 兩次自動自愈最短間隔(防抖)
requestTimeoutMs 30000 單次上游調用超時
webBaseUrl "" 留空則依次用 webServer.port/host → $DSH_WEB_URL → http://127.0.0.1:19387
registerRoutes true 是否註冊狀態路由

示例片段:

- id: api-heal
  name: dsh-api-heal
  config:
    cooldownMs: 15000
    autoHeal: true

典型用法與驗證

不裝插件,先探三家入口

設置 DSH_HOME 與 DSH 自帶的 node.exe,在插件目錄執行:

cd /d "E:\DSH CODE\dsh-api-heal"
set DSH_HOME=E:\dsh-data\.dsh
set NODE=D:\DSH\resources\runtime\primary-runtime\dependencies\node\bin\node.exe
%NODE% probe.mjs

成功時輸出類似:qoder / workbuddy-ai / our-free-model 各一行 [OK] 及耗時說明。

裝插件後的完整測試

%NODE% selftest.mjs
%NODE% smoke.mjs
%NODE% loadtest.mjs

loadtest.mjs 需從 app.asar 抽取真實依賴(README 中 stage_deps.mjs 步驟,只需一次)。

運行時若仍遇認證失敗,可讓 agent 調用 heal_api,或指定 provider 只修一家。

適用場景與邊界

適合:長期開 DSH 智能體、依賴 qoder / workbuddy-ai / our-free-model 之一或多家,且偶發憑據過期導致界面統一報「API 密鑰無效」的環境。

邊界(README 原文要點):

  1. 只能救「流已建立之後才失敗」的請求。 連接階段就拋錯(started === false)時,agent/request-error 監聽器不會跑,需手動 heal_api 或重發消息。
  2. probeKey 每次進程重啓都會變,插件每次通過 GET .../status 現取,不硬編碼。
  3. 自動自愈默認 60 秒冷卻,同一錯誤短時間內不會瘋狂打上游。
  4. our-free-model 的 cookie 用本機 .credentials.yaml 密鑰簽名,僅在 127.0.0.1 使用,不落盤、不外發。

DSH 生態強調「一切皆插件」;SkillHub 等社區目錄獨立於 DeepSeek / 幻方,本文介紹的是社區維護的 admin-security 類插件,非官方應用商店條目。

結尾

dsh-api-heal 把被 UI 吞掉的認證失敗拆回三家 provider 的可執行續期步驟,並在 agent loop 裏自動重試,減少誤讀「API 密鑰無效」帶來的排查成本。目錄與源碼:

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

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

小夜