dsh-request-injector:按 provider / model / host 向下游模型请求注入 HTTP 头

前言

在 DSH(DeepSeek Harness)里调用模型时,请求往往还要经过自建网关或统一代理:需要带会话标识、租户头、链路追踪 ID 等。这类头通常只能改 DSH 源码,或在网关侧写死逻辑,改动面大、也难按 provider 或模型区分。

dsh-request-injector 是社区维护的 DSH 插件,用一份配置在请求发出前注入自定义 HTTP 头,并按 provider、model、host 做匹配;头值里的 ${变量} 只在真正发请求时求值。下面介绍它的定位、能力、安装与配置方式。

这是什么

  • 插件名称:dsh-request-injector(目录页:SkillHub 插件条目)
  • 维护者:PluieM
  • 分类:模型推理(社区目录归类)
  • 一句话:按 provider / model / host 匹配,向下游模型请求注入自定义 HTTP 请求头;请求头的值支持 ${variable} 占位符,在请求真正发出时才求值。

插件以当前 DSH 进程的权限运行,安装前应自行查阅 GitHub 仓库 源码与 MIT 许可证。社区插件目录为独立站点,与 DeepSeek / 幻方无官方从属关系。

核心功能

匹配与注入

  1. 三个匹配维度:provider 精确匹配;model 精确或尾部 * 前缀匹配(如 deepseek-v4*);host 按真实目标主机匹配(不计大小写)。留空表示该维度不限。
  2. 占位符:例如 x-opencode-session: ${sessionId}、x-trace-id: ${uuid};不做递归展开,$$ 输出字面量 $。
  3. 变量缺失时:可选 skip(跳过该头)、empty(替换为空串)、error(让本次请求失败)。
  4. 保留头保护:authorization、host、content-length、x-dsh-* 等由 HTTP 栈或宿主管理的头拒绝写入。

双后端与生效范围

插件在链路上有两处落点,默认 backend: auto 同时启用:

后端 覆盖的场景 盲区
A · 官方扩展点 llm-pi-ai/request-headers pi-ai 适配器的全部传输方式(含 websocket) 拿不到真实目标 URL;非 pi-ai 适配器与模型列表探测不走这里
B · 包装 globalThis.fetch 所有走 fetch 的路径,可按 host 精确匹配 websocket 握手不经 fetch

同一条规则被两个后端各写一次时,值相同则幂等,无需额外去重。无 LLM 上下文时(例如模型列表探测),只有显式写了 host 的规则才会命中——避免把本会话级头误注入到进程内任意 fetch。

配置与 UI

  • 配置页入口:设置 → 「请求头注入」,或 插件管理器 → 请求头注入行详情;两处读写同一 namespace。
  • 配置整节为 volatile:在插件页保存后立即生效,无需重启插件或重载 DSH;也可手写 profile 的 cordis.patch.yml,Host 侧会审计并告警明显错误。
  • 可视化表单支持规则增删排序、逐头校验、可用变量速查表;保存采用整表提交并带版本冲突检测。
  • 安装后默认 rules 为空,不注入任何头,不影响现有行为。

安装与启用

在 DSH 环境中执行:

dsh plugin install dsh-request-injector

或在插件管理器「添加插件」中填写 dsh-request-injector。包内已包含可直接加载的 lib/index.js(Host)与 lib/client.js(Web 客户端),无需构建步骤。

资料中 package.json 标明版本 0.1.3,声明与 DSH 0.2.2-rc.1 兼容;Node 引擎要求 >=22.19.0。

快速上手

配置可在界面中完成,不必先改文件。

  1. 打开插件管理器,找到「请求头注入」,进入配置页。
  2. 在「基本」区:启用插件、后端(默认「自动(两个后端都注册)」)、变量缺失时的处理方式、调试日志。
  3. 在「规则」区点「新增规则」:
    - 匹配条件:provider、model、host,留空表示不限。
    - 请求头:逐条填名称与值,值中可写 ${sessionId} 等占位符。
    - 顺序:数字小的先应用;同名头后写的覆盖先写的。
  4. 点「保存」。保存即生效,下一条请求即可带头。

典型 YAML 示例(给网关带会话头):

enabled: true
backend: auto            # auto | headers | fetch
onMissingVariable: skip  # skip | empty | error
debug: false
rules:
  - enabled: true
    comment: 给网关带会话头
    match:
      provider: newapi-responses
      model: ''          # 空 = 不限
      host: ''           # 空 = 不限
    headers:
      x-opencode-session: ${sessionId}

适用场景与注意

适合谁:需要在不改 DSH 核心、不改网关硬编码的前提下,按 provider / 模型 / 目标 host 附加 HTTP 头的智能体或网关集成场景——例如自建网关会话头、按模型区分租户标识、链路追踪头。

务必注意:

  1. websocket:仅后端 A 对 WS 有效;保持默认 backend: auto 即可。
  2. 配置明文:保存在 profile 的 cordis.patch.yml;不要把长期密钥写进配置,优先用短期会话 ID 类变量。
  3. 能力边界:model 需手填,无下拉;只处理请求头,不修改请求体。
  4. 运行权限:插件与 DSH 同进程,安装前请核对源码与许可证。

结尾

dsh-request-injector 把「按条件注入下游模型请求头 + 运行时占位符」收成可热更新的插件配置,并兼顾 pi-ai 扩展点与 fetch 两条路径。需要查阅说明与源码时,可参考 SkillHub 目录页 与 GitHub:PluieM/dsh-request-injector。

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

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

小夜