Con la popularidad de la inteligencia artificial, muchos canales de ayuda y comunidades técnicas quieren que su bot de IRC pueda responder con IA directamente desde el canal.
En este artículo te mostramos un script completo en TCL + Python para Eggdrop 1.10.x que integra ChatGPT (OpenAI) y responde cuando mencionan el nick del bot en el canal.
Este script fue diseñado para usarse en canales como #Ayuda en Undernet, y está pensado para ser compartido y adaptado por cualquier entusiasta de IRC (con sus respectivos créditos hacia nosotros!).
¿Qué hace este script?
El flujo es sencillo:
1- El bot está vigilando los mensajes en los canales configurados.
2- Solo responde cuando alguien menciona su nick en el canal.
-
- Ejemplo:
botnick, ¿me explicas qué es un Eggdrop?
- Ejemplo:
3- El script TCL:
-
- Construye un prompt limpio (sin el nick del bot).
- Opcionalmente añade contexto de conversaciones anteriores del mismo nick.
- Llama a un script Python que se conecta a la API de OpenAI (ChatGPT).
4- Python devuelve la respuesta en texto plano (sin Markdown, sin saludos, máximo 20 líneas).
5- El TCL:
-
- Divide la respuesta en trozos legibles según el límite de caracteres.
- Aplica un límite de líneas para el canal.
- Si la respuesta es muy larga, envía un mensaje indicando que la explicación completa está disponible en una URL de referencia (por ejemplo, tu página de IA).
Requisitos
Para usar este script necesitas:
-
- Eggdrop 1.10.x (probado con Tcl 8.x).
- Sistema Linux (cualquier distro estándar).
- Python 3.7+ (recomendado 3.8 o superior).
- Una API key de OpenAI válida.
- Permiso para usar
execen tu Eggdrop (no debe estar deshabilitado en la compilación/configuración).
Estructura de archivos
Una estructura típica podría ser:

