使用Python requests调用OpenAI API遇model参数缺失及端点请求异常
问题:用Python的requests库调用OpenAI API遇到参数错误及端点请求问题
我不想用官方的openai包,想通过更灵活的requests库调用OpenAI API。初始代码如下:
>>> headers = {"Authorization": "Bearer xxx"} >>> url = 'https://api.openai.com/v1/completions' >>> data = {'model': 'text-davinci-002', 'prompt': 'Once upon a time'} >>> requests.get(url, headers=headers, data=data).content ... "error": {\n "message": "you must provide a model parameter"
API令牌已验证是正确的。我试过把字典用json参数传入、转成JSON字符串传入data参数,都返回同样的错误。
更新尝试
我又试了以下几种方式,同样返回相同错误,也尝试在请求头里加了'Content-Type': 'application/json':
>>> requests.get(url, headers=headers, json=data).content >>> requests.get(url, headers=headers, json=json.dumps(data)).content >>> requests.get(url, headers=headers, data=json.dumps(data)).content >>> requests.get(url, headers=headers, data=json.dumps(data).encode()).content
update2:端点请求新问题
用POST请求completions端点能正常工作,但调用edit端点时出问题:
>>> completion_url = "https://api.openai.com/v1/completions" >>> completion_data = {'model': 'text-davinci-002', 'prompt': 'Once upon a time'} >>> requests.post(completion_url, headers=headers, json=completion_data).json() ... # 正常返回结果 >>> edit_url = "https://api.openai.com/v1/edits" >>> edit_data = {'model': 'text-davinci-002', 'input': 'Once upon a time', 'instruction': 'Continue'} >>> requests.get(edit_url, headers=headers, json=edit_data).json()['error']['message'] 'you must provide a model parameter' >>> requests.post(edit_url, headers=headers, json=edit_data).json()['error']['message'] 'Invalid URL (POST /v1/edits)'
解答
1. Completions端点的问题根源
OpenAI的/v1/completions端点只接受POST请求,不支持GET请求。你之前用GET方式发送,哪怕参数正确,服务器也不会解析请求体里的参数,所以才会提示“必须提供model参数”。
正确的调用方式就是你后来用的POST请求:
import requests headers = {"Authorization": "Bearer YOUR_API_KEY"} completion_url = "https://api.openai.com/v1/completions" completion_data = {'model': 'text-davinci-002', 'prompt': 'Once upon a time'} response = requests.post(completion_url, headers=headers, json=completion_data) print(response.json())
2. Edits端点的问题解决
(1)端点错误的核心原因
/v1/edits端点是存在的,但你遇到的Invalid URL错误,本质是text-davinci-002不支持Edits接口。Edits接口要求使用专门的编辑模型,比如text-davinci-edit-001或者code-davinci-edit-001,普通的completion模型无法调用这个端点。
(2)正确的Edits调用示例
把模型换成支持的编辑模型,用POST请求:
import requests headers = {"Authorization": "Bearer YOUR_API_KEY"} edit_url = "https://api.openai.com/v1/edits" edit_data = { 'model': 'text-davinci-edit-001', 'input': 'Once upon a time', 'instruction': 'Continue the story in a magical tone' } response = requests.post(edit_url, headers=headers, json=edit_data) print(response.json())
关键注意事项
- OpenAI的所有生成类接口(completions、edits、chat/completions等)全部要求用POST请求,GET请求无法传递请求体参数,会被服务器拒绝解析。
- 每个接口对应支持的模型不同,调用前要确认模型是否兼容目标接口,比如Edits接口只能用带
edit标识的模型。
内容的提问来源于stack exchange,提问作者Adam Schmideg
相关产品推荐
相关产品推荐

