Skip to content

feat(generation): 配额耗尽或风控拒绝时自动切换账号重试 - #194

Merged
TheSmallHanCat merged 4 commits into
TheSmallHanCat:mainfrom
wizd:feat/account-failover-on-quota-and-risk
Nov 8, 2026
Merged

TheSmallHanCat merged 4 commits into
TheSmallHanCat:mainfrom
wizd:feat/account-failover-on-quota-and-risk

Conversation

@wizd

@wizd wizd commented Nov 4, 2026 •

Copy link
Copy Markdown

背景

视频提交(如 I2V eb1hJf)偶发被 Flow 拒绝:

  • PUBLIC_ERROR_USER_QUOTA_REACHED:当前账号额度不足
  • PUBLIC_ERROR_UNUSUAL_ACTIVITY:账号/IP 被风控

两种情况下提交都被直接拒绝、不会创建任务,但目前只会在同一账号上连续重试(无间隔、也不通知打码服务),一次请求可能卡 90s 以上后失败,而换一个账号通常就能成功。

改动

  • 账号切换(generation_handler.py):遇到上述两类错误时把当前 Token 加入本次请求的排除列表,换其他账号重试。错误带 submission_uncertain / outcome_unknown 标记时不换号,避免重复生成。换号后会在新账号的 project 中重新上传参考图。此类错误不计入 Token 连续错误,不会导致账号被自动禁用。
  • 换号预算:风控失败最多 3 个账号(每次风控要耗费两轮打码);额度不足的账号会立即失败,不占用这部分预算;总尝试上限 6 个账号。
  • 错误信息:最终错误列出每个失败账号及原因,例如 已尝试 3 个账号均失败: #7 触发风控, #9 触发风控, #1 配额耗尽;token_failovers 记录全部失败账号(含最后一个)。
  • 负载均衡(load_balancer.py):select_token 支持 exclude_token_ids;冷却中的 Token 排到候选末尾(不剔除,避免无号可用)。
    • 配额冷却最长 6h,并记录耗尽时刷新到的余额;余额回升(充值/额度刷新)即提前解除,避免低余额账号每隔一段时间又被选中。
    • 风控冷却按连续被拒次数递增(5m → 15m → 45m → 60m),成功一次即重置;不会缩短已有的配额冷却。
  • 视频提交重试(flow_current.py):接入统一的 _handle_retryable_generation_error,与图片链路一致——每次被拒都通知打码服务自愈(清缓存/重建浏览器)。UNUSUAL_ACTIVITY 同账号仅再重试一次,之后交给上层换号。
  • 重试判定(flow_client.py):USER_QUOTA_REACHED 不再视为可重试错误(此前被 public_error 规则当作 500 重试,在额度不足的账号上白白消耗多轮打码);UNUSUAL_ACTIVITY 重试前等待 3s。

generation_handler.py 的 diff 较大主要是因为生成流程外包了一层换号循环导致的缩进变化。

行为变化

视频提交遇到无法识别为可重试的错误时,现在会直接失败,而不是盲目同号重试,与图片链路的现有行为一致。

测试

  • tests/test_token_quota_failover.py:配额/风控换号、总上限与风控上限、额度不足不占用风控预算(复现线上「两个账号风控 + 一个账号额度不足」的请求)、失败汇总信息、余额回升解除配额冷却、风控冷却递增与重置、提交结果不确定时不换号。
  • tests/test_veo_lite_support.py:I2V 遇到 UNUSUAL_ACTIVITY 同号只重试一次并两次通知打码服务;USER_QUOTA_REACHED 不同号重试。
  • 全量测试通过(250 个);已在自部署环境(9 个账号)实际运行验证。

🤖 Generated with Claude Code

Wizard and others added 4 commits November 4, 2026 05:10
- 生成链路遇到 PUBLIC_ERROR_USER_QUOTA_REACHED / PUBLIC_ERROR_UNUSUAL_ACTIVITY
  时排除当前 Token 并切换其他账号重试(最多 3 个账号);提交结果不确定时不换号,
  避免重复生成
- LoadBalancer 支持 exclude_token_ids,新增配额冷却(1h)与风控冷却(5min),
  冷却中的 Token 排到候选末尾
- 视频提交重试接入统一重试处理:每次被拒都通知打码服务自愈,UNUSUAL_ACTIVITY
  同账号仅再重试一次并延迟 3s,其余交给上层换号
- 补充配额/风控换号与视频重试相关测试

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- PUBLIC_ERROR_USER_QUOTA_REACHED 不再视为可重试错误,避免在额度不足的账号上
  白白消耗多轮打码,直接交给上层换号
- 配额冷却改为最长 6h,并记录耗尽时刷新到的余额;余额回升(充值/额度刷新)
  即提前解除,避免低余额账号每小时重新被选中
- 风控冷却按连续被拒次数递增 (5m -> 15m -> 45m -> 60m),成功一次即重置
- 换号预算拆分:风控失败最多 3 个账号,额度不足的账号不占用该预算,
  总尝试上限 6 个账号
- 最终错误信息列出每个失败账号及原因,token_failovers 也记录最后一个账号

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@TheSmallHanCat
TheSmallHanCat merged commit 2cf700d into TheSmallHanCat:main Nov 8, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants