Un bot de Feishu para varios Hermes: tutorial paso a paso de routing de Profile en v0.19

Antes de Hermes Agent v0.19, si querías ejecutar diferentes personalidades de Agent en distintos grupos de Feishu, la opción más simple era: crear una aplicación de bot de Feishu para cada grupo y ejecutar un Gateway de Hermes para cada una. Muchos tokens, muchos procesos y una configuración dispersa.
La combinación de multiplex_profiles + profile_routes en v0.19 te permite usar una sola aplicación de bot de Feishu y un solo proceso de Gateway para distribuir mensajes de diferentes grupos o hilos a diferentes Profile. Cada Profile tiene su propio modelo, skills, memoria y secretos, pero comparten la misma identidad de bot.
Este artículo se basa en el release oficial de Hermes v0.19.0 y en la documentación del proyecto, y ofrece un ejemplo completo y listo para usar.
¿Quieres ver el panorama general primero? Lee nuestro resumen de las notas de lanzamiento de Hermes v0.19.0 Quicksilver y las v0.19.0 release notes oficiales.
Requisitos previos
- Hermes Agent >= v0.19.0
- Una aplicación de bot de Feishu (Lark) creada y aprobada
- El bot tiene habilitada la “suscripción de eventos” y puede recibir eventos como
im.message.receive_v1 - Has obtenido
app_id,app_secret,encrypt_keyyverification_tokendesde la consola de desarrollador de Feishu
Si aún no has conectado tu bot de Feishu a Hermes, puedes configurar primero las credenciales en ~/.hermes/.env:
FEISHU_ALLOWED_USERS=ou_xxxxxxxx,ou_yyyyyyyy
FEISHU_APP_ID=cli_xxxxxxxxxxxxxxxx
FEISHU_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
FEISHU_ENCRYPT_KEY=xxxxxxxxxxxxxxxx
FEISHU_VERIFICATION_TOKEN=xxxxxxxxxxxxxxxx
El adaptador de Feishu de Hermes es un Gateway completo desde v0.6.0, con soporte para tarjetas de mensaje, chats grupales, adjuntos de imagen/archivo y callbacks interactivos, así que la conectividad básica no será un problema.
Conceptos clave: multiplex_profiles + profile_routes
Antes de v0.19, el Gateway de Hermes ya era “un proceso que conecta múltiples plataformas”. La novedad de v0.19 es: la misma plataforma, el mismo token de bot, y aún así enrutar por origen a diferentes Profile.
Campos clave:
gateway.multiplex_profiles: true— activa el modo de reutilización de múltiples Profilegateway.profile_routes— define la lista de reglas de coincidencia por origen
Nota: en modo multiplex, las plataformas de enlace de puerto (webhook, api_server, feishu, etc.) solo se pueden configurar en el Profile
default; los demás Profile reciben mensajes a través de las reglas de routing. Este artículo describe exactamente ese patrón: la entrada de Feishu corre en el Profile default, yprofile_routesdespacha los mensajes a Profile comoworkopersonal.
Ejemplo de configuración para Feishu
Supongamos que tienes tres grupos de Feishu:
| Grupo | Uso | Profile deseado |
|---|---|---|
| Grupo de guardia técnica | Alertas, logs, comandos seguros | ops |
| Grupo de producto | Escribir PRDs, análisis de competencia | product |
| Grupo personal | Agenda personal, consultas | personal |
En ~/.hermes/config.yaml escribe algo así:
profiles:
default:
# La entrada de Feishu solo puede estar en el Profile default
gateway:
platforms:
- platform: feishu
app_id: "cli_xxxxxxxxxxxxxxxx"
app_secret: "{{env.FEISHU_APP_SECRET}}"
encrypt_key: "{{env.FEISHU_ENCRYPT_KEY}}"
verification_token: "{{env.FEISHU_VERIFICATION_TOKEN}}"
allowed_users:
- "ou_xxxxxxxx"
- "ou_yyyyyyyy"
ops:
model: "claude-sonnet-5"
system_prompt: "Eres un asistente de guardia técnica, experto en logs, operaciones de contenedores y respuesta de seguridad."
skills:
- kubernetes
- sentry
approvals:
smart_approvals: true
deny_rules:
- pattern: "kubectl delete.*prod"
reason: "Las operaciones de borrado en producción están prohibidas de forma automática"
product:
model: "gpt-5.6-sol"
system_prompt: "Eres un asistente de producto, experto en escribir PRDs, análisis de competencia y organización de feedback."
skills:
- notion
- web_search
personal:
model: "grok-4.5"
system_prompt: "Eres un asistente de productividad personal con tono relajado."
gateway:
multiplex_profiles: true
profile_routes:
- name: feishu-ops
platform: feishu
chat_id: "oc_xxxxxxxxxxxxxxxx"
profile: ops
- name: feishu-product
platform: feishu
chat_id: "oc_yyyyyyyyyyyyyyyy"
profile: product
- name: feishu-personal
platform: feishu
chat_id: "oc_zzzzzzzzzzzzzzzz"
profile: personal
# Fallback: todos los mensajes directos de un usuario van a personal
- name: feishu-dm
platform: feishu
user_id: "ou_xxxxxxxx"
profile: personal
Guarda y ejecuta:
hermes config validate
hermes gateway restart
Campos de routing de Feishu explicados
profile_routes en v0.19 soporta los siguientes campos para Feishu/Lark (ordenados por especificidad):
| Campo | Significado | Ejemplo | Peso de especificidad |
|---|---|---|---|
platform |
Tipo de plataforma, obligatorio | feishu |
Base |
chat_id |
ID del chat/grupo de Feishu (empieza con oc_) |
oc_xxxxxxxxxxxxxxxx |
Alto |
thread_id |
ID del hilo/tema de Feishu | omt_xxxxxxxxxxxxxxxx |
Máximo |
user_id |
ID de usuario de Feishu (empieza con ou_) |
ou_xxxxxxxx |
Medio-alto |
tenant_id |
ID de empresa/tenant (escenarios multi-tenant) | xxx |
Medio |
profile |
Nombre del Profile destino | ops |
— |
name |
Comentario de la regla | feishu-ops |
— |
Reglas de coincidencia:
- Todos los campos declarados deben cumplirse (relación AND).
- Los campos no declarados se ignoran.
- Mayor especificidad gana:
thread_id>chat_id>user_id>tenant_id> soloplatform. - Con la misma especificidad, gana la primera regla declarada.
Por eso puedes enrutar un grupo completo por chat_id y luego hacer un desvío más fino dentro de un hilo con thread_id.
Cómo obtener chat_id, thread_id y user_id de Feishu
La forma más sencilla: deja que Hermes corra primero con el Profile default, envía un mensaje y revisa el log en busca del session_key o el payload del evento. El log suele mostrar algo como:
[feishu] incoming message chat_id=oc_xxxxxxxxxxxxxxxx thread_id=omt_yyyyyyyy user_id=ou_zzzzzzzz
O añade temporalmente un skill echo en el Profile default que responda:
chat_id: oc_xxxxxxxxxxxxxxxx
thread_id: omt_yyyyyyyy
user_id: ou_zzzzzzzz
Una vez tengas los IDs, escríbelos en profile_routes y reinicia el Gateway.
Error común: no puedes configurar Feishu en varios Profile
En modo multiplex, si intentas poner en ops algo como:
profiles:
ops:
gateway:
platforms:
- platform: feishu
...
El arranque fallará. feishu es una plataforma de enlace de puerto, por lo que su entrada solo puede estar en el Profile default. Los Profile secundarios obtienen Feishu exclusivamente a través de profile_routes.
Si necesitas aislamiento a nivel de proceso (por ejemplo, ops no puede compartir proceso con personal), no uses multiplex. En su lugar, inicia un Gateway independiente para cada Profile con
hermes -p ops gateway start.
Comandos de depuración y validación
# Ver si multiplex está activado
hermes config get gateway.multiplex_profiles
# Ver las reglas de profile_routes activas
hermes config get gateway.profile_routes
# Validar la sintaxis de la configuración
hermes config validate
# Iniciar/reiniciar el Gateway
hermes gateway start
hermes gateway restart
# Ver el estado del Gateway y qué Profile están siendo servidos
hermes status
# Ver logs en tiempo real de Feishu (en otra terminal)
hermes gateway --log-level debug
Después de enviar un mensaje de prueba, busca en los logs:
[multiplex] routed feishu chat_id=oc_xxx to profile=ops
Si no aparece, la regla no coincidió. Revisa que el chat_id no tenga espacios ni errores de copia.
Avanzado: aislamiento por hilo (thread_id)
Los hilos de Feishu son como subcanales dentro de un grupo. Puedes enrutar diferentes hilos del mismo grupo a diferentes Profile:
gateway:
multiplex_profiles: true
profile_routes:
- name: feishu-ops-main
platform: feishu
chat_id: "oc_xxxxxxxxxxxxxxxx"
profile: ops
- name: feishu-ops-oncall
platform: feishu
chat_id: "oc_xxxxxxxxxxxxxxxx"
thread_id: "omt_yyyyyyyyyyyyyyyy"
profile: ops-oncall
Como thread_id tiene mayor especificidad, los mensajes dentro de ese hilo irán a ops-oncall, mientras que el resto del grupo irá a ops.
Avanzado: escenario multi-tenant (tenant_id)
Si instalas la misma aplicación de bot en varias empresas de Feishu (escenario ISV), puedes enrutar por tenant_id:
gateway:
profile_routes:
- name: tenant-a
platform: feishu
tenant_id: "tenant_a_id"
profile: customer-a
- name: tenant-b
platform: feishu
tenant_id: "tenant_b_id"
profile: customer-b
Combinado con los per-profile secret scopes de Hermes, cada cliente puede tener secretos y modelos completamente aislados.
Recomendaciones de seguridad
- Siempre define
allowed_users: el bot de Feishu solo responde a usuarios en la lista blanca, evitando abusos si alguien lo añade a un grupo desconocido. - Separa los permisos por Profile: el Profile
opspuede conectar herramientas de operaciones, peroproductno debería tener acceso a la ejecución en producción. - Usa
deny_rulescomo red de seguridad: incluso si un mensaje se enruta mal, las reglas de denegación pueden bloquear comandos peligrosos. Consulta nuestro tutorial anterior sobre las tres barreras de Smart Approvals en Hermes v0.19. - Verifica la exactitud de
chat_id: en Feishu es fácil confundiroc_conou_, y un error hará que los mensajes vayan al Profile default o no coincidan.
Resumen
profile_routes en Hermes v0.19 transforma un bot de Feishu de “un bot, un Agent” a “un bot, múltiples Agent”. El núcleo de la configuración son tres pasos:
- Configura la única entrada de Feishu en el Profile
default; - Activa
gateway.multiplex_profiles: true; - Usa
gateway.profile_routespara dividir porchat_id/thread_id/user_id/tenant_idhacia diferentes Profile.
Así, el mismo bot de Feishu puede actuar como asistente de operaciones en un grupo técnico, redactor de PRDs en un grupo de producto y asistente personal en mensajes directos, sin mantener múltiples bots ni procesos de Gateway.
# Validación final y arranque
hermes config validate
hermes gateway restart
hermes status