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
羽毛球分组比赛记分
小程序二维码

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

Xiaoye