Skip to content

Releases

1.1.1

Choose a tag to compare

@dboycht dboycht released this 25 Sep 04:57

界面上的倒计时:每次等待都会在开始前写一条持久的 llm/retry 记录(正常结束时补 llm/retry-started),与内置 llm-retry 完全同构。会话界面因此用它自己的 model-retry 卡片渲染这次等待 —— 实时倒计时 + 第几次,不需要任何客户端代码。

  • 两条链各用独立 policyKey(cooldown-retry/capacity 与 cooldown-retry/mislabeled),预算互不影响
  • 编号按会话历史推导而非内存计数器,插件重挂 / 会话恢复后接着数,而不是从 1 重来
  • 失败字段按不变式重建:message / code 必须非空,越界的 status、非正的 providerRetryAfterMs、空 requestId 一律剔除
  • 被中断的等待只留排期记录、不写收尾记录,因为那次尝试从未开始

验证:随附 dsh-llm-retry 自己的不变式 0 违规;测试 61 → 76 例全过。README(中英)新增「界面上的倒计时卡片」一节,dynamic/ 的浮动徽标因此成为可选装饰。

同时包含 1.0.3(此前未单独发布)

  • 接管网关熔断重放的伪 400(400001 Audio modality is not supported):只在该 provider 近期出现过容量冷却时生效,独立预算 3 次
  • 新增选项 mislabeledClientError / mislabeledMaxRetries / mislabeledBaseDelayMs / mislabeledEvidenceMs

安装 / 升级

dsh plugin --profile web add github:dboycht/dsh-cooldown-retry

附件 dsh-cooldown-retry-1.1.1.zip,SHA256 E7DB62EC5BDB6C03581A08A42CFAE7AD1383502275206F8BF2831B0C4B45F544。

⚠️ 本版含模块源码改动:DSH 需重启后才生效——本机 web profile 的 hmr 行是 disabled,patch 层的热重载不会重新导入插件模块(纯配置改动才热生效)。

1.0.2

Choose a tag to compare

@dboycht dboycht released this 11 Sep 07:26

dsh-cooldown-retry 1.0.2

文档修正版。 1.0.1 发布后做了一次用户端安装实测,发现两处文档与发布包实际情况不符,本版修正。插件行为与 1.0.1 完全一致,无代码改动。

修正

  • 开发章节的 npm test 跑不起来:package.json 的 files 白名单不含 test/,所以 dsh plugin add 装进 profile 的包里没有测试文件,用户照 README 在 node_modules 里跑 npm test 必然失败。已改为先 git clone 再跑,并明确说明 test/ 不属于安装包。

  • 安装验证方法无法复现:原文写「插件清单里应出现 cooldown-retry 且 phase=active」,但这个说法没有可复现的获取途径。已改为实测可用的方法:

    dsh --profile web --dump-config | grep -A2 'cooldown-retry'

    并补充说明该行必须位于内置 llm-retry 之后 —— agent/request-error 是 waterfall,后注册的监听者绑定为内层监听者,这个位置决定了本插件能否对每次失败拥有优先接管权,而不是被内置快速重试短路。

用户端安装实测结论(全部通过)

在隔离的 DSH_HOME 下完整验证了第三方用户按 README 安装的路径:

检查 结果
仓库匿名可 clone(不带凭据) ✅
dsh plugin --profile <p> add github:dboycht/dsh-cooldown-retry ✅ pnpm 4.7s 装成,exit 0
自动登记 bundle 层(dsh.profile.bundles) ✅
--dump-config 确认行已插入 ✅ 且位于 llm-retry 之后
从用户 profile import 该包 ✅ 解析到 profiles/<p>/node_modules/dsh-cooldown-retry/index.js
真实 Cordis 上下文挂载 ✅ fiber state = 2 (ACTIVE)
不提供 commands 服务也能挂载 ✅ 仍 ACTIVE 并正常接管重试

最后一项印证了设计意图:inject 只声明 timer,commands / logger 全部走 ctx.get 优雅降级,因此残缺 profile(headless / ACP)不会因为一条装饰性命令而把插件卡在 waiting。

功能(自 1.0.1 起不变)

上游网关返回容量类 429 并附带重试提示时(例如 "All upstream providers are cooling down. Please retry after 28 seconds."),按上游给出的延时长等待后重试,而不是让内置 llm-retry 在冷却窗口里用两次快速重试撞死。

  • 预算按 turn + provider 计,多步 turn 共享(acrossSteps: false 可恢复旧行为)
  • 每次等待与放弃走 ctx.logger(名为 cooldown-retry),/cooldown-retry 可查计数器
  • 可选 hintlessBackoff:对无提示的容量冷却也做指数退避

