OpenClaw noch nicht installiert? Hier klicken für den Ein-Klick-Installationsbefehl
curl -fsSL https://openclaw.ai/install.sh | bashiwr -useb https://openclaw.ai/install.ps1 | iexcurl -fsSL https://openclaw.ai/install.cmd -o install.cmd && install.cmd && del install.cmd- Zero-Polling-Architektur: OpenClaw Hooks verwendet ein ereignisgesteuertes Modell, das den durch traditionelles Polling verursachten CPU-Leerlauf und die Latenz vollständig eliminiert und die durchschnittliche Reaktionszeit von Sekunden auf Millisekunden senkt.
- Aktivierung mit einem Befehl: Mit
openclaw hooks enablewird das gesamte Hook-System aktiviert – benutzerdefinierte Logik kann ohne Änderung der Kernkonfiguration eingehängt werden. - 15 integrierte Ereignistypen: Von Nachrichtenempfang über Aufgabenabschluss und Skill-Ausführung bis hin zu Fehlerereignissen und geplanten Auslösern – der gesamte Lebenszyklus wird abgedeckt und die meisten Automatisierungsszenarien erfüllt.
- Gateway als Event-Bus: Alle Hook-Ereignisse werden über den lokalen WebSocket-Gateway unter
ws://127.0.0.1:18789geroutet, was niedrige Latenz und hohe Zuverlässigkeit gewährleistet. - Sichere Sandbox-Ausführung: Jeder Hook wird in einem isolierten Sandbox-Prozess ausgeführt, verfügt über ein feingranulares Berechtigungsmodell und vollständige Audit-Logs, was Hook-Injection-Angriffe wirksam verhindert.
Wenn Unternehmen ernsthaft erwägen, KI-Agenten in Produktionsumgebungen einzusetzen, stellt sich eine zentrale Frage: Wie lässt sich der Agent wirklich in die bestehende Engineering-Kultur und das Betriebssystem integrieren? Die Antwort von OpenClaw sind Hooks – ein ereignisgesteuertes Automatisierungs-Framework.[1]
Dieser Artikel ist der dritte Teil der „OpenClaw-Serie". Aufbauend auf den vorherigen Beiträgen zur Architekturübersicht und zum Deployment in der Praxis analysieren wir hier die Designphilosophie, die technischen Details sowie sechs vollständige Praxisbeispiele auf Enterprise-Niveau des Hooks-Systems. Ob Sie bestehende CI/CD-Prozesse optimieren, ein Echtzeit-Alarmsystem aufbauen oder eine vollautomatisierte Reporting-Pipeline erstellen möchten – dieser Artikel liefert Ihnen direkt umsetzbare Anleitungen.
Eins: Vom Polling zur Ereignissteuerung – ein Paradigmenwechsel in der KI-Agenten-Automatisierung
1.1 Grundlegende Schwächen des Polling-Modells
Vor der Einführung des Hooks-Systems verwendeten die meisten KI-Agenten-Frameworks ein Polling-Modell: Das Agentenprogramm sendet in festen Intervallen (z. B. jede Sekunde, alle fünf Sekunden) Abfragen an die verschiedenen Nachrichtenkanäle, um zu prüfen, ob neue Ereignisse verarbeitet werden müssen. Dieses Design ist zwar einfach und intuitiv, weist jedoch drei grundlegende Schwächen auf.
Erstens: Ressourcenverschwendung. Unabhängig davon, ob neue Ereignisse vorliegen, verbrauchen Polling-Anfragen CPU-Zyklen und Netzwerkbandbreite. In einer Multi-Agenten-Umgebung mit 10 Agenten, die jeweils im 1-Sekunden-Takt 5 Kanäle abfragen, entstehen pro Minute 3.000 Leeranfragen – die überwiegende Mehrheit davon völlig sinnlos.
Zweitens: Unkontrollierbare Latenz. Das Polling-Intervall bestimmt die maximale Reaktionslatenz des Systems. Bei einer Abfrage alle 5 Sekunden kann im ungünstigsten Fall ein dringender Alarm fast 5 Sekunden auf seine Bearbeitung warten. In zeitkritischen Szenarien wie Finanztransaktionen oder KI-Cybersecurity-Alarmen ist dies völlig inakzeptabel.
Drittens: Skalierbarkeitsengpass. Mit zunehmender Anzahl von Agenten und überwachten Kanälen wachsen Polling-Anfragen linear oder sogar exponentiell und überlasten schließlich die Backend-Dienste.[5]
1.2 Vorteile des ereignisgesteuerten Paradigmas
Ereignisgesteuerte Architektur (Event-Driven Architecture, EDA) kehrt diese Logik um: Anstatt aktiv zu fragen „Gibt es ein neues Ereignis?", benachrichtigt das System alle Abonnenten proaktiv, wenn ein Ereignis tatsächlich eintritt. Martin Fowler bezeichnet dies als den Wandel vom „imperativen" zum „reaktiven" Denken.[5]
Das AWS-Architektur-Whitepaper betont, dass ereignisgesteuerte Architektur drei zentrale Ziele erreicht: Entkopplung (Produzenten und Konsumenten müssen nicht direkt voneinander abhängen), Elastizität (Konsumenten können unabhängig skaliert werden) und Echtzeit (Ereignisse werden innerhalb von Millisekunden an alle Abonnenten übermittelt).[6]
Das Hooks-System von OpenClaw überträgt genau dieses bewährte Unternehmensarchitektur-Konzept in den Bereich der KI-Agenten. Wie der CNBC-Bericht zeigt, war das Hooks-System bei der Evolution von OpenClaw seit der Clawdbot-Ära der entscheidende technologische Sprung vom „Gesprächswerkzeug" zur „Enterprise-Automatisierungsplattform".[4]
1.3 Quantitativer Vergleich: Polling vs. Ereignissteuerung
Die folgenden Daten stammen aus einem typischen Unternehmens-Deployment-Szenario (10 Agenten, Überwachung von 8 Kanälen, ca. 2.000 Ereignisse pro Tag):
| Kennzahl | Polling-Modell (5-Sek.-Intervall) | OpenClaw Hooks | Verbesserung |
|---|---|---|---|
| Tägliche Leeranfragen | 1.382.400 | 2.000 | -99,86 % |
| Durchschn. Ereignis-Reaktionslatenz | 2.500 ms | 18 ms | -99,28 % |
| CPU-Auslastung im Leerlauf | 12–18 % | <1 % | -94 % |
| Kosten horizontale Skalierung | O(n × m) | O(n + m) | linear → sublinear |
(n = Anzahl der Agenten, m = Anzahl der überwachten Kanäle)
Zwei: Tiefgehende Analyse der OpenClaw Hooks-Architektur
2.1 Architekturübersicht
Das OpenClaw Hooks-System besteht aus drei Kernkomponenten: Event Producers (Ereigniserzeuger), Gateway Event-Bus und Hook Executor (Hook-Ausführungsengine).[2]
Ereigniserzeuger sind über die verschiedenen Subsysteme von OpenClaw verteilt – wenn ein Benutzer eine Nachricht sendet, ein Agent eine Aufgabe abschließt, ein Skill aufgerufen wird oder ein geplanter Zeitpunkt erreicht ist, erzeugt das entsprechende Subsystem ein standardisiertes Ereignisobjekt und überträgt es an das Gateway.
Das Gateway läuft auf dem lokalen WebSocket-Endpunkt ws://127.0.0.1:18789 und fungiert als Event-Bus. Es ist verantwortlich für den Empfang aller Ereignisse, das Routing nach Ereignistyp und die Verteilung an alle abonnierten Hooks. Das Gateway verwendet ein nicht-blockierendes asynchrones Modell, das sicherstellt, dass hochfrequente Ereignisse keinen Queue-Stau verursachen.
Die Hook-Ausführungsengine empfängt Ereignisse vom Gateway und führt das entsprechende Hook-Skript in einer Sandbox-Umgebung aus, wobei Ausführungsergebnisse und Fehler erfasst werden. Der gesamte Ausführungszyklus wird vollständig im Audit-Log protokolliert.
2.2 Hook-Lebenszyklus
Jeder Hook durchläuft von der Ereignisauslösung bis zur Fertigstellung den folgenden standardisierten Lebenszyklus:
- Ereigniserzeugung: Das Subsystem serialisiert das Ereignis als JSON-Objekt, einschließlich Ereignistyp, Zeitstempel, Quell-Agenten-ID und ereignisspezifischem Payload.
- Gateway-Routing: Nach Empfang des Ereignisses durchsucht das Gateway die Routing-Tabelle und findet alle Hooks, die diesen Ereignistyp abonniert haben.
- Filterbewertung: Falls der Hook Filterbedingungen definiert hat, bewertet die Engine zunächst die Filterregeln. Ereignisse, die die Bedingungen nicht erfüllen, werden direkt verworfen und gelangen nicht in die Ausführungsphase.
- Sandbox-Initialisierung: Dem Hook wird ein isolierter Sandbox-Prozess zugewiesen, in den die erforderlichen Umgebungsvariablen und Berechtigungstoken injiziert werden.
- Hook-Ausführung: Die
handler-Funktion des Hook-Skripts wird in der Sandbox ausgeführt, wobei das standardisierte Ereignisobjekt übergeben wird. - Ergebnisrückgabe: Das Ausführungsergebnis des Hooks (Erfolg/Fehler/Rückgabewert) wird erfasst und im Audit-Log protokolliert.
- Sandbox-Bereinigung: Die Sandbox-Ressourcen werden freigegeben, um eine vollständige Isolation zwischen Hooks zu gewährleisten.
2.3 Grundlegende Unterschiede zu Cron und traditionellen Webhooks
Viele Ingenieure neigen dazu, OpenClaw Hooks mit Cron-Jobs oder traditionellen Webhooks gleichzusetzen, doch es bestehen wesentliche Unterschiede:
Unterschied zu Cron: Cron-Jobs werden zeitbasiert ausgelöst und laufen unabhängig davon, ob Ereignisse verarbeitet werden müssen. Obwohl das schedule.triggered-Ereignis in OpenClaw Hooks ebenfalls Zeitplanung unterstützt, ist sein Ausführungskontext die Agentenumgebung von OpenClaw – es kann direkt auf Agentenfähigkeiten zugreifen, den Agentenkontext nutzen und mit anderen Ereignissen interagieren.
Unterschied zu traditionellen Webhooks: Traditionelle Webhooks erfordern einen öffentlich erreichbaren HTTP-Endpunkt, was Entwickler dazu zwingt, Server zu verwalten, TLS zu handhaben und die Herkunft zu verifizieren. OpenClaw Hooks laufen auf dem lokalen Gateway, benötigen keinen öffentlichen Endpunkt und sind nativ in das Authentifizierungssystem des Agenten integriert.
Drei: Aktivierung und Grundkonfiguration
3.1 Voraussetzungen prüfen
Bevor Sie OpenClaw Hooks aktivieren, stellen Sie sicher, dass die folgenden Bedingungen erfüllt sind:[10]
- OpenClaw Version ≥ 0.8.0 (das Hooks-System wird ab dieser Version stabil unterstützt)
- Node.js ≥ 18.0.0 (Ausführungsumgebung für Hook-Skripte)
- Lokales Gateway läuft (
openclaw gateway start) - Mindestens ein Agent-Profil ist konfiguriert
Gateway-Status prüfen:
openclaw gateway status
# Erwartete Ausgabe:
# Gateway Status: Running
# WebSocket: ws://127.0.0.1:18789
# Connected Agents: 2
# Active Hooks: 0
3.2 Hooks-System aktivieren
OpenClaw bietet zwei Aktivierungsmethoden:
Methode 1: Globale Aktivierung (empfohlen)
openclaw hooks enable
Dieser Befehl ändert die globale Konfiguration ~/.openclaw/config.yaml, setzt hooks.enabled auf true und startet das Hook-Routing-Modul im Gateway. Nach der Aktivierung ist kein Gateway-Neustart erforderlich – die Änderung wird sofort wirksam.
Methode 2: Aktivierung für ein bestimmtes Agent-Profil
openclaw hooks enable production-agent
In diesem Modus werden nur Hooks mit dem angegebenen Namen aktiviert – geeignet für die präzise Steuerung in Mehrbetriebsumgebungen.
3.3 Konfigurationsdateiformat
Nach der Aktivierung von Hooks erstellt OpenClaw im Projektverzeichnis die folgende Hook-Konfigurationsstruktur:
.openclaw/
├── config.yaml # Globale Konfiguration
└── hooks/
├── hooks.yaml # Hook-Liste und Routing-Regeln
└── scripts/ # Hook-Skriptverzeichnis
├── on-task-complete.js
├── on-error-alert.js
└── daily-report.js
Die Grundstruktur von hooks.yaml:
version: "1.0"
hooks:
enabled: true
sandbox:
timeout_ms: 30000 # Hook-Ausführungstimeout (Millisekunden)
max_memory_mb: 256 # Sandbox-Speicherlimit
allow_network: false # Darf der Hook Netzwerkanfragen stellen
allow_fs: read # Dateisystemberechtigung: none / read / read-write
definitions:
- id: task-complete-notifier
event: task.completed
script: scripts/on-task-complete.js
enabled: true
filters:
- field: payload.status
operator: eq
value: "success"
- id: error-slack-alert
event: error.occurred
script: scripts/on-error-alert.js
enabled: true
filters:
- field: payload.severity
operator: gte
value: "high"
- id: daily-report-generator
event: schedule.triggered
script: scripts/daily-report.js
enabled: true
schedule: "0 8 * * 1-5" # Montag bis Freitag um 8:00 Uhr
3.4 Globale Konfigurationsoptionen
Vollständige Hooks-bezogene Konfigurationsoptionen in ~/.openclaw/config.yaml:
hooks:
enabled: true
gateway:
host: "127.0.0.1"
port: 18789
reconnect_interval_ms: 5000
max_reconnect_attempts: 10
execution:
concurrency: 4 # Max. gleichzeitig ausgeführte Hooks
queue_size: 1000 # Kapazität der Ereignis-Queue
retry:
enabled: true
max_attempts: 3
backoff: exponential # linear / exponential / fixed
initial_delay_ms: 1000
logging:
level: info # debug / info / warn / error
audit: true # Audit-Logging aktivieren
audit_path: ".openclaw/logs/hooks-audit.jsonl"
Vier: Übersicht der integrierten Hook-Ereignisse
4.1 Nachrichtenereignisse
Nachrichtenereignisse werden ausgelöst, wenn der Agent Nachrichten mit Benutzern oder externen Systemen austauscht:[1]
| Ereignisname | Auslösezeitpunkt | Wichtige Payload-Felder |
|---|---|---|
message.received |
Agent empfängt eine neue Nachricht | channel_id, sender, content, timestamp |
message.sent |
Nach dem Senden einer Nachricht durch den Agenten | channel_id, recipient, content, message_id |
message.failed |
Nachrichtenversand fehlgeschlagen | channel_id, error_code, error_message, retry_count |
4.2 Aufgabenereignisse
| Ereignisname | Auslösezeitpunkt | Wichtige Payload-Felder |
|---|---|---|
task.started |
Agent beginnt eine neue Aufgabe | task_id, task_type, agent_id, input |
task.completed |
Aufgabe erfolgreich abgeschlossen | task_id, status, output, duration_ms |
task.failed |
Aufgabenausführung fehlgeschlagen | task_id, error_type, error_stack, retry_count |
task.cancelled |
Aufgabe manuell oder automatisch abgebrochen | task_id, reason, cancelled_by |
4.3 Skill- und Agenten-Ereignisse
| Ereignisname | Auslösezeitpunkt | Wichtige Payload-Felder |
|---|---|---|
skill.executed |
Ein beliebiger Skill wurde erfolgreich aufgerufen | skill_name, agent_id, params, result |
skill.failed |
Skill-Ausführung hat einen Fehler ausgelöst | skill_name, error_code, error_message |
agent.started |
Agentenprozess erfolgreich gestartet | agent_id, profile, version |
agent.stopped |
Agentenprozess ordnungsgemäß beendet | agent_id, uptime_ms, tasks_completed |
4.4 Verbindungs- und Planungsereignisse
| Ereignisname | Auslösezeitpunkt | Wichtige Payload-Felder |
|---|---|---|
channel.connected |
Nachrichtenkanal erfolgreich verbunden | channel_id, channel_type, endpoint |
channel.disconnected |
Kanalverbindung unterbrochen | channel_id, reason, will_retry |
error.occurred |
Systemfehler aufgetreten | error_code, severity, component, stack_trace |
schedule.triggered |
Geplanter Zeitpunkt erreicht | schedule_id, cron_expr, trigger_time |
Fünf: Leitfaden zur Erstellung benutzerdefinierter Hooks
5.1 Grundstruktur eines Hook-Skripts
Jedes Hook-Skript ist ein Standard-Node.js-Modul und muss eine asynchrone handler-Funktion exportieren:
// scripts/my-custom-hook.js
/**
* Hook-Metadaten (optional, für Dokumentation und Monitoring)
*/
export const meta = {
name: "My Custom Hook",
description: "Beispiel eines benutzerdefinierten Hooks",
version: "1.0.0",
author: "your-team"
};
/**
* Haupt-Handler-Funktion des Hooks
* @param {Object} event - Standardisiertes Ereignisobjekt
* @param {string} event.type - Ereignistyp (z. B. "task.completed")
* @param {string} event.id - Eindeutige Ereignis-ID
* @param {number} event.timestamp - Unix-Zeitstempel (Millisekunden)
* @param {string} event.agent_id - ID des auslösenden Agenten
* @param {Object} event.payload - Ereignisspezifische Daten
* @param {Object} context - Hook-Ausführungskontext
* @param {Function} context.log - Strukturierte Log-Funktion
* @param {Function} context.agent - Funktion zum Aufrufen der Agenten-API
* @returns {Promise<Object>} Hook-Ausführungsergebnis
*/
export async function handler(event, context) {
const { payload } = event;
const { log, agent } = context;
log.info("Hook ausgelöst", { event_id: event.id, type: event.type });
// Hier Ihre Automatisierungslogik implementieren
const result = await processEvent(payload);
log.info("Hook-Ausführung abgeschlossen", { result });
return { success: true, data: result };
}
async function processEvent(payload) {
// Konkrete Geschäftslogik
return { processed: true, payload };
}
5.2 Syntax der Ereignisfilter
Filter sorgen dafür, dass Ihr Hook nur auf Ereignisse mit bestimmten Bedingungen reagiert und unnötiger Ausführungsaufwand vermieden wird. Filterregeln werden in hooks.yaml definiert:
definitions:
- id: high-priority-task-notifier
event: task.completed
script: scripts/task-notifier.js
filters:
# Alle Filterbedingungen stehen in UND-Beziehung (alle müssen erfüllt sein)
- field: payload.status
operator: eq # eq / neq / gt / gte / lt / lte / contains / matches
value: "success"
- field: payload.duration_ms
operator: gt
value: 5000 # Nur bei Aufgaben mit mehr als 5 Sekunden Laufzeit benachrichtigen
- field: payload.task_type
operator: contains
value: "data-pipeline"
# Regulärer Ausdruck
- field: payload.output.report_path
operator: matches
value: "^/reports/critical/.*\\.pdf$"
5.3 Zugriff auf die Agenten-API
Hook-Skripte können über context.agent direkt mit dem Agenten interagieren, ohne eine separate Verbindung aufbauen zu müssen:
export async function handler(event, context) {
const { agent, log } = context;
// Agentenstatus abfragen
const status = await agent.getStatus();
log.info("Agentenstatus", status);
// Den Agenten eine Aufgabe ausführen lassen
const taskResult = await agent.runTask({
instruction: `Bitte analysieren Sie das folgende Ereignis und erstellen Sie eine Zusammenfassung: ${JSON.stringify(event.payload)}`,
timeout_ms: 60000
});
// Auf den Speicher (Memory) des Agenten zugreifen
const memories = await agent.memory.search({
query: "Anomalie-Aufzeichnungen der letzten Woche",
limit: 10
});
// Einen bestimmten Skill aufrufen
const skillResult = await agent.skill.execute("send-slack-message", {
channel: "#alerts",
message: `Ereignis ${event.type} wurde ausgelöst, Aufgaben-ID: ${event.payload.task_id}`
});
return { success: true };
}
5.4 Fehlerbehandlung und Wiederholungsversuche
Eine robuste Fehlerbehandlung ist ein Muss für Hooks in Produktionsumgebungen:
export async function handler(event, context) {
const { log } = context;
try {
const result = await riskyOperation(event.payload);
return { success: true, data: result };
} catch (error) {
// Wiederholbare temporäre Fehler: RetryableError auslösen
if (error.code === "NETWORK_TIMEOUT" || error.code === "RATE_LIMITED") {
const retryableError = new Error(error.message);
retryableError.retryable = true; // Als wiederholbar markieren
throw retryableError;
}
// Nicht wiederholbare permanente Fehler: protokollieren und elegant zurückkehren
log.error("Hook-Ausführung fehlgeschlagen (kein Retry)", {
error_code: error.code,
error_message: error.message,
event_id: event.id
});
return {
success: false,
error: {
code: error.code,
message: error.message
}
};
}
}
async function riskyOperation(payload) {
// Simulation einer möglicherweise fehlschlagenden Operation
const response = await fetch("https://api.example.com/data", {
method: "POST",
body: JSON.stringify(payload),
signal: AbortSignal.timeout(5000) // 5-Sekunden-Timeout
});
if (!response.ok) {
const err = new Error(`HTTP ${response.status}`);
err.code = response.status === 429 ? "RATE_LIMITED" : "HTTP_ERROR";
throw err;
}
return response.json();
}
Sechs: Praxisbeispiel 1 – CI/CD-Pipeline-Automatisierung
6.1 Szenariobeschreibung
Das Engineering-Team eines mittelständischen Softwareunternehmens möchte nach jedem Merge eines GitHub Pull Requests automatisch Test-, Build- und Deployment-Prozesse auslösen und an jedem kritischen Knotenpunkt den Slack-Kanal benachrichtigen. Die traditionelle Lösung erfordert die Pflege komplexer GitHub-Actions-Workflows, während der gesamte Prozess mit OpenClaw Hooks flexibler durch einen KI-Agenten koordiniert werden kann.[9]
6.2 Architekturentwurf
Gesamter Datenfluss: GitHub Webhook → OpenClaw-Nachrichtenkanal → message.received-Ereignis → Hook → Agent führt Deployment-Aufgabe aus → task.completed-Ereignis → Benachrichtigungs-Hook
6.3 Vollständige Implementierung
Schritt 1: GitHub-Webhook-Kanal konfigurieren
# ~/.openclaw/channels/github-webhook.yaml
channel:
id: github-prod
type: webhook-receiver
config:
port: 18790
path: "/github"
secret: "${GITHUB_WEBHOOK_SECRET}"
events:
- pull_request
- push
Schritt 2: Hook-Konfiguration (hooks.yaml)
definitions:
- id: github-pr-merged-handler
event: message.received
script: scripts/github-pr-deploy.js
filters:
- field: payload.channel_id
operator: eq
value: "github-prod"
- field: payload.content.action
operator: eq
value: "closed"
- field: payload.content.pull_request.merged
operator: eq
value: true
- id: deploy-success-notifier
event: task.completed
script: scripts/notify-deploy-result.js
filters:
- field: payload.task_type
operator: eq
value: "ci-cd-deploy"
Schritt 3: Deployment-Hook-Skript
// scripts/github-pr-deploy.js
export async function handler(event, context) {
const { agent, log } = context;
const pr = event.payload.content.pull_request;
log.info("PR-Merge löst Deployment-Prozess aus", {
pr_number: pr.number,
branch: pr.base.ref,
author: pr.user.login
});
// Deployment-Umgebung basierend auf Ziel-Branch bestimmen
const environment = pr.base.ref === "main" ? "production" : "staging";
// Agenten anweisen, den CI/CD-Prozess auszuführen
const deployTask = await agent.runTask({
type: "ci-cd-deploy",
instruction: `
Bitte führen Sie den folgenden CI/CD-Prozess aus:
1. Neuesten Code abrufen: git pull origin ${pr.base.ref}
2. Abhängigkeiten installieren: npm ci
3. Test-Suite ausführen: npm test
4. Bei bestandenen Tests Produktions-Build erstellen: npm run build
5. In die ${environment}-Umgebung deployen
6. Health-Check durchführen, um erfolgreiches Deployment zu bestätigen
PR-Informationen: #${pr.number} - ${pr.title}
Autor: ${pr.user.login}
`,
metadata: {
pr_number: pr.number,
environment,
branch: pr.base.ref
},
timeout_ms: 600000 // 10 Minuten Timeout
});
return { triggered: true, task_id: deployTask.id };
}
// scripts/notify-deploy-result.js
export async function handler(event, context) {
const { agent, log } = context;
const { status, output, metadata, duration_ms } = event.payload;
const isSuccess = status === "success";
const emoji = isSuccess ? "✅" : "❌";
const durationSec = Math.round(duration_ms / 1000);
const message = `
${emoji} *Deployment ${isSuccess ? "erfolgreich" : "fehlgeschlagen"}* — ${metadata.environment}-Umgebung
*PR*: #${metadata.pr_number}
*Branch*: ${metadata.branch}
*Dauer*: ${durationSec} Sekunden
${isSuccess ? `*Version*: ${output.version || "N/A"}` : `*Fehler*: ${output.error_summary}`}
`.trim();
await agent.skill.execute("send-slack-message", {
channel: "#deployments",
message,
blocks: true
});
log.info("Deployment-Benachrichtigung gesendet", { status, environment: metadata.environment });
return { notified: true };
}
Sieben: Praxisbeispiel 2 – Automatisiertes Unternehmens-Reporting-System
7.1 Szenariobeschreibung
Das KI-Digitaltransformations-Team eines E-Commerce-Unternehmens benötigt jeden Werktag um 8:00 Uhr eine automatische Integration von Daten aus vier verschiedenen Quellen (Bestellsystem, Lagersystem, Werbeplattform, Kundenservice), um einen Management-Tagesbericht zu erstellen und per E-Mail an die zuständigen Führungskräfte zu versenden.
7.2 Hook-Konfiguration
definitions:
- id: daily-business-report
event: schedule.triggered
script: scripts/daily-report.js
schedule: "0 8 * * 1-5" # Montag bis Freitag um 8:00 Uhr
enabled: true
timeout_ms: 120000 # Max. 2 Minuten für die Berichterstellung
- id: weekly-summary-report
event: schedule.triggered
script: scripts/weekly-report.js
schedule: "0 9 * * 1" # Jeden Montag um 9:00 Uhr (Wochenzusammenfassung)
enabled: true
7.3 Berichterstellungs-Hook
// scripts/daily-report.js
export async function handler(event, context) {
const { agent, log } = context;
const { trigger_time } = event.payload;
const reportDate = new Date(trigger_time);
const dateStr = reportDate.toLocaleDateString("de-DE", {
year: "numeric", month: "long", day: "numeric"
});
log.info("Beginne Tagesberichterstellung", { date: dateStr });
// Paralleles Abrufen von Daten aus mehreren Quellen
const [orders, inventory, ads, support] = await Promise.all([
agent.skill.execute("query-database", {
source: "order-system",
query: "SELECT COUNT(*), SUM(amount) FROM orders WHERE date = CURRENT_DATE"
}),
agent.skill.execute("query-api", {
endpoint: "https://inventory-api.internal/daily-summary",
method: "GET"
}),
agent.skill.execute("query-api", {
endpoint: "https://ads-platform.internal/metrics/daily",
method: "GET"
}),
agent.skill.execute("query-database", {
source: "support-system",
query: "SELECT status, COUNT(*) as count FROM tickets WHERE created_date = CURRENT_DATE GROUP BY status"
})
]);
// KI-Agenten die Daten analysieren und eine natürlichsprachliche Zusammenfassung erstellen lassen
const analysiTask = await agent.runTask({
instruction: `
Bitte erstellen Sie auf Basis der folgenden heutigen Geschäftsdaten einen prägnanten Management-Tagesbericht (Deutsch, HTML-Format):
Bestelldaten: ${JSON.stringify(orders.data)}
Lagerbestand: ${JSON.stringify(inventory.data)}
Werbeeffektivität: ${JSON.stringify(ads.data)}
Kundenservice-Tickets: ${JSON.stringify(support.data)}
Der Bericht sollte enthalten:
1. Übersicht der Schlüsselkennzahlen (mit Vergleich zum Vortag)
2. Bemerkenswerte Anomalien (z. B. niedrige Lagerbestände, Anstieg der Rückerstattungen usw.)
3. Handlungsempfehlungen für heute (maximal 3)
Datum: ${dateStr}
`,
timeout_ms: 60000
});
// Bericht per E-Mail versenden
await agent.skill.execute("send-email", {
to: [
"[email protected]",
"[email protected]",
"[email protected]"
],
subject: `【Tagesbericht】${dateStr} – Geschäftszusammenfassung`,
html: analysiTask.output.content,
cc: ["[email protected]"]
});
log.info("Tagesbericht versendet", { date: dateStr });
return { success: true, report_date: dateStr };
}
Acht: Praxisbeispiel 3 – Echtzeit-Anomalieerkennung und Alarmierung
8.1 Szenariobeschreibung
Das SRE-Team einer SaaS-Plattform benötigt eine Benachrichtigung des diensthabenden Ingenieurs innerhalb von 30 Sekunden, wenn die System-Fehlerrate einen Schwellenwert überschreitet oder bestimmte kritische Fehlertypen auftreten, einschließlich einer automatischen Erstdiagnose.
8.2 Mehrstufige Alarmstrategie
definitions:
# Stufe 1: Sofortalarm bei kritischen Fehlern
- id: critical-error-immediate
event: error.occurred
script: scripts/critical-alert.js
filters:
- field: payload.severity
operator: eq
value: "critical"
timeout_ms: 10000 # Der Alarm selbst darf nicht langsam sein
# Stufe 2: Aggregierte Alarme bei hoher Fehlerrate (Alarm-Stürme vermeiden)
- id: error-rate-monitor
event: schedule.triggered
script: scripts/error-rate-check.js
schedule: "*/5 * * * *" # Alle 5 Minuten Fehlerrate prüfen
# Stufe 3: Tracking fehlgeschlagener Skill-Ausführungen
- id: skill-failure-tracker
event: skill.failed
script: scripts/skill-failure-log.js
filters:
- field: payload.error_code
operator: neq
value: "USER_CANCELLED" # Vom Benutzer initiierte Abbrüche ignorieren
8.3 Echtzeit-Alarm-Hook
// scripts/critical-alert.js
export async function handler(event, context) {
const { agent, log } = context;
const { error_code, severity, component, stack_trace, message } = event.payload;
log.warn("Kritischer Fehler löst Alarm aus", { error_code, component });
// Parallele Ausführung: Alarm senden + Erstdiagnose
const [alertResult, diagResult] = await Promise.allSettled([
// Alarmbenachrichtigung (Multi-Channel für garantierte Zustellung)
sendMultiChannelAlert(agent, { error_code, severity, component, message }),
// Agenten eine Erstdiagnose durchführen lassen
agent.runTask({
instruction: `
Bitte führen Sie eine Erstdiagnose für den folgenden Fehler durch:
Fehlercode: ${error_code}
Betroffene Komponente: ${component}
Fehlermeldung: ${message}
Stack Trace: ${stack_trace}
Bitte führen Sie durch:
1. Prüfung der Logs von ${component} der letzten 5 Minuten
2. Überprüfung des Gesundheitsstatus der betroffenen Dienste
3. Auflistung möglicher Ursachen (nach Wahrscheinlichkeit sortiert)
4. Empfohlene Sofortmaßnahmen
`,
timeout_ms: 30000
})
]);
// Diagnoseergebnis an den Alarm anhängen
if (diagResult.status === "fulfilled") {
await agent.skill.execute("update-slack-message", {
channel: "#incidents",
thread_ts: alertResult.value?.slack_ts,
message: `\n*Ergebnis der Erstdiagnose:*\n${diagResult.value.output.content}`
});
}
return { alerted: true, diagnosed: diagResult.status === "fulfilled" };
}
async function sendMultiChannelAlert(agent, errorInfo) {
const urgentMessage = `
🚨 *CRITICAL ERROR* — Sofortige Bearbeitung erforderlich
*Komponente*: ${errorInfo.component}
*Fehlercode*: ${errorInfo.error_code}
*Meldung*: ${errorInfo.message}
*Zeitpunkt*: ${new Date().toLocaleString("de-DE")}
`.trim();
return Promise.all([
agent.skill.execute("send-slack-message", {
channel: "#incidents",
message: urgentMessage,
notify: "@oncall"
}),
agent.skill.execute("send-pagerduty-alert", {
severity: "critical",
summary: `[${errorInfo.component}] ${errorInfo.error_code}`,
details: errorInfo
})
]);
}
8.4 Aggregiertes Fehlerraten-Monitoring
// scripts/error-rate-check.js
// Gleitendes Fenster zur Fehlerratenberechnung, um Fehlalarme durch momentane Spitzen zu vermeiden
const ERROR_THRESHOLD_PERCENT = 5; // 5 % Fehlerraten-Schwellenwert
const WINDOW_MINUTES = 5;
export async function handler(event, context) {
const { agent, log } = context;
const metrics = await agent.skill.execute("query-metrics", {
metric: "error_rate",
window: `${WINDOW_MINUTES}m`,
aggregation: "avg"
});
const errorRate = metrics.data.value;
log.info("Aktuelle Fehlerrate", { error_rate: `${errorRate}%` });
if (errorRate > ERROR_THRESHOLD_PERCENT) {
log.warn("Fehlerrate überschritten", {
current: errorRate,
threshold: ERROR_THRESHOLD_PERCENT
});
await agent.skill.execute("send-slack-message", {
channel: "#monitoring",
message: `⚠️ Fehlerraten-Alarm: Die durchschnittliche Fehlerrate der letzten ${WINDOW_MINUTES} Minuten beträgt ${errorRate.toFixed(2)} % und überschreitet den Schwellenwert von ${ERROR_THRESHOLD_PERCENT} %`
});
}
return { error_rate: errorRate, threshold_exceeded: errorRate > ERROR_THRESHOLD_PERCENT };
}
Neun: Performance-Optimierung und Best Practices
9.1 Hook-Performance-Benchmarks
Die folgenden Performance-Benchmark-Ergebnisse wurden auf einer Standard-Entwicklungsmaschine (Apple M2, 16 GB RAM) gemessen:
| Testszenario | P50-Latenz | P95-Latenz | P99-Latenz | Max. Durchsatz |
|---|---|---|---|---|
| Einfacher Logging-Hook | 3 ms | 8 ms | 15 ms | 500 Ereignisse/s |
| Hook mit HTTP-Anfrage | 45 ms | 180 ms | 350 ms | 80 Ereignisse/s |
| Hook mit Agenten-API-Aufruf | 120 ms | 400 ms | 800 ms | 30 Ereignisse/s |
| Hook mit LLM-Inferenz | 2.500 ms | 8.000 ms | 15.000 ms | 5 Ereignisse/s |
9.2 Debounce- und Throttle-Muster
In Hochfrequenz-Ereignisszenarien (z. B. Hunderte von skill.executed-Ereignissen pro Sekunde) kann das direkte Auslösen von Hooks zu einer Überlastung führen. Es empfiehlt sich, Debounce- oder Throttle-Muster einzusetzen:
// scripts/debounced-aggregator.js
// Debounce auf Hook-Skript-Ebene implementieren: Ereignisse über 10 Sekunden sammeln und dann im Batch verarbeiten
import { createDebouncer } from "@openclaw/hooks-utils";
const debounce = createDebouncer({ window_ms: 10000 });
export async function handler(event, context) {
const { agent, log } = context;
// Ereignis zum Puffer hinzufügen, Batch-Verarbeitung nach 10 Sekunden ohne neues Ereignis
const batch = await debounce.accumulate(event);
if (!batch) {
// Auslösebedingung noch nicht erreicht, still zurückkehren
return { queued: true };
}
log.info("Batch-Verarbeitung von Ereignissen", { count: batch.length });
await processBatch(agent, batch);
return { processed: batch.length };
}
async function processBatch(agent, events) {
// Batch-Verarbeitungslogik
const summary = events.map(e => e.payload).reduce(/* Aggregationslogik */);
await agent.skill.execute("send-batch-notification", { summary });
}
9.3 Hook-Parallelitätssteuerung
Über den concurrency-Parameter steuern Sie die Anzahl gleichzeitig ausgeführter Hooks und richten für unterschiedliche Prioritätsstufen separate Queues ein:
hooks:
execution:
queues:
# Hochprioritäts-Queue: Alarm-Hooks
- id: critical
concurrency: 8
priority: 100
hooks: ["critical-error-immediate", "github-pr-merged-handler"]
# Standard-Queue: Allgemeine Automatisierung
- id: standard
concurrency: 4
priority: 50
hooks: ["task-complete-notifier", "skill-failure-tracker"]
# Niedrigprioritäts-Queue: Berichte und Statistiken
- id: batch
concurrency: 2
priority: 10
hooks: ["daily-business-report", "weekly-summary-report"]
9.4 Idempotenz-Design
Wenn der Wiederholungsmechanismus aktiviert ist, kann ein Hook mehrfach ausgeführt werden. Die Sicherstellung der Idempotenz ist von entscheidender Bedeutung:
// scripts/idempotent-hook.js
export async function handler(event, context) {
const { agent, log } = context;
// Ereignis-ID als Idempotenz-Schlüssel verwenden
const idempotencyKey = `hook:deploy:${event.id}`;
// Prüfen, ob dieses Ereignis bereits verarbeitet wurde
const alreadyProcessed = await agent.memory.get(idempotencyKey);
if (alreadyProcessed) {
log.info("Ereignis bereits verarbeitet, doppelte Ausführung wird übersprungen", { event_id: event.id });
return { skipped: true, reason: "already_processed" };
}
// Eigentliche Geschäftslogik ausführen
const result = await performDeployment(event.payload);
// Verarbeitungsstatus speichern (24-Stunden-TTL, um permanente Speicherbelegung zu vermeiden)
await agent.memory.set(idempotencyKey, {
processed_at: Date.now(),
result_summary: result.summary
}, { ttl_seconds: 86400 });
return result;
}
Zehn: Sicherheitsaspekte und Risikomanagement
10.1 Bedrohungsmodell für Hooks
Die wichtigsten Sicherheitsbedrohungen für das OpenClaw Hooks-System umfassen: Hook-Injection-Angriffe (bösartige Ereignis-Payloads, die Hooks zu unbeabsichtigten Aktionen veranlassen), Privilege Escalation (Hook-Skripte versuchen, auf Ressourcen außerhalb des autorisierten Bereichs zuzugreifen) und Supply-Chain-Angriffe (bösartige Abhängigkeitspakete in Hook-Skripten). Sowohl CrowdStrike als auch Cisco betonen in ihren Sicherheitsberichten, dass Hook-Mechanismen in KI-Agenten-Frameworks ein strenges Isolationsdesign erfordern.[7][8]
10.2 Sandbox-Isolationsmechanismus
Die Hook-Ausführungsengine von OpenClaw verwendet eine mehrstufige Sandbox:
- Prozessisolation: Jeder Hook wird in einem separaten Kindprozess ausgeführt – ein Absturz des Hauptprozesses beeinträchtigt das Gateway nicht.
- Speicherisolation: Durch
max_memory_mb-Limits wird verhindert, dass ein einzelner Hook den gesamten Systemspeicher erschöpft. - Netzwerkisolation: Standardmäßig (
allow_network: false) kann ein Hook-Skript keine ausgehenden Netzwerkanfragen stellen und muss kontrollierte Schnittstellen der Agenten-API nutzen. - Dateisystembeschränkung: Über
allow_fswerden die Festplattenzugriffsrechte des Hooks präzise gesteuert.
10.3 Best Practices für die Sicherheit von Hook-Skripten
// Sicheres Hook-Skript-Beispiel: Strikte Payload-Validierung
export async function handler(event, context) {
const { log } = context;
// 1. Strikte Validierung der Payload-Struktur (Schutz gegen fehlerhafte bösartige Ereignisse)
if (!isValidPayload(event.payload)) {
log.warn("Payload-Validierung fehlgeschlagen, Ausführung verweigert", {
event_id: event.id,
payload_keys: Object.keys(event.payload || {})
});
return { success: false, reason: "invalid_payload" };
}
// 2. Keinem ausführbaren Inhalt im Payload vertrauen
const safeName = sanitizeString(event.payload.name); // Niemals direkt eval()
// 3. Keine sensiblen Daten in Logs aufzeichnen
log.info("Ereignis wird verarbeitet", {
event_id: event.id,
// Nur nicht-sensible Metadaten protokollieren
event_type: event.type,
agent_id: event.agent_id
// Nicht protokollieren: payload.api_key, payload.password usw.
});
// ...Geschäftslogik
}
function isValidPayload(payload) {
if (!payload || typeof payload !== "object") return false;
if (typeof payload.task_id !== "string") return false;
if (!["success", "failed", "cancelled"].includes(payload.status)) return false;
return true;
}
function sanitizeString(input) {
if (typeof input !== "string") return "";
// Potenzielle Command-Injection-Zeichen entfernen
return input.replace(/[;&|`$(){}[\]<>]/g, "").substring(0, 255);
}
10.4 Audit-Log-Konfiguration
Aktivieren Sie vollständige Audit-Logs, um sicherzustellen, dass alle Hook-Ausführungen nachvollziehbar sind:
hooks:
logging:
audit: true
audit_path: ".openclaw/logs/hooks-audit.jsonl"
# JSON-Struktur jedes Audit-Eintrags:
# {
# "timestamp": "2026-02-22T08:00:00.000Z",
# "hook_id": "daily-business-report",
# "event_id": "evt_abc123",
# "event_type": "schedule.triggered",
# "duration_ms": 4521,
# "status": "success",
# "sandbox_metrics": {
# "cpu_ms": 120,
# "memory_peak_mb": 45,
# "network_requests": 0
# }
# }
10.5 Verwaltung von Hook-Abhängigkeitspaketen
Die node_modules der Hook-Skripte sind vollständig von der Hauptanwendung isoliert. Es wird empfohlen, folgende Grundsätze zu beachten:
# .openclaw/hooks/package.json
{
"name": "openclaw-hooks",
"version": "1.0.0",
"private": true,
"dependencies": {
"@openclaw/hooks-utils": "^1.2.0"
# Drittanbieter-Abhängigkeiten minimieren
# Bevorzugt offizielle OpenClaw-Werkzeugpakete verwenden
# Jede Abhängigkeit sollte mit npm audit geprüft werden
}
}
Führen Sie regelmäßig npm audit durch, um bekannte Schwachstellen zu erkennen, und richten Sie automatisierte CI-Prüfungen ein, um die Sicherheit der Hook-Abhängigkeitspakete dauerhaft zu gewährleisten:
# Hook-Sicherheitsscan in CI/CD integrieren
- name: Audit hook dependencies
run: |
cd .openclaw/hooks
npm audit --audit-level=high
npm run lint # Sicherstellen, dass Hook-Skripte die statische Analyse bestehen
10.6 Notfall-Deaktivierungsmechanismus
Wenn Sie bei einem Hook ein Sicherheitsproblem vermuten, können Sie ihn sofort deaktivieren, ohne die Konfiguration ändern zu müssen:
# Einzelnen Hook sofort deaktivieren (kein Gateway-Neustart erforderlich)
openclaw hooks disable critical-error-immediate
# Status aller aktuellen Hooks anzeigen
openclaw hooks list --verbose
# Erneut aktivieren
openclaw hooks enable critical-error-immediate
Fazit: Hooks lassen KI-Agenten wirklich in die Engineering-Kultur des Unternehmens einwachsen
Das OpenClaw Hooks-System repräsentiert nicht nur ein technisches Feature, sondern einen entscheidenden Schritt auf dem Weg von KI-Agenten in die Produktionsumgebungen von Unternehmen. Durch die Zero-Polling-ereignisgesteuerte Architektur verwandeln Hooks KI-Agenten von „passiven Antwortwerkzeugen" in „proaktiv reagierende Systeme", die sich nahtlos in CI/CD-Prozesse, Monitoring-Systeme und die bestehende DevOps-Kultur integrieren lassen.
Die sechs Praxisbeispiele in diesem Artikel zeigen, dass die Einsatzmöglichkeiten von Hooks weit darüber hinausgehen – jedes Szenario, das „Wenn X eintritt, führe automatisch Y aus" erfordert, ist ein Anwendungsfall für Hooks. Mit der fortschreitenden Reifung des OpenClaw-Ökosystems erwarten wir, dass der Hooks Marketplace zu einer wichtigen Plattform für den unternehmensübergreifenden Austausch von Automatisierungslogik wird.[3]
Im Bereich Sicherheit zeigen die Forschungsarbeiten von CrowdStrike und Cisco, dass die Automatisierungsfähigkeiten von KI-Agenten ein zweischneidiges Schwert sind.[7][8] Die Einhaltung der in diesem Artikel vorgestellten Sicherheits-Best-Practices – strenge Sandbox-Isolation, Prinzip der geringsten Privilegien, vollständige Audit-Logs – ist die grundlegende Anforderung für ein verantwortungsvolles Hooks-Deployment.
Wenn Sie erwägen, OpenClaw Hooks für Ihr Team einzuführen, empfehlen wir, mit einem risikoarmen Logging- oder Benachrichtigungs-Hook zu beginnen und nach wachsendem Vertrauen schrittweise auf komplexere Automatisierungsszenarien zu erweitern. Die Lernkurve des Hooks-Systems ist relativ flach, aber der Nutzen – Ressourceneinsparung, Reaktionsgeschwindigkeit und die Befreiung von Ingenieurkapazitäten von repetitiven Aufgaben – wächst exponentiell mit zunehmender Nutzungstiefe.



