๐ Plugin-System โ
Seit v0.3.0 kann Hermes durch Plugins erweitert werden. Ein Plugin ist ein Python-Skript, das neue Tools, Slash-Befehle, Lifecycle-Hooks, Dashboard-Tabs oder sogar ganze Gateway-Plattformen mitbringt.
รbersicht โ
| Version | Neuerung |
|---|---|
| v0.3.0 | Plugin-Architektur โ Drop-in Python-Plugins |
| v0.7.0 | Memory Provider + Credential Pools als Plugin |
| v0.8.0 | Plugins kรถnnen CLI-Subcommands registrieren |
| v0.11.0 | Plugin Surface: Slash-Befehle, Tool-Dispatch, Tool-Blocking, Config |
| v0.12.0 | Microsoft Teams als erste Plugin-Plattform + Spotify & Google Meet als Bundled Plugins |
Plugin-Verwaltung โ
CLI-Befehle โ
hermes plugins list # Alle installierten Plugins anzeigen
hermes plugins install <id> # Plugin aus Registry installieren
hermes plugins remove <name> # Plugin deinstallieren
hermes plugins info <name> # Details zu einem PluginInstallierte Plugins anzeigen โ
hermes plugins listBeispiel-Ausgabe:
๐ฆ Installierte Plugins:
๐ spotify โ Spotify-Integration (v1.0) [Bundled]
๐ google-meet โ Google Meet: Calls beitreten & transkribieren (v1.0) [Bundled]
๐ langfuse โ LLM-Observability & Tracing (v0.3) [Bundled]
๐ achievements โ Hermes Achievements-System (v0.2) [Bundled]
๐ microsoft-teams โ Microsoft Teams Gateway-Adapter (v1.0) [Bundled]Plugin-Ordner โ
Plugins liegen als Python-Pakete unter:
~/.hermes/plugins/
โโโ spotify/ # Spotify-Plugin (Bundled)
โ โโโ plugin.yaml
โ โโโ __init__.py
โ โโโ tools.py
โโโ google-meet/
โ ...
โโโ meine-erweiterung/ # Eigenes Plugin
โโโ plugin.yaml
โโโ __init__.pyOffizielle Plugins (Bundled) โ
๐ต Spotify โ
Vollstรคndige Spotify-Steuerung รผber Hermes:
- 7 Tools: play, search, queue, playlists, devices, next, previous
- PKCE OAuth โ Sicheres Login ohne Passwort
- Interaktiver Setup-Wizard โ
hermes plugins install spotify - Cron-Job-Integration โ z.B. tรคgliche Playlist-Updates
hermes plugins install spotify
# โ Browser รถffnet sich fรผr OAuth-Login๐ค Google Meet โ
Calls beitreten, transkribieren und per Sprachausgabe interagieren:
- Echtzeit-Transkription โ Schreibt Meeting-Inhalte mit
- Sprachausgabe โ Hermes kann sich im Meeting รคuรern
- Node.js Bot Server โ Lรคuft als Hintergrundprozess
- OpenAI Realtime Transport โ Low-Latency-Kommunikation
hermes plugins install google-meet๐ Langfuse โ
LLM-Observability und Tracing fรผr alle Hermes-Interaktionen:
- Request-Tracing โ Sieh jede LLM-Anfrage mit Latenz, Tokens, Modell
- Session-Export โ Gesprรคchsverlรคufe in Langfuse-Dashboard
- Cost-Tracking โ Token-Verbrauch pro Session/Modell
hermes plugins install langfuse
# Erfordert LANGFUSE_PUBLIC_KEY + LANGFUSE_SECRET_KEY in .env๐ Achievements โ
Gamification-System โ Hermes schaltet Erfolge frei:
- Automatische Erfolge โ Erste Session, 100 Nachrichten, erster Skill etc.
- /achievements โ Zeigt alle freigeschalteten Erfolge an
- Fortschrittsanzeige โ Wie nah am nรคchsten Erfolg?
๐ผ Microsoft Teams โ
Erste Plattform, die als Plugin ausgeliefert wird:
- Vollstรคndiger Gateway-Adapter โ Wie native Plattformen
- Bot-Unterstรผtzung โ Teams-Bot mit Messaging, Reactions, Mentions
- Per
hermes gateway setupkonfigurierbar
Eigenes Plugin schreiben โ
Minimales Plugin โ
Ein Plugin besteht aus zwei Dateien:
plugin.yaml โ Metadaten:
name: meine-erweiterung
version: "1.0"
description: Macht etwas Nรผtzliches
author: "Dein Name"__init__.py โ Plugin-Logik:
"""Mein erstes Hermes-Plugin."""
from hermes.plugin import PluginBase
class MyPlugin(PluginBase):
name = "meine-erweiterung"
def on_register(self):
"""Wird beim Laden aufgerufen."""
pass
def on_unregister(self):
"""Wird beim Entfernen aufgerufen."""
passPlugin-Features โ
Slash-Befehle registrieren โ
from hermes.plugin import PluginBase
class MyPlugin(PluginBase):
def on_register(self):
self.register_command("meinbefehl", self.handle_meinbefehl)
def handle_meinbefehl(self, agent, args):
return f"Hallo, du hast '{args}' eingegeben!"Tools bereitstellen โ
def my_tool(param1: str, param2: int = 42) -> dict:
"""Mein erstes Tool.
Args:
param1: Eine Text-Eingabe
param2: Eine Zahl (Standard: 42)
"""
return {"result": f"{param1} x {param2}"}Lifecycle-Hooks โ
class MyPlugin(PluginBase):
def pre_llm_call(self, messages):
"""Vor jedem LLM-Call โ Nachricht bearbeiten."""
return messages
def post_llm_call(self, response):
"""Nach jedem LLM-Call โ Response bearbeiten."""
return response
def on_session_start(self, session):
"""Wird bei jeder neuen Session aufgerufen."""
def on_session_end(self, session):
"""Wird beim Session-Ende aufgerufen."""
def pre_tool_call(self, tool_name, args):
"""Kann Tool-Calls blocken oder modifizieren."""
if tool_name == "dangerous_tool":
return {"blocked": True, "reason": "Nicht erlaubt"}
return None # Tool-Call normal ausfรผhren
def post_tool_call(self, tool_name, result):
"""Nach jedem Tool-Call."""
return resultDashboard-Tabs โ
class MyPlugin(PluginBase):
def get_dashboard_tabs(self):
return [{
"id": "mein-tab",
"title": "๐ Mein Tab",
"content": "<h1>Dashboard-Inhalt</h1>"
}]Shell Hooks (Alternative) โ
Seit v0.11.0 kรถnnen auch Shell-Skripte als Lifecycle-Hooks dienen โ ohne Python-Kenntnisse:
# ~/.hermes/hooks/pre_tool_call.sh
#!/bin/bash
echo "Tool-Call: $HERMES_TOOL_NAME mit Args: $HERMES_TOOL_ARGS"Verfรผgbare Hook-Punkte:
| Hook | Environment-Variablen |
|---|---|
pre_tool_call | $HERMES_TOOL_NAME, $HERMES_TOOL_ARGS |
post_tool_call | $HERMES_TOOL_NAME, $HERMES_TOOL_RESULT |
on_session_start | $HERMES_SESSION_ID |
on_session_end | $HERMES_SESSION_ID |
Memory-Provider als Plugin โ
Seit v0.7.0 ist das Memory-System pluggbar:
| Plugin | Beschreibung |
|---|---|
| SQLite (Default) | Lokal โ keine Installation nรถtig |
| Honcho | KI-gestรผtztes Memory mit semantischer Suche |
| Mem0 | Self-Improving Memory |
| Supermemory | Cloud-basiertes, gerรคteรผbergreifend |
hermes plugins install honchoKonfiguration in config.yaml:
memory:
provider: honcho # oder: mem0, supermemory, default
honcho_api_key: "sk-..."Best Practices โ
- Plugin.yaml nicht vergessen โ Ohne Metadaten wird das Plugin nicht erkannt
- Hooks sparsam einsetzen โ
pre_llm_callundpre_tool_callverlangsamen den Agenten - Fehlerbehandlung โ Jeder Hook sollte Exceptions abfangen, sonst bricht der Agent ab
- Keine Side-Effekte in on_register โ Das Plugin sollte erst in Hooks aktiv werden
- Shell Hooks fรผr einfache Fรคlle โ Kein Python nรถtig fรผr kleine Automatisierungen