Kiro Gateway多账户故障转移详解:熔断器、粘性会话与智能切换
【免费下载链接】kiro-gateway👻 Proxy API gateway for Kiro IDE & CLI (Amazon Q Developer / AWS CodeWhisperer). Use free Claude models with any client.项目地址: https://gitcode.com/gh_mirrors/ki/kiro-gateway
Kiro Gateway 是一款开源代理网关,能把 Kiro IDE / Kiro CLI 背后的 Kiro API(Amazon Q Developer / AWS CodeWhisperer)转成 OpenAI 与 Anthropic 兼容接口,让你用免费 Claude 模型连接 Claude Code、Cursor、Cline 等任意客户端。它的多账户系统内置熔断器(Circuit Breaker)、粘性会话(Sticky Session)与智能故障转移(Failover):某个账户被限流或配额用尽时,网关会自动切换到下一个可用账户,无需人工干预。
为什么需要多账户故障转移 🔄
单账户使用 Kiro 时有两个常见痛点:
- 限流(429):短时间请求过多,接口直接拒绝
- 配额耗尽(402):月度请求额度用完,需要等下个周期
当你手里有多个 Kiro 账户(IDE 登录缓存、CLI 数据库、refresh token 均可作为凭证)时,Kiro Gateway 的账户系统可以把它们组成一个"账户池",自动把请求分配到健康账户上,实现高可用的 AI 代理接入。
相关核心实现集中在:
- 账户管理:kiro/account_manager.py
- 错误分类:kiro/account_errors.py
- 可调参数:kiro/config.py
一键开启多账户:启用步骤
在.env文件中加一行即可开启:
ACCOUNT_SYSTEM=true首次启动时,网关会把.env中的凭证一次性迁移到credentials.json,之后所有账户配置以该文件为准。完整说明见 README.md 的 Account System 章节,完整示例见 credentials.json.example。
三种凭证类型与目录扫描
credentials.json是一个数组,支持三种类型,可混合使用:
| 类型 | 来源 | 说明 |
|---|---|---|
json | Kiro IDE 的 SSO 缓存文件 | 含refreshToken/accessToken |
sqlite | Kiro CLI 的data.sqlite3 | AWS SSO (OIDC) 数据库 |
refresh_token | 直接写入 token | 可附带profile_arn、region |
实用技巧:把path指向一个文件夹,网关会扫描目录内所有凭证文件,逐个注册为独立账户——批量管理多账户非常方便。单个账户还可以用"enabled": false临时禁用而不删除配置。
熔断器详解:指数退避避免"死磕"坏账户 ⚙️
熔断器(Circuit Breaker)是 Kiro Gateway 智能切换的底层机制:账户连续失败后,网关会"断开"对该账户的调用,进入冷却期,避免每次请求都浪费在必然失败的账户上。
具体行为(见 kiro/account_manager.py 的get_next_account):
- 失败计数:可恢复错误(402 配额、403 令牌失效、429 限流)每次都会累加
failures - 指数退避冷却:冷却时间 = 基础 60 秒 × 2^(失败次数-1)
- 失败 1 次 → 冷却 60 秒
- 失败 2 次 → 120 秒,3 次 → 240 秒……
- 上限为 1 天(
ACCOUNT_MAX_BACKOFF_MULTIPLIER默认 1440)
- 10% 概率试探:冷却期内仍有 10% 机会(
ACCOUNT_PROBABILISTIC_RETRY_CHANCE默认 0.1)放行请求,让"将好的账户"更早被发现 - 半开恢复:冷却期结束后,账户自动进入 Half-Open 状态,再次被选中;一旦成功,失败计数清零,熔断解除
所有参数都可通过环境变量覆盖,例如ACCOUNT_RECOVERY_TIMEOUT(基础冷却秒数)、ACCOUNT_CACHE_TTL(模型缓存 TTL,默认 12 小时)。
粘性会话:让请求总走"上一个成功的账户" 🎯
如果每次都随机挑账户,会话上下文、令牌刷新都会反复震荡。Kiro Gateway 采用全局粘性索引(Global Sticky Index):
- 网关维护一个全局"当前账户"指针,所有模型共用
- 选账户时永远从该指针开始向后遍历,优先复用上一个成功的账户
- 只有成功才移动指针(见
report_success),失败不会改动它 - 指针随
state.json持久化,重启后仍从同一账户继续
这带来两个好处:会话体验连贯(尽量不跨账户跳变),且健康账户能稳定获得流量。
智能切换:错误分类决定"换账户还是报错" 🧠
并非所有错误都值得切换到下一个账户。kiro/account_errors.py 的classify_error把 Kiro API 错误分为两类:
| 分类 | 典型错误 | 网关行为 |
|---|---|---|
| RECOVERABLE(账户问题) | 402 配额耗尽、403 令牌失效、429 限流 | 上报失败,自动尝试下一个账户 |
| FATAL(请求本身问题) | 上下文超长、422 参数校验、5xx 服务端错误 | 立即返回客户端,不浪费时间换账户 |
路由层(见 kiro/routes_anthropic.py 的 failover 循环)拿着"已尝试账户集合"反复调用get_next_account,最多绕账户池两圈;全部失败才返回 503。
单账户特例:只有一个账户时,熔断器被绕过——网关原样返回 Kiro API 的真实错误码和消息,方便你定位问题,而不是看到模糊的"账户不可用"。
状态持久化:重启不丢"记忆" 💾
账户池的运行时状态(失败计数、冷却时间、粘性索引、使用统计)会周期性原子写入state.json(默认每 10 秒,"tmp 文件 + 原子重命名"防止写坏):
- 重启后恢复每个账户的冷却进度,不会刚重启就撞上一堆坏账户
- 成功请求还会触发动态学习:新发现的模型会自动登记到"模型 → 可用账户"映射中
测试用例 tests/unit/test_account_manager.py 与 tests/integration/test_account_system_flow.py 覆盖了熔断、粘性与故障转移的完整流程,想深入了解行为边界可以参考。
实用建议与常见问题 📝
Q:几个账户比较合适?2~3 个即可覆盖大部分限流场景,更多账户主要摊薄配额压力。
Q:想临时停用某账户?在credentials.json中加"enabled": false,无需删除配置。
Q:多账户下看不到 Kiro 原始错误?多账户耗尽时网关返回统一的 503 并附带最后错误信息;单账户模式则会透传原始错误码,便于调试。
Q:想自定义切换节奏?通过环境变量调整ACCOUNT_RECOVERY_TIMEOUT、ACCOUNT_MAX_BACKOFF_MULTIPLIER、ACCOUNT_PROBABILISTIC_RETRY_CHANCE、ACCOUNT_CACHE_TTL即可,全部定义在 kiro/config.py。
总结:Kiro Gateway 的账户系统用熔断器 + 指数退避隔离坏账户、用全局粘性索引保持会话连贯、用错误分类决定何时换账户何时报错,三者配合让多账户代理接近"零感知故障"。配合 main.py 启动、Dockerfile 容器化部署,即可搭建一个稳定可靠的免费 Claude 模型代理。
【免费下载链接】kiro-gateway👻 Proxy API gateway for Kiro IDE & CLI (Amazon Q Developer / AWS CodeWhisperer). Use free Claude models with any client.项目地址: https://gitcode.com/gh_mirrors/ki/kiro-gateway
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考