求助:调用OpenAI API出现429状态码问题的解决方法
解决OpenAI API 429状态码超限问题
429状态码表示请求超出了OpenAI的速率限制,即便你已经设置了time.sleep(5),仍有以下几个可能的原因和对应的解决方案:
- 排查实际调用频率:确认脚本没有被快速重复触发(比如误启动多次、脚本内部存在循环调用)。OpenAI的20RPM限制是基于滚动窗口计算的,并非严格按自然分钟划分,短时间内集中发起请求(比如10秒内发5次)依然可能触发超限。
- 调整sleep位置:把
time.sleep(5)移到请求完成之后,确保两次请求之间间隔5秒。当前代码在请求前sleep,首次请求无间隔,如果连续运行脚本,两次请求的间隔可能不达标。 - 添加指数退避重试机制:遇到429错误时,不要直接失败,而是根据响应头的
Retry-After值等待后重试,或者采用逐步增加等待时间的指数退避策略。修改后的示例代码如下:
import argparse import os import requests import time parser = argparse.ArgumentParser() parser.add_argument("prompt", help="The Prompt to send to OpenAI API ") parser.add_argument("file_name", help="Name of the File") args = parser.parse_args() api_endpoints = "https://api.openai.com/v1/completions" api_key = os.getenv("OPENAI_API_KEY") request_headers = { "Content-Type": "application/json", "Authorization": "Bearer " + api_key } request_data = { "model": "text-davinci-003", "prompt": f"Write python script for {args.prompt}. Provide only code, no text", "max_tokens": 100, "temperature": 0.5 } max_retries = 3 retry_delay = 5 # 初始等待时间 success = False for attempt in range(max_retries): response = requests.post(api_endpoints, headers=request_headers, json=request_data) if response.status_code == 200: response_text = response.json()["choices"][0]["text"] with open(args.file_name, "w") as file: file.write(response_text) success = True break elif response.status_code == 429: # 优先使用响应头中的Retry-After值 retry_after = response.headers.get("Retry-After") if retry_after: wait_time = int(retry_after) else: # 指数退避,每次重试等待时间翻倍 wait_time = retry_delay * (2 ** attempt) print(f"Rate limited. Retrying in {wait_time} seconds...") time.sleep(wait_time) else: print(f"Request failed with status code : {str(response.status_code)}") break if not success: print("All retry attempts failed.")
- 确认账号实际配额:登录OpenAI平台查看账号的速率限制详情,免费试用的配额可能存在变动,或账号下其他API调用消耗了额度。
- 改用OpenAI官方Python库:官方库已内置速率限制处理、重试逻辑,比手动发送请求更稳定。示例代码:
import argparse import os from openai import OpenAI parser = argparse.ArgumentParser() parser.add_argument("prompt", help="The Prompt to send to OpenAI API ") parser.add_argument("file_name", help="Name of the File") args = parser.parse_args() client = OpenAI(api_key=os.getenv("OPENAI_API_KEY")) response = client.completions.create( model="text-davinci-003", prompt=f"Write python script for {args.prompt}. Provide only code, no text", max_tokens=100, temperature=0.5 ) with open(args.file_name, "w") as file: file.write(response.choices[0].text)
内容的提问来源于stack exchange,提问作者geet choudhari
相关产品推荐
相关产品推荐

