使用OpenAI API遇不安全头及429错误的解决咨询
问题描述
我正在用ChatGPT API开发简易聊天应用,源代码如下:
import { Configuration, OpenAIApi } from "openai"; const openai = new OpenAIApi( new Configuration({ apiKey: process.env.REACT_APP_OPEN_AI_SECRET_KEY, }) ); export const getChatGPTMessage = async (text: string): Promise<string> => { return await openai .createChatCompletion({ model: "gpt-3.5-turbo", messages: [ { role: "user", content: `${text}`, }, ], }) .then((res) => res.data.choices[0].message as unknown as string); };
运行时遇到两个错误:
xhr.js:162 Refused to set unsafe header "User-Agent"Failed to load resource: the server responded with a status of 429 (),提示API密钥有问题,但已确认密钥设置正确。同时想确认API KEY和“密钥”是否为同一事物,若不同该如何获取正确密钥。
解决方案
1. 解决"Refused to set unsafe header 'User-Agent'"错误
这个错误是因为OpenAI的JS库在浏览器环境中尝试修改User-Agent请求头,但浏览器将这个头列为不安全头,禁止前端脚本修改。有两种解决方式:
方式一:升级openai库到最新版本
OpenAI官方已经修复了浏览器环境下的这个问题,执行升级命令即可:
npm update openai # 或 yarn upgrade openai
方式二:自定义Axios实例禁用User-Agent头
如果暂时无法升级库,可以创建自定义Axios实例,删除默认的User-Agent头后传入OpenAI的配置:
import axios from 'axios'; import { Configuration, OpenAIApi } from "openai"; // 创建自定义Axios实例并移除User-Agent头 const customAxios = axios.create(); delete customAxios.defaults.headers.common['User-Agent']; const openai = new OpenAIApi( new Configuration({ apiKey: process.env.REACT_APP_OPEN_AI_SECRET_KEY, axiosInstance: customAxios }) );
2. 解决429错误及API密钥相关疑问
- API KEY和你提到的"密钥"是同一事物,指的是从OpenAI平台生成的Secret Key。
429错误通常不是密钥本身错误,而是以下原因导致:
- 速率限制触发:OpenAI API对请求频率有严格限制(免费用户和付费用户额度不同),短时间内请求过多会触发429。
- 额度耗尽:免费额度用完或付费账户的余额不足。
- 密钥权限问题:密钥被禁用,或没有权限调用
gpt-3.5-turbo模型。 - 前端暴露密钥风险:直接在前端代码中使用API密钥会导致密钥泄露,可能被他人滥用,进而触发平台的限制。
解决步骤:
- 登录OpenAI账户,查看API使用面板,确认是否超出速率限制或额度耗尽。
- 确认密钥是从OpenAI平台的「API Keys」页面生成的Secret key(注意不是Organization ID),且密钥状态为启用。
- 绝对不要在前端代码中直接暴露API密钥!建议将API调用逻辑放在后端服务中,前端通过调用自己的后端接口来完成对话请求,这样既避免密钥泄露,也能更好地控制请求频率。
- 如果是速率限制导致,可以在后端添加请求重试逻辑,或降低前端的请求频率。
内容的提问来源于stack exchange,提问作者Amos Machora
相关产品推荐
相关产品推荐

