Discord Bot调用GPT-3.5-turbo遇404错误求助
修复Discord Bot调用OpenAI API的404错误
核心排查方向及解决步骤
1. 确认API端点正确性
GPT-3.5-turbo必须使用聊天补全端点,旧的文本补全端点(/v1/completions)仅适用于text-davinci-003等模型,误用会直接返回404:
- 正确端点:
https://api.openai.com/v1/chat/completions
如果使用Axios,务必确保请求URL指向上述端点;如果用OpenAI官方npm包,需保证安装的是v4及以上版本(v3版本的端点映射已过时)。
2. 规范请求结构(代码示例)
Axios 正确调用示例
const axios = require('axios'); require('dotenv').config(); async function getGptResponse(userMessage) { try { const response = await axios.post( 'https://api.openai.com/v1/chat/completions', { model: 'gpt-3.5-turbo', messages: [{ role: 'user', content: userMessage }], temperature: 0.7 }, { headers: { 'Authorization': `Bearer ${process.env.OPENAI_API_KEY}`, 'Content-Type': 'application/json' } } ); return response.data.choices[0].message.content.trim(); } catch (error) { console.error('API请求错误:', error.response?.data || error.message); throw error; } }
OpenAI 官方npm包(v4)正确示例
const OpenAI = require('openai'); require('dotenv').config(); const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY, }); async function getGptResponse(userMessage) { try { const completion = await openai.chat.completions.create({ model: 'gpt-3.5-turbo', messages: [{ role: 'user', content: userMessage }], }); return completion.choices[0].message.content.trim(); } catch (error) { console.error('API请求错误:', error.response?.data || error.message); throw error; } }
3. 验证环境变量加载
即使你确认配置正确,也要在代码启动时打印验证:
console.log('OpenAI API Key:', process.env.OPENAI_API_KEY ? '已加载' : '未加载');
如果显示“未加载”,检查:
- 是否在代码最顶部调用了
dotenv.config()(CommonJS)或import 'dotenv/config'(ESM) .env文件是否放在项目根目录,且文件名正确(不能有空格或后缀)- 环境变量名是否拼写正确(比如
OPENAI_API_KEY而非OPENAI_KEY)
4. 排查账号权限与额度
404错误偶尔也会伪装成权限问题:
- 登录OpenAI后台,确认你的API Key已启用,且拥有
chat.completions端点的访问权限 - 检查账号是否有剩余额度(免费额度过期或耗尽后,也会触发非预期的错误码)
Discord Bot 集成示例(含点赞/点踩反馈)
const { Client, GatewayIntentBits, ActionRowBuilder, ButtonBuilder, ButtonStyle } = require('discord.js'); require('dotenv').config(); const client = new Client({ intents: [GatewayIntentBits.Guilds, GatewayIntentBits.GuildMessages, GatewayIntentBits.MessageContent] }); client.on('messageCreate', async (message) => { if (message.author.bot) return; try { const gptResponse = await getGptResponse(message.content); const reply = await message.reply(gptResponse); // 添加点赞/点踩按钮 const row = new ActionRowBuilder() .addComponents( new ButtonBuilder() .setCustomId('like') .setLabel('👍') .setStyle(ButtonStyle.Success), new ButtonBuilder() .setCustomId('dislike') .setLabel('👎') .setStyle(ButtonStyle.Danger) ); await reply.edit({ components: [row] }); // 处理按钮点击事件 const filter = i => i.customId === 'like' || i.customId === 'dislike'; const collector = reply.createMessageComponentCollector({ filter, time: 60000 }); collector.on('collect', async i => { await i.deferUpdate(); // 这里可以将反馈存入数据库或日志,用于后续优化 console.log(`用户 ${message.author.tag} 对回复的反馈: ${i.customId}`); }); } catch (error) { await message.reply('抱歉,暂时无法生成回复,请稍后再试。'); } }); client.login(process.env.DISCORD_BOT_TOKEN);
内容的提问来源于stack exchange,提问作者Edward Rieck
相关产品推荐
相关产品推荐

