dsh-llm-pool:在 DeepSeek Harness 里用统一模型池做粘性路由与自动 failover

前言

在 DeepSeek Harness(DSH)里接入多个 LLM 服务商时,常见做法是分别配置渠道、在模型菜单里来回切换。会话一旦跨渠道,前缀 KV cache 往往无法复用;某条线路限流或鉴权失败后,又要手动改模型或改配置。若希望把多条真实渠道收成「一个虚拟服务商」,并在失败时自动换路、同时尽量让同一会话钉在同一条线路上,就需要在 Host 侧做统一路由与能力合并。dsh-llm-pool 是 lyingloong 维护的 DSH 插件(分类:模型推理),在当前资料中面向 DSH 0.2.1-rc.5,用会话粘性加全局负载均衡和自动切换来应对上述问题。

这是什么

dsh-llm-pool 为 DSH 增加「统一服务商 / 模型池」:把多个真实模型渠道组合成一个虚拟 provider,在模型选择器里像普通渠道一样选择。仓库与 npm 包名均为 dsh-llm-pool,许可证 MIT,运行时要求 Node.js ^22.19 || >=24,纯 JavaScript、无原生依赖;与 DSH 的版本约束为 >=0.2.1-0 <0.3.0-0(package.json 当前版本 0.1.1)。

插件不单独保存 provider 密钥,真实请求仍走用户已配置好的 provider route;只在 Host 内注册虚拟路由,并通过设置里的配置编辑器或 cordis.patch.yml 写入池配置。

核心功能

下面按资料中已写明的行为归纳,不超出 README 范围。

统一服务商与模型映射

  • 可定义虚拟 provider(例如 pool-a),members 列出有序的真实 provider(如 provider-a、provider-b)。
  • 在虚拟 provider 下定义统一模型 id(如 model-a),通过 targets 把「成员 → 实际模型 id」一一映射;省略映射时默认各成员使用与统一模型同名的实际 id。

会话粘性 + 全局均衡(默认 strategy: sticky)

  1. 新会话或子代理首次调用时,在候选成员中选当前绑定会话数最少者;相同时轮转。
  2. 之后该会话对同一统一模型尽量固定在同一成员,减少换渠道导致的前缀缓存失效。
  3. 调用失败且在尚未产生可见输出前,静默尝试下一个候选;若切换后成功,会话绑定会改到成功的成员。

分配粒度为「会话 + 统一服务商 + 统一模型」。进程重启后内存中的绑定会重置,但会话已选的 provider/model 不受影响。

失败切换与健康冷却

  • 首 token 前失败(认证、配额、限流、5xx、超时等):记录失败并进入冷却,尝试下一候选。
  • 已有可见输出后再失败:不拼接两个渠道的回复,交给 DSH 自带的 dsh-llm-retry 按 step 重试。
  • 认证/配额/限流/服务端/超时等失败进入冷却;全部成员冷却时 fail-open,选最早恢复时间尝试。

strategy 还可设为 round-robin(每次调用轮询)或 failover(固定第一个可用)。

能力合并

对统一模型声明的能力会合并各成员:上下文窗口与最大输出默认取可用成员的最小值(可手动覆盖);推理档位默认取交集,可用 effortMap 做统一档位到成员档位的映射;图片能力取并集。不支持当前请求能力的成员在调用时会被跳过。

配置界面与可观测

安装并在 设置 → 模型 页面底部打开「统一服务商池」面板后,可查看状态、编辑渠道与模型映射、测试模型;面板可显示会话分配、路由成功/失败、冷却与最近调用等信息。高级字段(推理档位映射、冷却毫秒等)可通过「高级 JSON」或 cordis.patch.yml 编辑。

安装与启用

推荐从 npm 安装(README 原文命令如下)。web 是 DSH 市场文档里的通用 profile 名;若 profile 名为 desktop,将 --profile web 换成 --profile desktop。

dsh plugin --profile web add dsh-llm-pool

安装后重启或刷新客户端,在 设置 → 模型 底部应出现「统一服务商池」。npm 包页:https://www.npmjs.com/package/dsh-llm-pool。

从 GitHub 安装源码时,资料给出的命令为:

dsh plugin --profile web add github:lyingloong/dsh-llm-pool

本地开发可将 --profile 与仓库绝对路径按 README 说明传入插件管理器。若环境中存在已从 npm 撤包的老插件导致 pnpm install 失败,README 建议可通过 registry 选项指定 https://registry.npmmirror.com 绕过,属安装环境问题而非本插件逻辑。

插件在带 llm、Web server、configEditor 的 profile(desktop / web 均可)上工作。安装前宜自行查看仓库源码与 MIT 许可证;插件以当前 DSH 进程权限运行,测试按钮会发起真实、可能计费的 provider 请求。

典型配置与用法

配置保存在当前 profile 的 cordis.patch.yml,也可通过面板保存。完整示例见仓库 examples/pool.yml。简例结构如下(字段含义见 README 字段表):

- id: llm-pool
  name: dsh-llm-pool
  config:
    retryPolicy:
      mode: normal
      maxRetries: 2
    providers:
      pool-a:
        displayName: Example Pool
        strategy: sticky
        members: [provider-a, provider-b, provider-c]
        models:
          - id: model-a
            name: Model A
            targets:
              provider-a: model-a
              provider-b: model-a-alt
              provider-c: model-a

使用步骤(与 README 一致):

  1. 在真实渠道里配好各自的 endpoint、key 与模型;本插件复用这些配置,不要求在池里再配密钥。
  2. 在 设置 → 模型 底部面板点「新增统一服务商」,选择成员、聚合模型、调整映射后保存。
  3. 在会话 /model 或输入框模型菜单中选择 pool-a 下统一模型;子代理、默认模型、AgentTeams 成员也可直接选该虚拟 provider。
  4. 在面板中对某模型行点「测试」,可做一次真实流式调用以确认映射与渠道可用。

可选 retryPolicy 将虚拟 provider 失败后的重试交给 dsh-llm-retry;providers.<id>.cooldown 可覆盖各类失败的冷却时长(毫秒)。

适用场景与注意

适合:已为 DSH 配置多条 LLM 渠道,希望在模型菜单里呈现一个逻辑上的「池」,在负载与故障之间做默认粘性均衡;需要按成员映射不同实际 model id,或合并多成员能力声明的场景。

资料中的限制与注意:

  • 已输出内容后失败无法在同一流上无缝续接,依赖 dsh-llm-retry 重试整个 step。
  • 会话绑定、健康状态、最近调用在内存中,重启或保存配置后相关运行时状态会重置。
  • 默认上下文取各成员最小值可能偏保守,可手动覆盖 contextWindow / maxTokens。
  • 不支持嵌套统一服务商(成员不能是另一个池)。
  • 卸载插件后真实 provider 配置保持不变;插件不修改 DSH 核心安装包。

CI 在 Node 22/24 上运行 npm run verify(27 个单元测试);端到端与故障切换记录见仓库 docs/demo.md。

结尾

dsh-llm-pool 把多渠道路由、能力感知映射和失败前静默切换收到一个虚拟 provider 里,默认策略优先保住会话级 KV cache 并做全局会话数均衡。查阅市场条目与源码可分别访问 SkillHub 目录页与 GitHub 仓库:

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

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

小夜