在Discord.js中集成ChatGPT API斜杠命令遇404错误求助
Discord.js调用ChatGPT API出现404错误的解决方法
问题描述
我编写了一段Discord.js的斜杠命令代码,用于调用ChatGPT API,已确认API密钥正确、API服务可用,但运行时持续触发404错误。以下是我的代码及完整错误栈:
代码
const { SlashCommandBuilder } = require('@discordjs/builders'); const { Configuration, OpenAIApi } = require("openai"); const configuration = new Configuration({ apiKey: "MY API KEY HERE", }); const openai = new OpenAIApi(configuration); module.exports = { data: new SlashCommandBuilder() .setName('chat') .setDescription('Get an AI-generated response based on your message') .addStringOption(option => option.setName('message') .setDescription('The message to generate a response from') .setRequired(true)), async execute(interaction) { const message = interaction.options.getString('message'); try { const completion = await openai.createChatCompletion({ model: "gpt-3.5-turbo", messages: [{ role: "user", content: message }], }); const response = completion.data.choices[0].text.trim(); await interaction.reply(response); } catch (error) { console.error(error); await interaction.reply({ content: 'Sorry, there was an error processing your request!', ephemeral: true }); } }, };
错误栈
Error: Request failed with status code 404 at createError (C:\Users\user\OneDrive\Desktop\rzn bot\node_modules\openai\node_modules\axios\lib\core\createError.js:16:15) at settle (C:\Users\user\OneDrive\Desktop\rzn bot\node_modules\openai\node_modules\axios\lib\core\settle.js:17:12) at IncomingMessage.handleStreamEnd (C:\Users\user\OneDrive\Desktop\rzn bot\node_modules\openai\node_modules\axios\lib\adapters\http.js:322:11) at IncomingMessage.emit (node:events:525:35) at endReadableNT (node:internal/streams/readable:1359:12) at process.processTicksAndRejections (node:internal/process/task_queues:82:21) { config: { transitional: { silentJSONParsing: true, forcedJSONParsing: true, clarifyTimeoutError: false }, adapter: [Function: httpAdapter], transformRequest: [ [Function: transformRequest] ], transformResponse: [ [Function: transformResponse] ], timeout: 0, xsrfCookieName: 'XSRF-TOKEN', xsrfHeaderName: 'X-XSRF-TOKEN', maxContentLength: -1, maxBodyLength: -1, validateStatus: [Function: validateStatus], headers: { Accept: 'application/json, text/plain, */*', 'Content-Type': 'application/json', 'User-Agent': 'OpenAI/NodeJS/3.2.1', Authorization: 'Bearer THE API KEY HERE', 'Content-Length': 74 }, method: 'post', data: '{"model":"gpt-3.5-turbo","messages":[{"role":"user","content":"hey"}]}', url: 'https://api.openai.com/v1/chat/completions' }, response: { status: 404, statusText: 'Not Found', headers: { date: 'Thu, 02 Mar 2023 22:37:48 GMT', 'content-type': 'application/json; charset=utf-8', 'content-length': '158', connection: 'keep-alive', vary: 'Origin', 'x-request-id': '40456c1da0117d70199e713b83ddc6f8', 'strict-transport-security': 'max-age=15724800; includeSubDomains' }, data: { error: [Object] } }, isAxiosError: true, toJSON: [Function: toJSON] }
错误原因及解决方法
1. 核心原因:OpenAI SDK版本不兼容
你使用的OpenAI Node.js版本是3.2.1,该版本的createChatCompletion方法对应的API路径在当时未对gpt-3.5-turbo模型完全开放,且版本架构与当前API标准不匹配,导致请求路径无效触发404。
2. 修复步骤
- 升级OpenAI SDK:执行命令将包升级到最新稳定版(至少v4.x以上):
npm install openai@latest
- 适配新版本代码:新版本SDK调用方式有调整,修改后的代码如下:
const { SlashCommandBuilder } = require('@discordjs/builders'); const OpenAI = require("openai"); const openai = new OpenAI({ apiKey: "MY API KEY HERE", }); module.exports = { data: new SlashCommandBuilder() .setName('chat') .setDescription('基于你的消息生成AI回复') .addStringOption(option => option.setName('message') .setDescription('生成回复的输入消息') .setRequired(true)), async execute(interaction) { const message = interaction.options.getString('message'); try { const completion = await openai.chat.completions.create({ model: "gpt-3.5-turbo", messages: [{ role: "user", content: message }], }); // 注意:新版本返回内容路径为message.content,而非旧版的text const response = completion.choices[0].message.content.trim(); await interaction.reply(response); } catch (error) { console.error(error); await interaction.reply({ content: '抱歉,处理你的请求时出错了!', ephemeral: true }); } }, };
3. 旧版本兼容方案(不推荐)
如果暂时无法升级SDK,可改用createCompletion方法调用,但该方式存在功能限制,官方已逐步淘汰:
// 旧版本临时兼容写法 const completion = await openai.createCompletion({ model: "gpt-3.5-turbo", prompt: message, }); const response = completion.data.choices[0].text.trim();
内容的提问来源于stack exchange,提问作者Mahdi
相关产品推荐
相关产品推荐

