deepseek-harness
deepseek-ai
DeepSeek Harness: Everything is a Plugin.
EPCN-fla/dsh-custom-headers
Per-model custom request headers for DeepSeek Harness: define named header profiles in Settings → Plugins → Plugin configuration, pick one per model in the provider's model catalog, and every call to that model carries those headers.
PROJECT TOPICS
INSTALL REFERENCE
dsh plugin --profile web add github:EPCN-fla/dsh-custom-headers
该命令指向仓库当前默认分支;尚无绑定当前 commit 的完整验证结果。
PROJECT README
中文 | English
适用于 DeepSeek Harness(DSH)的插件:为每个模型单独附加自定义 HTTP 请求头。
实际部署中,模型请求往往不直达提供方,而是经过企业网关、自研代理或 OpenAI 兼容端点——这些中间层常要求额外的请求头(租户标识、计费标签、自定义鉴权拼写等),且不同模型的要求可能不同。本插件把这件事做成一个按模型、可随时修改的设置项:
名称 / 值 键值对——DSH 0.1.7+ 在「插件」页的本包详情页中编辑,DSH 0.1.5 在「设置 → 插件 → 插件配置」中编辑;插件由两半组成:host 半端负责 custom-headers 配置(写入校验、持久化)和 LLM 派发注入;Web 客户端半端提供插件配置卡片和模型行下拉框。全部数据都保存在 DSH 自身的配置层中(0.1.7+ 为 Profile 的 cordis 补丁,0.1.5 为用户设置文档),不引入任何外部存储;取消选择或删除配置后,下一次调用即恢复原状,不留痕迹。
DSH 的提供方资料(provider profile)本身支持 headers,但它作用于整个提供方路由,无法区分同一路由下的不同模型。而「按模型附加请求头」在真实部署里很常见:
X-Tenant、X-Billable 之类的头做租户识别与计费分摊;不同模型可能归属不同租户或成本中心,需要不同的头。这些头若写进提供方资料,会无差别地附加到该路由下的所有模型;若写进自定义适配器代码,则无法随设置调整。本插件正是在这两者之间补上了「按模型粒度、运行时可视化配置」这一层。
header-name / value 键值对;ID 不允许重复(大小写不敏感,Gateway 与 gateway 视为同一个)。custom-headers 配置名下(0.1.7+ 持久化于 Profile 的 cordis 补丁中本插件行的 config 下,0.1.5 持久化于用户设置文档的同名命名空间),重启后保留;写入时由 Host 端校验,非法数据(重复 ID、非法请求头名/值)会被拒绝并原样反馈。默认 + 全部配置 ID);选择结果写入该模型在 llm-pi-ai 设置中的 headersProfile 字段,随设置文档持久化。默认)或删除配置后,下一次调用即恢复原状。要求:deepseek-harness 0.1.7-rc.1 或 0.1.5-rc.2(@deepseek-ai/dsh-* 包 ≥ 0.1.5-rc.2;两个世代的设置机制均已适配,同一份构建在两者上运行)。
三种方式都通过 DSH CLI 把插件加入指定的 Profile(这里以 web 为例,按需替换)。本包自带 cordis.patch.yml,组合器会自动挂载 host 半端,并向 Web 客户端提供 /plugins/dsh-custom-headers/client.js——安装后无需额外的组合配置。
dsh plugin --profile web add dsh-custom-headers
dsh plugin --profile web add github:EPCN-fla/dsh-custom-headers
通过 git 源安装时,npm 会执行包的 prepare 脚本自动完成构建(要求 Node ^22.19.0 或 >=24)。
git clone https://github.com/EPCN-fla/dsh-custom-headers.git
cd dsh-custom-headers
npm install
npm run build
npm pack # 产出 dsh-custom-headers-<version>.tgz
然后用 CLI 安装这个 tarball:
dsh plugin --profile web add /path/to/dsh-custom-headers-0.1.0.tgz
开发期也可以把 CLI 直接指向工作副本目录;每次改动后重新 npm run build 即可生效。
点击卡片展开后:
gateway),点击 + 添加请求头 填写 请求头名称 与 值;点击行尾 − 删除一行,点击 删除配置 删除整个配置。打开 设置 → 模型,展开某个提供方卡片,在 模型目录 中展开某个模型的 容量(Capacities)折叠区——「请求头」下拉框与容量配置一起折叠,展开后显示在「上下文窗口」和「最大输出」的下方一行:
尚未保存的提供方/模型行(新建卡片)上的下拉框处于禁用状态;请先保存提供方。
headers 优先于本插件的模型级请求头;DSH 的归属标识头(User-Agent)始终由 Harness 决定,本插件会过滤同名自定义项。Authorization、x-api-key)由 SDK 按提供方凭据设置;如需自定义认证方式,请在配置中使用自定义名称的头(例如 X-Api-Key 的网关拼写),并知晓与凭据头同名时可能被 SDK 覆盖。custom-headers 名下的用户层(DSH 0.1.7+ 写在 Profile 的 cordis 补丁中本插件行的 config 下;DSH 0.1.5 写在用户设置文档的同名命名空间里。首个 0.1.7 启动会自动把旧 settings.yaml 的 custom-headers 节导入到本插件行):
custom-headers:
profiles:
- id: gateway
headers:
- name: X-Tenant
value: acme
- name: X-Trace-Id
value: "1"
模型行上的选择(llm-pi-ai 名下,由下拉框写入,无需手工维护):
llm-pi-ai:
providers:
acme:
models:
- id: my-model
headersProfile: gateway
部署方也可以通过插件的 cordis 行 config: 预置组合层配置(作为用户层的 base):
- id: custom-headers
name: dsh-custom-headers
config:
profiles:
- id: gateway
headers:
- name: X-Tenant
value: acme
llm-pi-ai 提供方路由,含手工声明的自定义提供方)的调用生效;其他适配器家族(如 deepseek-official)不经过该连线路径,选择不会被应用。Headers 语义)。npm install # 安装依赖(.npmrc 已启用 legacy-peer-deps)
npm run typecheck # 类型检查
npm test # vitest:单元 / DOM 注入 / 组件 / 真实 pi-ai 连线测试
npm run build # 产出 lib/index.js(host)、lib/client.js(web)、类型声明
测试全部位于 tests/:
| 文件 | 覆盖 |
|---|---|
tests/headers.spec.ts |
校验、归一化、解析、模型行选择读取等纯逻辑 |
tests/host.spec.ts |
设置 seam 双世代(0.1.5 命名空间注册 / 0.1.7 volatile 配置)、适配器包装、请求头盖印与还原、卸载清理 |
tests/pi-ai-wire.spec.ts |
真实 pi-ai openai-completions 连线:model.headers 到达请求、冲突优先级、认证保持 |
tests/ops.spec.ts |
客户端设置读写(冲突重试、拒绝透传、空行清理) |
tests/injector.spec.ts |
模型行发现、幂等注入、staged 行、语言锚点 |
tests/register.spec.ts |
配置卡片在两个世代的槽位注册(0.1.5 settings.plugin.item / 0.1.7 plugins.bundle.config) |
tests/card.spec.tsx |
配置卡片:展开、编辑、校验拦截、保存/放弃、只读 |
tests/select.spec.tsx |
下拉框:选项、写入、已删除配置显示、禁用态、中文文案 |
CLASSIFICATION EVIDENCE
系统优先读取 GitHub Topics,再与站内分类词典和词根规则比对。当前命中: 无有效分类标签。