技术教程 · 阅读约 7 分钟

为什么你的 GPT-5 / Claude 任务总在关键时刻中断?用 30 行代码彻底解决

为什么你的 GPT-5 / Claude 任务总在关键时刻中断?用 30 行代码彻底解决

昨天 V2EX 上有个帖子引发了大量共鸣:

"gpt-5.6-sol 下午一直遇到 Selected model is at capacity,任务中断,是只有我一个人这样吗?"

不是只有你一个人。这是 OpenAI 官方服务在高峰期的常态问题——模型过载、限速、甚至 Plus 账号也开始不稳定。更糟糕的是,如果你在跑一个长任务(代码审查、批量翻译、文档生成),中断一次就得从头来。

解决思路不是换个时间段重试,而是让代码自己处理这些异常。


问题根源:你的代码没有容错

大多数人调用 LLM 的方式是这样的:


response = client.chat.completions.create(

    model="gpt-4o",

    messages=[{"role": "user", "content": prompt}]

)

print(response.choices[0].message.content)

这段代码有个致命缺陷:任何网络抖动、模型过载、限速都会直接抛异常,任务终止。

在官方服务不稳定的今天,这等于把你的自动化任务建在沙滩上。


解决方案:带重试 + 模型降级的健壮调用器

下面这个封装,30 行出头,解决三个问题:

1. 自动重试:遇到 429/503 自动等待重试,指数退避

2. 模型降级:主力模型挂了,自动切到备用模型

3. 多端点支持:官方挂了,切到镜像,任务不中断


import time

import openai

from openai import RateLimitError, APIStatusError



# 模型优先级列表:主力 → 备用

MODEL_FALLBACKS = [

    "gpt-4o",

    "gpt-4o-mini",

    "claude-3-5-sonnet-20241022",  # 无量Api 支持 300+ 模型,Claude 也能用同一套代码

]



client = openai.OpenAI(

    api_key="your-api-key",

    base_url="https://api2everything.xyz/v1",  # 改这一行,其余代码不动

)



def robust_chat(prompt: str, max_retries: int = 3) -> str:

    for model in MODEL_FALLBACKS:

        for attempt in range(max_retries):

            try:

                resp = client.chat.completions.create(

                    model=model,

                    messages=[{"role": "user", "content": prompt}],

                    timeout=60,

                )

                return resp.choices[0].message.content

            except RateLimitError:

                wait = 2 ** attempt  # 指数退避:1s, 2s, 4s

                print(f"[{model}] 限速,{wait}s 后重试 (attempt {attempt+1})")

                time.sleep(wait)

            except APIStatusError as e:

                if e.status_code in (503, 529):  # 模型过载

                    print(f"[{model}] 过载 ({e.status_code}),切换备用模型")

                    break  # 跳出重试循环,换下一个模型

                raise  # 其他错误直接抛出

    raise RuntimeError("所有模型均不可用")



# 使用示例

result = robust_chat("用一句话解释量子纠缠")

print(result)


实战:批量代码审查,中断也不怕

把上面的封装用到实际场景——扫描一个目录下所有 Python 文件,让模型逐个审查:


import os

from pathlib import Path



def review_repo(repo_path: str, extensions: list = [".py", ".ts", ".go"]):

    files = [

        p for p in Path(repo_path).rglob("*")

        if p.suffix in extensions and p.stat().st_size < 50_000  # 跳过超大文件

    ]

    

    results = {}

    for f in files:

        code = f.read_text(errors="ignore")

        prompt = f"""审查以下代码,指出:

1. 潜在 bug 或安全问题

2. 性能瓶颈

3. 改进建议(限 3 条)



文件:{f.name}

{code[:3000]} # 截断避免超出 context


        

        print(f"审查 {f.name}...")

        results[str(f)] = robust_chat(prompt)

    

    return results



# 跑起来

reviews = review_repo("./my_project")

for path, review in reviews.items():

    print(f"\n{'='*50}\n{path}\n{review}")

这个脚本遇到模型过载会自动降级,遇到限速会自动等待,不需要你盯着看。


为什么 `base_url` 改一行就够了

OpenAI 的 SDK 设计很好——所有请求都走 base_url,只要目标服务实现了相同的 API 格式,客户端代码完全不用改。

无量Api(api2everything.xyz)就是这个思路:完全兼容 OpenAI 格式,支持 GPT-5、Claude 4.x、Gemini、DeepSeek 等 300+ 模型,全部用同一个 client 调用。

对上面那段代码来说,MODEL_FALLBACKS 里混用 GPT 和 Claude 是完全合法的——它们都走同一个 endpoint,同一套鉴权。


关于成本

官方 GPT-4o 现在不便宜,加上汇率和支付门槛,很多人卡在这里。无量Api 的价格大概是官方的 35%–40%,SVIP 还有 7.7 折,注册就送 ¥1 余额可以先试。

对于上面这种批量审查场景,处理一个中型项目(~50 个文件)大概消耗几万 token,官方价格可能要几十块,这边能省不少。


小结

| 问题 | 解法 |

|------|------|

| 模型过载中断 | 指数退避重试 |

| 单模型挂掉 | MODEL_FALLBACKS 自动降级 |

| 官方不稳定 | 改 base_url 切镜像 |

| 费用高 | 用兼容 API 的低价服务 |

核心代码就这 30 行,可以直接复制到你的项目里。


如果你在跑类似的批量任务遇到其他问题,评论区说一下,我看到都会回。

觉得有用的话点个赞,这类实战内容我会持续更新。


推广链接(V2EX 读者): 无量Api — 国内直连 300+ 模型,注册送 ¥1