Integrar ChatGPT en tu Eggdrop con TCL + Python (para canales IRC)

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?

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 exec en 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 exec esté disponible.
    • Que el binario de Python sea ejecutable.
    • Que el script Python exista y sea legible.
    • Que el workdir exista (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).

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.

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.

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 exec falla, 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?
    • La respuesta se trocea con chatgpt:chunk_text respetando max_chars.
    • Si hay más de max_lines trozos, se manda solo el mensaje de redirección.
    • Si no, se envían todas las líneas al canal usando puthelp.

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 usar OPENAI_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_prompt en 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 stdout solo 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 de scripts/ 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»

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.
    • Error: Python no encontrado o no ejecutable
      • Revisa ::chatgpt(python) y que el binario exista y tenga permisos de ejecución.
    • 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.

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.log para 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.