调用OpenAI生成图片时出现400错误,请求协助排查修复
修复Discord机器人调用OpenAI生成图片的400错误
核心问题排查与修复
1. API密钥不完整
你代码里的API密钥sk-aqe0eRo77gOnnSBR2n7明显是截断状态,OpenAI的API密钥以sk-开头,长度至少50个字符以上。去OpenAI平台复制完整的有效密钥替换掉这个截断的内容。
2. Prompt为空或违规
- 先确认Discord slash command的
text选项确实传了值,不能是空字符串或者undefined。调用OpenAI之前加个校验:if (!text || text.trim() === '') { return interaction.editReply('得给个有效的图片描述啊'); } - 如果用户输入的内容违反OpenAI的内容政策(比如暴力、色情类内容),也会返回400错误,需要限制用户输入的合规性。
3. 未捕获具体错误信息
你现在的代码只在编辑回复时捕获错误,根本看不到OpenAI返回的具体错误原因(比如“无效密钥”“prompt为空”)。必须给openai.createImage加上错误捕获,才能精准定位问题。
修复后的完整代码
const { Configuration, OpenAIApi } = require('openai'); const { EmbedBuilder } = require('discord.js'); const configuration = new Configuration({ apiKey: '替换成你的完整OpenAI API密钥' }); const openai = new OpenAIApi(configuration); async function handleImageGeneration(interaction) { try { let text = interaction.options.getString('text'); // 校验输入是否有效 if (!text || text.trim() === '') { return interaction.editReply('请提供有效的图片描述文本'); } const response = await openai.createImage({ prompt: text.trim(), n: 1, size: '1024x1024', }); const imageUrl = response.data.data[0].url; const embed = new EmbedBuilder() .setTitle('生成的图片') .setImage(imageUrl); // Discord.js v14+需要用embeds数组形式传递 await interaction.editReply({ embeds: [embed] }); } catch (error) { // 打印详细错误到控制台,方便调试 console.error('OpenAI请求出错:', error.response?.data || error.message); let errorMsg = '生成图片失败'; // 如果OpenAI返回了具体错误信息,直接展示给用户 if (error.response?.data?.error?.message) { errorMsg += `: ${error.response.data.error.message}`; } await interaction.editReply(errorMsg); } }
额外提醒
- 确保你用的是Discord.js v14及以上版本,
EmbedBuilder和editReply的语法要对应上,v14之后必须用{ embeds: [embed] }这种格式。 - 检查OpenAI账户有没有可用额度,余额不足也可能导致请求失败(有时候会返回400而不是402)。
内容的提问来源于stack exchange,提问作者Ansh Tyagi
相关产品推荐
相关产品推荐

