claude-swap 自适应轮询策略完整揭秘:为何查询上千次用量仍不被 Anthropic 429 限流 claude-swap 自适应轮询策略完整揭秘为何查询上千次用量仍不被 Anthropic 429 限流【免费下载链接】claude-swapSwitch between multiple Claude Code accounts, with automatic rate-limit rotation, usage dashboard, and parallel sessions项目地址: https://gitcode.com/gh_mirrors/cl/claude-swapclaude-swap是一个多 Claude Code 账号切换工具支持用量看板、自动限流轮换和并行会话。本文揭秘它的自适应轮询策略通过新鲜度下限 用量变化驱动的加速/减速 429 后的 AIMD 退避三层设计把每个账号的用量查询压到远低于 Anthropic 限流预算的水平实现稳态零 429。很多人一上来就写个死循环每 10 秒查一次/api/oauth/usage结果很快撞上429 Too Many Requests。claude-swap的做法完全不同——它先实测出 Anthropic 用量接口的限流形状再据此设计一个平时很慢、该快时快、被限后主动退让的轮询节奏。下面把这套策略拆给你看。一、先搞清楚 Anthropic 用量接口的限流真相策略设计的前提是作者用探针实测得出的限流模型记录在 poll_policy.py 的模块文档里它不是一个补充速率的水桶而是一个约 60 分钟的滚动窗口每个身份账号/令牌 × User-Agent 类别在窗口内只有约 28~30 次请求的预算。暂停不会提前恢复额度——只有当旧请求老化出这个小时窗口容量才会回来。一次突发burst可能让身份被卡满整整一小时。所以目标被定为平均不超过 1 次 / 3 分钟约 20 次/小时对 ~28~30 次/小时的预算留出 8~10 次/小时的余量给手动命令、睡眠唤醒补查、紧急模式留空间。一句话别和限流窗口硬拼把持续速率压到预算的安全线以下。二、自适应轮询的核心按用量是否在动动态调节奏核心函数是plan_after_fetch()每次成功取回用量后它为下一个轮询时间算出(next_poll_at, interval)。逻辑可以概括成四句话新鲜度下限全局节流阀任何账号的数据只要比SERVE_TTL_S 180 秒更新就直接从本地存储读取、不发起网络请求。这保证了一个令牌上的持续查询速率上限永远是 1/180s跟同时开着几个看板无关。用量在动 → 加速当账号的约束窗口百分比变化超过MOVEMENT_DELTA_PCT 1%说明有地方正在消耗额度本机、另一台电脑、会话模式轮询间隔减半下限 180 秒。用量没动 → 减速没有变化的账号间隔按×1.5向各自的天花板回退——活动账号最多 300 秒闲置的候选账号最多 600 秒。接近阈值 → 紧急模式当活动账号处在阈值上方 15%ESCALATION_MARGIN_PCT以内且正在被消耗时直接切入URGENT_INTERVAL_S 60 秒。这个模式是天然有界的——要么越过阈值触发引擎切号要么用量停止增长、下一次轮询就回落到正常节奏。 这样忙的账号被盯得紧闲的账号被放松API 流量曲线始终很平不管你有几个账号、开几个界面。三、撞上 429 之后退避 AIMD 拥塞控制万一还是被限流了claude-swap不是傻等而是区分两种 429并做退让—恢复Retry-After: N0突发规则完整尊重服务器给的截止时间。实测这个 deadline 是精确到墙钟、探测不会重置它的所以完整等满比反复试探更省。Retry-After: 0预算耗尽边缘说明一小时窗口的预算已经花光此时至少等EDGE_BACKOFF_S 300 秒再探测让老化跑在探测前面。POST_429保底 AIMD只要某令牌在RECENT_429_WINDOW_S 1 小时内出现过 429其轮询节奏就被抬到POST_429_MIN_INTERVAL_S 360 秒的地板之上同时抑制紧急模式。之后每次成功轮询都把间隔乘 1.5向POST_429_MAX_INTERVAL_S 1800 秒增长——这正是 TCP 式的AIMD加法增、乘法减拥塞控制多台机器共享同一账号、互相看不见、也拿不到剩余请求数只能靠被 429 就退让来公平分摊预算无需配置机器数量或共享状态。失败退避无 Retry-After 时按30s · 2^(n-1)指数退避封顶 600 秒见 usage_store.py。 健康不变量稳态下日志里 http-429 计数为 0。这是判断策略是否失效的哨兵指标。四、多端共享同一套节奏不重复抢请求轮询计划是按账号持久化在用量存储里的nextPollAt/pollIntervalS字段见 usage_store.py。cswap list、TUI 看板、菜单栏、自动引擎全都继承同一套节奏——不管哪个界面、刷新多频繁实际网络请求只发一次。配合用量表设计一次失败不会清空所有账号的数据失败只更新错误/退避字段last_good读数保持不变stale-on-error在窗口重置前继续作为可信下界参与切号决策usage_store.py。再加上CLAIM_TTL_S的租约机制避免多个收集器进程对同一个账号重复取数。五、实测效果稳态零 429作者在文档里记录了验证数据一个休息过的身份用 1/180s 的稳态轮询从满额度窗口连续跑满 96 分钟、零 429而一旦突发打满429 振荡会精确地在 60 分钟老化后结束。这套策略只在鲁棒的部分上依赖——一个安全的持续速率 约一小时的重置视野而不赌 Anthropic 未公开的确切边界算法poll_policy.py。六、关键参数一览都在 poll_policy.py常量默认值作用SERVE_TTL_S180s新鲜度下限年轻数据不发请求MIN_INTERVAL_S180s正常轮询下限URGENT_INTERVAL_S60s接近阈值的活动账号紧急节奏ACTIVE_MAX_INTERVAL_S300s活动账号无变化时减速天花板CANDIDATE_MAX_INTERVAL_S600s闲置账号减速天花板EXHAUSTED_INTERVAL_S600s耗尽账号的慢速探测MOVEMENT_DELTA_PCT1.0判定用量在动的最小变化JITTER_FRAC0.1±10% 抖动让多进程错开POST_429_BACKOFF_MULT1.5AIMD 乘法增大系数POST_429_MAX_INTERVAL_S1800s429 退避上限完整实现见 poll_policy.py行为回归测试见 tests/test_poll_policy.py。七、快速上手体验安装后开启看板或自动切换就能亲眼看到这套自适应节奏在跑uv tool install claude-swap cswap watch # 打开实时用量看板 cswap auto # 自动轮换每轮按上面策略取用量 想深入了解自动轮换引擎如何消费这套轮询计划可看 autoswitch.py 与 usage_store.py。小结claude-swap的上千次查询不被 429靠的不是更快的重试而是尊重限流窗口形状的自适应退让平时把速率压到预算安全线以下、用量在动才加速、被限后按 AIMD 主动退让直到窗口老化。这套思路对任何要轮询受限 API 的场景都很值得借鉴。【免费下载链接】claude-swapSwitch between multiple Claude Code accounts, with automatic rate-limit rotation, usage dashboard, and parallel sessions项目地址: https://gitcode.com/gh_mirrors/cl/claude-swap创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考