如何通过代理正确调用OpenAI官方SDK?API调用遇429等问题求助
OpenAI API调用问题:SDK报错429,直接请求成功但担心API Key安全
问题描述
因地域限制,无法通过OpenAI官方SDK正常调用API,已配置代理但仍出现APIConnectionError和429错误,单次请求也会触发。此前用Java的OKHttp调用时同样遇到429错误。改用requests直接调用API成功,但听说该方式可能导致API Key被封禁,希望找到官方SDK的正确使用方法,或优化直接调用的安全性。
尝试的官方SDK代码
import requests import openai proxies = { # MY PROXY HOST "http":"http://127.0.0.1:7890", "https":"https://127.0.0.1:7890" } requests.session().proxies.update(proxies) openai.api_key = "MYAPIKEY" completion = openai.chat.completions.create( model="gpt-3.5", messages=[{"role": "user"}, {"content": "Tell me about math"}] ) print(completion)
成功的直接请求代码
import requests # OpenAI API URL url = "https://api.openai.com/v1/engines/gpt-3.5-turbo-instruct/completions" headers = { "Authorization": "Bearer MYAPIKEY", "Content-Type": "application/json" } proxies = { # MY PROXY HOST "http": "http://127.0.0.1:7890", "https": "http://127.0.0.1:7890", } data = { "prompt": "Tell me about math", "max_tokens": 60 } response = requests.post(url, json=data, headers=headers, verify=False)
错误栈信息
Traceback (most recent call last): File "C:\User\PycharmProjects\pythonProject\main.py", line 42, in <module> completion = openai.chat.completions.create( ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\User\PycharmProjects\pythonProject\venv\Lib\site-packages\openai\_utils\_utils.py", line 301, in wrapper return func(*args, **kwargs) ^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\PycharmProjects\pythonProject\venv\Lib\site-packages\openai\resources\chat\completions.py", line 598, in create return self._post( ^^^^^^^^^^^ File "C:\Users\PycharmProjects\pythonProject\venv\Lib\site-packages\openai\_base_client.py", line 1096, in post return cast(ResponseT, self.request(cast_to, opts, stream=stream, stream_cls=stream_cls)) ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ File "C:\Users\PycharmProjects\pythonProject\venv\Lib\site-packages\openai\_base_client.py", line 856, in request return self._request( ^^^^^^^^^^^^^^ File "C:\Users\PycharmProjects\pythonProject\venv\Lib\site-packages\openai\_base_client.py", line 894, in _request return self._retry_request( ^^^^^^^^^^^^^^^^^^^^ File "C:\User\PycharmProjects\pythonProject\venv\Lib\site-packages\openai\_base_client.py", line 966, in _retry_request return self._request( ^^^^^^^^^^^^^^ File "C:\Users\PycharmProjects\pythonProject\venv\Lib\site-packages\openai\_base_client.py", line 894, in _request return self._retry_request( ^^^^^^^^^^^^^^^^^^^^ File "C:\Users\PycharmProjects\pythonProject\venv\Lib\site-packages\openai\_base_client.py", line 966, in _retry_request return self._request( ^^^^^^^^^^^^^^ File "C:\Users\PycharmProjects\pythonProject\venv\Lib\site-packages\openai\_base_client.py", line 908, in _request raise self._make_status_error_from_response(err.response) from None openai.RateLimitError: Error code: 429 - {'error': {'message': 'You exceeded your current quota, please check your plan and billing details.', 'type': 'insufficient_quota', 'param': None, 'code': 'insufficient_quota'}}
解决方案
一、修复官方SDK的代理配置
OpenAI v1+版本SDK需直接通过客户端实例配置代理,而非修改requests.session,同时修正模型名和请求格式:
import openai # 初始化带代理的客户端 client = openai.OpenAI( api_key="MYAPIKEY", proxies={ "http": "http://127.0.0.1:7890", "https": "http://127.0.0.1:7890", } ) # 修正后的chat completions请求 completion = client.chat.completions.create( model="gpt-3.5-turbo", # 正确的聊天模型名称 messages=[{"role": "user", "content": "Tell me about math"}] # 正确的消息格式 ) print(completion)
关键修复点:
- 使用
openai.OpenAI实例配置代理,适配v1版本SDK的规范 - 修正消息格式:每个消息是包含
role和content的单个字典 - 替换有效模型名:
gpt-3.5不是合法模型标识,聊天接口需用gpt-3.5-turbo
二、优化直接请求的安全性
若继续使用requests直接调用,可通过以下方式降低API Key泄露风险:
- 避免硬编码API Key:通过环境变量读取
import os api_key = os.getenv("OPENAI_API_KEY") - 开启SSL验证:移除
verify=False,若代理需证书,指定证书路径:verify="/path/to/proxy/cert.pem" - 使用正确的接口路径:聊天接口应调用
https://api.openai.com/v1/chat/completions,请求体匹配格式:url = "https://api.openai.com/v1/chat/completions" data = { "model": "gpt-3.5-turbo", "messages": [{"role": "user", "content": "Tell me about math"}], "max_tokens": 60 }
三、429错误额外排查点
- 更换代理节点:共享IP可能被OpenAI列入黑名单,优先使用独享代理
- 检查账户配额:登录OpenAI后台确认账户是否有可用额度
- 关闭自动重试:SDK默认会自动重试请求,可能触发频率限制,可关闭:
client = openai.OpenAI( api_key="MYAPIKEY", proxies=..., max_retries=0 )
内容的提问来源于stack exchange,提问作者chen zc
相关产品推荐
相关产品推荐

