Discord ChatGPT机器人长回复无响应问题求助(Python)
修复Discord斜杠命令调用ChatGPT长回复超时问题
问题描述
开发的Discord Python机器人,通过斜杠命令调用ChatGPT时,简单请求(如问候)可正常响应,但复杂请求需要长回复时,Discord提示“应用未响应”。非斜杠命令可正常使用,尝试重构命令未解决该问题。
原因分析
Discord对斜杠命令的交互有3秒响应时限,复杂请求调用ChatGPT的接口耗时会超过这个阈值,导致Discord判定应用未响应。非斜杠命令没有严格的响应时间限制,因此能正常工作。
解决方案
核心思路是先快速响应Discord的交互要求,再在后台处理耗时的ChatGPT请求,最后更新回复内容:
- 第一步:发送临时响应消息,满足3秒时限要求
- 第二步:在后台线程执行ChatGPT请求,避免阻塞机器人事件循环
- 第三步:编辑临时响应,替换为ChatGPT的实际回复
- 额外添加异常处理,避免请求失败导致机器人无反馈
修改后的完整代码
from dotenv import load_dotenv import openai import discord from discord import app_commands from discord.ext import commands import os import asyncio load_dotenv() TOKEN = os.getenv('DISCORD_TOKEN') openai.api_key = os.getenv('OPENAI_KEY') bot = commands.Bot(command_prefix="!", intents=discord.Intents.all()) @bot.event async def on_ready(): try: synced = await bot.tree.sync() print(f"Synced {len(synced)} commands(s)") except Exception as e: print(e) @bot.tree.command(name="ai", description="ask chatgpt anything") async def ai(interaction: discord.Interaction, message: str): # 发送临时响应,快速满足Discord的交互要求 await interaction.response.send_message("正在思考中,请稍候...") try: # 后台线程执行ChatGPT请求,不阻塞机器人事件循环 response_content = await asyncio.to_thread(chatgpt_response, message) # 编辑原始消息,替换为实际回复并清理格式 await interaction.edit_original_response(content=response_content.strip()) except Exception as e: # 异常处理:告知用户请求失败 await interaction.edit_original_response(content=f"请求失败:{str(e)}") def chatgpt_response(prompt): response = openai.Completion.create( model="text-davinci-003", prompt=prompt, temperature=1, max_tokens=100 ) response_dict = response.get("choices") if response_dict and len(response_dict) > 0: prompt_response = response_dict[0]["text"] return prompt_response return "未获取到有效回复" bot.run(TOKEN)
关键修改说明
- 新增
asyncio库依赖,用于后台线程执行耗时操作 - 斜杠命令中优先发送临时消息,确保在3秒内完成Discord交互响应
- 使用
asyncio.to_thread将同步的ChatGPT请求移至后台,避免阻塞机器人的事件循环 - 添加异常捕获逻辑,当ChatGPT接口调用失败时,向用户反馈错误信息
- 对ChatGPT返回的内容调用
strip(),去除多余的换行和空格,优化回复格式
内容的提问来源于stack exchange,提问作者stubbie
相关产品推荐
相关产品推荐

