dsh-provider-headers:DeepSeek Harness 自定义请求头插件

前言

DeepSeek Harness (dsh) 原生支持按提供方配置请求头,但该字段仅在 settings.yaml 中可编辑,模型设置页没有入口。本插件通过 dsh 的插件机制,在模型设置页增加了请求头编辑器,并额外实现了 ${sessionId} 的按会话展开功能。

是什么

这是一个为 DeepSeek Harness(dsh)的模型设置页添加“自定义请求头”编辑器的插件。由用户 duanyunlun 维护,通过插件机制在不修改源码的情况下,为每个 pi-ai 提供方卡片增删请求头,并将 ${sessionId} 替换为当前会话 ID。

安装

安装前需确保系统已安装 Node.js ^22.19.0 || >=24.0.0 和 pnpm。

# 从 npm 安装(已发布)
dsh plugin --profile desktop add dsh-provider-headers

# 从本地目录安装
dsh plugin --profile desktop add /path/to/dsh-provider-headers

# 从本地打包文件安装
dsh plugin --profile desktop add ./dsh-provider-headers-0.1.0.tgz

安装后需重启对应 profile 才能加载浏览器端代码。卸载时执行:

dsh plugin --profile desktop remove dsh-provider-headers

使用

  1. 打开 设置 → 模型。
  2. 展开任意一个 pi-ai 提供方卡片(DeepSeek 官方、内置第三方或自定义提供方均可)。
  3. 卡片中会出现 “自定义请求头(N)”,展开后按 名称 / 值 逐行填写。
  4. 点击 保存,配置将写入 Harness 原生的 settings.yaml。

典型示例

以 OpenCode Go 为例,该服务要求所有推理请求携带 x-opencode-session。在对应卡片中添加一行:

名称 值
x-opencode-session ${sessionId}

保存后,每次流式请求都会带上属于该会话的 ID。若不需要会话展开,直接填写固定值即可。

机制说明

Harness 原生配置无法实现 ${sessionId} 的按会话展开,因为同一路由下所有会话共用一个值。插件通过以下机制实现:

  1. 监听 llm/stream 瀑布流,将一次流式调用放入携带会话 ID 的 AsyncLocalStorage 作用域。
  2. 在插件生命周期内包装 globalThis.fetch,只有处于上述作用域内的请求才会附加展开后的请求头。

固定值的请求头仍走 Harness 原生逻辑,不受影响。

配置

插件支持在 settings.yaml 中配置以下项:

- id: model-headers
  config:
    dynamic: true      # 默认 true,设为 false 则不安装 fetch 包装与监听器
    hosts: []          # 默认空,填写则按主机后缀收窄生效范围

注意事项

  1. 仅覆盖 pi-ai 路由:llm-deepseek 路由的 Config 中没有 headers 字段,该路由的卡片不会出现此编辑器。
  2. user-agent 无法覆盖:它是 Harness 的归属标识,插件无法修改。
  3. ${sessionId} 仅对流式生效:“获取可用模型”请求不经过 llm/stream,因此那里仍发送字面量。
  4. 明文存储:请求头值以明文存储在 settings.yaml,不要将密钥写进请求头,请使用 Harness 的凭据字段。
  5. 编辑器位置:渲染在卡片内而非独立的“编辑”表单,这是模型设置页仅有的扩展槽位。

结尾

本插件填补了 DSH 模型设置页缺少请求头 UI 入口的空白,并解决了原生配置无法随会话动态变化的问题。它通过标准的插件机制实现,卸载后可完全还原。更多细节可参考插件目录或源码仓库。

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

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

小夜