agent-sdk/hooks.md +14 −14
36 </Step>36 </Step>
37 37
38 <Step title="Ihr Callback gibt eine Entscheidung zurück">38 <Step title="Ihr Callback gibt eine Entscheidung zurück">
3939 Nach dem Ausführen von Operationen (Protokollierung, API-Aufrufe, Validierung) gibt Ihr Callback ein [Ausgabeobjekt](#outputs) zurück, das dem Agent mitteilt, was zu tun ist: die Operation zulassen, blockieren, die Eingabe ändern oder Kontext in das Gespräch einfügen. Nach dem Ausführen von Operationen (Protokollierung, API-Aufrufe, Validierung) gibt Ihr Callback ein [Ausgabeobjekt](#outputs) zurück, das dem Agenten mitteilt, was zu tun ist: die Operation zulassen, blockieren, die Eingabe ändern oder Kontext in die Konversation einfügen.
40 </Step>40 </Step>
41</Steps>41</Steps>
42 42
140 ```140 ```
141</CodeGroup>141</CodeGroup>
142 142
143143Wenn Sie eines der Skripte ausführen, versucht Claude, die `.env`-Datei zu erstellen, der Hook verweigert den Tool-Aufruf, und Claudes endgültige Antwort erklärt, dass es keine `.env`-Dateien erstellen kann.Wenn Sie eines der Skripte ausführen, versucht Claude, die `.env`-Datei zu erstellen, und der Hook verweigert den Tool-Aufruf.
144 144
145<h2 id="available-hooks">145<h2 id="available-hooks">
146 Verfügbare Hooks146 Verfügbare Hooks
179| `ConfigChange` | Nein | Ja | Konfigurationsdatei ändert sich | Einstellungen dynamisch neu laden |179| `ConfigChange` | Nein | Ja | Konfigurationsdatei ändert sich | Einstellungen dynamisch neu laden |
180| `InstructionsLoaded` | Nein | Ja | Eine `CLAUDE.md`- oder Regeldatei wird in den Kontext geladen | Überprüfen, welche Anweisungsdateien geladen werden |180| `InstructionsLoaded` | Nein | Ja | Eine `CLAUDE.md`- oder Regeldatei wird in den Kontext geladen | Überprüfen, welche Anweisungsdateien geladen werden |
181| `WorktreeCreate` | Nein | Ja | Git Worktree erstellt | Isolierte Workspaces verfolgen |181| `WorktreeCreate` | Nein | Ja | Git Worktree erstellt | Isolierte Workspaces verfolgen |
182182| `WorktreeRemove` | Nein | Ja | Git Worktree entfernt | Workspace-Ressourcen bereinigen || `WorktreeRemove` | Nein | Ja | Ein durch einen `WorktreeCreate`-Hook erstellter Worktree wird entfernt | Workspace-Ressourcen bereinigen |
183| `CwdChanged` | Nein | Ja | Das Arbeitsverzeichnis ändert sich während einer Sitzung | Umgebungsvariablen pro Verzeichnis neu laden |183| `CwdChanged` | Nein | Ja | Das Arbeitsverzeichnis ändert sich während einer Sitzung | Umgebungsvariablen pro Verzeichnis neu laden |
184| `FileChanged` | Nein | Ja | Eine überwachte Datei wird geändert, erstellt oder gelöscht | Konfiguration neu laden, wenn sich Projektdateien ändern |184| `FileChanged` | Nein | Ja | Eine überwachte Datei wird geändert, erstellt oder gelöscht | Konfiguration neu laden, wenn sich Projektdateien ändern |
185| `DirectoryAdded` | Nein | Ja | Ein Arbeitsverzeichnis wird während einer Sitzung hinzugefügt | Abhängigkeiten für ein während der Sitzung hinzugefügtes Repository installieren |185| `DirectoryAdded` | Nein | Ja | Ein Arbeitsverzeichnis wird während einer Sitzung hinzugefügt | Abhängigkeiten für ein während der Sitzung hinzugefügtes Repository installieren |
249 249
250* **Eingabedaten:** ein typisiertes Objekt mit Ereignisdetails. Jeder Hook-Typ hat seine eigene Eingabeform. Beispielsweise enthält `PreToolUseHookInput` `tool_name` und `tool_input`, während `NotificationHookInput` `message` enthält. Siehe die vollständigen Typdefinitionen in den [TypeScript](/docs/de/agent-sdk/typescript#hookinput) und [Python](/docs/de/agent-sdk/python#hookinput) SDK-Referenzen.250* **Eingabedaten:** ein typisiertes Objekt mit Ereignisdetails. Jeder Hook-Typ hat seine eigene Eingabeform. Beispielsweise enthält `PreToolUseHookInput` `tool_name` und `tool_input`, während `NotificationHookInput` `message` enthält. Siehe die vollständigen Typdefinitionen in den [TypeScript](/docs/de/agent-sdk/typescript#hookinput) und [Python](/docs/de/agent-sdk/python#hookinput) SDK-Referenzen.
251 * Alle Hook-Eingaben teilen `session_id`, `cwd` und `hook_event_name`.251 * Alle Hook-Eingaben teilen `session_id`, `cwd` und `hook_event_name`.
252252 * `agent_id` und `agent_type` werden ausgefüllt, wenn der Hook in einem Subagent ausgelöst wird. In TypeScript befinden sich diese in der Basis-Hook-Eingabe und sind für alle Hook-Typen verfügbar. In Python sind sie optionale Felder auf `PreToolUse`, `PostToolUse`, `PostToolUseFailure` und `PermissionRequest`, und erforderliche Felder auf `SubagentStart` und `SubagentStop`. * `agent_id` und `agent_type` werden ausgefüllt, wenn der Hook in einem Subagenten ausgelöst wird. In TypeScript befinden sich diese in der Basis-Hook-Eingabe und sind für alle Hook-Typen verfügbar. In Python sind sie optionale Felder auf `PreToolUse`, `PostToolUse`, `PostToolUseFailure` und `PermissionRequest`, und erforderliche Felder auf `SubagentStart` und `SubagentStop`.
253* **Tool-Verwendungs-ID** (`str | None` / `string | undefined`): korreliert `PreToolUse` und `PostToolUse` Ereignisse für denselben Tool-Aufruf.253* **Tool-Verwendungs-ID** (`str | None` / `string | undefined`): korreliert `PreToolUse` und `PostToolUse` Ereignisse für denselben Tool-Aufruf.
254* **Kontext:** In TypeScript enthält eine `signal` Eigenschaft (`AbortSignal`) für Abbruch. In Python ist dieses Argument für zukünftige Verwendung reserviert.254* **Kontext:** In TypeScript enthält eine `signal` Eigenschaft (`AbortSignal`) für Abbruch. In Python ist dieses Argument für zukünftige Verwendung reserviert.
255 255
262* **Top-Level-Felder** werden bei jedem Ereignis akzeptiert: `systemMessage` zeigt eine Nachricht für den Benutzer an, und `continue` (`continue_` in Python) bestimmt, ob der Agent nach diesem Hook weiterläuft. Einige Ereignisse verwerfen sie oder liefern sie an anderer Stelle. Jeder [Abschnitt des Ereignisses](/docs/de/hooks#hook-events) auf der Hooks-Seite sagt, wo sie landen.262* **Top-Level-Felder** werden bei jedem Ereignis akzeptiert: `systemMessage` zeigt eine Nachricht für den Benutzer an, und `continue` (`continue_` in Python) bestimmt, ob der Agent nach diesem Hook weiterläuft. Einige Ereignisse verwerfen sie oder liefern sie an anderer Stelle. Jeder [Abschnitt des Ereignisses](/docs/de/hooks#hook-events) auf der Hooks-Seite sagt, wo sie landen.
263* **`hookSpecificOutput`** steuert die aktuelle Operation. Die Felder, die Sie darin setzen, hängen vom Hook-Ereignistyp ab:263* **`hookSpecificOutput`** steuert die aktuelle Operation. Die Felder, die Sie darin setzen, hängen vom Hook-Ereignistyp ab:
264 * Für `PreToolUse` Hooks ist dies der Ort, an dem Sie `permissionDecision` (`"allow"`, `"deny"`, `"ask"` oder `"defer"`), `permissionDecisionReason` und `updatedInput` setzen. Wenn Sie `"defer"` zurückgeben, endet der Turn mit einer Ergebnisnachricht, deren `stop_reason` `"tool_deferred"` ist, sodass Sie den Aufruf [später fortsetzen](/docs/de/hooks#defer-a-tool-call-for-later) können.264 * Für `PreToolUse` Hooks ist dies der Ort, an dem Sie `permissionDecision` (`"allow"`, `"deny"`, `"ask"` oder `"defer"`), `permissionDecisionReason` und `updatedInput` setzen. Wenn Sie `"defer"` zurückgeben, endet der Turn mit einer Ergebnisnachricht, deren `stop_reason` `"tool_deferred"` ist, sodass Sie den Aufruf [später fortsetzen](/docs/de/hooks#defer-a-tool-call-for-later) können.
265265 * Für `PostToolUse` Hooks können Sie `additionalContext` setzen, um Informationen zum Tool-Ergebnis anzuhängen. Um die Ausgabe des Tools zu ersetzen, bevor Claude sie sieht, setzen Sie `updatedToolOutput`, das für jedes Tool in beiden SDKs funktioniert. Das ältere `updatedMCPToolOutput` Feld ersetzt nur MCP-Tool-Ausgabe und ist veraltet. * Für `PostToolUse` Hooks können Sie `additionalContext` setzen, um Informationen zum Tool-Ergebnis anzuhängen. Um die Ausgabe des Tools zu ersetzen, bevor Claude sie sieht, setzen Sie `updatedToolOutput`, das für jedes Tool in beiden SDKs funktioniert. Das ältere `updatedMCPToolOutput` Feld ersetzt nur MCP-Tool-Ausgabe.
266 * Im TypeScript SDK kann ein `PostToolUse` Callback auch `classifierContext` zurückgeben, eine kurze Notiz über das Ergebnis des Tool-Aufrufs für den Berechtigungsklassifikator des [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode). Da Ihr Callback in Ihrem eigenen Anwendungsprozess ausgeführt wird, kann der Klassifikator eine Benutzeraussage, die Sie in der Notiz weitergeben, als Benutzerabsicht gewichten. Das Feld erfordert TypeScript Agent SDK v0.3.236 oder später. [Ein Ergebnis für den Auto-Modus-Klassifikator annotieren](/docs/de/hooks#annotate-a-result-for-the-auto-mode-classifier) behandelt die Längenbegrenzung, die Nur-Synchron-Regel und was nicht in die Notiz gehört.266 * Im TypeScript SDK kann ein `PostToolUse` Callback auch `classifierContext` zurückgeben, eine kurze Notiz über das Ergebnis des Tool-Aufrufs für den Berechtigungsklassifikator des [Auto-Modus](/docs/de/permission-modes#eliminate-prompts-with-auto-mode). Da Ihr Callback in Ihrem eigenen Anwendungsprozess ausgeführt wird, kann der Klassifikator eine Benutzeraussage, die Sie in der Notiz weitergeben, als Benutzerabsicht gewichten. Das Feld erfordert TypeScript Agent SDK v0.3.236 oder später. [Ein Ergebnis für den Auto-Modus-Klassifikator annotieren](/docs/de/hooks#annotate-a-result-for-the-auto-mode-classifier) behandelt die Längenbegrenzung, die Nur-Synchron-Regel und was nicht in die Notiz gehört.
267 267
268Geben Sie `{}` zurück, um die Operation ohne Änderungen zuzulassen. SDK-Callback-Hooks verwenden das gleiche JSON-Ausgabeformat wie [Claude Code Shell-Befehls-Hooks](/docs/de/hooks#json-output), das jedes Feld und ereignisspezifische Option dokumentiert. Für die SDK-Typdefinitionen siehe die [TypeScript](/docs/de/agent-sdk/typescript#synchookjsonoutput) und [Python](/docs/de/agent-sdk/python#synchookjsonoutput) SDK-Referenzen.268Geben Sie `{}` zurück, um die Operation ohne Änderungen zuzulassen. SDK-Callback-Hooks verwenden das gleiche JSON-Ausgabeformat wie [Claude Code Shell-Befehls-Hooks](/docs/de/hooks#json-output), das jedes Feld und ereignisspezifische Option dokumentiert. Für die SDK-Typdefinitionen siehe die [TypeScript](/docs/de/agent-sdk/typescript#synchookjsonoutput) und [Python](/docs/de/agent-sdk/python#synchookjsonoutput) SDK-Referenzen.
275 Asynchrone Ausgabe275 Asynchrone Ausgabe
276</h4>276</h4>
277 277
278278Standardmäßig wartet der Agent darauf, dass Ihr Hook zurückkommt, bevor er fortfährt. Wenn Ihr Hook einen Nebeneffekt ausführt, wie Protokollierung oder Webhook-Versand, und das Verhalten des Agenten nicht beeinflussen muss, können Sie stattdessen eine asynchrone Ausgabe zurückgeben. Dies teilt dem Agent mit, dass er sofort fortfahren soll, ohne auf die Fertigstellung des Hooks zu warten. In diesem Ausschnitt stehen `send_to_logging_service` in Python und `sendToLoggingService` in TypeScript für jede Protokollierungsfunktion, die Sie definieren:Standardmäßig wartet der Agent darauf, dass Ihr Hook zurückkommt, bevor er fortfährt. Wenn Ihr Hook einen Nebeneffekt ausführt, wie Protokollierung oder Webhook-Versand, und das Verhalten des Agenten nicht beeinflussen muss, können Sie stattdessen eine asynchrone Ausgabe zurückgeben. Dies teilt dem Agenten mit, dass er sofort fortfahren soll, ohne auf die Fertigstellung des Hooks zu warten. In diesem Ausschnitt stehen `send_to_logging_service` in Python und `sendToLoggingService` in TypeScript für jede Protokollierungsfunktion, die Sie definieren:
279 279
280<CodeGroup>280<CodeGroup>
281 ```python Python theme={null}281 ```python Python theme={null}
834 834
835* `PreToolUse`: Claude Code führt den Tool-Aufruf nicht aus, Claude erhält ein Tool-Ergebnis, das besagt, dass der Hook nicht vor seinem Timeout geantwortet hat, und der Turn wird fortgesetzt. Wenn ein anderer `PreToolUse` Hook eine explizite Ablehnung zurückgegeben hat, erhält Claude stattdessen diese Ablehnung. Vor v2.1.210 meldete Claude Code das Timeout an Claude als Benutzerabweisung, was unbeaufsichtigte Sitzungen zum Stoppen und Warten auf Eingabe führte.835* `PreToolUse`: Claude Code führt den Tool-Aufruf nicht aus, Claude erhält ein Tool-Ergebnis, das besagt, dass der Hook nicht vor seinem Timeout geantwortet hat, und der Turn wird fortgesetzt. Wenn ein anderer `PreToolUse` Hook eine explizite Ablehnung zurückgegeben hat, erhält Claude stattdessen diese Ablehnung. Vor v2.1.210 meldete Claude Code das Timeout an Claude als Benutzerabweisung, was unbeaufsichtigte Sitzungen zum Stoppen und Warten auf Eingabe führte.
836* `PostToolUse` und `PostToolUseFailure`: Claude Code behält das Tool-Ergebnis bei und der Turn wird fortgesetzt.836* `PostToolUse` und `PostToolUseFailure`: Claude Code behält das Tool-Ergebnis bei und der Turn wird fortgesetzt.
837837* `UserPromptSubmit` und [`UserPromptExpansion`](/docs/de/hooks#userpromptexpansion): Claude Code blockiert die Aufforderung mit einer Nachricht, die den Hook und das Timeout benennt, und die Sitzung wird fortgesetzt. Da ein Callback bei diesen Ereignissen als Richtlinien-Gate fungieren kann, lässt Claude Code niemals eine abgelaufene Aufforderung ungeprüft durch. Vor v2.1.208 endete Claude Code die Abfrage mit `error_during_execution`, wenn ein Callback bei diesen Ereignissen abgelaufen ist.* `UserPromptSubmit` und [`UserPromptExpansion`](/docs/de/hooks#userpromptexpansion): Claude Code blockiert den Prompt mit einer Nachricht, die den Hook und das Timeout benennt, und die Sitzung wird fortgesetzt. Da ein Callback bei diesen Ereignissen als Richtlinien-Gate fungieren kann, lässt Claude Code niemals einen Prompt mit abgelaufenem Timeout ungeprüft durch. Vor v2.1.208 beendete Claude Code die Abfrage mit `error_during_execution`, wenn ein Callback bei diesen Ereignissen abgelaufen ist.
838* `Stop` und `SubagentStop`: der abgelaufene Callback zählt als Rückgabe ohne Entscheidung. Der Agent oder Subagent stoppt, als hätte dieser Callback es erlaubt, und eine Entscheidung von Ihren anderen Hooks bei dem Ereignis wird immer noch angewendet. Vor Claude Code v2.1.273 zählte ein abgelaufener `Stop` oder `SubagentStop` Callback als fehlgeschlagener Hook-Lauf, und Claude Code verwarf die Entscheidungen Ihrer anderen Hooks bei dem Ereignis.838* `Stop` und `SubagentStop`: der abgelaufene Callback zählt als Rückgabe ohne Entscheidung. Der Agent oder Subagent stoppt, als hätte dieser Callback es erlaubt, und eine Entscheidung von Ihren anderen Hooks bei dem Ereignis wird immer noch angewendet. Vor Claude Code v2.1.273 zählte ein abgelaufener `Stop` oder `SubagentStop` Callback als fehlgeschlagener Hook-Lauf, und Claude Code verwarf die Entscheidungen Ihrer anderen Hooks bei dem Ereignis.
839* `SessionStart`: der abgelaufene Callback zählt als Rückgabe ohne Ausgabe, und die Sitzung wird mit der Ausgabe Ihrer anderen `SessionStart` Hooks fortgesetzt.839* `SessionStart`: der abgelaufene Callback zählt als Rückgabe ohne Ausgabe, und die Sitzung wird mit der Ausgabe Ihrer anderen `SessionStart` Hooks fortgesetzt.
840* `PreModelSwitch`: Claude Code blockiert den Modellwechsel. Ein Hook, der nicht antwortet, hat den Wechsel nicht genehmigt.840* `PreModelSwitch`: Claude Code blockiert den Modellwechsel. Ein Hook, der nicht antwortet, hat den Wechsel nicht genehmigt.
851</h3>851</h3>
852 852
853* Überprüfen Sie alle `PreToolUse` Hooks auf `permissionDecision: 'deny'` Rückgaben853* Überprüfen Sie alle `PreToolUse` Hooks auf `permissionDecision: 'deny'` Rückgaben
854854* Fügen Sie Protokollierung zu Ihren Hooks hinzu, um zu sehen, welche `permissionDecisionReason` sie zurückgeben* Fügen Sie Logging zu Ihren Hooks hinzu, um zu sehen, welche `permissionDecisionReason` sie zurückgeben
855* Überprüfen Sie, ob Matcher-Muster nicht zu breit sind: ein leerer Matcher gleicht alle Tools ab855* Überprüfen Sie, ob Matcher-Muster nicht zu breit sind: ein leerer Matcher gleicht alle Tools ab
856 856
857<h3 id="modified-input-not-applied">857<h3 id="modified-input-not-applied">
878 Sitzungs-Hooks nicht in Python verfügbar878 Sitzungs-Hooks nicht in Python verfügbar
879</h3>879</h3>
880 880
881881`SessionStart` und `SessionEnd` können als SDK-Callback-Hooks in TypeScript registriert werden, sind aber im Python SDK nicht verfügbar, da sein `HookEvent` Typ sie auslässt. In Python sind sie nur als [Shell-Befehls-Hooks](/docs/de/hooks#hook-events) verfügbar, die in Einstellungsdateien wie `.claude/settings.json` definiert sind. Um Shell-Befehls-Hooks aus Ihrer SDK-Anwendung zu laden, schließen Sie die entsprechende Einstellungsquelle mit [`setting_sources`](/docs/de/agent-sdk/python#settingsource) oder [`settingSources`](/docs/de/agent-sdk/typescript#settingsource) ein:`SessionStart` und `SessionEnd` können als SDK-Callback-Hooks in TypeScript registriert werden, sind aber im Python SDK nicht verfügbar, da sein `HookEvent` Typ sie auslässt. In Python sind sie nur als [Shell-Befehls-Hooks](/docs/de/hooks#hook-events) verfügbar, die in Einstellungsdateien wie `.claude/settings.json` definiert sind. Welche Einstellungsdateien Ihre SDK-Anwendung lädt, hängt von [`setting_sources`](/docs/de/agent-sdk/python#settingsource) bzw. [`settingSources`](/docs/de/agent-sdk/typescript#settingsource) ab. Wenn Sie diese Option festlegen, schließen Sie die Quelle ein, die die Hooks enthält:
882 882
883<CodeGroup>883<CodeGroup>
884 ```python Python theme={null}884 ```python Python theme={null}
897Um stattdessen Initialisierungslogik als Python SDK-Callback auszuführen, verwenden Sie die erste Nachricht von `client.receive_response()` als Auslöser.897Um stattdessen Initialisierungslogik als Python SDK-Callback auszuführen, verwenden Sie die erste Nachricht von `client.receive_response()` als Auslöser.
898 898
899<h3 id="subagent-permission-prompts-multiplying">899<h3 id="subagent-permission-prompts-multiplying">
900900 Subagent-Berechtigungsaufforderungen vervielfachen sich Berechtigungsabfragen von Subagenten vervielfachen sich
901</h3>901</h3>
902 902
903903Beim Spawnen mehrerer Subagents kann jeder einzelne Berechtigungen separat anfordern. Um wiederholte Aufforderungen zu vermeiden, verwenden Sie `PreToolUse` Hooks, um spezifische Tools automatisch zu genehmigen, oder konfigurieren Sie Berechtigungsregeln, die Subagents [vom übergeordneten Gespräch erben](/docs/de/sub-agents#permission-modes).Beim Starten mehrerer Subagenten kann jeder einzelne für seine eigenen Tool-Aufrufe separat Berechtigungen anfordern. Um wiederholte Abfragen zu vermeiden, verwenden Sie `PreToolUse` Hooks, um spezifische Tools automatisch zu genehmigen, oder konfigurieren Sie Berechtigungsregeln, die Subagenten [von der übergeordneten Konversation erben](/docs/de/sub-agents#permission-modes).
904 904
905<h3 id="recursive-hook-loops-with-subagents">905<h3 id="recursive-hook-loops-with-subagents">
906906 Rekursive Hook-Schleifen mit Subagents Rekursive Hook-Schleifen mit Subagenten
907</h3>907</h3>
908 908
909909Ein `UserPromptSubmit` Hook, der Subagents spawnt, kann unendliche Schleifen erzeugen, wenn diese Subagents denselben Hook auslösen. Um dies zu verhindern:Ein `UserPromptSubmit` Hook, der Subagenten startet, kann unendliche Schleifen erzeugen, wenn diese Subagenten denselben Hook auslösen. Um dies zu verhindern:
910 910
911911* Verwenden Sie eine gemeinsame Variable oder Sitzungsstatus, um zu verfolgen, ob Sie bereits in einem Subagent sind* Verwenden Sie eine gemeinsame Variable oder Sitzungsstatus, um zu verfolgen, ob Sie sich bereits in einem Subagenten befinden
912* Beschränken Sie Hooks so, dass sie nur für die Top-Level-Agent-Sitzung ausgeführt werden912* Beschränken Sie Hooks so, dass sie nur für die Top-Level-Agent-Sitzung ausgeführt werden
913 913
914<h3 id="systemmessage-not-appearing-in-output">914<h3 id="systemmessage-not-appearing-in-output">