前置条件

github: 写法需要 PATH 上有 git(底层 pnpm 走 git 克隆)。插件本身零依赖、无需 API key。

安装

dsh plugin --profile web add github:dboycht/dsh-cooldown-retry

附件

  • dsh-cooldown-retry-1.0.2.zip — 源码包(12 条目、扁平结构、package.json 在根)
  • SHA256:C6074DC403508AF47B508F8913F3D627FF2E9DD0D1586743D59329A77A34A54E

注:1.0.1 的 tag 与 Release 保持原样不动(未改写已发布历史),其 README 含上述两处瑕疵;请优先使用 1.0.2。

1.0.1

Choose a tag to compare

@dboycht dboycht released this 11 Sep 06:22

dsh-cooldown-retry 1.0.1

上游网关返回容量类 429(例如 "All upstream providers are cooling down. Please retry after 28 seconds.")时,按上游给出的延时耐心等待后重试,而不是让内置 llm-retry 在冷却窗口里用两次快速重试撞死、直接中断本轮对话。

本版在 1.0.0 基础上补齐了可观测性、配置扩展,并修正了计数语义与两处 bug。

新增

  • 具名日志:等待与放弃改走 ctx.logger,日志归属 cooldown-retry,不再用裸 console.log:
    [cooldown-retry] upstream cooling down for nuaa (turn 3 step 2): retrying in 28000ms (1/5)
    
  • /cooldown-retry 命令:在输入框查看计数器 —— 本 turn 与累计的重试次数、累计等待、放弃次数、无提示容量失败次数、按 provider 分布。
  • 新配置项
    键 默认 含义
    acrossSteps true 一个 turn 的各 step 共享一份重试预算;设 false 恢复「每 step 各一份」
    hintlessBackoff false 连无提示的容量冷却也接管,用指数退避
    hintlessBaseDelayMs 5000 无提示退避的第一步延时
  • extractDelayMs 支持裸 retryAfter 字段(秒);毫秒字段 providerRetryAfterMs 仍优先。
  • isCapacityFailure 增补适配器为 429 铸造的 code:RATE_LIMIT、rate_limit_exceeded、QUOTA_EXCEEDED、RESOURCE_EXHAUSTED、TOO_MANY_REQUESTS、HTTP 429、overloaded、server busy。

变更

  • 计数语义:由「每 turn/step/provider」改为「每 turn/provider」。多步 turn 里每一步都撞同一冷却时共享一份预算,而不是每步各拿一份新的 5 次。需要旧行为请显式设 acrossSteps: false。
  • maxRetries 上限为 100(异常大值不再被原样接受)。

修正

  • 统计输出单位重复:formatWaits() 已自带单位,调用方又拼了一次 ms,输出中出现 1.0sms。现拆分为「只选单位」与「唯一拼装点」,并补三分支回归测试。
  • 新 turn 的 session 统计不重置:turn 记账原先写在计数器内部,而 skip 分支在它之前就 return next(),导致新 turn 首个失败若不带提示时,session 计数仍停留在上一轮。现提为 beginTurn(),置于所有分支之前。
  • ctx.logger 改用可调用形式 ctx.logger('cooldown-retry')(Cordis 的 logger 服务既可调用又直接挂 .info/.warn),并保留普通对象兜底;移除未使用的解构与死参数。

其它

  • inject 仍只有 timer:commands 与 logger 全部走 ctx.get 优雅降级,没有 commands 服务的 profile(headless / ACP / 残缺 profile)照样挂载、照样重试,只是没有那条命令。
  • README(英文 / 中文)新增可观测性章节、配置表改版。
  • 测试 42 → 48 例,全绿。

校验

  • 在真实 Cordis 上下文(真 Context + 真 timer 插件 + 真 logger exporter)挂载验证:带提示等待、无提示指数退避、跨 step 共享预算、命令输出、日志归属均通过。

安装

dsh plugin --profile web add github:dboycht/dsh-cooldown-retry

附件

  • dsh-cooldown-retry-1.0.1.zip — 源码包(12 条目、扁平结构、package.json 在根)
  • SHA256:568FD8A49C437DD7DB779B1DA93E1B798616BCECF4A3A4F0B88D736BDD38B82E