IanShaw
|
16b15e870d
|
修复 5888 与 5925 的同号重试语义冲突
|
2026-08-20 18:16:38 -07:00 |
|
IanShaw027
|
7c53a842e4
|
合并上游 main,保留 5925 的 Grok 重试上限与 5888 的协议兼容修复
同账号重试采用次数上限加 deadline;畸形 tools 在出站前删除;compaction 422 与结构化错误扫描一并保留。
|
2026-08-21 08:49:44 +08:00 |
|
IanShaw
|
c628b3eea7
|
让 Grok stream idle 重试上限作用于主路径
|
2026-08-20 07:07:55 -07:00 |
|
IanShaw
|
2ab24a1e77
|
修正 Grok 429 边界与 stream idle 重试上限
|
2026-08-20 06:43:31 -07:00 |
|
IanShaw
|
e62ec2c42f
|
Revert "feat(429): add configurable cooldown and retry strategies"
This reverts commit 6c3edc0956.
|
2026-08-20 05:44:21 -07:00 |
|
IanShaw
|
6c3edc0956
|
feat(429): add configurable cooldown and retry strategies
|
2026-08-20 05:43:43 -07:00 |
|
IanShaw
|
ad26172b83
|
完善 Grok 限流冷却与用量兼容
|
2026-08-20 02:32:43 -07:00 |
|
IanShaw
|
953028718d
|
修复 Grok 错误分类与容量重试
|
2026-08-20 01:02:40 -07:00 |
|
IanShaw
|
c374ff2951
|
完善 OpenAI 网关切换与运维错误语义
|
2026-08-19 23:13:40 -07:00 |
|
cyh
|
74fcdf3d42
|
fix(openai): preserve exponential capacity backoff
|
2026-08-08 01:02:02 +08:00 |
|
shaw
|
dec47e8fae
|
fix(profit-control): stop leaking profit policy, close veto livelock, restore passthrough turn pricing
审计修复,逐条如下。
H1 利润策略泄露给所有普通用户
profit_control_enabled / profit_min_margin / profit_safety_buffer 从
dto.Group 移到 dto.AdminGroup(后者内嵌前者),赋值相应从
groupFromServiceBase 移到 GroupFromServiceAdmin;前端 TS 同步从 Group 移到
AdminGroup。dto.Group 是 GET /api/v1/groups/available 的响应体,该响应本就带
rate_multiplier,相乘即可反推运营方上游采购成本上限。
api_contract_test.go 的 /groups/available golden JSON 回滚这三个字段,并把
fixture 改成非零值(require.JSONEq 是精确比对,缺字段即失败)。
新增 dto 层边界测试:普通用户 DTO 不含三字段、管理员 DTO 仍含。
M1 利润终检 continue 与 failover 503 退避互动产生活锁
FailoverState 新增 profitVetoedAccountIDs / profitVetoCount 与
RecordProfitVeto():加入排除集 + 计数,达 maxProfitVetoAttempts(10) 返回
FailoverExhausted。HandleSelectionExhausted 的 503 清空分支改为清空后把利润
否决的账号放回排除集;若排除集已全部由利润否决贡献,清空不会带来任何新候选,
直接判定耗尽(否则 SwitchCount 永不前进、退避条件永远成立,每 2s 空转一轮)。
五个 handler 否决点(gateway_handler ×2 / responses / chat_completions /
gemini_v1beta)改为经 RecordProfitVeto 决策,耗尽时按无可用账号终止。
回归测试钉死:503 之后持续利润否决必须有限步终止且不 spin;未启用利润控制的
请求退避语义完全不变。
M2 排队等槽后才终检,延迟可放大到 N × WaitPlan.Timeout
OpenAI 侧选号循环(自有 failedAccountIDs map,非 FailoverState)新增
recordOpenAIProfitVeto + handleOpenAIProfitVetoExhausted,共用同一上限语义。
覆盖 responses / messages-dispatch / chat_completions / alpha_search /
embeddings / images / grok_media 七处,以及 WS 两处否决分支。
M4 ws_v2 透传 ingress 绕过 per-turn 重定价(选方案 B:最小止血)
透传 relay 只回调 AfterTurn、没有任何 turn 起始回调,hooks.BeforeTurn 永远
不触发,而 handler 把 turnPricingAt 初始化成建连时刻 ⇒ 透传连接全部 turn 按
建连时刻的高峰因子结算,客户端峰前建连保活即可全程谷价——正是本 PR 想堵的
漏洞。改为 openAIWSTurnPricing 零值起步、只由 BeforeTurn 冻结;透传路径保持
零值,RecordUsage 回退记录时刻,与引入利润控制前的基线一致。
未选方案 A(给透传补 turn 起始回调):passthrough_relay.go 是 #5167 刚修过的
取消传播/close frame 时序敏感区;且 BeforeTurn 还承担 turn>1 的并发槽位抢占,
接进去等于给透传连接引入 per-turn 抢槽,风险远超本次修复范围。透传仍有建连时
的准入门,只是没有 turn 级复核,已在两处注释写明。
测试:service 层钉死透传 ingress 不触发 BeforeTurn(含失败时的复核指引),
handler 层钉死零值语义与逐 turn 覆盖。
M5 装门读分组走了带账号计数聚合的 GetByID
SchedulerSnapshotService 新增 GetGroupByIDLite,openai/gateway 两处装门改用
之。门只需要平台/倍率/利润/高峰字段,且该查询发生在「是否启用利润控制」判定
之前,未启用的分组同样付代价。两个测试 stub 的 GetByID 改成 panic 守卫。
M6 认证快照注释与真实读取路径相反
门解析优先取 ctxkey.Group,而它就是本快照物化出来的对象,直连流量走的正是这
条路。改正注释,与 api_key_repo.go 投影处的说明对齐,避免后人照旧注释删列。
M3 rate_multiplier 为 nil 时利润门 fail-closed(不改行为,加护栏)
保留 fail-closed。补 repository 层测试钉死账号调度快照的 full/metadata 两份
payload 都必须保留 RateMultiplier(含 0 值),漏列在 CI 就红。
L1 迁移号注释 191 / 191-192 改为实际的 192/193。
L2 admin group Create 的利润配置预校验改用与 CreateGroup 一致的归一化平台
(新增 service.NormalizeGroupPlatform,两边共用)。保留预校验而非删除:
service 层返回的是无类型 error,经 ErrorFrom 会变成 500,删掉会把合法的
400 降级成 500。
L3 前端利润校验的上界改为判定换算后的小数(后端按小数校验 [0,1)),
99.999% 会四舍五入进位成 1.0 而被后端 400;i18n en/zh 同步改为 0-99.99。
L4 clampProfitControlThreshold / profitControlOverThreshold 抽为共用函数,
线上装门/否决点与 profit-preview 不再各自实现,附边界语义测试。
L5 profit-preview 补「默认 D 有账号但最低有效 D 归零」的告警(两档都为 0 由
既有告警覆盖,不重复)。
|
2026-08-01 22:39:33 +08:00 |
|
wucm667
|
a2acbf553b
|
fix(handler): avoid cache billing on same-account retry
|
2026-07-20 02:20:58 +08:00 |
|
shaw
|
a0593b0bf8
|
fix(gateway): 客户端断开后 failover 静默终止,不再误报 502 账号耗尽
上游请求经 detachUpstreamContext(WithoutCancel) 有意脱离客户端取消(保
计费),但 failover 循环仍用原始 c.Request.Context() 重新选号:客户端
断开后上游返回 520 等可 failover 错误时,重新选号必然得到 context
canceled,被误判为账号耗尽,记录并返回通用 502。
修复:客户端已断开 ⇒ failover 静默终止。
- 新增 failoverClientGone(c):请求 ctx 已取消时先停 compact 心跳
(建立 happens-before,对齐其它终结路径),响应未提交则标 499
(statusClientClosedRequest,与并发槽取消路径同惯例)
- 7 个 OpenAI 内联 failover 循环(Responses/Messages/chat_completions/
embeddings/images/grok_media/alpha_search)加双 guard:换号前 +
选号失败分支入口;guard 位于 ReportOpenAIAccountScheduleResult(false)
之后、RecordOpenAIAccountSwitch/池模式重试之前,账号健康副作用
(service 层 detached ctx)不受影响
- FailoverState.HandleFailoverError/HandleSelectionExhausted 入口加
ctx.Err() 检查返回 FailoverCanceled,取消不再改动 failover 状态;
全部 10 个 FailoverCanceled 分支统一调用 failoverClientGone 归类 499
- 上游 detach 与计费设计不变;真实上游 520 事件仍完整落 ops
(面板显示码 COALESCE(upstream_status_code,status_code)=520,
错误率/告警口径不变)
测试:新增 openai_responses_failover_cancel_test.go 复现 issue 场景
(520+取消 ⇒ 不切号、499、无 502 终态)+ 在线客户端对照(正常切换、
耗尽 502);failover_loop_test.go 补入口取消用例并修正取消语义断言。
Fixes #4257
|
2026-07-15 09:29:05 +08:00 |
|
Heatherm Huang
|
343390057d
|
fix(grok): fail over OAuth credential errors safely
|
2026-07-14 14:55:30 +08:00 |
|
feeeei
|
c7c933776d
|
fix: 池模式同账号重试次数配置对 Anthropic/Gemini/通用转发路径生效
e643fc38 引入 pool_mode_retry_count 账号配置时,只覆盖了 OpenAI 族
handler 的内联重试循环;走 HandleFailoverError 的 Anthropic/
Antigravity/Gemini/通用转发路径仍硬编码同账号重试 3 次,配置不生效。
为 HandleFailoverError 增加 retryLimit 参数,由调用方传入
account.GetPoolModeRetryCount();未配置账号默认仍为 3 次,行为不变。
|
2026-07-13 12:57:00 +08:00 |
|
kyx236
|
e643fc382c
|
feat: 支持 API Key 上游池模式同账号重试次数配置与自定义错误策略
|
2026-03-08 14:12:17 +08:00 |
|
yangjianbo
|
bb664d9bbf
|
feat(sync): full code sync from release
|
2026-02-28 15:01:20 +08:00 |
|
erio
|
09166a52f8
|
refactor: extract failover error handling into FailoverState
- Extract duplicated failover logic from gateway_handler.go (3 places)
and gemini_v1beta_handler.go into shared failover_loop.go
- Introduce FailoverState with HandleFailoverError and HandleSelectionExhausted
- Move helper functions (needForceCacheBilling, sleepWithContext) into failover_loop.go
- Add comprehensive unit tests (32+ test cases)
- Delete redundant gateway_handler_single_account_retry_test.go
|
2026-02-24 18:08:04 +08:00 |
|