xsluck/dsh-llm-pi-ai-headers0

dsh-llm-pi-ai-headers

DeepSeek Harness LLM User-Agent/header injector with key pool round-robin: keeps the official llm-pi-ai adapter, re-injects user-agent, and supports multi-key rotation per provider. | DeepSeek Harness LLM 请求头注入器 + Key 轮询:保留官方适配器,补回 User-Agent,支持按提供商多 Key Round-Robin 轮询。

包名
dsh-llm-pi-ai-headers
版本
0.4.0
许可证
MIT
最近更新
2026年8月25日

安装

$npx -p @deepseek-ai/dsh dsh plugin --profile web add github:xsluck/dsh-llm-pi-ai-headers

使用

  1. 重启 dsh web 进程

  2. 浏览器硬刷新(Ctrl+F5)

  3. 打开 设置 → 模型扩展

  4. 选择提供商 → 添加请求头,例如:

    KeyValue
    User-Agentopencode/1.18.18
    X-Customyour-value
  5. 如需 Key 轮询:勾选「启用 Key 轮询」,设置请求头名称(默认 Authorization),逐个添加 API Key。启用后,每次请求会按添加顺序循环选取下一个 Key 注入该请求头,与上方「自定义请求头」互不干扰

  6. 如需调整失败重试:在下方「重试策略」区修改模式/次数,用中文标签勾选可重试错误码(可另填自定义码),并调整退避参数(默认限次数 2 次,可一键恢复默认)

  7. 保存

请求头合并顺序:官方 attributionHeaders(身份头)→ Authorizationheaders(settings.yaml / UI 写入,官方原样发送,其中 user-agent 被官方过滤)→ 本插件 transformHeadersuser-agent 补回 + Key 轮询注入(最终覆盖)。

Key 轮询配置示例


### Key 轮询配置示例

```yaml

# settings.yaml 等价写法(也可通过 UI 配置)
llm-pi-ai:
  providers:
    my-provider:
      keyPool:
        headerName: Authorization   # 注入的请求头名,默认 Authorization
        keys:
          - "sk-key-aaa-first"
          - "sk-key-bbb-second"
          - "sk-key-ccc-third"

请求顺序:第 1 次 → sk-key-aaa,第 2 次 → sk-key-bbb,第 3 次 → sk-key-ccc,第 4 次 → sk-key-aaa……

Key 健康度(坏 Key 定位)

某个 Key 失效(凭据无效 / 额度耗尽 / 限流)时无需猜:

  • 服务端日志:立即打 WARN,含脱敏 Key 与序号——key #2 (Bearer…ab1f) on "my-provider" failed with INVALID_CREDENTIAL — check/replace this key
  • UI 健康面板:「模型扩展」→ Key 轮询卡片下方显示每个 Key 的 调用数 / 失败数 / 最后错误码;疑似失效的 Key 红框高亮 + ⚠️ 标记
  • 错误码含义INVALID_CREDENTIAL = Key 已失效;QUOTA = 额度耗尽;RATE_LIMIT = 限流(通常无需处理)

官方重试机制会自动轮到下一个 Key,因此单个坏 Key 通常只表现为延迟略增;健康面板告诉你该换哪个。修复或删除该 Key 并保存后统计自动清零。

⚠️ 注意:keyPool.keys明文存储在 ~/.dsh/settings.yaml(官方 schema 仅对 apiKeyEnv 走凭据服务,未知字段不参与脱敏)。请确保该文件访问权限受控。

卸载

标准安装

dsh plugin --profile web remove dsh-llm-pi-ai-headers

官方 llm-pi-ai 适配器始终未被修改,卸载后恢复官方原样(headers 里的 User-Agent 会恢复为被过滤、不再注入的状态)。

旧版

node uninstall.mjs              # 恢复前端备份 + 还原 cordis.patch.yml
node uninstall.mjs --purge      # 同时删除插件文件

标准安装为什么升级不需要重跑

旧版把 UI 直接写进官方 dsh-client-ui-settings-models 的 bundle,dsh 升级后该 bundle 被新版覆盖,补丁失效。

新版把 UI 做成独立 client module:

  • dsh.client 声明让 dsh 在浏览器侧加载 lib/client.js
  • lib/client.js 注册到官方 settings.section 槽位,显示为设置侧边栏「模型扩展」分节(order 11,位于「模型」与「插件」之间)
  • 服务端通过 /api/dsh-llm-pi-ai-headers(loopback-only)读写同一个 llm-pi-ai 设置命名空间
  • 服务端只 wrap 官方 PiAiAdapterstreamSimple,注入 transformHeaders 钩子;官方适配器本体不被替换

因此 dsh 升级不会覆盖本插件的前端代码与服务端注入点;升级后通常无需任何重装操作。

目录结构

dsh-llm-pi-ai-headers/
├── package.json            # 标准 dsh 插件包声明
├── cordis.patch.yml        # 仅插入本插件,不修改官方适配器
├── lib/
│   ├── index.js            # 包入口(复用 plugin/llm-pi-ai.mjs)
│   └── client.js           # 前端「模型扩展」分节(设置侧边栏)
├── plugin/
│   └── llm-pi-ai.mjs       # 服务端注入器 + 设置桥(单文件,旧版也复制它)
├── install.mjs             # 旧版安装脚本(保留兼容,新用户勿用)
├── uninstall.mjs           # 旧版卸载脚本
└── patches/                # 旧版前端补丁片段

License

MIT