# Selector nativo de sesiones Hermes / Telegram Plugin de sesiones y menú **1.1.0** · revisión documental **1.1.0-docs.20261028**. Descarga actual: **selector-sesiones-hermes-telegram.zip**. Esta revisión conserva el instalador y añade el procedimiento de cuentas y cuota; no instala esas dos funciones automáticamente. ## Empieza aquí 1. Descarga el ZIP y descomprímelo en el ordenador donde funciona Hermes. 2. Si quieres instalar sesiones y menú, sigue el apartado 3 de esta guía y comprueba primero los requisitos del apartado 2. 3. Para el cambio de cuenta y la cuota, lee **PROCEDIMIENTO-cuentas-y-cuota.md**, incluido en el ZIP y al final de esta guía. Explica el uso con una o dos cuentas y contiene instrucciones para tu agente. 4. El instalador instala sesiones y menú. El selector de cuentas y el lector oficial de cuota requieren componentes adicionales adaptados a tu instalación; no se habilitan por descargar este paquete. ## 1. Qué instala y qué NO instala El componente predeterminado es `telegram-session-picker`: presenta la selección nativa de Hermes con un botón **Sesiones** y una lista de Telegram. No es otra IA, no crea otro historial y no es una web ni una Mini App. Al seleccionar se tramita `/resume ID` por el ingreso normal del adaptador: siguen aplicándose autorización, ámbito, compresión y bloqueo de sesión ocupada de Hermes. - Abre la lista con `/sesiones` (también `/sessions`, sin argumentos). - Esa primera apertura muestra el teclado de respuesta persistente **Sesiones**. Además, el MISMO plugin mantiene el menú de comandos ordenado mediante la API de Telegram, sin BotFather. Telegram puede ocultar el teclado y permitir desplegarlo de nuevo. - Hasta **10 sesiones no vacías**, ordenadas por actividad, autorizadas para el propietario, chat/hilo y perfil actuales. Se inspeccionan hasta 1.000 filas en lotes de 50: no es un buscador exhaustivo. - No borra ni archiva sesiones vacías: solamente las oculta mediante el contador canónico de historial reanudable, incluidos los antecesores legítimos de compresión. - Cada menú caduca a los **180 segundos**. Está ligado a usuario, chat, hilo, perfil y mensaje. Los tokens son de un solo uso; un menú nuevo invalida el anterior de ese ámbito. Tras caducar, abre otro. - Conserva la sesión persistida y el historial/contexto reanudable de Hermes. La compresión nativa puede cambiar el segmento activo; el selector no descomprime ni recupera información que Hermes haya descartado. - **No salta visualmente al mensaje antiguo.** Telegram no permite a este bot forzar el desplazamiento de tu conversación privada. Reanudar contexto no es navegar a una posición del chat. - El selector **no añade llamadas LLM**. Funciona con otros proveedores/modelos que ya utilice Hermes. Opcional: `--with-titles` añade `context-session-titles`. Puede generar etiquetas contextuales con la ruta de títulos **ya configurada** en ese perfil, exclusivamente `openai-codex` o `deepseek`; no descubre alternativas, no hace fallback ni modifica modelos/cuentas. Esta opción puede consumir cuota. No es necesaria para el selector. ## 2. Requisitos y compatibilidad comprobable 1. Hermes ya instalado y funcionando; su adaptador Telegram debe estar configurado y autorizado para tu cuenta. Este ZIP **no instala Hermes, dependencias, tokens ni servicios**. No uses sudo ni instales paquetes globales para este paquete. 2. Usa el **Python real de tu instalación Hermes**, con sus dependencias ya presentes: PyYAML y python-telegram-bot. El código utiliza Python 3.11+ y `zoneinfo`; debe existir la base horaria `Europe/Madrid`. Las pruebas de entrega se ejecutaron en Linux con el Python del Hermes disponible, no con un Python global supuesto. 3. La revisión de Hermes debe incluir las APIs privadas de runner/Telegram y SDK de plugins que verifica `install.py`. Estas APIs cambian: **no se promete compatibilidad con todas las versiones**. El preflight inspecciona código y presencia de las superficies de integración mínimas sin importar el gateway ni descubrir plugins; hay además guardas de runtime al instalar los handlers. 4. Debe existir `config.yaml` en el HOME del perfil seleccionado. El instalador no crea perfiles ni adivina qué gateway atiende tu bot. 5. Solo Linux está verificado aquí. Windows nativo, macOS y WSL **no están verificados**. El `.sh` requiere shell POSIX. No interpretes que un dry-run correcto prueba Telegram o esas plataformas. ## 3. Identificar el Python y el código correctos No supongas `python3`, `~/.hermes/hermes-agent/.venv/bin/python` ni un venv de una versión anterior. - Si conoces el ejecutable que lanza Hermes, usa **esa ruta absoluta de Python**, conservando el camino del venv. No la sustituyas por su `realpath`: un symlink del venv puede apuntar al Python base y perder las dependencias. - En Linux con Hermes en ejecución, muestra tus procesos con `ps -u "$USER" -o pid,args` y localiza el proceso Python del gateway de Hermes (no el bot ni otro agente). Con su PID confirmado, `tr '\0' '\n' < /proc/PID/cmdline` muestra los argumentos separados. Si el primer argumento es el Python del venv de Hermes, esa es la ruta. No uses `/proc/PID/exe` para reconstruir el venv. - Si el proceso usa un lanzador en vez de una ruta Python reconocible, consulta cómo instalaste Hermes; no elijas un Python por ensayo con instalaciones globales. `command -v hermes` ayuda a localizar el lanzador, pero **no garantiza** que sea Python. Define las rutas reales (estos textos son marcadores, debes sustituirlos): ```sh export HERMES_PYTHON='/ruta/absoluta/al/venv-de-Hermes/bin/python' export HERMES_SOURCE='/ruta/absoluta/al/codigo-de-Hermes' export PYTHONPATH="$HERMES_SOURCE${PYTHONPATH:+:$PYTHONPATH}" ``` Comprobación de lectura, sin importar el gateway: ```sh "$HERMES_PYTHON" -B -c 'import sys, importlib.util, yaml; print("Python:",sys.executable); s=importlib.util.find_spec("hermes_constants"); print("Hermes:",s.origin if s else "NO ENCONTRADO")' ``` La ruta `Hermes:` debe pertenecer a la instalación que atiende tu Telegram. Si no coincide, detente. El instalador vuelve a comprobar las APIs y falla antes de escribir si no están presentes. El código de Hermes no se modifica. ## 4. Obtener TU ID de Telegram sin adivinar Necesitas el ID **numérico de usuario**, no el nombre `@usuario`, no un token de bot, no el ID de un grupo y no el ID de otra persona. - Primero revisa localmente la configuración/autorización Telegram que ya tiene Hermes: la entrada correspondiente a **tu usuario** en su lista de usuarios autorizados. Según versión puede estar en `config.yaml`, variables de entorno o en el panel de configuración. No copies aquí el archivo completo ni compartas `.env`, tokens o credenciales. - Si la lista contiene varias personas o no puedes identificar la tuya, no elijas el primer número. Confirma con tu propia cuenta de Telegram. Una exportación JSON de **tus datos de Telegram Desktop** puede incluir el ID numérico bajo `personal_information.user_id`; compruébalo si tu exportación lo incluye. No se requiere que subas/exportes historiales al paquete. Si tu versión no muestra ese dato, utiliza el procedimiento de identificación de usuario de tu instalación o un administrador autorizado; no inventes el ID. - El flag requiere dígitos positivos sin signo ni espacios; se guarda como **string YAML** en el perfil. Este valor **no concede acceso**: la cuenta debe estar autorizada además por el flujo normal de Hermes. ```sh export TELEGRAM_OWNER_ID='TU_ID_NUMERICO_CONFIRMADO' ``` El marcador anterior no es válido para instalar hasta que lo sustituyas. No uses los números sintéticos de los tests. ## 5. Elegir HOME y perfil `--hermes-home` significa la **raíz de Hermes**, no el directorio del perfil. Si no se indica, usa `$HOME/.hermes` de la cuenta del sistema que ejecuta el instalador; deliberadamente **no toma un HERMES_HOME ambiente que pudiera apuntar a otro perfil**. - `--profile default`: modifica solo `RAIZ/config.yaml` y `RAIZ/plugins/...`. - `--profile mi-curso`: modifica solo `RAIZ/profiles/mi-curso/config.yaml` y sus plugins. El perfil debe existir. - Se aceptan slugs de 1–64 caracteres: empieza por letra minúscula ASCII y sigue con minúsculas, dígitos, `_` o `-`. No hay lista cerrada de perfiles. - Para repetir en otros perfiles, ejecuta explícitamente una vez por perfil; no hay despliegue masivo automático. ## 6. Instalar: primero dry-run, luego real Extrae el ZIP en una carpeta de trabajo, **fuera** de las carpetas destino de los plugins. Entra en `telegram-session-picker`, donde están `install.sh`, `install.py` y esta guía. Solo selector, perfil por defecto: ```sh sh ./install.sh --owner-user-id "$TELEGRAM_OWNER_ID" --profile default --dry-run sh ./install.sh --owner-user-id "$TELEGRAM_OWNER_ID" --profile default ``` Raíz propia y perfil arbitrario ya existente: ```sh sh ./install.sh --owner-user-id "$TELEGRAM_OWNER_ID" --hermes-home "$HOME/.hermes" --profile mi-curso --dry-run sh ./install.sh --owner-user-id "$TELEGRAM_OWNER_ID" --hermes-home "$HOME/.hermes" --profile mi-curso ``` El dry-run valida rutas, configuración, payload y API sin crear backups/directorios, sin tocar configuración, sin Telegram y sin recargar. Un ID bien formado aún podría ser de otra persona: confírmalo tú. La instalación real: 1. Rechaza symlinks y plugins preexistentes no gestionados; no pisa una copia desconocida. 2. Respalda `config.yaml` antes de modificarlo en `HOME-DEL-PERFIL/.telegram-session-picker-install/config.before.yaml`, con permisos privados. Registra en `current.json` los campos propios anteriores y posteriores y hashes de todos los archivos nuevos. No respalda ni inspecciona historial, DB, tokens o `.env`. 3. Copia exclusivamente los archivos del componente elegido; mantiene los demás plugins y valores de configuración. El YAML se reserializa: los **valores** ajenos se conservan, pero pueden perderse comentarios y formato. 4. Escribe el owner y `quota_command` en `plugins.entries.telegram-session-picker.settings`, la prioridad y `priority_mode: prepend` en `platforms.telegram.extra.command_menu`, y cambia solamente la pertenencia de sus componentes en `plugins.enabled`/`disabled`. Conserva `max_commands` y las prioridades ajenas detrás del prefijo. 5. Hace readback. Si hay gateway con API de recarga, solicita para sus componentes **disable → reload → enable → reload**, evitando la pérdida de handlers por redescubrir el mismo conjunto. No reinicia servicios. Esta recarga afecta a la rediscovery nativa del perfil: no instales mientras se esté editando su configuración o desplegando otros plugins. 6. Si no hay gateway/API/respuesta, indica **reinicio manual pendiente**. Esto es normal en fixtures sin gateway; **no significa activación probada**. Reinicia Hermes/gateway con el mecanismo que ya utilizas, cuando sea seguro; este paquete no inventa comandos systemd ni mata procesos. Un segundo install idéntico es idempotente y no vuelve a escribir ni afirma recargar. Cambiar componentes, owner o versión exige desinstalar primero. Si un archivo/campo propio fue editado, se rechaza el conflicto antes de sobrescribirlo. ## 7. Primera prueba en TU Telegram (manual) 1. Abre el chat del bot que atiende el perfil elegido con la misma cuenta cuyo ID confirmaste. 2. Comprueba el menú: **Sesiones → Consumo de esta conversación → Modelo → Nueva conversación → Detener → Ayuda**, seguido del resto. Envía **`/sesiones`**: debes recibir la lista y el teclado **Sesiones**. 3. Pulsa **Sesiones** para actualizar la lista. Elige una sesión no vacía. 4. Hermes debe confirmar su reanudación por el flujo normal. Un acuse «Solicitud enviada» solo confirma el handoff, no que la reanudación haya terminado. 5. Continúa con un mensaje pertinente y confirma que es la sesión esperada. No necesitas ni debes pegar IDs de sesiones en una web. Si no aparece: comprueba perfil del bot, autorización normal de tu usuario, ID owner, compatibilidad de API, recarga/reinicio pendiente y logs de Hermes. Un contador `adapters_rewired` o una respuesta de control por sí solos no prueban que el handler esté activo. Si la lista está vacía, puede que no haya sesiones reanudables en ese chat/hilo/perfil. No se amplía ACL para mostrar otras. ## 8. Fechas Formato visible **DD/MM/AAAA HH:mm**, sin abreviaturas CET/CEST ni otro sufijo. La zona de esta distribución es **Europe/Madrid**, incluida la conversión automática de horario de verano/invierno; no depende del `TZ` del proceso ni de la ubicación de Telegram. No hay ajuste de zona en el instalador: para otra zona se requiere una adaptación de código y nueva validación. No se cambia la fecha de los mensajes ni los timestamps de Hermes. ## 9. Títulos contextuales opcionales Para instalarlos, decide antes de instalar y añade el flag **en ambos pasos**: ```sh sh ./install.sh --owner-user-id "$TELEGRAM_OWNER_ID" --profile mi-curso --with-titles --dry-run sh ./install.sh --owner-user-id "$TELEGRAM_OWNER_ID" --profile mi-curso --with-titles ``` Debe existir una ruta concreta de `auxiliary.title_generation` o una configuración primaria inequívoca heredable en ese perfil con `openai-codex` o `deepseek`. El instalador rechaza proveedores no aprobados y rutas no concretas; el runtime valida además la identidad devuelta por el resolver de Hermes. No corrige aliases de modelo, no selecciona cuentas, no lee auth para probarlas ni cambia `model`/`auxiliary`. Una API válida o un preflight correcto no acredita acceso ni cuota del proveedor. Se añade únicamente `plugins.entries.context-session-titles.llm.allow_task_override: true`, necesario para la tarea nativa `title_generation`; no se conceden overrides de proveedor/modelo/perfil/cuenta. El resto de política LLM preexistente permanece intacto. Este extra reutiliza el generador/decisor de **hermes-auto-titler 0.3.0 (Vocllum)**, con licencia Apache-2.0 y atribución en `NOTICE`. No registra su scheduler, comandos, migraciones, scanner de reintentos ni escritor SQL privado. No atribuimos su autoría a este paquete. Comportamiento conservador: 900 s de pausa mínima, 6 turnos humanos nuevos, hasta 12 comprobaciones LLM/día/perfil y 6/sesión; llamadas que fallen también consumen reserva. Exige confirmación sostenida de cambio de tema. Solo usa texto humano propio, no resultados de herramientas ni resúmenes de compresión como si fueran usuario. Un cambio propuesto puede esperar otra comprobación, no es inmediato. El adaptador Codex puede omitir el límite de tokens del SDK: no se promete un tope duro de tokens de salida en ese proveedor. Respeta títulos manuales y la precedencia nativa: si SessionDB no permite sustituir un título, presenta un alias auditado en `plugin_data/context-session-titles/`, vinculado al original/procedencia. Un nuevo rename manual invalida el alias antiguo. `/titulos` muestra título visible y original; no permite IDs ni retitulado en lote. No se cambia SQL privado para forzar escritura. ## 10. Desinstalar / rollback controlado Usa **la misma raíz y perfil** elegidos al instalar. Los dos comandos siguientes hacen el mismo undo de esta instalación; no un restore global de Hermes: ```sh sh ./install.sh --hermes-home "$HOME/.hermes" --profile mi-curso --rollback --dry-run sh ./install.sh --hermes-home "$HOME/.hermes" --profile mi-curso --rollback # Alternativa equivalente al segundo comando: sh ./install.sh --hermes-home "$HOME/.hermes" --profile mi-curso --uninstall ``` No hace falta repetir owner ni `--with-titles`: el manifiesto recuerda el alcance. Antes verifica hashes y campos propios. Si cambiaron, **se niega a pisarlos**. Desactiva/solicita recarga, restaura solo sus campos anteriores y pertenencias propias en listas, elimina únicamente sus archivos verificados y conserva cambios ajenos concurrentes. No restaura `config.before.yaml` completo. Conserva ese backup y el manifiesto archivándolos en un directorio `.telegram-session-picker-install.backup-*`. **Nunca elimina la base de datos, sesiones, otros plugins/copias, ni los sidecars/alias ya creados.** Tampoco revierte los títulos legítimos ya escritos en la DB: esos datos son parte del historial del usuario. Si vuelves a instalar el extra, esos sidecars podrían volver a usarse si siguen coincidiendo con título/procedencia. Si el proceso se interrumpe a mitad de instalación y el manifiesto indica `installing`, no se aplica rollback ciego: conserva el backup, detén despliegues concurrentes y revisa los archivos enumerados antes de una reparación manual. No reemplaces la configuración completa con la copia de seguridad porque pisaría cambios posteriores. Si no hubo recarga confirmada, será necesario un reinicio manual seguro para retirar handlers que continúen en memoria. ## 11. Pruebas offline reproducibles Desde la carpeta extraída, usando el mismo Python/código de Hermes: ```sh "$HERMES_PYTHON" -B ./run_tests.py "$HERMES_SOURCE" ``` El runner aísla HOME/HERMES_HOME **antes** de cualquier import de Hermes, bloquea red, lecturas de DB/credenciales reales y escrituras fuera de la carpeta de prueba. Solo crea fixtures bajo la carpeta extraída. Usa SessionDB/SDK/adaptador reales con Telegram/HTTP simulados: no confundir un MockTransport con llamadas LLM reales. No incluye el probe operativo que permitiría llamadas reales. Los tests del instalador realizan dry-run, install, readback, idempotencia, conflictos, rollback incremental, perfil arbitrario y ciclo de recarga con mockcontroller. `TEST-RESULTS.txt` recoge el resultado de la entrega; `SHA256SUMS` permite comprobar archivos del paquete. Junto al ZIP se proporciona su checksum SHA-256. La evidencia offline **no prueba Telegram real ni activación de un gateway de destino**. ## 12. Compartirlo con un botón en tu web, sin crear una app Este paquete se distribuye en los materiales descargables y en los materiales de la formación de diegocazzola.es. Si quieres alojar tu propia copia: 1. Sube únicamente el **ZIP limpio de entrega**, no la carpeta donde hiciste pruebas/instalaciones. Los backups de instalación contienen configuración privada y las carpetas de test son artefactos locales: no los publiques. 2. Usa tu alojamiento estático habitual y una ruta propia, por ejemplo `/descargas/selector-sesiones-hermes-telegram.zip`. Sirve HTTPS y, si tu hosting permite elegirlo, `Content-Type: application/zip`. 3. En tu página añade un enlace que puedes estilizar como botón: ```html Descargar selector de sesiones para Hermes / Telegram ``` El atributo `download` puede depender del navegador/origen; el archivo debe existir en esa ruta. Si alojas tu propia copia, comprueba su enlace. El botón solo descarga: **no instala**, no conecta Telegram, no comparte sesiones y no ejecuta IA en tu web. ## Menú permanente 1.1: consumo honesto y cuota propia Ambas funciones son obligatorias y vienen en `telegram-session-picker`: botón selector y menú ordenado. El extra de títulos sigue separado y desactivado por defecto. - El modo predeterminado es `--quota-command usage`: publica **Consumo de esta conversación** con el identificador REAL `/usage`. No anuncia saldo del proveedor ni inventa `/cuota`. No modifica cuentas, tokens, modelos ni comandos propios. - Si YA existe un `/cuota` funcional registrado por otro plugin o `quick_commands`, añade `--quota-command cuota` tanto al dry-run como a la instalación. El menú conserva su descripción real; si falta, falla sin publicar un comando inexistente. El plugin no registra ni sustituye un handler `/cuota`. - En gateways multiplexados la fuente autoritativa para quick commands es `adapter.gateway_runner._hm_quick_commands()`, no la presencia del campo en el YAML de un perfil. El plugin solo consulta metadatos y no ejecuta esos comandos. Cambiar un quick command puede requerir reinicio nativo del host: esta entrega NO lo configura ni promete recargarlo. - Identificadores: `sessions`, `usage` o `cuota`, `model`, `new`, `stop`, `help`, sin barra en configuración. Sus títulos son Sesiones, Consumo (o la descripción real de cuota), Modelo, Nueva conversación, Detener y Ayuda. No se registra un nombre sin handler. - Usa el recolector nativo del registro de comandos, plugins y skills; conserva el resto detrás, sujeto al límite nativo `max_commands` (60 por defecto, hasta 100). Los comandos que no quepan siguen disponibles al escribirlos. No se altera ese límite configurado por el usuario. - La factory captura el adaptador de SU perfil y añade hooks solo a esa instancia. Publica inmediatamente mediante `set_my_commands` en scopes `default`, `all_private_chats`, `all_group_chats` y los chats de foro que ese adaptador ya conoce; comprueba cada scope con `get_my_commands`. Los nuevos foros conservan la ruta lazy nativa con el mismo formateador. No limpia scopes personalizados de BotFather ni menús con `language_code` específicos: pueden prevalecer y requieren revisión manual del administrador. - Con un gateway ya activo no se espera al siguiente reinicio para publicar el menú. La tarea comienza al cablear el plugin; si el bot aún está conectando, espera hasta 10 segundos y el housekeeping nativo también llama al hook tras conectar. Sin gateway activo no se puede acreditar activación: el aviso de instalación lo distingue. - Diagnóstico propio en el estado del plugin: `runtime_wiring_` y `command_menu_runtime_`. Comprueba PID del gateway (no el de un CLI), hashes `source_sha256`, perfil y `status: verified`, fingerprint y scopes verificados. `failed` o `adapter_not_ready` NO son éxito; revisa conexión/API/recarga. No publiques ese estado privado. - Rollback conserva `max_commands`, prioridades ajenas añadidas al final y otros cambios concurrentes. Si alguien edita el prefijo gestionado o `priority_mode`, se detiene sin borrar archivos. La reversión restaura configuración local y hooks; los menús remotos se actualizan en la siguiente publicación nativa del adaptador. Una prueba offline no confirma ese efecto remoto. Para actualizar desde 1.0: usa PRIMERO el instalador 1.0 original con `--rollback` en el mismo perfil (su manifiesto solo conoce sus propios archivos); después instala 1.1. No copies encima de un plugin privado ni de una instalación no gestionada. ## 13. Cómo explicarlo en la formación > «Seguimos utilizando nuestro Hermes y su misma sesión. Este plugin coloca sus comandos nativos `/sessions` y `/resume` detrás de un botón y una lista. Primero escribimos `/sesiones`; a partir de ahí tenemos el botón persistente Sesiones. Vemos como máximo las diez últimas sesiones con historial de nuestro usuario y ámbito; las vacías se ocultan, no se borran. La elección pasa por los controles normales de Hermes y mantiene el contexto reanudable. No es otra IA ni una web separada. El menú caduca a los tres minutos: si no responde una selección antigua, abrimos uno nuevo. No hace scroll a un mensaje antiguo de Telegram. Los títulos automáticos son un extra opcional y pueden gastar cuota; el selector básico no añade llamadas LLM.» --- # Cambiar de cuenta y consultar la cuota en Hermes y Telegram Actualización del material de formación · 28 de octubre de 2026. ## Antes de empezar Hermes debe estar instalado en tu ordenador y conectado a tu bot de Telegram. Puedes hablar con él desde iPhone, Android o el ordenador; el paquete se instala donde funciona Hermes, no en el móvil. El ZIP de sesiones y menú incluye ahora esta guía. Su instalador sigue instalando **sesiones y menú**: no incorpora automáticamente un selector de cuentas ni el lector de cuota de la instalación de Diego. Estos ajustes requieren una adaptación a tu versión de Hermes y a las cuentas que ya tengas vinculadas. No copies configuraciones personales de otro equipo. ## 1. Elige una o dos cuentas - **Una cuenta:** utiliza sus modelos y consulta únicamente su cuota. No necesitas botones para cambiar de cuenta. - **Dos cuentas:** identifica ambas con nombres distintos. En los ejemplos usamos **61A** y **61P**; son etiquetas de cuentas, no modelos. Cada persona debe usar sus propias cuentas vinculadas. La instalación debe preguntar cuántas cuentas quieres usar y comprobar cuáles existen. Si falta alguna, completa primero su vinculación mediante el acceso oficial de Hermes. No basta con asignar dos nombres a una misma cuenta. ## 2. Cambia de cuenta sin abrir otra conversación Estos pasos son para una instalación que **ya dispone** de los comandos descritos. Si no aparecen, utiliza las instrucciones para tu agente del apartado 6; no son comandos universales de cualquier Hermes. 1. Espera a que termine la respuesta en curso. 2. Para cambiar solo la cuenta, envía `/61A` o `/61P`. Conserva el modelo y el esfuerzo actuales. 3. Envía un mensaje normal en esa misma conversación. Por ejemplo: «Continúa con lo anterior». 4. Comprueba la cuenta efectiva de **esa respuesta**, no solamente la confirmación del menú. Si hay un aviso de cuenta, debe corresponder a la respuesta que acaba de completarse. El modelo se elige por separado. Cambiar de cuenta no debe cambiar de modelo, modificar el esfuerzo ni iniciar una conversación nueva. No uses `/new` para comprobarlo, porque abre otra sesión. Si la cuenta elegida está sin cuota, puede responder otra cuenta o el modelo alternativo autorizado en tu instalación. El sistema debe explicar lo que ha ocurrido; no debe presentar la cuenta solicitada como si hubiera atendido la respuesta. ## 3. Consulta la cuota Abre el menú de Telegram y pulsa **Ver cuota**, o envía `/cuota`, si está instalado el lector oficial. La consulta debe mostrar: - La etiqueta de cada cuenta consultada. - Fecha, hora y zona horaria de la lectura. - Porcentaje usado y disponible en las ventanas que OpenAI devuelva. - Fecha y hora de restablecimiento de cada ventana. Con dos cuentas, el formato es: ```text Cuota 61P y 61A · consulta directa a OpenAI 61P Lectura: [fecha y hora de la consulta] • 5 h: [porcentaje usado y disponible] · reinicia [fecha y hora] • Semanal: [porcentaje usado y disponible] · reinicia [fecha y hora] 61A Lectura: [fecha y hora de la consulta] • 5 h: [porcentaje usado y disponible] · reinicia [fecha y hora] • Semanal: [porcentaje usado y disponible] · reinicia [fecha y hora] ``` Los corchetes son campos explicativos, no una lectura de cuota. Con una cuenta solo aparece su bloque. Consultar dos cuentas **no indica cuál ha generado una respuesta** y no debe cambiar la cuenta activa. `/usage` informa del consumo de la conversación; no equivale a la cuota de la suscripción. Si OpenAI no devuelve una lectura actual o no se puede verificar la identidad, muestra «lectura no disponible». Nunca presentes un fallo como 0 % de uso ni reutilices porcentajes antiguos como si fueran actuales. Otros proveedores pueden necesitar lectores diferentes. ## 4. Si algo no coincide - **El menú confirma una cuenta, pero la respuesta parece de otra:** pide al agente que contraste el cambio y la respuesta posterior en los registros. No encadenes cambios para intentar adivinarlo. - **El asistente menciona la cuenta anterior:** puede haber leído el registro del turno anterior mientras el nuevo aún estaba en curso. Eso no demuestra por sí solo que haya fallado el cambio. - **No aparece `/cuota`:** el ZIP de sesiones no añade ese lector. Debe configurarse por separado; mientras tanto utiliza `/usage` con su significado real. - **La cuenta está agotada:** distingue el cambio manual del paso automático por falta de cuota. Comprueba el restablecimiento con una consulta actual. - **El selector deja de abrirse tras una recarga:** revisa el registro de sus comandos y la versión del mecanismo de recarga. No reinicies repetidamente ni borres la conversación. ## 5. Qué se ha comprobado y qué debes comprobar en tu equipo En la instalación de referencia se acreditó un cambio real **P→A** en Telegram mediante selección manual, reconstrucción del agente y atribución de la respuesta completada a A. Se conservaron la conversación, el modelo y el esfuerzo. Las pruebas aisladas cubrieron los dos sentidos y casos de agotamiento de cuota. Esto no acredita por sí mismo un recorrido real P→A→P en todos los equipos ni la instalación en Windows o macOS. En cada instalación nueva debe verificarse el siguiente mensaje normal después de seleccionar una cuenta. Con dos cuentas disponibles, comprueba ambos sentidos; con una sola, comprueba únicamente esa cuenta. Guarda el resultado, sin repetir una prueba genuina que ya esté acreditada. ## 6. Instrucciones para tu agente Copia este bloque en tu Hermes y adjunta esta guía. El agente debe explicar cualquier paso que requiera tu intervención. > Quiero adaptar mi menú de Telegram, el selector de cuenta/modelo y la consulta de cuota a mi instalación de Hermes. Primero revisa mi versión y los comandos que ya tengo. Pregúntame si usaré una o dos cuentas y qué funciones quiero; reutiliza las cuentas ya vinculadas y sus etiquetas. No copies credenciales ni configuraciones personales del ejemplo. No prometas que este ZIP instala el selector o la cuota: su instalador cubre sesiones y menú. Si faltan componentes, identifica cuáles y prepara la adaptación para mi versión, con copia de seguridad y posibilidad de volver atrás. Mantén modelo, esfuerzo e historial al cambiar solo de cuenta. No cambies mis modelos alternativos ni reinicies un servicio compartido sin acordar su alcance. Con una cuenta no muestres una segunda; con dos, verifica que sus identidades son distintas. Separa la cuota oficial del consumo de conversación. Usa datos actuales y muestra cuándo no están disponibles. Prueba primero sin tocar mi configuración; después verifica un mensaje real de Telegram y la cuenta que lo atendió. No declares éxito a partir del menú o de una preferencia guardada. Entrega pasos cortos, claros y completos. ## Nota técnica para quien hace la adaptación 1. **Recarga de comandos.** Comprueba que una recarga forzada vuelve a registrar los comandos y botones del plugin; retirar el registro sin reponerlo puede dejar `/gpt` en la respuesta genérica. 2. **Resolución del modelo.** Propaga el modelo efectivo al resolver las credenciales. Un veto de otro modelo no debe descartar una cuenta válida ni provocar una caída inadvertida a la credencial única de respaldo. 3. **Cambio de cuenta.** Invalida el agente y el cliente que mantienen la credencial anterior, junto con las credenciales o el pool guardados en el override de la sesión. Conserva los campos de modelo, esfuerzo e historial y reconstruye el runtime para el siguiente turno. Cubre agentes con pool y sin pool, overrides y restauraciones de un solo turno. Un mensaje «preferencia guardada» no acredita aplicación. 4. **Cuota agotada.** Prueba por separado selección manual, rotación tras un límite real del proveedor y retorno autorizado. No confundas contadores internos de peticiones con cuota oficial. No cambies la estrategia de la persona para implementar la visualización. 5. **Identidad efectiva.** Atribuye la credencial realmente utilizada, no la preferencia del YAML ni el cursor del pool. Si cambió el token por una renovación, contrasta la identidad de cuenta y usuario; solo la cuenta de organización no basta. Nunca incluyas los tokens en informes ni descargables. 6. **Orden temporal.** Correlaciona selección, sesión y respuesta finalizada. Un recibo guardado al finalizar un turno no puede demostrar el turno que aún se está ejecutando. En la instalación de referencia, `account-reminder-state.json` es el último aviso emitido, no una sonda en vivo: puede estar atrasado. Si no puedes atribuir la respuesta, indícalo. 7. **Aceptación.** Usa credenciales sintéticas distintas en las pruebas A→P y P→A, incluido residente sin pool. Después contrasta los mensajes genuinos de Telegram ya existentes o haz la mínima prueba que falte con permiso. Distingue pruebas aisladas, código cargado y respuesta real. Una nueva instalación necesita su propia comprobación. 8. **Cierre.** Documenta las fuentes y el resultado. No fuerces estados SQL, mates procesos por coincidencias de texto ni generes tareas repetidas para ocultar avisos. Usa el mecanismo normal de seguimiento y conserva los límites de lo verificado. Los nombres internos y los comandos de cuenta corresponden a la instalación de referencia. Revisa la versión de destino antes de adaptar código; esta nota no es un parche que pueda copiarse indiscriminadamente.