dsh-fetch-router:按 host 與 path 路由 DSH 出網 HTTP 請求

前言

在 DeepSeek Harness(DSH)裏跑智能體時,模型調用、工具聯網都會走 harness 統一的出網 HTTP。網關往往對請求頭、路徑有額外約定:缺一個字段就 400,日誌裏卻看不出「缺了什麼」。自己在每個 provider 或 SDK 裏打補丁,改一處漏一處,也不利於在桌面 profile 裏統一驗收。

下面介紹社區插件 @leolee9086/dsh-fetch-router(維護者 leolee9086,分類:聯網工具)。它在 DSH 出網路徑上按 host + path 做路由:可注入或改寫請求頭、改寫目標 URL、或在本地直接應答;並提供一個 DSH 原生右側欄監控面板,便於對照規則與實際上游行爲。包內默認規則針對 OpenCode Zen 網關的 400 MissingSessionID(該網關要求 x-opencode-session,缺失即拒)。

這是什麼

一句話:dsh-fetch-router 是 DSH 的 fetch 路由插件,按主機名與路徑匹配規則,在請求真正出網前完成頭注入、URL 改寫或本地 mock,同時用右側欄逐條展示命中與結果。

  • 名稱:@leolee9086/dsh-fetch-router
  • 當前版本(package.json):0.1.2
  • 許可證:MIT
  • 依賴:@leolee9086/sac-path-router(npm 包,安裝時不跑構建腳本)
  • 目錄頁:https://www.skillhub.cn/plugins/leolee9086/dsh-fetch-router
  • 源碼:https://github.com/leolee9086/dsh-fetch-router

插件以當前 DSH 進程權限攔截並改寫出網請求;安裝前應自行閱讀源碼與許可證,並只在可信 profile 中啓用。

核心功能

端點路由(host + path)

