dsh-wb-credit-fallback
WorkBuddy 积分耗尽时,自动把会话切到 DeepSeek,并把默认模型永久回落到 DeepSeek——这一轮照常答完,之后新开的会话也不再撞额度墙。
DSH(DeepSeek Harness)本身没有跨 provider 的回退链:
- WorkBuddy 插件在积分不足时让本地 shim 返回
402 / hard_credit;
- DSH 的 pi-ai 适配器会把 402 归到
PI_AI_ERROR(不是 QUOTA);
- 内置
dsh-llm-retry 只会用同一个模型重试。
所以这里用一个 host 侧小插件补上缺口。它只用 DSH 0.2.0-rc.2 公开的扩展点,宿主代码零运行时依赖。
行为
- 监听
agent/request-error:失败 provider 是 from(默认 workbuddy)且错误文本命中积分不足标记(hard_credit、insufficient credit、402、积分不足、额度不足、余额不足 等)时:
- 用
sessionController.agents.selectForNextRequest 把当前会话切到 to(默认 deepseek-account / deepseek-flash);
- 用
agentDefaultModel.saveSelection 把它写成 profile 默认模型(走官方配置编辑器写回 cordis.patch.yml,不手改 YAML),此后新会话直接走 DeepSeek;
- 返回
{ kind: "retry" },让这一轮重试一次。
- 监听
agent/request:切换尚未落盘时直接重写这次请求的 provider/model,因为同一步的重试不会重新组装系统提示。
- 保护:每个 turn 最多自动切换一次;内置重试策略已决定重试时让内置优先;非积分类失败(400/401/网络错误)不触发;监听器内部异常全部吞掉,不影响正常请求。
不做的事:DeepSeek 也失败时不再切;积分恢复后不会自动切回 WorkBuddy(在模型选择器里重选一次即可);不处理 WorkBuddy 登录失效(401 session_dead)。
安装
桌面客户端的 profile 由 App 独占管理,CLI 不能装,用 App 内入口:
- 左侧栏「插件」→「添加插件」;
- 输入本目录的绝对路径(安装向导接受绝对路径);
- 安装 → 立即启用 → 完全退出客户端(含托盘)再打开。
卸载在插件页里完成,本插件不写任何用户数据。
dsh web / dsh tui 这类命令行 profile 可以直接从 GitHub 源码安装(桌面客户端的 desktop profile 仍只能用 App 内入口):
dsh plugin --profile web add github:Yikeqm/dsh-wb-credit-fallback
装完重启对应 profile,再刷新页面即可。用 GitHub 源安装时插件会跟随仓库 main 分支更新,需要重新 dsh plugin remove + add 才会取到新提交。
配置
bundle 的 cordis.patch.yml 里给了默认值,可在 profile 的 cordis.patch.yml 里按行 id wb-credit-fallback 覆盖:
config:
from: workbuddy # 触发条件:哪个 provider 报额度不足
to: # 切到哪个 provider/model
provider: deepseek-account
model: deepseek-flash
reasoningEffort: high
persistDefault: true # 同时写回默认模型;false = 只救当前会话
验证
逻辑层:node tests/smoke.mjs(用假 ctx 模拟瀑布调用,覆盖触发 / 不触发 / 只切一次 / 默认写回)。
集成层:在独立的 headless profile 里挂两个手工声明的 pi-ai 路由(一个返回 402 hard_credit,一个正常流式返回),跑真实 agent loop:
- 第一次运行:
BAD → GOOD,会话里 request/header 从故障 provider 换成回退 provider,turn/end 为 completed,profile 的 agent-default-model 被改写;
- 第二次运行(新会话):只有
GOOD,直接走回退后的默认模型;
- 负向用例:非积分错误(400)不触发切换;回退目标也失败时不会在两个 provider 之间打转。
已知限制
- 依赖 DSH
0.2.0-rc.2 的 agent/request / agent/request-error 瀑布与 sessionController、agentDefaultModel 服务;升级 DSH 大版本后需复核。
- 积分不足靠错误文本匹配;WorkBuddy 若更换措辞需要补标记。
- 插件在宿主进程内运行,如遇异常行为先在插件页禁用它。
License
MIT