¿Los mensajes directos de Telegram se te amontonan en un solo hilo? Dale a cada mensaje nuevo su propio topic

Llevas tres cosas a la vez en Telegram: persiguiendo un bug en producción, redactando el informe semanal y parcheando un script para un amigo. Así que activas el modo /topic y le das a cada una su propio hilo. La configuración perfecta, hasta que el pulgar te resbala y escribes una línea directamente en la ventana del chat principal en vez de en un topic.
Ese mensaje no abre un hilo nuevo. Aterriza en el topic que usaste más recientemente. Ahora tu informe semanal tiene dentro una conclusión de depuración, y el modelo empieza tan contento a mezclar las dos cosas. Subes por el historial un buen rato antes de encontrar el momento exacto en que se torció.
El modo topic no está roto; toma una decisión conservadora: un mensaje en el chat raíz significa «continúa la última conversación». Si prefieres que cada mensaje en la raíz empiece de cero, Hermes fusionó un interruptor justo para eso el 19 de octubre: dm_topic_auto_transfer.
Cómo se comporta hoy el modo topic
Envías /topic en un mensaje directo (DM) y Hermes comprueba si el bot puede crear topics (el Threaded Mode tiene que estar activo en BotFather), habilita el modo topic multisesión para ese chat, crea un topic System fijado para estados y comandos, y te ofrece recuperar sesiones anteriores que nunca quedaron vinculadas a un topic.
A partir de ahí, el chat raíz es un vestíbulo: los prompts normales se rechazan con una indicación que apunta a All Messages, mientras que los comandos de sistema como /status, /sessions, /usage y /help siguen funcionando allí.
Cada topic es una sesión independiente: su propio historial, estado de modelo, ejecución de herramientas y session id. La clave de aislamiento es agent:main:telegram:dm:{chat_id}:{thread_id}, así que dos topics en el mismo DM son dos conversaciones distintas a ojos de Hermes.
La pega es esa decisión conservadora de antes: algunos clientes entregan un mensaje escrito en el chat raíz sin message_thread_id. Hermes los trata como una continuación y responde en tu topic activo más reciente — lo que la documentación llama recuperación del vestíbulo. El recordatorio que envía para empujarte de vuelta a un topic está limitado a un mensaje cada 30 segundos por (perfil, chat), así que olvidarte y escribir diez prompts seguidos no genera diez respuestas.
El interruptor: una sola clave de configuración
Añade una línea al config.yaml de tu perfil:
gateway:
platforms:
telegram:
extra:
dm_topic_auto_transfer: true # por defecto: false
La clave de nivel superior telegram.extra.dm_topic_auto_transfer también vale (es la que aparece en Ajustes de Desktop). Es estrictamente opt-in: si no la pones, nada cambia, incluido el fallback a tu topic más reciente.
Con el interruptor activo, un mensaje normal en el DM raíz hace lo siguiente:
- Hermes crea un topic nuevo de inmediato (llamado «Hermes Chat» hasta que el pipeline de auto-titulado lo renombra);
- Arranca una sesión nueva dentro de ese topic;
- Tu respuesta se publica en ese topic.
Dicho de otro modo: el chat raíz deja de ser un vestíbulo y pasa a ser una puerta. Un mensaje perdido, una habitación nueva.
Lo que nunca se mueve
Este interruptor cubre exactamente un caso: una persona escribiendo un mensaje normal en el DM raíz. Todo lo demás se queda quieto a propósito:
- Los slash commands no se mueven. Un
/statusescrito en la raíz sigue siendo un comando de vestíbulo y nunca crea un topic. - Los despertares internos y los eventos enrutados no se mueven. Los disparos de cron, los eventos enrutados desde otras plataformas y las tareas en segundo plano nunca acaban empujados a un topic nuevo.
- El tráfico que no es DM no se toca. Los grupos y canales no tienen nada que ver con el modo topic.
- Los remitentes no autorizados no se mueven. La comprobación de autorización ocurre en la fase de vestíbulo.
- Si falla la creación del topic, hay fallback. Si el Threaded Mode se desactivó en BotFather, la creación falla y Hermes vuelve al comportamiento por defecto: responder en tu topic activo más reciente en lugar de tirar el mensaje.
Un detalle de implementación vale la pena: la transferencia ocurre en la entrada del adaptador, antes de asignar la clave de sesión (vive en telegram_topic_transfer.py, dentro del plugin de Telegram). Así el turno, su sesión y la respuesta usan todos el topic nuevo: nunca te queda una sesión en un hilo y la respuesta en otro.
Dos trampas pequeñas
Primera: la respuesta inicial en un topic nuevo no tiene ancla de respuesta. Tu mensaje original vive fuera del topic y Telegram no permite que una respuesta cruce hacia dentro, así que Hermes envía solo con message_thread_id, sin ancla. Parece que la respuesta no se enganchó a tu mensaje; el contenido está en el topic nuevo, y es lo esperado.
Segunda: en configuraciones con varios bots, la clave se lee por bot. Si un gateway sirve a varios bots de Telegram (un asistente personal, un bot de equipo), el interruptor se lee del bot que recibió el mensaje, no del bot de lanzamiento. Conviene recordarlo cuando tienes varios perfiles detrás de un mismo gateway y das por hecho que tocar el perfil por defecto lo cubre todo.
Un detalle agradable relacionado: el auto-renombrado de topics. En cuanto Hermes genera un título de sesión, intenta como mejor puede renombrar el topic de Telegram para que coincida: «New Topic» pasa a ser «Plan de migración de base de datos». Los fallos solo se registran en el log; la sesión no se ve afectada. Si nombras los topics a mano y quieres que se queden como están, la documentación explica cómo desactivarlo.
Cuándo vale la pena activarlo y cuándo no
Vale la pena si Telegram es tu banco de trabajo multihilo: un topic por hilo, y muchas veces entras al chat desde la pantalla de inicio de la app. Que cada mensaje se convierta en su propio topic impone «hilo nuevo, contexto nuevo», que suele ser justo lo que querías.
No vale la pena si casi siempre tienes una sola conversación en marcha y usas topics solo de vez en cuando. Entonces cada mensaje en la raíz añade otro hilo y, hasta que el auto-titulado se pone al día, verás una pared de «Hermes Chat».
Si lo que de verdad te importa es la frontera entre un topic, una sesión y un contexto, la guía de límites de sesión de este sitio lo dibuja con claridad. El artículo del selector inline de Telegram cubre cómo elegir modelos y sesiones desde dentro del chat, y los DMs entre bots pares es la otra mitad de la historia de Telegram. ¿Empiezas de cero? La guía de instalación trae la base de configuración de plataformas.
La versión corta
dm_topic_auto_transfer es un interruptor minúsculo que responde a una pregunta muy concreta: «¿a qué conversación pertenecía este mensaje perdido?». La respuesta antigua era «a la última»; la nueva es «a una nueva». Mantener el comportamiento anterior como valor por defecto es lo correcto —la mayoría de la gente no quiere un topic por mensaje—, pero para quien trata Telegram como banco de trabajo, activarlo elimina toda una clase de contexto contaminado entre hilos.