Zum Hauptinhalt springen

Hooks

Hooks sind kleine Skripte, die ausgeführt werden, wenn innerhalb des Gateway etwas passiert. Sie werden automatisch aus Verzeichnissen erkannt und können mit openclaw hooks geprüft werden. Es gibt zwei Arten von Hooks in OpenClaw:
  • Interne Hooks (diese Seite): werden innerhalb des Gateway ausgeführt, wenn Agentenereignisse eintreten, zum Beispiel /new, /reset, /stop oder Lebenszyklusereignisse.
  • Webhooks: externe HTTP-Endpunkte, mit denen andere Systeme Arbeit in OpenClaw auslösen können. Siehe Webhooks.
Hooks können auch in Plugins gebündelt sein. openclaw hooks list zeigt sowohl eigenständige Hooks als auch von Plugins verwaltete Hooks.

Schnellstart

# Verfügbare Hooks auflisten
openclaw hooks list

# Einen Hook aktivieren
openclaw hooks enable session-memory

# Hook-Status prüfen
openclaw hooks check

# Detaillierte Informationen abrufen
openclaw hooks info session-memory

Ereignistypen

EreignisWann es ausgelöst wird
command:new/new-Befehl ausgeführt
command:reset/reset-Befehl ausgeführt
command:stop/stop-Befehl ausgeführt
commandBeliebiges Befehlsereignis (allgemeiner Listener)
session:compact:beforeBevor die Komprimierung den Verlauf zusammenfasst
session:compact:afterNachdem die Komprimierung abgeschlossen ist
session:patchWenn Sitzungseigenschaften geändert werden
agent:bootstrapBevor Bootstrap-Dateien des Workspaces eingefügt werden
gateway:startupNachdem Kanäle gestartet wurden und Hooks geladen sind
message:receivedEingehende Nachricht von einem beliebigen Kanal
message:transcribedNachdem die Audiotranskription abgeschlossen ist
message:preprocessedNachdem alle Medien- und Linkverarbeitung abgeschlossen ist
message:sentAusgehende Nachricht zugestellt

Hooks schreiben

Hook-Struktur

Jeder Hook ist ein Verzeichnis mit zwei Dateien:
my-hook/
├── HOOK.md          # Metadaten + Dokumentation
└── handler.ts       # Handler-Implementierung

HOOK.md-Format

