前言¶
在 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 通配,默認/**)methodsprovider、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.jsonGET {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」,僅適合測試 profileonMissing:規則require不滿足時爲fail或skippanel.enabled/panel.path:監控面板開關與路徑前綴
適用場景與注意¶
適合誰
- 需要在 DSH 層統一給特定網關補請求頭、改 URL,而不改每個 provider 實現
- 調試出網行爲,希望在本機右側面板看命中規則與上游狀態碼
- 使用 OpenCode Zen 等要求 session 頭的網關,希望用默認 bundled 規則快速驗證
邊界與行爲
- 配置非法時拒絕安裝,保持原
fetch - 改寫器拋錯時立即拒絕本次請求,異常向調用方傳播
- 不覆蓋:
node:http直連的 SDK;pi-aitransport: '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