Skip to main content

Session-Hooks

Mit hooks können Sie sich in die einzelnen Lebenszyklusphasen einer Copilot-Session einklinken. Tool-Ausführungssteuerung, Audit-Logs, Prompt-Anreicherung, Fehlerbehandlung usw. lassen sich hinzufügen, ohne die Kernimplementierung zu ändern. Diese Funktion ist unabhängig von deklarativen hooks in Definitionen benutzerdefinierter Agenten und vom Laden dateibasierter Hooks. Für Einstellungen pro Agent siehe Benutzerdefinierte Agenten.

Discovery dateibasierter Hooks

In hookDirectories können Sie explizite Roots angeben, in denen dateibasierte Hooks gesucht werden. Diese dienen nur der Discovery und gewähren dem Agenten keinen allgemeinen Dateizugriff. Explizite Roots sind auch dann nutzbar, wenn enableConfigDiscovery oder enableFileHooks deaktiviert ist. Relative Pfade werden einmalig relativ zu dem workingDirectory aufgelöst, das beim Setzen gilt.
  • Weggelassen oder null: Andere Discovery-Quellen bleiben unverändert
  • []: Entfernt nur die explizit gesetzten SDK-Roots
Deaktivierungseinstellungen für Hook-Quellen und Managed Settings gelten weiterhin. enableFileHooks steuert Datei-Hooks aus dem Repository (.github/hooks/ und Roots aus vertrauenswürdigen Repository-Einstellungen). Explizite hookDirectories und PHP-Callback-hooks werden dadurch nicht deaktiviert.

Ablauf der Hooks

Grundlegende Verwendung

Verfügbare Hooks

Wird null zurückgegeben, läuft das Standardverhalten weiter.

Prompts blockieren

onUserPromptSubmitted kann einen Prompt ablehnen, indem es decision: 'block' zurückgibt. Bei einer Ablehnung wird kein Modell-Turn gestartet und auch keine User-Nachricht aufgezeichnet. Wenn Sie reason angeben, wird der Inhalt in ein temporäres session.warning-Event mit warningType: "policy_blocked" aufgenommen.

Typische Anwendungsfälle

1) Berechtigungssteuerung (Ausführungskontrolle)

  • Zulassene Tools per Allow-List über onPreToolUse
  • Destruktive Operationen mit permissionDecision: 'ask' menschlich freigeben lassen
  • Über permissionDecisionReason den Ablehnungsgrund explizit machen
  • Kandidaten für toolName finden Sie in der Liste unter Tools (z. B. view, glob, bash)

2) Auditing / Compliance

  • Audit-Ereignisse durch Kombination der Lebenszyklus-Hooks sammeln
  • Gesammelte Daten pro Session-ID persistieren

3) Prompt-Anreicherung

  • In onSessionStart Projektinformationen (Sprache, Framework, Konventionen) via additionalContext ergänzen
  • In onUserPromptSubmitted Shortcuts (/fix, /test) expandieren

4) Ergebnisfilterung

  • In onPostToolUse API-Keys / Tokens / Passwörter maskieren
  • Zu lange Ergebnisse zusammenfassen und Details nur bei Bedarf ausgeben

5) Fehler-Recovery

  • In onErrorOccurred nur bei model_call und recoverable=true einen retry ausführen
  • Nicht wiederherstellbare Fälle über userNotification knapp an den Nutzer melden

6) Session-Metriken

  • In onSessionStart die Startzeit erfassen
  • In onPreToolUse / onUserPromptSubmitted Zähler aktualisieren
  • In onSessionEnd Dauer, Anzahl der Tool-Aufrufe und Abschlussgrund ausgeben

Hook-Input-/Output-Typen

Gemeinsame Eingabe (BaseHookInput)

agentId / agentType / parentAgentId sind in Hooks verfügbar, deren Akteur ein Subagent ist. In Hooks des Root-Agenten sind sie nicht enthalten. Ältere Runtimes lassen die Felder ganz weg, wenn keine Informationen vorliegen. Daher können alle drei null sein.

PreToolUseHookInput

PreToolUseHookOutput

PostToolUseHookInput

PostToolUseHookOutput

UserPromptSubmittedHookInput

UserPromptSubmittedHookOutput

SessionStartHookInput

SessionStartHookOutput

SessionEndHookInput

SessionEndHookOutput

ErrorOccurredHookInput

ErrorOccurredHookOutput

ToolResultObject

Standard-Objekt für Tool-Ausführungsergebnisse.

Best Practices

  1. Führen Sie schwere synchrone Verarbeitung nicht direkt im Hook aus. Bei Bedarf asynchron auslagern.
  2. Wenn keine Änderung nötig ist, geben Sie null zurück und überlassen den Standardablauf.
  3. Setzen Sie permissionDecision möglichst explizit.
  4. Unterdrücken Sie kritische Fehler nicht zu stark – halten Sie Log-/Notification-Pfade offen.
  5. Verwalten Sie Session-bezogenen Zustand auf Basis der Session-ID und räumen Sie ihn in onSessionEnd auf.
Aktuelle Informationen finden Sie im GitHub-Repository.
Zuletzt geändert am 19. Oktober 2026