路由層按 match 條件匹配請求:

  • host(必需,支持 *.example.com)
  • path(radix 通配,默認 /**)
  • methods
  • provider、model、purpose(取自當前請求的模型調用作用域)

匹配後可:

  • 通過 headers 注入或覆蓋請求頭(受 reserved、ifAbsent 約束)
  • 通過 rewrite.url / rewrite.path / rewrite.search 改發目標
  • 通過 respond 本地應答(需 allowMock: true)

模板變量包括 $session、$provider、$model、$purpose、$requestId;取不到值時行爲由 onMissing 決定(fail 或 skip)。同一 path 上多條規則按聲明順序取第一條滿足條件的;未命中任何端點規則則不做端點處理,請求照常出網。

中間件層(內容改寫)

與端點路由分開的一層:在路徑匹配之前,對所有請求運行 requestRewrite 登記的改寫器,改的是 body,與 host 無關。改寫結果寫入 ctx.requestBody,由 fetch 入口出網時使用。

  • 顯式字符串 body 可改
  • SDK 傳入的 Request 僅在媒體類型爲 JSON(含 +json)或 text/* 時讀取 clone 後改寫
  • 顯式流、FormData、URLSearchParams 與二進制 Request 不處理

兩層不共用一道門:內容改寫關心「這一次發送時對 body 的操作」,與端點歸屬正交。因此所有請求都會構造 Request(不再有 host 早退),以保證改寫對每條請求都成立。

右側欄監控面板

在界面註冊原生右側欄 tab,入口在左側欄底部(無會話時置灰)。面板可查看:

  • 逐請求:時間、host+path、方法、命中規則、被改動的頭名、結果(forward / mock / skipped / error)、provider·model、上游狀態碼、耗時
  • 彙總:命中、透傳、本地應答、錯誤計數;當前生效路由表;暫停記錄

數據接口(僅 loopback,並複用 DSH Connection 的 Host/Origin 與簽名 Cookie 校驗):

  • GET {panel.path}/stats.json
  • GET {panel.path}/events(SSE)
  • POST {panel.path}/recording

默認不寫會話日誌、不發 session 事件;默認不記錄 body;authorization、cookie、含 token / secret 的頭永不顯示值。

默認 bundled 規則

包內 cordis.patch.yml 含示例規則 opencode-session-chat:對 opencode.ai 上 /zen/go/v1/chat/completions 的 POST(且 provider 匹配 opencode-go*)在存在 session 時注入 x-opencode-session: $session。

安裝與啓用

已對照 DSH 0.2.0-rc.2 的運行時服務契約適配。桌面部署使用 desktop profile,不是 web。

在現有 DSH 插件管理器中安裝 GitHub 地址:

github:leolee9086/dsh-fetch-router#<commit-sha>

將 <commit-sha> 換成已發佈提交,可固定安裝版本。具有 DSH CLI 的部署也可使用:

dsh plugin --profile desktop add github:leolee9086/dsh-fetch-router#<commit-sha>
dsh plugin --profile desktop remove @leolee9086/dsh-fetch-router

以安裝器報告的 applied 或 restart-required 爲準;已有 Host 代碼的更新需要重啓纔會替換 Node 模塊。不要用本地 link: 安裝代替 GitHub 發佈驗收。

包自帶 bundle patch(cordis.patch.yml),安裝後由 dsh plugin 併入 profile layers,不需要手改 profile 的 cordis.patch.yml。

典型配置

默認配置在包內 cordis.patch.yml;在 profile 的 cordis.patch.yml 裏用同 id: fetch-router 覆蓋 config 即可改規則。

    - id: fetch-router
      name: "@leolee9086/dsh-fetch-router"
      config:
        reserved: [user-agent]          # 永不被規則覆蓋的請求頭
        ifAbsent: true                  # 目標頭已存在則不覆蓋
        allowMock: false                # 允許 respond 本地應答(僞造響應不進會話日誌)
        onMissing: fail                 # 規則 require 不滿足時:fail | skip
        log: { matched: true, passthrough: false, headers: false, buffer: 200 }
        panel: { enabled: true, path: '/fetch-router' }
        routes:
          - id: opencode-session-chat
            match: { host: "opencode.ai", path: "/zen/go/v1/chat/completions", methods: [POST], provider: "opencode-go*" }
            require: [session]
            headers: { x-opencode-session: "$session" }

常用配置項說明:

  • reserved:規則不得覆蓋的請求頭(如 user-agent)
  • ifAbsent: true:目標頭已存在則不覆蓋
  • allowMock:respond 本地應答開關;僞造響應會進入模型上下文但不進會話日誌,破壞「Model-visible ⟺ logged」,僅適合測試 profile
  • onMissing:規則 require 不滿足時爲 fail 或 skip
  • panel.enabled / panel.path:監控面板開關與路徑前綴

適用場景與注意

適合誰

  • 需要在 DSH 層統一給特定網關補請求頭、改 URL,而不改每個 provider 實現
  • 調試出網行爲,希望在本機右側面板看命中規則與上游狀態碼
  • 使用 OpenCode Zen 等要求 session 頭的網關,希望用默認 bundled 規則快速驗證

邊界與行爲

  • 配置非法時拒絕安裝,保持原 fetch
  • 改寫器拋錯時立即拒絕本次請求,異常向調用方傳播
  • 不覆蓋:node:http 直連的 SDK;pi-ai transport: 'websocket' 路由
  • dispose 後先純透傳,再按身份還原 globalThis.fetch

DSH 生態強調「一切皆插件」;SkillHub 等社區目錄爲獨立站點,與 DeepSeek / 幻方無官方從屬關係。本插件 GitHub 星標爲 0(截至資料抓取),選用時請自行評估維護節奏與 issue 情況。

結尾

dsh-fetch-router 把 DSH 出網 HTTP 的「按端點注頭 / 改目標 / 本地應答」與「全局 body 改寫」分成兩層,並附帶原生右側欄監控,適合在 desktop profile 裏集中處理網關約定與聯調觀測。

  • 目錄頁:https://www.skillhub.cn/plugins/leolee9086/dsh-fetch-router
  • GitHub:https://github.com/leolee9086/dsh-fetch-router
羽毛球分组比赛记分
小程序二维码

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

小夜