跳到主内容

dsh-llm-fallbacks

13Star2Fork0Issue0Watching

为 DSH 智能体提供 LLM 模型自动降级链:请求触发鉴权、配额或限流码时自动切换到下一个备用模型,任务不中断。

机审证据5/5方法论数据来源安装命令持续维护DSH 版本风险扫描
机审证据安装命令仓库已核验dsh-plugin Topic许可证READMEAI 百科
语言
TypeScript
License
MIT
分支
main
deepseek-harnessdeepseek-harness-plugindshdsh-pluginfallbackssubagents

安装

命令web profile
$ dsh plugin --profile web add github:btspoony/dsh-llm-fallbacks

在终端中运行以上命令,通过 dsh CLI 安装此插件。可在右上角切换 Profile。 第一次用 dsh?看这篇新手教程

对话式安装

帮我安装 DeepSeek Harness 插件 btspoony/dsh-llm-fallbacks:先查看仓库 https://github.com/btspoony/dsh-llm-fallbacks 确认安全性,然后执行安装命令并验证插件加载成功。

把这段指令粘贴给 DSH Web GUI 里的助手,由它代你完成安装与验证。

一句话定位

为 DSH(DeepSeek Harness)智能体的 LLM 请求增加自动降级链:当鉴权失败、配额耗尽或限流(429)触发时,插件会沿着预设的 provider/model 顺序自动切换到下一个可用模型,当前步骤继续运行而不被打断。

核心能力

  • 主代理和子代理的请求失败后,自动沿降级链切到下一个 provider/model,任务不中断
  • 通过模型选择器新增的「FallbacksChain / Auto」虚拟条目,可以把整条链作为主选使用,而不是仅在失败时介入
  • 提供 7 个内置子代理角色(task / sonic / scout / designer / librarian / reviewer / security-reviewer),可直接被规则引用
  • 支持按时段切换有效根链(peak/valley 窗口):4 个固化 UTC+8 预设 + 自定义窗口,第一条命中的行的链替换全天链
  • 派发时为子代理智能体按三段式解析(显式 → 规则 → LLM 自动匹配)锁定角色,并把该角色链的第一个具体模型注入到首次请求
  • 单步切换次数与 always-mode 重试上限两个安全阀,避免链循环把延迟放大

