Kabosu - Creando cosas

Logo de la página. Gato esférico con colores verdoso.

Renovando el bot traductor de telegram

Publicado: 2026-04-29

Etiquetas: IA, Proyectos, Python


Buenos días, tardes o noches:

En 2024 hablé sobre un bot de telegram que había creado para traducir los mensajes de mi familia. En 2025 publiqué algunos cambios que había hecho como actualizar el modelo o la migración a LibreTranslate. LibreTranslate solo duró un par de semanas porque para los idiomas que estaba usando iba muy muy mal así que volvimos a usar un LLM.

Es ya 2026 y toca revisar un poco el bot, actualizar dependencias y mejorarlo un poco. De eso va este artículo como habrás adivinado por el título.

Migración a UV

UV es un gestor de paquetes para Python. Viene a sustituir venv, pip y algunos otros programas que llevo usando desde hace muchos años. Creo que UV apareció hace un par de años y quería probarlo así que decidí integrarlo en este pequeño proyecto.

No está mal, la verdad. Usando uv run me evito tener que activar el venv cada vez y va bastante rápido.

Telegram Bot

Para la parte del bot utilizo el módulo python-telegram-bot. Lo he actualizado a la última versión. No sé cuáles son las novedades pero he aprovechado para mejorar un poco la implementación que hice.

Primero, yo tenía un función escapeEverything (explicada en el artículo de 2024) para sustituir símbolos especiales de Markdown. He descubierto que python-telegram-bot ya proporciona su propia función así que he borrado la mía

from telegram.helpers import escape_markdown


...

tr = escape_markdown(translate(msg), version=2)

Otra novedad es que antes tenía una forma bastante cutre de buscar el mensaje a traducir. Ahora uso update.effective_message.text que ya me lo da. No sé por qué no lo usé desde el principio.

El último cambio es simplemente cosmético. Cuando el bot recibe un mensaje, contesta a Telegram inmediatamente con una acción "typing". Esto hace que en la interfaz se muestre un mensaje de "Bot está escribiendo" hasta que llega la traducción. Totalmente innecesario pero queda bien.

await context.bot.send_chat_action(chat_id=chat_id, action="typing")

Traductor

Como ya he dicho, al poco de poner LibreTranslate mi familia me forzó a quitarlo porque las traducciones eran penosas. Volvimos a usar la API de OpenAI con su modelo gpt-5-nano que era el más barato por aquel entonces.

Al actualizar el módulo de OpenAI para Python vi que ahora la API que recomiendan se llama "responses" en vez de "chat completions" que había antes. He usado la nueva. Ni idea de cuál es la diferencia.

He cambiado el modelo a gpt-5.4-nano. A ver qué tal funciona este.

También he descubierto que hay un parámetro llamado "service_tier" que se puede usar para indicar que no nos importa esperar un poco para obtener la respuesta. Usándolo el precio es un poco más barato así que lo he activado.

La llamada a OpenAI finalmente se ha quedado así. instructions es el promp ("traduce este texto...") e input es el texto a traducir.

    try:
        response = client.responses.create(
            model='gpt-5.4-nano',
            service_tier='flex',
            instructions=instructions,
            input=prompt
        )
    except Exception as e:
        logging.exception('OpenAI call failed')
        return 'Error'

Y eso es todo. He recreado la imagen de Docker (esta vez sí) y de momento está funcionando bien.


Artículo siguiente: Mi configuración con IA generativa privada
Artículo anterior: Juegos terminados en 2026 - Primer trimestre