Repository navigation
Closed
Labels
bugSomething isn't workingSomething isn't working
Description
问题描述
网页搜索的多个 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。
如何复现?
- 在任一上述厂商的 Key 列表中填两个 Key:A 额度已耗尽(Brave 可填一个无效 Key),B 正常。
- 连续发起搜索:轮到 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
辅助信息
检查清单
Metadata
Metadata
Assignees
Labels
bugSomething isn't workingSomething isn't working
Type
Projects
- StatusShow more project fieldsDone
Activity