必须区分瞬态错误与永久错误:仅对429、500、502、503、504、连接/读取超时重试;含retry-after则直接sleep,禁用指数退避;需独立捕获各模型异常,支持并发与链式fallback。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

在 Atoms 框架中实现多模型并行调用时,必须区分瞬态错误与永久错误,否则会因重试全部失败模型导致请求雪崩或响应延迟激增。
识别可重试与不可重试的模型错误
第一步:检查异常类型是否属于 【瞬态故障】 ——仅对 429、500、502、503、504、连接超时、读取超时生效;其余如 400(参数错误)、401(密钥失效)、404(模型不存在)一律跳过重试。
第二步:若响应头含 Retry-After 字段,直接 sleep 对应秒数,【禁止叠加指数退避】,否则将触发上游更严厉的限流惩罚。
第三步:对每个模型调用单独封装 try/except,避免一个模型抛出 401 导致整组并发调用提前终止。
并发调用中逐个捕获模型异常
方法一:使用 asyncio.gather + return_exceptions=True
调用时传入 return_exceptions=True 参数,使 gather 不因单个协程异常而中断,所有结果(含 Exception 实例)按原顺序返回。
方法二:手动 await + 独立异常处理
对每个模型创建独立 task,用 asyncio.create_task 包裹,并在 await 后立即用 isinstance(e, Exception) 判断是否出错,再分类记录或降级。
注意:不要在 for 循环内直接 await,否则变成串行执行,失去并发意义。
按优先级链式故障转移
第一步:定义模型 fallback 链,例如 ["qwen-plus", "deepseek-chat", "glm-4-air"]
第二步:对链首模型执行带重试的调用(最多 2 次,含抖动)
第三步:若仍失败,立即切换至链中下一个模型,不等待前一个模型的最终超时耗尽
第四步:任一模型成功即终止后续尝试,返回其结果;全链失败则聚合各模型的异常类型与消息,供上层决策











