前言¶
在 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