前言¶
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
使用¶
- 打开 设置 → 模型。
- 展开任意一个 pi-ai 提供方卡片(DeepSeek 官方、内置第三方或自定义提供方均可)。
- 卡片中会出现 “自定义请求头(N)”,展开后按
名称/值逐行填写。 - 点击 保存,配置将写入 Harness 原生的
settings.yaml。
典型示例¶
以 OpenCode Go 为例,该服务要求所有推理请求携带 x-opencode-session。在对应卡片中添加一行:
| 名称 | 值 |
|---|---|
x-opencode-session |
${sessionId} |
保存后,每次流式请求都会带上属于该会话的 ID。若不需要会话展开,直接填写固定值即可。
机制说明¶
Harness 原生配置无法实现 ${sessionId} 的按会话展开,因为同一路由下所有会话共用一个值。插件通过以下机制实现:
- 监听
llm/stream瀑布流,将一次流式调用放入携带会话 ID 的AsyncLocalStorage作用域。 - 在插件生命周期内包装
globalThis.fetch,只有处于上述作用域内的请求才会附加展开后的请求头。
固定值的请求头仍走 Harness 原生逻辑,不受影响。
配置¶
插件支持在 settings.yaml 中配置以下项:
- id: model-headers
config:
dynamic: true # 默认 true,设为 false 则不安装 fetch 包装与监听器
hosts: [] # 默认空,填写则按主机后缀收窄生效范围
注意事项¶
- 仅覆盖 pi-ai 路由:
llm-deepseek路由的 Config 中没有headers字段,该路由的卡片不会出现此编辑器。 - user-agent 无法覆盖:它是 Harness 的归属标识,插件无法修改。
- ${sessionId} 仅对流式生效:“获取可用模型”请求不经过
llm/stream,因此那里仍发送字面量。 - 明文存储:请求头值以明文存储在
settings.yaml,不要将密钥写进请求头,请使用 Harness 的凭据字段。 - 编辑器位置:渲染在卡片内而非独立的“编辑”表单,这是模型设置页仅有的扩展槽位。
结尾¶
本插件填补了 DSH 模型设置页缺少请求头 UI 入口的空白,并解决了原生配置无法随会话动态变化的问题。它通过标准的插件机制实现,卸载后可完全还原。更多细节可参考插件目录或源码仓库。