---
name: my-hook
description: "Kurze Beschreibung dessen, was dieser Hook macht"
metadata:
  { "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---

# My Hook

Detaillierte Dokumentation kommt hier hin.
Metadatenfelder (metadata.openclaw):
FeldBeschreibung
emojiAnzeige-Emoji für die CLI
eventsArray von Ereignissen, auf die gehört werden soll
exportZu verwendender benannter Export (Standard: "default")
osErforderliche Plattformen (z. B. ["darwin", "linux"])
requiresErforderliche bins, anyBins, env oder config-Pfade
alwaysEignungsprüfungen umgehen (Boolesch)
installInstallationsmethoden

Handler-Implementierung

const handler = async (event) => {
  if (event.type !== "command" || event.action !== "new") {
    return;
  }

  console.log(`[my-hook] New command triggered`);
  // Your logic here

  // Optionally send message to user
  event.messages.push("Hook executed!");
};

export default handler;
Jedes Ereignis enthält: type, action, sessionKey, timestamp, messages (zum Senden an den Benutzer hineinpushing) und context (ereignisspezifische Daten).

Wichtige Punkte zum Ereigniskontext

Befehlsereignisse (command:new, command:reset): context.sessionEntry, context.previousSessionEntry, context.commandSource, context.workspaceDir, context.cfg. Nachrichtenereignisse (message:received): context.from, context.content, context.channelId, context.metadata (anbieterspezifische Daten einschließlich senderId, senderName, guildId). Nachrichtenereignisse (message:sent): context.to, context.content, context.success, context.channelId. Nachrichtenereignisse (message:transcribed): context.transcript, context.from, context.channelId, context.mediaPath. Nachrichtenereignisse (message:preprocessed): context.bodyForAgent (endgültiger angereicherter Inhalt), context.from, context.channelId. Bootstrap-Ereignisse (agent:bootstrap): context.bootstrapFiles (veränderbares Array), context.agentId. Session-Patch-Ereignisse (session:patch): context.sessionEntry, context.patch (nur geänderte Felder), context.cfg. Nur privilegierte Clients können Patch-Ereignisse auslösen. Komprimierungsereignisse: session:compact:before enthält messageCount, tokenCount. session:compact:after ergänzt compactedCount, summaryLength, tokensBefore, tokensAfter.

Hook-Erkennung

Hooks werden aus diesen Verzeichnissen erkannt, in Reihenfolge zunehmender Override-Priorität:
  1. Gebündelte Hooks: werden mit OpenClaw ausgeliefert
  2. Plugin-Hooks: Hooks, die in installierten Plugins gebündelt sind
  3. Verwaltete Hooks: ~/.openclaw/hooks/ (vom Benutzer installiert, über Workspaces hinweg gemeinsam genutzt). Zusätzliche Verzeichnisse aus hooks.internal.load.extraDirs haben dieselbe Priorität.
  4. Workspace-Hooks: <workspace>/hooks/ (pro Agent, standardmäßig deaktiviert, bis sie ausdrücklich aktiviert werden)
Workspace-Hooks können neue Hook-Namen hinzufügen, aber keine gebündelten, verwalteten oder von Plugins bereitgestellten Hooks mit demselben Namen überschreiben.

Hook-Pakete

Hook-Pakete sind npm-Pakete, die Hooks über openclaw.hooks in package.json exportieren. Installation mit:
openclaw plugins install <path-or-spec>
Npm-Spezifikationen sind nur für die Registry erlaubt (Paketname + optionale exakte Version oder Dist-Tag). Git-/URL-/Datei-Spezifikationen und Semver-Bereiche werden abgelehnt.

Gebündelte Hooks

HookEreignisseWas er macht
session-memorycommand:new, command:resetSpeichert Sitzungskontext in <workspace>/memory/
bootstrap-extra-filesagent:bootstrapFügt zusätzliche Bootstrap-Dateien aus Glob-Mustern ein
command-loggercommandProtokolliert alle Befehle in ~/.openclaw/logs/commands.log
boot-mdgateway:startupFührt BOOT.md aus, wenn das Gateway startet
Aktivieren Sie einen beliebigen gebündelten Hook:
openclaw hooks enable <hook-name>

session-memory-Details

Extrahiert die letzten 15 Benutzer-/Assistentennachrichten, erzeugt per LLM einen beschreibenden Dateinamen-Slug und speichert ihn unter <workspace>/memory/YYYY-MM-DD-slug.md. Erfordert, dass workspace.dir konfiguriert ist.

bootstrap-extra-files-Konfiguration

{
  "hooks": {
    "internal": {
      "entries": {
        "bootstrap-extra-files": {
          "enabled": true,
          "paths": ["packages/*/AGENTS.md", "packages/*/TOOLS.md"]
        }
      }
    }
  }
}
Pfade werden relativ zum Workspace aufgelöst. Es werden nur erkannte Bootstrap-Basisdateinamen geladen (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md, MEMORY.md).

command-logger-Details

Protokolliert jeden Slash-Befehl in ~/.openclaw/logs/commands.log.

boot-md-Details

Führt beim Start des Gateway BOOT.md aus dem aktiven Workspace aus.

Plugin-Hooks

Plugins können Hooks über das Plugin SDK registrieren, um eine tiefere Integration zu ermöglichen: Tool-Aufrufe abfangen, Prompts ändern, Nachrichtenfluss steuern und mehr. Das Plugin SDK stellt 28 Hooks bereit, die Modellauflösung, Agentenlebenszyklus, Nachrichtenfluss, Tool-Ausführung, Subagent-Koordination und den Gateway-Lebenszyklus abdecken. Die vollständige Plugin-Hook-Referenz einschließlich before_tool_call, before_agent_reply, before_install und aller anderen Plugin-Hooks finden Sie unter Plugin Architecture.

Konfiguration

{
  "hooks": {
    "internal": {
      "enabled": true,
      "entries": {
        "session-memory": { "enabled": true },
        "command-logger": { "enabled": false }
      }
    }
  }
}
Umgebungsvariablen pro Hook:
{
  "hooks": {
    "internal": {
      "entries": {
        "my-hook": {
          "enabled": true,
          "env": { "MY_CUSTOM_VAR": "value" }
        }
      }
    }
  }
}
Zusätzliche Hook-Verzeichnisse:
{
  "hooks": {
    "internal": {
      "load": {
        "extraDirs": ["/path/to/more/hooks"]
      }
    }
  }
}
Das ältere Array-Konfigurationsformat hooks.internal.handlers wird aus Gründen der Abwärtskompatibilität weiterhin unterstützt, aber neue Hooks sollten das erkennungsgestützte System verwenden.

CLI-Referenz

# Alle Hooks auflisten (--eligible, --verbose oder --json hinzufügen)
openclaw hooks list

# Detaillierte Informationen zu einem Hook anzeigen
openclaw hooks info <hook-name>

# Eignungsübersicht anzeigen
openclaw hooks check

# Aktivieren/deaktivieren
openclaw hooks enable <hook-name>
openclaw hooks disable <hook-name>

Best Practices

  • Halten Sie Handler schnell. Hooks laufen während der Befehlsverarbeitung. Starten Sie aufwendige Arbeit per Fire-and-Forget mit void processInBackground(event).
  • Behandeln Sie Fehler robust. Kapseln Sie riskante Operationen in try/catch; werfen Sie keine Fehler, damit andere Handler weiterlaufen können.
  • Filtern Sie Ereignisse früh. Kehren Sie sofort zurück, wenn Ereignistyp/Aktion nicht relevant ist.
  • Verwenden Sie spezifische Ereignisschlüssel. Bevorzugen Sie "events": ["command:new"] gegenüber "events": ["command"], um den Overhead zu verringern.

Fehlerbehebung

Hook wird nicht erkannt

# Verzeichnisstruktur prüfen
ls -la ~/.openclaw/hooks/my-hook/
# Sollte anzeigen: HOOK.md, handler.ts

# Alle erkannten Hooks auflisten
openclaw hooks list

Hook ist nicht geeignet

openclaw hooks info my-hook
Prüfen Sie auf fehlende Binärdateien (PATH), Umgebungsvariablen, Konfigurationswerte oder OS-Kompatibilität.

Hook wird nicht ausgeführt

  1. Prüfen Sie, ob der Hook aktiviert ist: openclaw hooks list
  2. Starten Sie Ihren Gateway-Prozess neu, damit Hooks neu geladen werden.
  3. Prüfen Sie die Gateway-Protokolle: ./scripts/clawlog.sh | grep hook

Verwandt