Obviamente, puedes adaptar las rutas a tu entorno; lo importante es que coincidan con lo configurado en el .tcl.
Configuración del script TCL
En el archivo chatgpt.tcl se definen todas las variables clave:
# Ruta del directorio dónde se ejecuta Python 3 (Verificar ruta)
set ::chatgpt(python) «/usr/bin/python3»
# Ruta del directorio donde se encuentra ubicado el script Python
set ::chatgpt(script) «/mi/ruta/de/directorio/chatgpt.py»
# Directorio de trabajo (donde se ejecutará el Python)
# Si lo dejas vacío, no hace cd.
set ::chatgpt(workdir) «/mi/ruta/de/directorio/chatgpt»
# API key de OpenAI
set ::chatgpt(api_key) «TU_CLAVE_API_DE_OPENAI»
# Modelo de OpenAI
# Modelos disponibles: gpt-3.5-turbo, gpt-3.5-turbo-16k, text-davinci-003, text-davinci-002, gpt-4, gpt-4-turbo, gpt-4-32k,
# gpt-4o, gpt-4o-mini, gpt-4.1, gpt-4.1-mini, gpt-4.1-nano, gpt-5, gpt-oss-20b, gpt-oss-120b
set ::chatgpt(model) «gpt-4.1-mini»
# Máximo de tokens de salida que se solicitarán a ChatGPT
set ::chatgpt(max_tokens) 1200
# Número máximo de caracteres a enviar al canal por línea
# (valores bajos evitan cortes por límite de IRC)
set ::chatgpt(max_chars) 200
# Estilo de comportamiento:
# informativo, profesional, creativo, educativo, divertido
set ::chatgpt(style) «profesional»
# Lista de canales donde el bot responderá
# Configura esto por tus canales reales, ejemplo: {#canal1 #canal2}
set ::chatgpt(channels) {#canal1}
Memoria / contexto por usuario
El script soporta un pequeño contexto de conversación por nick:
# Activar/desactivar contexto (0 = sin contexto)
set ::chatgpt(context_enabled) 1
# Tiempo máximo en segundos para considerar la misma conversación
set ::chatgpt(context_timeout) 900
# Máximo de caracteres de historial guardado por usuario
set ::chatgpt(context_max_chars) 1500
El contexto se guarda en un diccionario Tcl ::chatgpt(context) que contiene, por nick (en minúsculas):
-
- Último timestamp
- Historial truncado de preguntas/respuestas
Cuando el usuario vuelve a hablar dentro de ese tiempo, se envía a ChatGPT un prompt que incluye un resumen de lo anterior para dar continuidad.
Logs y errores
Para depuración se define:
set ::chatgpt(log_file) «/mi/ruta/de/directorio/chatgpt.log»
set ::chatgpt(logging_enabled) 1
La función chatgpt:log_error escribe errores con timestamp en ese archivo y también los muestra en el log del Eggdrop.
Límites de salida y redirección
# Máximo de líneas que enviará el bot al canal
set ::chatgpt(max_lines) 20
# URL de la página de IA para consultas largas (Habilita esta línea, si tienes un sitio web implementado con IA)
#set ::chatgpt(redirect_url) «https://mi-sitio-web-con-ia.com»
Si la respuesta de ChatGPT se trocea en más de max_lines líneas, el bot no inunda el canal; en lugar de eso envía un mensaje tipo: Esta consulta requiere una explicación más extensa de lo permitido en el canal. Puedes hacerla completa aquí: https://canal-ayuda.com/ia/
Cómo funciona internamente el TCL
Verificación inicial
1- La función chatgpt:check_config revisa:
-
- Que
execesté disponible. - Que el binario de Python sea ejecutable.
- Que el script Python exista y sea legible.
- Que el
workdirexista (si se configuró). - Que haya al menos un canal en la lista.
- Que la API key esté configurada (ya sea en Tcl o por entorno).
- Que
2- Detección de mención en el canal
Se usa:
bind pubm – * chatgpt:pubm_handler
En chatgpt:pubm_handler se hace:
-
- Se verifica que el canal esté en
::chatgpt(channels). - Se evita responderse a sí mismo.
- Se comprueba si el texto contiene el nick del bot (en minúsculas).
- Si no lo contiene, se sale y no hace nada.
- Se verifica que el canal esté en
3- Construcción del prompt
-
- Se limpia el mensaje retirando el nick del bot al inicio (
botnick:/botnick,/ etc). - Se quitan menciones extra del bot en el medio del texto.
- Si está activado el contexto y el usuario tiene historial reciente, se concatena un resumen anterior.
- Se genera un prompt en español, instructivo para ChatGPT, que incluye:
- Indicación de que es una conversación de IRC.
- Restricciones (sin saludos, sin nicks, sin Markdown).
- La pregunta actual del usuario.
- Se limpia el mensaje retirando el nick del bot al inicio (
4- Llamada al script Python
Se arma un comando tipo:
set cmd [list /usr/bin/python3 /ruta/chatgpt.py \
–model gpt-4.1-mini \
–max-tokens 1200 \
–prompt $prompt \
–api-key <TU_API_KEY> \
–style profesional]
Si hay workdir, se hace cd a ese directorio antes de ejecutar exec.
5- Procesamiento de la respuesta
-
- Si
execfalla, se loguea el error y se envía: Ocurrió un error hablando con ChatGPT. - Si la respuesta viene vacía, se fuerza un texto genérico: No estoy muy seguro de qué responder a eso, ¿me lo puedes explicar un poquito más?
- Si
-
- La respuesta se trocea con
chatgpt:chunk_textrespetandomax_chars. - Si hay más de
max_linestrozos, se manda solo el mensaje de redirección. - Si no, se envían todas las líneas al canal usando
puthelp.
- La respuesta se trocea con
Módulo Python: cliente para la API de OpenAI
El script chatgpt.py es un pequeño cliente que:
-
- Valida que Python sea 3.7 o superior.
- Lee los argumentos:
--prompt--model--max-tokens--api-key(opcional, puede usarOPENAI_API_KEY)--style(informativo, profesional, creativo, educativo, divertido)
- Construye una petición a la API de OpenAI en el endpoint
/v1/chat/completions. - Usa un
system_prompten español que:- Obliga a no saludar.
- Evita nicks.
- Prohíbe Markdown y bloques de código.
- Limita a un máximo de 20 líneas.
- Devuelve por
stdoutsolo el contenido de la respuesta (texto plano).
En caso de error de HTTP, conexión o JSON inválido, devuelve mensajes de error claros en español que el TCL puede loguear.
Instalación paso a paso
1- Copia los archivos a tu servidor:
-
chatgpt.tcl→ dentro descripts/de tu Eggdrop.chatgpt.py→ en la ruta que definas en::chatgpt(script).
2- Ajusta las rutas en chatgpt.tcl:
-
::chatgpt(python)::chatgpt(script)::chatgpt(workdir)::chatgpt(log_file)::chatgpt(channels)::chatgpt(redirect_url)
3- Configura la API key:
-
- O bien la pones en
::chatgpt(api_key) "<TU_API_KEY>". - O la dejas vacía y exportas la variable de entorno: export OPENAI_API_KEY=»TU_API_KEY»
- O bien la pones en
4- Carga el script en tu eggdrop.conf: source scripts/chatgpt.tcl
5- Reinicia el bot
Cómo usarlo desde el canal
Una vez cargado, el bot responde cuando:
-
- El canal está en la lista.
- El mensaje contiene el nick del bot.
Ejemplos:

No necesitas prefijos tipo !comando, basta con mencionar el nick del bot en el mensaje.
Errores comunes y solución
-
- El bot no responde nunca
- Verifica que el canal esté en
::chatgpt(channels). - Asegúrate de mencionar el nick exacto del bot.
- Revisa el log del Eggdrop y el archivo
chatgpt.log.
- Verifica que el canal esté en
- Error: Python no encontrado o no ejecutable
- Revisa
::chatgpt(python)y que el binario exista y tenga permisos de ejecución.
- Revisa
- Error HTTP desde OpenAI
- API key inválida o caducada.
- Problema de créditos o configuración de la cuenta.
- Ver más detalles en el mensaje de error logueado.
- Respuestas muy largas que no se ven completas
- Ajusta
::chatgpt(max_lines)y::chatgpt(max_chars)según tu canal. - Revisa que el usuario use la URL de redirección para ver explicaciones completas.
- Ajusta
- El bot no responde nunca
Buenas prácticas y seguridad
-
- No publiques tu API key real en GitHub ni en artículos.
- Usa variables de entorno o un archivo de configuración local fuera del repo público.
- Considera limitar el uso del bot a ciertos canales o nicks si tu comunidad es grande.
- Revisa periódicamente el log
chatgpt.logpara detectar abusos o errores.
Código fuente
El script (TCL + Python) está disponible haciendo clic aquí. Si encuentras un bug o quieres colaborar, puedes escribirnos al correo admin@canal-ayuda.com, o unirte al canal #Ayuda en Undernet para comentarlo.