@leaves615/dsh-llm-ctl
DSH plugin — rate-limit queuing, provider cooldown, and standalone request recovery on the llm/stream and agent/request-error seams 适合需要精细控制多模型服务商并发、处理排队预算及自动重试的用户。
インストール
$
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:leaves615/dsh-llm-ctlドキュメント
README 全文を読む ↗配置
完整配置长这样,每项都有默认值,不写就是下面这个效果:
- id: llm-ctl
name: '@leaves615/dsh-llm-ctl'
config:
queue:
# 每个 provider 几个并发。不写 default 就是全不限流,0 也是不限流。
perProviderConcurrency: { 'zen-free': 1 }
maxQueueDepth: 50 # 队满报 QUEUE_FULL
# 唯一的等待预算:排队愿意等多久,也愿意接受多长的冷却。
# 明确要等更久就直接报 QUEUE_TIMEOUT,不白等。
maxWaitMs: 120000
honorRetryAfter: true # provider 的提示优先于本地退避
backoff: { initialDelayMs: 500, maxDelayMs: 10000, jitterRatio: 0.1 }
# 没装 dsh-llm-retry 时的兜底:auto = 下游没人管才自己上(默认 3 次);
# off = 从不;数字 = 每步最多几次。
reactiveRetry: auto
visibility:
# 启动预置的隐藏规则,用户层只读。通配符只有 '*',大小写不敏感,
# 'provider:model' 或裸模型名都行。
hiddenPatterns: ['*-test-*']
排队是严格 FIFO,先到先得,不分前后台优先级。
触发冷却的失败码跟 dsh-llm-retry 默认集一致:RATE_LIMIT / SERVER / TIMEOUT / TRANSPORT / EMPTY_RESPONSE。直接抛错的算数,包在 SSE 流里回来的 terminal finish chunk(OpenRouter 转发上游 429 就是这样)也算数。AUTH、QUOTA 这类码不排队,原样透传。
等多久听 provider 的:优先用 adapter 透出来的 failure.providerRetryAfterMs(DeepSeek 的 adapter 已经给了),没有就本地指数退避。
上游进展:
Retry-After、x-ratelimit-reset这些 header 的解析器已经写好测过,就等 adapter 把原始响应头放进LlmError.details,接上就能用,插件这边已经收headers包了。