OmniRoute 配额管理完全指南:配额窗口、重置窗口与 Quota-Share 公平分摊 🚀
【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 350 providers (90+ free), 1200+ models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline & Copilot. Quota-aware auto-fallback, RTK+Caveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 450+ contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute
OmniRoute是一款免费开源(MIT 协议)的 AI 网关:一个端点聚合 350+ 供应商、1200+ 模型(Kimi、Claude、GPT、Gemini、GLM、DeepSeek 等),并内置配额管理——配额窗口(quota window)追踪、重置窗口(reset window)感知与 Quota-Share 公平分摊,让多个 API Key 共享同一账号时不再"一家吃光、其余干等"。本文带你从零理解并上手这三套机制。
🕐 配额窗口(Quota Window):每个供应商都有自己的"时间刻度"
不同 AI 供应商的免费/订阅额度都挂在不同的时间窗口上。OmniRoute 为每个连接维护一套"计划(Plan)",由 planResolver.ts 自动解析,内置目录中常见供应商的默认维度如下:
| 供应商 | 默认配额维度(单位 / 窗口 / 上限) |
|---|---|
| Codex | 百分比 /5h/ 100,百分比 /weekly/ 100 |
| Kimi | 请求数 /hourly/ 1500 |
| 阿里百炼 | 百分比 / 5h / 100,weekly / 100,monthly / 100 |
| GLM / MiniMax | Token / 5h,Token / weekly |
| Alibaba | 请求数 / monthly / 90000 |
| OpenAI / Anthropic | 无默认,需手动配置 |
一个池(Pool)可以配置多个维度,每个维度独立判定(如 Codex 同时看 5 小时和周两个窗口),任一维度触顶都会拦截请求。
窗口计数采用滑动窗口实现(sqliteQuotaStore.ts 与 redisQuotaStore.ts),核心思路是为每个 API Key 维护"当前桶 + 上一桶"两个计数器,按经过的时间加权混合,得到平滑的滚动消耗值,精度约 99%,避免了"整点一刀切"的抖动。
🔁 重置窗口(Reset Window):倒计时结束,额度自动回血
当供应商返回resetAt(重置时间)时,OmniRoute 会持续跟踪:
- 倒计时展示:仪表盘用
formatResetCountdown(resetAt)之类的逻辑显示"距重置还有 2h 35m"; - 自动恢复:
resetAt一过,该账号自动重新参与路由——订阅优先路由中,resetAt已过的配额读数会被立即刷新(不受缓存 TTL 限制),无需重启或手动操作; - 过期读数归零:重置窗口已过去的旧用量会直接按 0 计算,不会显示"永远快用完了"的假数据。
也就是说,你不用盯着"多久重置",OmniRoute 会在窗口重置的第一时间把账号放回可用池。
⚖️ Quota-Share 公平分摊:多把 Key 共享一个账号怎么办?
这是配额管理最核心的一环。当多把 API Key 共用同一个上游账号(比如 3 个 Codex 订阅)时,如果没有分摊逻辑,Key A 的一次爆发就能把整窗额度耗尽,Key B/C 只能干等重置。
公平分摊算法(fairShare.ts)为每把 Key 计算:
fairShareAllowed = 池上限 × (分配权重 / 100) remaining = fairShareAllowed − 已消耗两种模式:宽松 vs 严格
| 条件 | 模式 | 行为 |
|---|---|---|
| 全局已用 < 50%(默认阈值) | 宽松(Generous) | 允许"借用"其他 Key 的闲置份额,池子尽量用满 |
| 全局已用 ≥ 50% | 严格(Strict) | 严格 enforce 各自的公平份额 |
阈值可通过环境变量QUOTA_SATURATION_THRESHOLD(0~1)调整。
三种策略(Policy)
- hard:超过份额 → 直接拦截(429);
- soft:超过份额 → 只降权不拦截,组合路由打分时乘 0.7 因子(
QUOTA_SOFT_DEPRIORITIZE_FACTOR),让该 Key 更难被选中; - burst:只要全局还有余量就放行,适合弹性场景。
另有capValue(绝对上限):无论何种模式,触顶即拦截,是最后的硬保险。
🛠️ 配置与查看:控制台 + 环境变量
控制台操作(推荐新手)
- 进入
/dashboard/costs/quota-share页面:创建池、分配权重、查看每个维度的堆叠用量条、各 Key 的欠额/盈余与"借用中"标记,以及烧录速率(burn rate)曲线; - 进入
/dashboard/costs/quota-share/plans:选择供应商,查看自动解析出的计划,或手动覆盖维度(写入provider_plans表)。
页面组件源码位于 src/app/(dashboard)/dashboard/costs/quota-share//dashboard/costs/quota-share/)。
环境变量速查
| 变量 | 默认值 | 说明 |
|---|---|---|
QUOTA_STORE_DRIVER | sqlite | 计数器存储:sqlite或redis |
QUOTA_STORE_REDIS_URL | — | 多实例部署时共享计数器 |
QUOTA_SATURATION_THRESHOLD | 0.5 | 达到该比例后切换严格模式 |
QUOTA_SOFT_DEPRIORITIZE_FACTOR | 0.7 | soft 策略的降权系数 |
QUOTA_CONSUMPTION_RETENTION_DAYS | 14 | 计数桶保留天数 |
数据存储怎么选?
- SQLite(默认,零安装):计数器存于本地数据库,适合单机;
- Redis(可选):多副本部署时共享计数器,Lua 脚本保证原子自增;配置失败会自动回退 SQLite 并告警。
🧯 容错设计:配额引擎"坏了"不会挡住你的流量
- Fail-open:拦截钩子在 chatCore.ts 中运行,若配额引擎自身抛错,请求会被放行并记录警告,而不是全站 429;
- 漂移自校正:响应后记录消耗是"尽力而为",若计数器偏差,供应商返回的真实饱和度信号(30 秒 TTL)会在下次请求时校正全局估计;
- 在途租约:被中止的请求占用的份额会自动老化释放,不会被同连接的后续流量"续命"(详见 11547-quota-share-inflight-lease.md)。
✅ 快速上手清单
- 确认连接已添加,打开 Quota-Share 页面创建第一个池;
- 用
/plans页检查计划是否自动解析(OpenAI/Anthropic 需手动配置); - 给每把 Key 设权重,敏感 Key 加
capValue硬上限; - 多副本部署时切换
QUOTA_STORE_DRIVER=redis; - 观察 burn rate 曲线与重置倒计时,验证"窗口回血"后账号自动回归路由。
📖 延伸阅读:QUOTA_SHARE.md、USAGE_QUOTA_GUIDE.md、OMNIROUTE_QUOTA_TELEMETRY.md
掌握配额窗口、重置窗口与 Quota-Share 公平分摊这三件套,你就能让 OmniRoute 上的多账号、多 Key 像一条永不枯竭的水流——用完自动回血,分摊永不失衡。💧
【免费下载链接】OmniRouteNever stop coding. Free MIT AI gateway: one endpoint, 350 providers (90+ free), 1200+ models Kimi, Claude, GPT, Gemini, GLM, DeepSeek, MiniMax. Works with Claude Code, Codex, Cursor, OpenCode, Cline & Copilot. Quota-aware auto-fallback, RTK+Caveman compression saves 15-95% tokens, MCP/A2A, Desktop/PWA. Built by 450+ contributors项目地址: https://gitcode.com/GitHub_Trending/om/OmniRoute
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考