Ein Feishu-Bot für mehrere Hermes-Profile: v0.19 Profile-Routing Schritt für Schritt

Vor Hermes Agent v0.19 war der naivste Ansatz, wenn du in unterschiedlichen Feishu-Gruppen unterschiedliche Agenten-Persönlichkeiten laufen lassen wolltest: für jede Gruppe eine separate Feishu-Bot-App erstellen und jeweils ein eigenes Hermes Gateway betreiben. Viele Token, viele Prozesse, verteilte Konfigurationen.
Mit multiplex_profiles + profile_routes in v0.19 reicht eine einzige Feishu-Bot-App und ein einziger Gateway-Prozess, um Nachrichten aus verschiedenen Gruppen oder Threads an verschiedene Profile zu verteilen. Jedes Profil behält sein eigenes Modell, Skills, Memory und Geheimnisse bei, teilt sich aber dieselbe Bot-Identität.
Dieser Artikel basiert auf dem offiziellen Hermes v0.19.0 Release und der bestehenden Dokumentation und liefert ein vollständig umsetzbares Beispiel.
Wer zuerst die Übersicht sehen möchte, kann unseren zusammengefassten Hermes v0.19.0 Quicksilver Release Notes sowie die offiziellen v0.19.0 release notes lesen.
Voraussetzungen
- Hermes Agent >= v0.19.0
- Eine erstellte und genehmigte Feishu- (Lark-) Bot-App
- Der Bot hat „Ereignisabonnement“ aktiviert und empfängt Ereignisse wie
im.message.receive_v1 app_id,app_secret,encrypt_key,verification_tokenwurden aus der Feishu Open Platform bezogen
Wenn du den Feishu-Bot noch nicht in Hermes eingebunden hast, kannst du die Basis-Credentials zuerst in ~/.hermes/.env hinterlegen:
FEISHU_ALLOWED_USERS=ou_xxxxxxxx,ou_yyyyyyyy
FEISHU_APP_ID=cli_xxxxxxxxxxxxxxxx
FEISHU_APP_SECRET=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
FEISHU_ENCRYPT_KEY=xxxxxxxxxxxxxxxx
FEISHU_VERIFICATION_TOKEN=xxxxxxxxxxxxxxxx
Der Feishu-Adapter von Hermes ist seit v0.6.0 ein vollständiger Gateway-Adapter und unterstützt Nachrichtenkarten, Gruppenchats, Bild-/Dateianhänge und Interaktions-Callbacks. Die grundlegende Erreichbarkeit ist also kein Hindernis.
Kernkonzept: multiplex_profiles + profile_routes
Vor v0.19 konnte ein Hermes Gateway bereits „ein Prozess, mehrere Plattformen“. Die Neuerung in v0.19 ist: ** dieselbe Plattform, derselbe Bot-Token, und trotzdem Routing anhand der Herkunft zu unterschiedlichen Profilen**.
Die wichtigsten Konfigurationsschlüssel:
gateway.multiplex_profiles: true— aktiviert den Mehrprofil-Modusgateway.profile_routes— definiert die Regelliste zur Herkunftsbasierten Zuordnung
Hinweis: Im Multiplex-Modus können port-bindende Plattformen (webhook, api_server, feishu usw.) nur im
defaultProfil konfiguriert werden; andere Profile empfangen Nachrichten ausschließlich über Routing-Regeln. Genau diesen Modus besprechen wir hier: dasdefaultProfil betreibt den Feishu-Plattform-Eingang, undprofile_routesverteilt die Nachrichten an Profile wiework,personalusw.
Konfigurationsbeispiel für Feishu
Angenommen, du hast drei Feishu-Gruppen:
| Gruppenname | Verwendung | Zielprofil |
|---|---|---|
| Technik-Rufbereitschaft | Alarmbearbeitung, Log-Analyse, Sicherheitsbefehle | ops |
| Produkt-Diskussion | PRD schreiben, Wettbewerbsanalyse | product |
| Privater-Assistent-Chat | Persönlicher Kalender, Recherche | personal |
In ~/.hermes/config.yaml sieht das so aus:
profiles:
default:
# Der Feishu-Plattform-Eingang muss im default-Profil bleiben
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: "Du bist ein technischer Rufbereitschaftsassistent, spezialisiert auf Log-Analyse, Container-Betrieb und Sicherheitsreaktion."
skills:
- kubernetes
- sentry
approvals:
smart_approvals: true
deny_rules:
- pattern: "kubectl delete.*prod"
reason: "Löschoperationen in Produktion dürfen nicht automatisch ausgeführt werden"
product:
model: "gpt-5.6-sol"
system_prompt: "Du bist ein Produktmanager-Assistent, spezialisiert auf PRDs, Wettbewerbsanalysen und User-Feedback-Zusammenfassungen."
skills:
- notion
- web_search
personal:
model: "grok-4.5"
system_prompt: "Du bist ein persönlicher Effizienzassistent mit lockerem Ton."
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: Alle Direktnachrichten eines bestimmten Users landen in personal
- name: feishu-dm
platform: feishu
user_id: "ou_xxxxxxxx"
profile: personal
Speichern und ausführen:
hermes config validate
hermes gateway restart
Feishu-Routing-Felder im Detail
v0.19 profile_routes unterstützt für Feishu/Lark folgende Felder (sortiert nach Spezifität):
| Feld | Bedeutung | Beispiel | Spezifitätsgewicht |
|---|---|---|---|
platform |
Plattformtyp, Pflicht | feishu |
Basis |
chat_id |
Feishu-Gruppen-/Chat-ID (beginnt mit oc_) |
oc_xxxxxxxxxxxxxxxx |
hoch |
thread_id |
Feishu-Themen-/Thread-ID | omt_xxxxxxxxxxxxxxxx |
höchst |
user_id |
Feishu-User-ID (beginnt mit ou_) |
ou_xxxxxxxx |
mittel-hoch |
tenant_id |
Unternehmens-/Tenant-ID (Multi-Tenant-Szenarien) | xxx |
mittel |
profile |
Zielprofil-Name | ops |
— |
name |
Kommentar für die Routing-Regel | feishu-ops |
— |
Regeln für die Auswertung:
- Alle angegebenen Felder müssen gleichzeitig erfüllt sein (UND-Verknüpfung).
- Nicht angegebene Felder werden ignoriert und fließen nicht in den Abgleich ein.
- Höhere Spezifität gewinnt:
thread_id>chat_id>user_id>tenant_id> nurplatform. - Bei gleicher Spezifität gilt: zuerst definierte Regel gewinnt.
Du kannst also erst den ganzen Chat über chat_id routen und dann einzelne Themen innerhalb desselben Chats über thread_id feiner aufteilen.
Wie du chat_id, thread_id und user_id für Feishu ermittelst
Der einfachste Weg: Lass Hermes zunächst im default Profil laufen und schaue in den Logs nach session_key oder dem Event-Payload. Standardmäßig erscheint etwa:
[feishu] incoming message chat_id=oc_xxxxxxxxxxxxxxxx thread_id=omt_yyyyyyyy user_id=ou_zzzzzzzz
Oder füge vorübergehend einen echo Skill ins default Profil ein, der antwortet:
chat_id: oc_xxxxxxxxxxxxxxxx
thread_id: omt_yyyyyyyy
user_id: ou_zzzzzzzz
Sobald du die IDs hast, trägst du sie in profile_routes ein und startest das Gateway neu.
Ein häufiges Missverständnis: Mehrere Profile dürfen nicht jeweils eine eigene feishu-Plattform konfigurieren
Im Multiplex-Modus führt folgende Konfiguration im ops Profil zu einem Startfehler:
profiles:
ops:
gateway:
platforms:
- platform: feishu
...
Denn feishu ist eine port-bindende Plattform; der Eingang darf nur zum default Profil gehören. Die Feishu-Fähigkeit eines sekundären Profils kommt ausschließlich über profile_routes zustande.
Wer prozess-harte Isolation braucht (z. B. darf
opsauf keinen Fall denselben Prozess wiepersonalnutzen), sollte nicht multiplexen, sondern für jedes Profil ein eigenes Gateway mithermes -p ops gateway startstarten.
Debugging- und Validierungskommandos
# Prüfen, ob Multiplex aktiviert ist
hermes config get gateway.multiplex_profiles
# Aktive profile_routes anzeigen
hermes config get gateway.profile_routes
# Konfigurationssyntax validieren
hermes config validate
# Gateway starten/neu starten
hermes gateway start
hermes gateway restart
# Gateway-Status anzeigen; zeigt Profile, die im Multiplex-Modus bedient werden
hermes status
# Feishu-Logs in Echtzeit ansehen (im zweiten Terminal)
hermes gateway --log-level debug
Nach dem Versenden einer Testnachricht sollte im Log erscheinen:
[multiplex] routed feishu chat_id=oc_xxx to profile=ops
Falls nicht, passt die Regel nicht — prüfe, ob chat_id falsch geschrieben oder Leerzeichen enthalten sind.
Erweitert: Isolation nach Themen (thread_id Routing)
Feishu-Themen in einer Gruppe funktionieren wie Unterkanäle. Du kannst unterschiedliche Themen desselben Chats an unterschiedliche Profile senden:
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
Da thread_id spezifischer ist, landen Nachrichten im Thema in ops-oncall, alle anderen Nachrichten der Gruppe in ops.
Erweitert: Multi-Tenant-Szenarien (tenant_id)
Wenn dieselbe Bot-App in mehrere Feishu-Unternehmen installiert ist (ISV-Szenario), kannst du nach tenant_id aufteilen:
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
In Kombination mit Hermes’ per-profile secret scopes kann jeder Tenant vollständig isolierte Geheimnisse und Modellkonfigurationen erhalten.
Sicherheitsempfehlungen
- Immer
allowed_userssetzen: Feishu-Bots sollten standardmäßig nur auf Benutzer in der Whitelist reagieren, damit sie nicht in fremde Gruppen eingeladen und missbraucht werden. - Profile unterschiedlich berechtigen: Das
opsProfil darf Ops-Tools nutzen, dasproductProfil sollte keine Produktionsausführungsrechte erhalten. - Mit
deny_rulesabsichern: Selbst wenn eine Nachricht fälschlicherweise geroutet wird, können deny rules gefährliche Kommandos blockieren. Siehe unser vorheriges Tutorial Hermes v0.19 Smart Approvals – drei Sicherheitsgatter. chat_idsorgfältig prüfen: Feishusoc_-IDs lassen sich leicht mitou_verwechseln; ein Tippfehler führt dazu, dass Nachrichten insdefaultProfil oder ins Leere laufen.
Zusammenfassung
Mit profile_routes in Hermes v0.19 wird der Feishu-Bot von „ein Bot, ein Agent“ zu „ein Bot, mehrere Agenten“. Die Konfiguration läuft in drei Schritten:
- Im
defaultProfil den einzigenfeishuPlattform-Eingang konfigurieren; gateway.multiplex_profiles: trueaktivieren;- Mit
gateway.profile_routesanhand vonchat_id,thread_id,user_idodertenant_idan verschiedene Profile verteilen.
So kann derselbe Feishu-Bot in der Technik-Gruppe als Ops-Assistent, in der Produkt-Gruppe als PRD-Autor und im Privatchat als persönlicher Sekretär arbeiten — ohne mehrere Bots oder Gateway-Prozesse pflegen zu müssen.
# Abschließende Prüfung und Start
hermes config validate
hermes gateway restart
hermes status