feat: 支持 API 429 (Too Many Requests) 自动故障转移与轮询#79
feat: 支持 API 429 (Too Many Requests) 自动故障转移与轮询#79QuickLAW wants to merge 19 commits intoBiFangKNT:devfrom
Conversation
- 在代理配置中引入 `api_endpoints` 列表,支持配置多个上游API端点和密钥 - 当上游返回429(请求过多)状态码时,自动切换到列表中的下一个可用端点 - 修改 `ProxyConfig` 结构,将单 `api_url` 和 `api_key` 替换为 `api_endpoints` 元组 - 在 `ProxyApp` 中实现端点轮询逻辑,并在请求失败时更新游标 - 优化 `user_data_service.py` 中的 `max` 函数调用,使用 `os.path.basename` 直接作为 key - 确保在HTTP错误和请求结束时正确关闭响应连接,避免资源泄漏
在收到上游 429 状态码时,现在会检查并记录 `retry-after` 头信息,以便于调试。同时,将节点切换逻辑移至 429 条件块内部,使逻辑更清晰,避免不必要的节点切换。
- 新增端点级429冷却机制,通过 `_endpoint_429_until` 字典记录冷却时间 - 当启用 `enable_429_failover` 且配置多个端点时,自动跳过冷却中的节点 - 适配 SiliconFlow 的 thinking 参数,将其转换为 enable_thinking 和 thinking_budget - 在单端点或未启用故障转移时保持原有轮询逻辑 - 添加400错误时的请求参数日志以便调试
扩展ProxyApiEndpoint类以包含target_model_id字段,并新增enable_429_failover配置选项。重构_parse_api_endpoints函数,使其支持从全局配置的config_groups中读取故障转移端点列表,并在启用故障转移时进行去重处理。调整build_proxy_config中的调用顺序以适配新的参数传递。
在load_global_config和save_config_groups方法中新增enable_429_failover布尔字段,以支持在遇到HTTP 429状态码时启用故障转移逻辑。
更新函数调用以解构三元组,忽略新增的布尔标志位,保持现有逻辑不变。
在 SaveConfigPayload 模型中新增 enable_429_failover 布尔字段,用于控制是否启用 429 状态码的失败转移机制。同时更新了 load_config 和 save_config 函数以支持该配置的加载和保存。
在配置类型和状态管理中新增 `enable_429_failover` 选项,并在设置面板提供对应的 UI 开关。 启用后,请求将在配置组间轮询分发,并在遇到 429 状态码时自动切换到下一个节点,避免因请求限制导致服务中断。
- 在全局配置中添加 `failover_429_cooldown_seconds` 字段,允许用户自定义触发429后的节点冷却时长 - 前端设置面板增加对应数值输入控件,支持秒级调整 - 代理逻辑使用配置的冷却时间,替代之前硬编码的10秒 - 修复SSE事件解析以同时支持 `\n\n` 和 `\r\n\r\n` 分隔符 - 重构配置保存逻辑,使用字典统一处理全局配置更新
将“高级策略”改为“转发策略”,明确功能定位 将“API 调度与故障转移”改为“负载均衡与自动容错”,更准确描述功能 调整相关开关和说明文案,使描述更清晰易懂 优化冷却时间输入框样式,提升视觉一致性
|
@codex 审查 |
There was a problem hiding this comment.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 481309fe0f
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
- 移除全局 middle_route 变量,改为使用端点级别的配置 - 修复端点游标计算逻辑,避免不必要的偏移 - 增强错误处理:对网络异常和特定状态码(400、401、403等)进行故障转移 - 优化模型替换逻辑,保留原始模型名用于日志记录 - 仅当启用路由且请求成功时才更新游标,确保负载均衡 - 改进端点唯一标识,包含 middle_route 信息
- 在 ProxyApiEndpoint 中新增 middle_route 字段,支持为每个端点配置中间路由 - 在解析配置时,使用 normalize_middle_route 函数处理中间路由值,确保格式统一 - 新增 _parse_cooldown_seconds 函数,集中处理 429 失败转移冷却时间的解析逻辑,提高代码可读性和健壮性 - 在端点去重逻辑中,加入对 middle_route 字段的比对,避免重复添加相同配置的端点
|
我觉得得再加一个可选配置组的功能,有时候不会希望所有配置组都走轮询 |
很可行,我刚刚就在考虑这个问题了,最好前端分组展示也需要调整下 |
|
另外,我认为你还需要考虑一下 #48,这两个需求之间会存在竟态,需要设计一个统一的架构 |
ok,我研究下 |
|
请先稍等,我对未来的架构设计有了初步想法 |
- 为配置组添加唯一ID字段,支持配置组的稳定标识和更新 - 在前端设置面板中添加轮询配置组选择功能,允许用户指定参与轮询的配置组 - 优化代理配置解析逻辑,支持基于选中组的轮询分发策略 - 当开启429故障转移且未选择任何组时,回退到仅使用当前激活配置
那挺好,因为我加了区分配置组功能后觉得,配置组和设置这些真需要修改下 |
|
是要大改的,且是持续数个版本的改动,本pr应该不会太快合并 |
|
你有空的话,可以先把我设计中的前置功能写一下,通过独立pr的形式 |
ok,这可行 |
|
路线图总述 版本计划
targets:
- id: claude-main
provider: anthropic
api_base: https://example.com
api_key: xxx
middle_route: /v1
upstream_model: claude-3-7-sonnet
failover_pools:
- id: claude-failover
trigger_statuses: [429]
cooldown_seconds: 10
members:
- target_id: claude-backup-1
- target_id: claude-backup-2
published_models:
- name: sonnet-proxy
enabled: true
primary_target_id: claude-main
failover_pool_id: claude-failover
当前主要落点
v2.4.0:LiteLLM 接入
范围
明确不做
建议拆分 issue
验收标准
v2.5.0:代理日志页 + 并发
trace 设计原则
建议 trace 字段 type ProxyTrace = {
trace_id: string;
request_id: string;
request_path: string;
request_model?: string;
resolved_target_label?: string;
target_api_base_url?: string;
upstream_model?: string;
is_stream: boolean;
status_code?: number;
started_at: string;
ended_at?: string;
duration_ms?: number;
request_body?: unknown;
response_body?: unknown;
error?: string;
events?: string[];
};范围
明确不做
建议拆分 issue
验收标准
v2.6.0:模型路由
范围
明确不做
建议拆分 issue
验收标准
社区协作规则
对现有 PR 的处理建议
暂不接受的贡献方向
建议的公开发布方式
|
ok,感谢,收到 |
|
这份文档是用于快速确定路线图的,到时候会创建一份 GitHub Projects - Roadmap 方便编辑查阅 |
变更目的
为代理系统引入多端点轮询(Round-Robin)与 429 自动故障转移机制,旨在提升在高并发或多账号场景下的服务稳定性,避免因单一节点触发频率限制而导致服务中断。
使用变更与说明
1. 配置多 API 节点
系统现在会自动聚合所有“配置组”中已启用的 API 节点。
api_url和api_key就会被纳入负载均衡池。2. 开启转发策略
在 设置面板 > 应用设置 中新增了“转发策略”配置区:
429 (Too Many Requests)时,该节点将进入冷却状态。3. 智能适配与日志
thinking参数,确保思维链功能正常。影响范围
ProxyApiEndpoint结构,支持从配置组加载多个 API 节点。thinking相关参数解析。验证方式
failover_429_cooldown_seconds时间内不被再次调度。UI 变更截图
修复与优化 (针对 AI 审查反馈) [日期3.13]
middle_route,适配 OpenAI、Azure 等混合部署。