Stack Overflow克隆项目集成ChatGPT API遇400错误求助
400 Bad Request错误排查与解决方法
可能的原因及对应解决方式
1. OpenAI API密钥配置错误
- 检查
.env文件中OPEN_AI_KEY是否正确:确认密钥无拼写错误、无多余空格,且该密钥未过期、拥有对应模型的调用权限。 - 解决:登录OpenAI平台查看密钥状态,修正
.env中的密钥内容,确保变量名严格为OPEN_AI_KEY。
2. 所使用的模型已停用
text-davinci-003属于旧版补全模型,OpenAI已在2024年1月停止对其提供支持,调用会直接报错。
- 解决:将模型替换为当前可用的文本补全模型,例如
gpt-3.5-turbo-instruct,修改控制器中的模型参数:const response = await openai.createCompletion({ model: "gpt-3.5-turbo-instruct", // 替换为可用模型 prompt: `${message}`, max_tokens: 100, temperature: 0, });
3. 请求参数不合法
- 若客户端发送的
message为空或格式错误,会导致OpenAI请求失败;另外prompt长度+max_tokens超出模型上下文限制也会触发错误。 - 解决:
- 在控制器中添加参数校验,提前拦截空请求:
export const chatbotController = async (req, res) => { const { message } = req.body // 新增校验逻辑 if (!message || message.trim() === '') { return res.status(400).json({ error: '提问内容不能为空' }); } try { // 原有请求逻辑 } } - 确保
prompt长度与max_tokens之和不超过所选模型的上下文限制(例如gpt-3.5-turbo-instruct最大为4096 tokens)。
- 在控制器中添加参数校验,提前拦截空请求:
4. 服务端未正确接收请求体
虽然配置了express.json()中间件,但仍可能存在解析异常,导致无法获取req.body.message。
- 解决:在控制器开头添加日志打印,确认请求体是否正确接收:
若日志显示export const chatbotController = async (req, res) => { console.log('Received request body:', req.body); // 新增日志 const { message } = req.body // 原有逻辑 }req.body为空,检查express.json()中间件是否在路由挂载前加载(你的代码中顺序是正确的,可确认是否存在其他中间件干扰)。
5. 网络或OpenAI服务问题
服务器无法连接到OpenAI API,可能是网络防火墙、代理限制,或OpenAI临时故障。
- 解决:在服务器终端执行以下命令测试网络连通性:
若无法返回模型列表,排查服务器网络设置;若返回服务错误,等待OpenAI恢复或查看其状态公告。curl https://api.openai.com/v1/models -H "Authorization: Bearer YOUR_OPENAI_KEY"
内容的提问来源于stack exchange,提问作者shaurya
相关产品推荐
相关产品推荐

