dsh-request-injector:按 provider / model / host 向下遊模型請求注入 HTTP 頭

前言

在 DSH(DeepSeek Harness)裏調用模型時,請求往往還要經過自建網關或統一代理:需要帶會話標識、租戶頭、鏈路追蹤 ID 等。這類頭通常只能改 DSH 源碼,或在網關側寫死邏輯,改動面大、也難按 provider 或模型區分。

dsh-request-injector 是社區維護的 DSH 插件,用一份配置在請求發出前注入自定義 HTTP 頭,並按 provider、model、host 做匹配;頭值裏的 ${變量} 只在真正發請求時求值。下面介紹它的定位、能力、安裝與配置方式。

這是什麼

  • 插件名稱:dsh-request-injector(目錄頁:SkillHub 插件條目)
  • 維護者:PluieM
  • 分類:模型推理(社區目錄歸類)
  • 一句話:按 provider / model / host 匹配,向下遊模型請求注入自定義 HTTP 請求頭;請求頭的值支持 ${variable} 佔位符,在請求真正發出時才求值。

插件以當前 DSH 進程的權限運行,安裝前應自行查閱 GitHub 倉庫 源碼與 MIT 許可證。社區插件目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。

核心功能

匹配與注入

  1. 三個匹配維度:provider 精確匹配;model 精確或尾部 * 前綴匹配(如 deepseek-v4*);host 按真實目標主機匹配(不計大小寫)。留空表示該維度不限。
  2. 佔位符:例如 x-opencode-session: ${sessionId}、x-trace-id: ${uuid};不做遞歸展開,$$ 輸出字面量 $。
  3. 變量缺失時:可選 skip(跳過該頭)、empty(替換爲空串)、error(讓本次請求失敗)。
  4. 保留頭保護:authorization、host、content-length、x-dsh-* 等由 HTTP 棧或宿主管理的頭拒絕寫入。

雙後端與生效範圍

插件在鏈路上有兩處落點,默認 backend: auto 同時啓用:

後端 覆蓋的場景 盲區
A · 官方擴展點 llm-pi-ai/request-headers pi-ai 適配器的全部傳輸方式(含 websocket) 拿不到真實目標 URL;非 pi-ai 適配器與模型列表探測不走這裏
B · 包裝 globalThis.fetch 所有走 fetch 的路徑,可按 host 精確匹配 websocket 握手不經 fetch

同一條規則被兩個後端各寫一次時,值相同則冪等,無需額外去重。無 LLM 上下文時(例如模型列表探測),只有顯式寫了 host 的規則纔會命中——避免把本會話級頭誤注入到進程內任意 fetch。

配置與 UI

  • 配置頁入口:設置 → 「請求頭注入」,或 插件管理器 → 請求頭注入行詳情;兩處讀寫同一 namespace。
  • 配置整節爲 volatile:在插件頁保存後立即生效,無需重啓插件或重載 DSH;也可手寫 profile 的 cordis.patch.yml,Host 側會審計並告警明顯錯誤。
  • 可視化表單支持規則增刪排序、逐頭校驗、可用變量速查表;保存採用整表提交併帶版本衝突檢測。
  • 安裝後默認 rules 爲空,不注入任何頭,不影響現有行爲。

安裝與啓用

在 DSH 環境中執行:

dsh plugin install dsh-request-injector

或在插件管理器「添加插件」中填寫 dsh-request-injector。包內已包含可直接加載的 lib/index.js(Host)與 lib/client.js(Web 客戶端),無需構建步驟。

資料中 package.json 標明版本 0.1.3,聲明與 DSH 0.2.2-rc.1 兼容;Node 引擎要求 >=22.19.0。

快速上手

配置可在界面中完成,不必先改文件。

  1. 打開插件管理器,找到「請求頭注入」,進入配置頁。
  2. 在「基本」區:啓用插件、後端(默認「自動(兩個後端都註冊)」)、變量缺失時的處理方式、調試日誌。
  3. 在「規則」區點「新增規則」:
    - 匹配條件:provider、model、host,留空表示不限。
    - 請求頭:逐條填名稱與值,值中可寫 ${sessionId} 等佔位符。
    - 順序:數字小的先應用;同名頭後寫的覆蓋先寫的。
  4. 點「保存」。保存即生效,下一條請求即可帶頭。

典型 YAML 示例(給網關帶會話頭):

enabled: true
backend: auto            # auto | headers | fetch
onMissingVariable: skip  # skip | empty | error
debug: false
rules:
  - enabled: true
    comment: 給網關帶會話頭
    match:
      provider: newapi-responses
      model: ''          # 空 = 不限
      host: ''           # 空 = 不限
    headers:
      x-opencode-session: ${sessionId}

適用場景與注意

適合誰:需要在不改 DSH 核心、不改網關硬編碼的前提下,按 provider / 模型 / 目標 host 附加 HTTP 頭的智能體或網關集成場景——例如自建網關會話頭、按模型區分租戶標識、鏈路追蹤頭。

務必注意:

  1. websocket:僅後端 A 對 WS 有效;保持默認 backend: auto 即可。
  2. 配置明文:保存在 profile 的 cordis.patch.yml;不要把長期密鑰寫進配置,優先用短期會話 ID 類變量。
  3. 能力邊界:model 需手填,無下拉;只處理請求頭,不修改請求體。
  4. 運行權限:插件與 DSH 同進程,安裝前請覈對源碼與許可證。

結尾

dsh-request-injector 把「按條件注入下游模型請求頭 + 運行時佔位符」收成可熱更新的插件配置,併兼顧 pi-ai 擴展點與 fetch 兩條路徑。需要查閱說明與源碼時,可參考 SkillHub 目錄頁 與 GitHub:PluieM/dsh-request-injector。

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

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

小夜