Skip to content

[Bug] 部分网页搜索多 Key 轮询遇到额度耗尽或 Key 失效时不重试 #10871

Closed

Description

@piexian

问题描述

网页搜索的多个 API Key 按请求轮询;当前 Key 返回 Key 级错误时,本次请求应改用下一个 Key 重试(#8886 / #8896 为 Tavily 引入的机制,#8886 中已有人指出其他搜索也有同样问题)。但下列情况本次请求不会改用下一个 Key,而是直接失败:状态码不在重试集合 _RETRYABLE_HTTP_STATUSES = {401, 403, 429, 432} 中,或者该厂商根本没有重试逻辑。

由于轮询不会跳过坏 Key,每轮都会轮到它:N 个 Key 坏 1 个,约 1/N 的请求固定失败,直到手动删除该 Key。(记住坏 Key 并暂时跳过是另一层改进,与 #7951 对模型提供商 API Key 提出的诉求相同)

厂商 本次请求不改用下一个 Key 的状态码 含义 依据
Firecrawl 402 额度耗尽 Billing
Tavily 433 按量付费额度耗尽 Errors Code
Brave 422 SUBSCRIPTION_TOKEN_INVALID Key 无效(Brave 不返回 401) 实测,见日志
Exa 全部(401/402/429) 没有重试逻辑(search、contents) Error Codes
DeepSeek 全部 有意不重试(注释、测试) 见下

DeepSeek 和 Exa 的配置提示和文档都写着"可添加多个 Key 轮询",但失败时不改用下一个 Key:同一账号的 Key 共享余额和限速,轮询起不到作用;不同账号的 Key 坏掉一个,每轮都会失败一次,直到手动删除(这会导致明明有正常key但是时不时失败)。应当二选一:改成只能填一个 Key,或者和其他厂商一样重试下一个 Key。

建议

  • 参照 _ANYSEARCH_RETRYABLE_HTTP_STATUSES,按厂商定义重试集合:Firecrawl 加 402,Tavily 加 433。
  • Brave 仅在 error.code == "SUBSCRIPTION_TOKEN_INVALID" 时改用下一个 Key(422 也用于参数错误 VALIDATION)。
  • Exa 和 DeepSeek 补上重试下一个 Key 的循环(401/402/429)或改为单 Key。

如何复现?

  1. 在任一上述厂商的 Key 列表中填两个 Key:A 额度已耗尽(Brave 可填一个无效 Key),B 正常。
  2. 连续发起搜索:轮到 A 的请求直接报错,不会尝试 B;下一次轮到 B 才成功。

离线复现脚本(mock aiohttp,调用 4.29.3源码未修改的函数)放在附件

AstrBot 版本

4.29.3

操作系统

Windows

部署方式

源码运行

使用的消息平台适配器

与适配器无关

错误日志

Brave 无效 Key 实测(2026-10-30):
HTTP 422 {"error":{"code":"SUBSCRIPTION_TOKEN_INVALID","detail":"The provided subscription token is invalid.","meta":{"component":"authentication"},"status":422},"type":"ErrorResponse"}

离线复现(A 为坏 Key,B 正常):
Firecrawl search A=402           tried=['A'] -> FAIL 402
Firecrawl scrape A=402           tried=['A'] -> FAIL 402
Tavily search A=433              tried=['A'] -> FAIL 433
Tavily extract A=433             tried=['A'] -> FAIL 433
Brave search A=422               tried=['A'] -> FAIL 422
Exa search A=401                 tried=['A'] -> FAIL 401
Exa search A=402                 tried=['A'] -> FAIL 402
Exa contents A=429               tried=['A'] -> FAIL 429
control: Firecrawl search A=429  tried=['A', 'B'] -> OK
control: Tavily search A=432     tried=['A', 'B'] -> OK
Firecrawl A=402, 4 requests in a row: FAIL 402, OK, FAIL 402, OK

辅助信息

test.py

检查清单

  • 我已在 Issue 列表中搜索过相关问题仍无法解决,或该问题从未被报告过。
  • 我已尝试过禁用所有插件,排除了可能是因插件导致的问题。
  • 我报告的问题与 AstrBot 本体相关,而非在报告某一插件的问题。
  • 我已阅读并同意本项目的贡献者行为准则。
  • (可选)我愿意提交 PR 以帮助修复该问题。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't working

    Type

    No type

    Projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions