Vai al contenuto principale

Hooks

Gli hook sono piccoli script che vengono eseguiti quando accade qualcosa all’interno del Gateway. Vengono individuati automaticamente dalle directory e possono essere ispezionati con openclaw hooks. In OpenClaw esistono due tipi di hook:
  • Hook interni (questa pagina): vengono eseguiti all’interno del Gateway quando si attivano eventi dell’agente, come /new, /reset, /stop o eventi del ciclo di vita.
  • Webhook: endpoint HTTP esterni che consentono ad altri sistemi di attivare lavoro in OpenClaw. Vedi Webhooks.
Gli hook possono anche essere inclusi nei plugin. openclaw hooks list mostra sia gli hook standalone sia quelli gestiti dai plugin.

Avvio rapido

# Elenca gli hook disponibili
openclaw hooks list

# Abilita un hook
openclaw hooks enable session-memory

# Controlla lo stato degli hook
openclaw hooks check

# Ottieni informazioni dettagliate
openclaw hooks info session-memory

Tipi di evento

EventoQuando si attiva
command:newComando /new emesso
command:resetComando /reset emesso
command:stopComando /stop emesso
commandQualsiasi evento di comando (listener generale)
session:compact:beforePrima che la compattazione riassuma la cronologia
session:compact:afterDopo il completamento della compattazione
session:patchQuando vengono modificate le proprietà della sessione
agent:bootstrapPrima che i file bootstrap del workspace vengano inseriti
gateway:startupDopo l’avvio dei canali e il caricamento degli hook
message:receivedMessaggio in ingresso da qualsiasi canale
message:transcribedDopo il completamento della trascrizione audio
message:preprocessedDopo il completamento di tutta l’elaborazione di media e link
message:sentMessaggio in uscita consegnato

Scrittura degli hook

Struttura di un hook

Ogni hook è una directory che contiene due file:
my-hook/
├── HOOK.md          # Metadati + documentazione
└── handler.ts       # Implementazione dell'handler

Formato di HOOK.md

---
name: my-hook
description: "Breve descrizione di ciò che fa questo hook"
metadata:
  { "openclaw": { "emoji": "🔗", "events": ["command:new"], "requires": { "bins": ["node"] } } }
---

# My Hook

La documentazione dettagliata va qui.
Campi dei metadati (metadata.openclaw):
CampoDescrizione
emojiEmoji visualizzata per la CLI
eventsArray di eventi da ascoltare
exportExport nominato da usare (predefinito: "default")
osPiattaforme richieste (ad es. ["darwin", "linux"])
requiresbins, anyBins, env o percorsi config richiesti
alwaysIgnora i controlli di idoneità (booleano)
installMetodi di installazione

Implementazione dell’handler

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;
Ogni evento include: type, action, sessionKey, timestamp, messages (usa push per inviare all’utente) e context (dati specifici dell’evento).

Punti salienti del contesto evento

Eventi di comando (command:new, command:reset): context.sessionEntry, context.previousSessionEntry, context.commandSource, context.workspaceDir, context.cfg. Eventi di messaggio (message:received): context.from, context.content, context.channelId, context.metadata (dati specifici del provider inclusi senderId, senderName, guildId). Eventi di messaggio (message:sent): context.to, context.content, context.success, context.channelId. Eventi di messaggio (message:transcribed): context.transcript, context.from, context.channelId, context.mediaPath. Eventi di messaggio (message:preprocessed): context.bodyForAgent (corpo finale arricchito), context.from, context.channelId. Eventi bootstrap (agent:bootstrap): context.bootstrapFiles (array modificabile), context.agentId. Eventi patch della sessione (session:patch): context.sessionEntry, context.patch (solo i campi modificati), context.cfg. Solo i client con privilegi possono attivare eventi patch. Eventi di compattazione: session:compact:before include messageCount, tokenCount. session:compact:after aggiunge compactedCount, summaryLength, tokensBefore, tokensAfter.

Individuazione degli hook

Gli hook vengono individuati da queste directory, in ordine di precedenza crescente per la sovrascrittura:
  1. Hook inclusi: distribuiti con OpenClaw
  2. Hook dei plugin: hook inclusi nei plugin installati
  3. Hook gestiti: ~/.openclaw/hooks/ (installati dall’utente, condivisi tra workspace). Le directory extra da hooks.internal.load.extraDirs condividono questa precedenza.
  4. Hook del workspace: <workspace>/hooks/ (per agente, disabilitati per impostazione predefinita finché non vengono abilitati esplicitamente)
Gli hook del workspace possono aggiungere nuovi nomi di hook, ma non possono sovrascrivere hook inclusi, gestiti o forniti da plugin con lo stesso nome.

Pacchetti di hook

I pacchetti di hook sono pacchetti npm che esportano hook tramite openclaw.hooks in package.json. Installa con:
openclaw plugins install <path-or-spec>
Le specifiche npm sono solo di registro (nome pacchetto + versione esatta facoltativa o dist-tag). Le specifiche Git/URL/file e gli intervalli semver vengono rifiutati.

Hook inclusi

HookEventiCosa fa
session-memorycommand:new, command:resetSalva il contesto della sessione in <workspace>/memory/
bootstrap-extra-filesagent:bootstrapInserisce file bootstrap aggiuntivi da pattern glob
command-loggercommandRegistra tutti i comandi in ~/.openclaw/logs/commands.log
boot-mdgateway:startupEsegue BOOT.md all’avvio del gateway
Abilita qualsiasi hook incluso:
openclaw hooks enable <hook-name>

Dettagli di session-memory

Estrae gli ultimi 15 messaggi utente/assistente, genera uno slug descrittivo per il nome file tramite LLM e salva in <workspace>/memory/YYYY-MM-DD-slug.md. Richiede che workspace.dir sia configurato.

Configurazione di bootstrap-extra-files

{
  "hooks": {
    "internal": {
      "entries": {
        "bootstrap-extra-files": {
          "enabled": true,
          "paths": ["packages/*/AGENTS.md", "packages/*/TOOLS.md"]
        }
      }
    }
  }
}
I percorsi vengono risolti in modo relativo al workspace. Vengono caricati solo i nomi base bootstrap riconosciuti (AGENTS.md, SOUL.md, TOOLS.md, IDENTITY.md, USER.md, HEARTBEAT.md, BOOTSTRAP.md, MEMORY.md).

Hook dei plugin

I plugin possono registrare hook tramite il Plugin SDK per un’integrazione più profonda: intercettazione delle chiamate agli strumenti, modifica dei prompt, controllo del flusso dei messaggi e altro ancora. Il Plugin SDK espone 28 hook che coprono risoluzione del modello, ciclo di vita dell’agente, flusso dei messaggi, esecuzione degli strumenti, coordinamento dei subagenti e ciclo di vita del gateway. Per il riferimento completo degli hook dei plugin, inclusi before_tool_call, before_agent_reply, before_install e tutti gli altri hook dei plugin, vedi Plugin Architecture.

Configurazione

{
  "hooks": {
    "internal": {
      "enabled": true,
      "entries": {
        "session-memory": { "enabled": true },
        "command-logger": { "enabled": false }
      }
    }
  }
}
Variabili d’ambiente per hook:
{
  "hooks": {
    "internal": {
      "entries": {
        "my-hook": {
          "enabled": true,
          "env": { "MY_CUSTOM_VAR": "value" }
        }
      }
    }
  }
}
Directory hook extra:
{
  "hooks": {
    "internal": {
      "load": {
        "extraDirs": ["/path/to/more/hooks"]
      }
    }
  }
}
Il formato di configurazione legacy con array hooks.internal.handlers è ancora supportato per retrocompatibilità, ma i nuovi hook dovrebbero usare il sistema basato sull’individuazione.

Riferimento CLI

# Elenca tutti gli hook (aggiungi --eligible, --verbose, o --json)
openclaw hooks list

# Mostra informazioni dettagliate su un hook
openclaw hooks info <hook-name>

# Mostra un riepilogo di idoneità
openclaw hooks check

# Abilita/disabilita
openclaw hooks enable <hook-name>
openclaw hooks disable <hook-name>

Buone pratiche

  • Mantieni gli handler rapidi. Gli hook vengono eseguiti durante l’elaborazione dei comandi. Avvia lavori pesanti in modalità fire-and-forget con void processInBackground(event).
  • Gestisci gli errori con eleganza. Racchiudi le operazioni rischiose in try/catch; non lanciare eccezioni così gli altri handler possono continuare a essere eseguiti.
  • Filtra subito gli eventi. Restituisci immediatamente se il tipo/azione dell’evento non è rilevante.
  • Usa chiavi evento specifiche. Preferisci "events": ["command:new"] rispetto a "events": ["command"] per ridurre l’overhead.

Risoluzione dei problemi

Hook non individuato

# Verifica la struttura della directory
ls -la ~/.openclaw/hooks/my-hook/
# Dovrebbe mostrare: HOOK.md, handler.ts

# Elenca tutti gli hook individuati
openclaw hooks list

Hook non idoneo

openclaw hooks info my-hook
Controlla la presenza di binari mancanti (PATH), variabili d’ambiente, valori di configurazione o compatibilità del sistema operativo.

Hook non in esecuzione

  1. Verifica che l’hook sia abilitato: openclaw hooks list
  2. Riavvia il processo gateway in modo che gli hook vengano ricaricati.
  3. Controlla i log del gateway: ./scripts/clawlog.sh | grep hook

Correlati