为什么你的 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