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 Agent-Ereignisse ausgelöst werden, zum Beispiel /new, /reset, /stop oder Lifecycle-Ereignisse.
  • Webhooks: externe HTTP-Endpunkte, über die 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 an.

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 Workspace-Bootstrap-Dateien eingefügt werden
gateway:startupNachdem Kanäle gestartet wurden und Hooks geladen sind
message:receivedEingehende Nachricht aus einem beliebigen Kanal
message:transcribedNachdem die Audiotranskription abgeschlossen ist
message:preprocessedNachdem die gesamte Medien- und Link-Verarbeitung 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: "Short description of what this hook does"
metadata:
  { "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---

# My Hook

Detailed documentation goes here.
Metadatenfelder (metadata.openclaw):
FeldBeschreibung
emojiAnzuzeigendes Emoji für CLI
eventsArray der zu überwachenden Ereignisse
exportZu verwendender benannter Export (Standard ist "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 per push) 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ültig 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 steigender Überschreibungspriorität:
  1. Gebündelte Hooks: mit OpenClaw ausgeliefert
  2. Plugin-Hooks: Hooks, die in installierten Plugins gebündelt sind
  3. Verwaltete Hooks: ~/.openclaw/hooks/ (vom Benutzer installiert, gemeinsam für alle Workspaces). 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 zulässig (Paketname + optionale exakte Version oder Dist-Tag). Git-/URL-/Datei-Spezifikationen und Semver-Bereiche werden abgelehnt.

Gebündelte Hooks

HookEreignisseWas er tut
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-/Assistenten-Nachrichten, erstellt 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).

Plugin-Hooks

Plugins können Hooks über das Plugin SDK registrieren, um eine tiefere Integration zu ermöglichen: das Abfangen von Tool-Aufrufen, das Ändern von Prompts, die Steuerung des Nachrichtenflusses und mehr. Das Plugin SDK stellt 28 Hooks bereit, die Modellauflösung, Agent-Lifecycle, Nachrichtenfluss, Tool-Ausführung, Subagent-Koordination und Gateway-Lifecycle abdecken. Die vollständige Referenz für Plugin-Hooks 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 veraltete Konfigurationsformat hooks.internal.handlers als Array 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 (fügen Sie --eligible, --verbose oder --json hinzu)
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

  • Handler schnell halten. Hooks werden während der Befehlsverarbeitung ausgeführt. Starten Sie aufwendige Arbeit im Hintergrund ohne Warten mit void processInBackground(event).
  • Fehler sauber behandeln. Kapseln Sie riskante Operationen in try/catch; werfen Sie keine Fehler, damit andere Handler weiterlaufen können.
  • Ereignisse früh filtern. Kehren Sie sofort zurück, wenn Ereignistyp/-aktion nicht relevant ist.
  • Spezifische Ereignisschlüssel verwenden. Bevorzugen Sie "events": ["command:new"] statt "events": ["command"], um Overhead zu reduzieren.

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