dsh-request-header-fix:为自选模型请求补上 x-opencode-session

前言

在 DeepSeek Harness(DSH)里,如果你把模型流量接到要求带 x-opencode-session 的中转站(例如转发到 OpenCode 的线路),会话 UUID 必须出现在 HTTP 请求头里,中转才能把多轮对话串在同一会话上。DSH 内置只会对 opencode、opencode-go 等少数 provider 自动补这个头;你自己在 profile 里配置的其它 provider 不会带上。下面介绍社区插件 dsh-request-header-fix(维护者 a285292107s):在设置里按 provider → 模型 勾选,只对选中的组合在发模型请求时追加 x-opencode-session: <当前 DSH 会话 UUID>。默认全部关闭,安装后不改变任何现有请求。

这是什么

dsh-request-header-fix 是 DSH 的 Cordis 插件包,分类属于模型推理相关能力。它在 DSH 设置弹窗左侧增加「请求头修正」分区(order 12,排在「模型」与「插件」之间),列出已配置 provider 下的模型,用开关决定是否在 llm/stream 触发的模型请求里注入请求头。装、卸只改 web profile(依赖、bundles 与本包 patch 提供的 Loader 行),不写入 DSH 安装目录。

核心功能

请求头注入规则

注入点在 host 进程里对 globalThis.fetch 的外包:当同时满足「当前在 llm/stream 上下文」「有 sessionId」「本次请求的 provider 与 model 与勾选配置精确匹配」时,为请求加上(或覆盖已有同名头):

x-opencode-session: <sessionId>

sessionId 来自 DSH 会话 UUID(同会话稳定、跨重启不变),插件不生成、不持久化 id,也不读写会话存储。未勾选、无 sessionId、或不在模型流上下文(如模型发现、用量查询)时,请求与原样一致。

设置页与持久化

页面按 provider 分组:组头显示名、provider id、已选计数,以及「全选」「清空」;组内每行一个模型开关。配置写入插件命名空间(Loader id 为 request-header-fix),字段形态为 headerFix: Record<provider, string[]>,数组元素是模型 id。示例(写入 profile 的 cordis.patch.yml 后大致如下):

- id: request-header-fix
  name: dsh-request-header-fix
  config:
    headerFix:
      mydeepseek:
        - deepseek-v4.1-flash
        - qwen3.8-max

deepseek-account 不会出现在列表中(账号路由不走这套配置)。

默认与安全边界

默认全关:未勾选任何模型时,行为与未安装插件相同。插件唯一的持久化写入是上述勾选状态;网络仍由原 fetch 执行,没有独立端口或额外出站。勾选后,你选中的 provider 及其背后的中转站会收到当前会话 UUID——这是功能设计,不是隐藏副作用。若只想停止带头而不卸载,清空全部勾选即可(下一条请求生效);彻底卸载后需重启 dsh web,旧进程内的 fetch 补丁才会消失。

安装与启用

从 GitHub 安装(README 给出的命令,只改 profile):

dsh plugin --profile web add github:a285292107s/dsh-request-header-fix

构建产物 lib/ 已随仓库提供;若要钉住提交,可使用 github:a285292107s/dsh-request-header-fix#<commit>。

装完后检查 %USERPROFILE%\.dsh\profiles\web\package.json:dsh.profile.bundles 中应出现 dsh-request-header-fix。然后重启 dsh web——host 半边仅在进程启动时加载,不重启看不到「请求头修正」分区。

本地改代码时,先在仓库内 npm install、npm run typecheck、npm run build,再:

dsh plugin --profile web add link:<本仓库的绝对路径>

link: 指向含 lib/ 的工作副本;Windows 路径建议用正斜杠,例如 link:C:/Users/<user>/Desktop/dsh-request-header-fix。

卸载:

dsh plugin --profile web remove dsh-request-header-fix

卸载后同样要重启 dsh web。README 注明:卸载不一定会清理 profile 里已写入的 headerFix 设置项;若要 profile 干净,可在卸载前先清空全部勾选。

典型用法

  1. 按上文命令把插件加入 web profile,重启 dsh web。
  2. 打开设置 → 请求头修正,用搜索框按 provider 名/id 或模型名/id 过滤;展开目标 provider,打开需要走 OpenCode 类中转的模型开关(或组头「全选」)。
  3. 确认配置已落盘(profile 里 request-header-fix 的 config.headerFix),在该会话中继续对话;仅被勾选的 provider + 模型 id 组合会在模型流请求中带头。

若中转仍收不到头,按 README 故障排查:核对 cordis.patch.yml 中的勾选、确认发请求的是已加载本插件并已重启的 dsh web 进程,并注意模型 id 与请求时的 options.model 必须字符串完全一致(无通配)。

适用场景与注意

适合谁: 使用 DSH web profile、自建或第三方 provider,且线路文档要求 x-opencode-session、但不在 DSH 内置自动补头的 provider 列表里的开发者。

环境与版本: 仓库 README 在 2026-11-02 核对的环境为 DSH 0.2.2-alpha.2、Node v24.15.0、npm 11.14.1;插件包版本为 0.1.1(MIT)。范围仅 web profile;其它 profile 各有独立设置命名空间。

安装前建议: 插件以当前 dsh web 进程权限运行,会在 host 侧 patch fetch 并按你的勾选改 outgoing 模型请求头。安装前应阅读 GitHub 仓库 源码与许可证,并理解勾选会把会话 UUID 发给对应中转站。

社区插件目录由 SkillHub 等站点收录,与 DeepSeek / 幻方无官方从属关系;DSH 生态强调「一切皆插件」,是否采用由你自行评估。

结尾

dsh-request-header-fix 用最小改动把「按 provider/模型选择性补 x-opencode-session」做成可关可卸的设置页能力,默认不影响现有流量。目录页:https://www.skillhub.cn/plugins/a285292107s/dsh-request-header-fix;源码与完整说明:https://github.com/a285292107s/dsh-request-header-fix。

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

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

小夜