技术实现

  • 语言: TypeScript(host 端 + client 端 React 组件),输出 ESM
  • 关键依赖: @deepseek-ai/cordis ^4.0.1(host 服务注入)、@deepseek-ai/dsh-settings(设置命名空间注册)、@deepseek-ai/dsh-typert-protocol + dsh-typert-registry(自建 /api/fallbacks/* 网关通道)、@deepseek-ai/schemastery ^3.18.1(设置 schema)
  • 架构模式: mount-only cordis 插件——bundle/cordis.patch.yml 只插入一行 id: llm-fallbacks,host 侧通过 agent/request-error 与 agent/request 两个 cordis 钩子拦截请求,client 侧通过 settings.plugin.item 插槽注册设置卡片 + 通过 llm.registerAdapter 注册虚拟 provider;自带的 typert 网关(/api/fallbacks/get|set|reset|revert-seed)是唯一写入路径,不修改 dsh 源码
  • 入口文件: src/index.ts(host 端 apply())、src/client/index.ts(client 端 apply()),分别被 bundle patch 与 dsh.client.inject 列表装载

适用场景

DSH 用户用 DeepSeek / Anthropic / OpenAI 等多模型时,单个 provider 出现 429、配额用尽或鉴权失败就会让整个任务卡住。装上本插件后,配一条「首选 Anthropic,备用 DeepSeek V4 Flash,最后兜底 DeepSeek V4 Pro」这样的链,单点失败就不再阻断任务。多模型用户、有自建/三方多 provider 配置习惯的用户,以及想为 peak/valley 时段切换不同模型池的用户最适合使用。

前置依赖与兼容性

依赖最低版本说明
DSH^0.1.1-rc.1所有 @deepseek-ai/dsh-* peer 依赖均为 ^0.1.1-rc.1;dsh-tui 设置面板需要 ≥ v0.8.5(README.md:145)
Node.js>=22package.json:56-58 声明 engines.node: ">=22";构建时使用 pnpm ≥ 10 / 项目栈 pnpm 11.21+
平台跨平台package.json 未声明 os / cpu,无原生模块依赖
原生模块无不引入 node-pty、node:sqlite 等原生绑定

安装方式

dsh plugin --profile web add github:btspoony/dsh-llm-fallbacks

配置项

本插件的所有配置都落在 dsh 设置文档的 fallbacks: 命名空间下,可在 Settings → Plugins → Fallbacks 卡片、$DSH_HOME/settings.yaml 文件、或 dsh-tui 的 /settings 区域编辑。说明列写人话,完整字段约束见 docs/configuration.md。

配置类型说明默认值
enabledboolean功能总开关;关闭时插件完全 no-opfalse
triggerCodes字符串数组进入降级决策的失败码列表(5xx 由 llm-retry 先重试)['AUTH', 'QUOTA', 'RATE_LIMIT']
rootChain字符串数组全天降级链:前面是降级链,最后一项必须是官方 V4 模型(Flash 或 Pro)作为兜底[]
cooldownMs数字被切离/失败的模型在多少毫秒内不再被选中300000(5 分钟)
revertPolicy枚举冷却到期后是否自动回到主模型cooldown-expiry
maxSwitchesPerStep数字单步最大切换次数;超过则停止切换8
alwaysModeRetryCap数字always 模式重试达到多少次后触发切换;0 表示禁用5
presets枚举是否在 apply 时自动声明 7 个内置子代理角色bundled
roleAutoMatch布尔是否允许在子代理首次请求时用 LLM 自动匹配角色true
timeSlots数组时段切换行(4 个固化预设 + 自定义窗口);第一条命中的行的链会替换全天链[]
tz字符串时段匹配使用的时区(标准 Intl 规则,DST-safe)Asia/Shanghai
roles.list数组自定义子代理角色列表,每条至少要有一条链条目[]
roles.rules数组把子代理映射到角色的规则(按 provider/model 模式匹配)[]

常见问题

Q: 这个插件装上之后会立刻改变我的模型行为吗?

A: 不会。enabled 默认是 false,且没有配置任何链时空配置是 no-op,跟没装一样。需要先在 Fallbacks 卡片里把开关打开,并填好 rootChain,重启会话后才生效。

Q: 5xx 类的临时错误会被降级链接管吗?

A: 5xx 默认由宿主的 llm-retry 插件先退避重试,等它的预算用完以后才会走到本插件的决策路径;不需要把 5xx 加进 triggerCodes(docs/configuration.md:25)。

Q: 主选想直接用降级链的「头」,应该怎么设置?

A: 在 web 端或 dsh-tui 的模型选择器里选 FallbacksChain / Auto 这一虚拟条目即可——它会把当天有效链的第一个具体模型当作主选;选任何真实模型则保留 fallback-only 行为。

Q: 升级到 0.2.2+ 之后历史会话打不开了,怎么办?

A: 0.2.2 之前的版本会在会话里写入 fallbacks/switch durable 事件,新版 dsh 会拒绝加载这种会话。先停 dsh,clone 本仓库,然后跑 pnpm repair:fallbacks-switch-logs -- --apply --backup,脚本会把旧事件标记为 ignorable 让会话恢复加载。

Q: 我直接编辑 settings.yaml,能实时生效吗?

A: YAML 是共享的真值源,web 卡片和 TUI 都从这里读。改完需要重启当前 dsh 会话,配置变更才会被插件拾起(README.md:70-74)。

Q: 终端 profile 里没有设置面板怎么办?

A: 需要 dsh-tui ≥ v0.8.5。低于这个版本的 dsh-tui 在 /settings 里看不到 Fallbacks 编辑区,只能改文件;功能仍然可以跑,只是没有 GUI。

Q: 卸载时需要做什么额外操作吗?

A: 跑 dsh plugin --profile web remove dsh-llm-fallbacks 然后重启会话即可。本插件没有任何 postinstall 钩子,也没有改过 dsh 源码。

上手难度

入门 — 默认配置下插件完全 no-op;最少只需在设置卡片里打开 enabled 并填一行 rootChain 就能让降级引擎运转,复杂的时段切换和角色规则可以按需慢慢加。

已知问题与限制

  • 不会自动改写旧版(两段式时代)的 chains / roles.default 配置,只在启动时打印 warning 并在面板顶部显示迁移横幅,需要手工按 docs/configuration.md 迁移表改写(src/index.ts:436-439、README.md:133)。
  • 0.2.2 之前的版本曾经写过 durable fallbacks/switch 会话事件,issue #52(apply() 时事件类型注册在不同模块实例下失效)已确认;自 0.2.2 起插件停止写入新事件,但旧会话需要用仓库里的 scripts/repair-fallbacks-switch-logs.ts 脚本标记为 ignorable 才能重新加载(src/index.ts:672-678、README.md:46-58)。
  • 时段切换的预设(liang-peak / liang-valley / glm-peak / glm-valley)窗口是固化的 UTC+8 代码常量,配置中预设行不可携带 start/end/days/name 字段;保存时被网关拒绝,加载时若带会被警告并跳过(src/time-slots.ts:106-152、src/config.ts:236-241)。
  • 当 rootChain 不以官方 V4 模型(Flash 或 Pro)结尾时,启动会有一次 warning;时段行此时保持无效,模型选择器里的 FallbacksChain / Auto 也会拒绝覆写(src/config.ts:236-241、src/virtual-adapter.ts:287-298)。
  • agent/request-error 钩子必须排在宿主 llm-retry 之后;插件的 bundle 行通过 dsh plugin add 自动追加到层栈末尾,满足顺序;手动改 dsh.profile.bundles 时需要保证 @deepseek-ai/dsh-base 在本插件之前(docs/install.md:31-37)。

查看使用指南 →

该插件的安装步骤、关键要点、FAQ 与兼容性说明(基于已收录字段派生)。

收录徽章

Listed on deepseek-plugin.org
[![Listed on deepseek-plugin.org](https://img.shields.io/badge/listed_on-deepseek--plugin.org-007EC6)](https://deepseek-plugin.org/plugins/btspoony/dsh-llm-fallbacks)

把这段 markdown 粘贴到你的 GitHub README,链接回本插件详情页。徽章只声明已被本站收录,不代表安全认证。

返回插件目录