Skip to content

๐Ÿ”Œ 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 โ€‹

VersionNeuerung
v0.3.0Plugin-Architektur โ€“ Drop-in Python-Plugins
v0.7.0Memory Provider + Credential Pools als Plugin
v0.8.0Plugins kรถnnen CLI-Subcommands registrieren
v0.11.0Plugin Surface: Slash-Befehle, Tool-Dispatch, Tool-Blocking, Config
v0.12.0Microsoft Teams als erste Plugin-Plattform + Spotify & Google Meet als Bundled Plugins

Plugin-Verwaltung โ€‹

CLI-Befehle โ€‹

bash
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 Plugin

Installierte Plugins anzeigen โ€‹

bash
hermes plugins list

Beispiel-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__.py

Offizielle 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
bash
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
bash
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
bash
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 setup konfigurierbar

Eigenes Plugin schreiben โ€‹

Minimales Plugin โ€‹

Ein Plugin besteht aus zwei Dateien:

plugin.yaml โ€“ Metadaten:

yaml
name: meine-erweiterung
version: "1.0"
description: Macht etwas Nรผtzliches
author: "Dein Name"

__init__.py โ€“ Plugin-Logik:

python
"""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."""
        pass

Plugin-Features โ€‹

Slash-Befehle registrieren โ€‹

python
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 โ€‹

python
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 โ€‹

python
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 result

Dashboard-Tabs โ€‹

python
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:

bash
# ~/.hermes/hooks/pre_tool_call.sh
#!/bin/bash
echo "Tool-Call: $HERMES_TOOL_NAME mit Args: $HERMES_TOOL_ARGS"

Verfรผgbare Hook-Punkte:

HookEnvironment-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:

PluginBeschreibung
SQLite (Default)Lokal โ€“ keine Installation nรถtig
HonchoKI-gestรผtztes Memory mit semantischer Suche
Mem0Self-Improving Memory
SupermemoryCloud-basiertes, gerรคteรผbergreifend
bash
hermes plugins install honcho

Konfiguration in config.yaml:

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_call und pre_tool_call verlangsamen 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