Cómo hacer un bot de Discord con IA (ChatGPT, Gemini…) en Python
Un bot de Discord con IA no lleva la IA dentro: le pasa la pregunta a un servicio como ChatGPT (OpenAI) o Gemini (Google) por internet y devuelve lo que contesta. Por eso el bot es pequeño y el código, corto: este tiene un comando /pregunta y vale para casi cualquier IA cambiando dos líneas del .env.
1. Lo que necesitas
Un bot de Discord creado en el portal de desarrolladores, con su token. Si es tu primer bot, haz antes el bot en Python paso a paso: aquí se da por hecho que sabes crearlo e invitarlo (con «bot» y «applications.commands»).
Y una clave de la API de la IA que quieras usar. La de OpenAI se saca en platform.openai.com y la de Gemini en Google AI Studio (aistudio.google.com). No es la suscripción de ChatGPT Plus: la API se paga aparte, por lo que se usa (por tokens, trozos de texto), y Gemini tiene una capa gratis con límites de uso. Mira los precios y límites de hoy en la página del proveedor antes de empezar.
¿Prefieres no montarlo tú? Hosting de bots de Discord desde 1,50 € al mes, sin permanencia y con devolución íntegra en 72 horas. O crea un bot de Discord gratis, sin tarjeta.
2. Una sola librería para casi todas las IA
La librería oficial de OpenAI para Python (openai) habla con OpenAI y también con cualquier servicio que copie su forma de API, que son muchos: Gemini lo admite en https://generativelanguage.googleapis.com/v1beta/openai/, y otros como OpenRouter o Groq tienen su propia dirección compatible. Así que el mismo bot sirve para todos: en el .env cambias la dirección (IA_URL), la clave (IA_CLAVE) y el modelo (IA_MODELO).
Para OpenAI, deja IA_URL vacía. El nombre del modelo cópialo tal cual de la documentación de tu proveedor: cambian a menudo y uno que ya no existe da error.
3. El código
Tres ficheros en una carpeta. El comando /pregunta primero avisa a Discord de que va a tardar (Discord solo espera 3 segundos una respuesta, y la IA suele tardar más), luego pregunta a la IA y contesta con lo que diga, cortado a 2000 caracteres, el máximo de un mensaje de Discord.
Las INSTRUCCIONES son lo que la IA lee antes de cada pregunta: cámbialas para darle personalidad o centrarla en tu comunidad (las normas, tu servidor de Minecraft…).
discord.py
openai
python-dotenvDISCORD_TOKEN=pega-aquí-el-token-del-bot
IA_CLAVE=pega-aquí-la-clave-de-la-api
IA_MODELO=nombre-del-modelo
# Vacía para OpenAI; para Gemini:
# IA_URL=https://generativelanguage.googleapis.com/v1beta/openai/
IA_URL=import os
import discord
from discord import app_commands
from dotenv import load_dotenv
from openai import AsyncOpenAI
load_dotenv() # lee el token y la clave del fichero .env
ia = AsyncOpenAI(
api_key=os.environ["IA_CLAVE"],
base_url=os.getenv("IA_URL") or None, # vacía = OpenAI
)
MODELO = os.environ["IA_MODELO"]
INSTRUCCIONES = (
"Eres el asistente de un servidor de Discord. "
"Contesta en español, breve y con buen tono."
)
intents = discord.Intents.default()
client = discord.Client(intents=intents)
tree = app_commands.CommandTree(client)
@tree.command(name="pregunta", description="Pregúntale algo a la IA")
@app_commands.describe(texto="Lo que le quieres preguntar")
@app_commands.checks.cooldown(1, 30) # una pregunta cada 30 s por persona
async def pregunta(interaction: discord.Interaction, texto: str):
await interaction.response.defer(thinking=True) # «El bot está pensando…»
try:
r = await ia.chat.completions.create(
model=MODELO,
messages=[
{"role": "system", "content": INSTRUCCIONES},
{"role": "user", "content": texto},
],
)
respuesta = r.choices[0].message.content or "(sin respuesta)"
except Exception as e:
print("Error de la IA:", e) # sale en la consola
respuesta = "La IA no ha contestado. Prueba dentro de un rato."
await interaction.followup.send(respuesta[:2000])
@pregunta.error
async def pregunta_error(interaction: discord.Interaction, error):
if isinstance(error, app_commands.CommandOnCooldown):
await interaction.response.send_message(
f"Espera {error.retry_after:.0f} s para otra pregunta.", ephemeral=True
)
else:
print("Error:", error)
@client.event
async def on_ready():
await tree.sync() # publica el comando /pregunta
print(f"Conectado como {client.user}")
client.run(os.environ["DISCORD_TOKEN"])4. Pruébalo en tu ordenador
Con Python 3.10 o más nuevo: abre una terminal en la carpeta, instala las librerías con «pip install -r requirements.txt» y arráncalo con «python app.py». Cuando diga «Conectado como…», escribe /pregunta en tu servidor de Discord. La primera vez el comando puede tardar unos minutos en aparecer.
Si contesta «La IA no ha contestado», mira la terminal: el error dice qué pasa. Lo más común es una clave mal copiada, un nombre de modelo que no existe, una IA_URL mal copiada o la cuenta del proveedor sin saldo o sin la capa gratis activada.
5. Que no te gasten el saldo
Cada pregunta cuesta tokens, y en un servidor con mucha gente alguien puede ponerse a preguntar sin parar. Tres frenos:
El tiempo de espera entre preguntas: en el código, @app_commands.checks.cooldown(1, 30) deja una pregunta cada 30 segundos por persona. Súbelo si tu comunidad es grande.
Un límite de gasto en el panel de tu proveedor: casi todos dejan poner un tope al mes o avisar al llegar a una cifra. Ponlo antes de abrir el bot a todo el mundo.
Quién puede usarlo: en tu servidor de Discord, «Ajustes del servidor» → «Integraciones» → tu bot deja elegir qué roles y canales pueden usar /pregunta, sin tocar el código.
6. La clave, a salvo
La clave de la IA es dinero: quien la tenga gasta a tu cuenta. Igual que el token del bot, va en el .env y nunca en un repositorio público de GitHub (si subes el código, añade .env a tu .gitignore). Si se te escapa, bórrala en el panel del proveedor y crea otra.
7. Déjalo encendido siempre
El trabajo pesado lo hace la IA en los servidores del proveedor; tu bot solo pasa mensajes, así que usa poca memoria y cabe de sobra en el bot gratis de NapNodes, de 256 MB.
En NapNodes: crea el bot, pásalo a Python en «Configuración» → «Lenguaje», sube los tres ficheros en «Archivos» y pulsa «Encender». Las librerías de requirements.txt se instalan solas al arrancar y app.py es el fichero de inicio que viene puesto; lo que imprime el bot (los errores de la IA incluidos) sale en «Consola». Todo el proceso, en la guía de hosting para tu bot.
El bot gratis se renueva con un clic cada semana. Si no quieres acordarte, el plan Mini (512 MB) está encendido siempre sin renovar nada (precios de los bots).
Preguntas frecuentes
¿Puedo meter ChatGPT en mi servidor de Discord?
Sí, con un bot propio que use la API de OpenAI: le pasa la pregunta y devuelve la respuesta. La API se paga por uso, aparte de la suscripción de ChatGPT.
¿Hay alguna IA gratis para un bot de Discord?
Gemini, de Google, tiene una capa gratis con límites de uso, y se usa con el mismo código cambiando la dirección, la clave y el modelo en el .env. Comprueba sus límites de hoy en la página de Google.
¿Por qué mi bot dice «La aplicación no ha respondido»?
Discord espera solo 3 segundos la primera respuesta a un comando con barra, y la IA tarda más. Hay que avisar antes de que va a tardar (interaction.response.defer) y contestar después con interaction.followup.send, como en el código de esta guía.
¿Puede contestar cuando lo mencionan, sin comando?
Sí, leyendo los mensajes con on_message, pero entonces el bot necesita «Message Content Intent», que se activa en la pestaña «Bot» del portal de desarrolladores (y en el código, intents.message_content = True). Con el comando /pregunta no hace falta.
¿Cuánta RAM necesita un bot de Discord con IA?
Poca: la IA funciona en los servidores del proveedor, no en el tuyo. Un bot como el de esta guía va de sobra en 256 MB.
¿Te ha servido esta guía?
¿Lo montamos?
Hosting de bots de Discord desde 1,50 € al mes, sin sobreventa: tu RAM es solo tuya. Y si quieres empezar sin pagar, tienes un bot de Discord gratis, sin tarjeta.
Sigue leyendo
- Bot de verificación para Discord en Python: un botón y una pregunta antes de entrar
Haz tu bot de verificación de Discord con discord.py: botón «Verificarme», una pregunta contra bots y un rol que abre el servidor. Código completo y gratis.
- Bot de sorteos para Discord en Python: botón para participar, ganadores al azar y repetir
Haz tu bot de sorteos de Discord en Python: /sorteo con botón para participar, cuenta atrás, ganadores al azar y /resortear. Código completo, sin anuncios.
- Bot de niveles para Discord: XP por mensajes, ranking y roles (Python y JavaScript)
Haz tu propio bot de niveles de Discord en Python o JavaScript: XP por mensajes contra el spam, /nivel, /ranking y roles al subir, guardado en SQLite.