agent-sdk/agent-loop.md +395 −0 created
1> ## Documentation Index
2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.
4
5# So funktioniert die Agent-Schleife
6
7> Verstehen Sie den Nachrichtenlebenszyklus, die Werkzeugausführung, das Kontextfenster und die Architektur, die Ihre SDK-Agenten antreibt.
8
9Das Agent SDK ermöglicht es Ihnen, die autonome Agent-Schleife von Claude Code in Ihre eigenen Anwendungen einzubetten. Das SDK ist ein eigenständiges Paket, das Ihnen programmatische Kontrolle über Werkzeuge, Berechtigungen, Kostenlimits und Ausgabe gibt. Sie müssen die Claude Code CLI nicht installiert haben, um es zu verwenden.
10
11Wenn Sie einen Agent starten, führt das SDK die gleiche [Ausführungsschleife aus, die Claude Code antreibt](/de/how-claude-code-works#the-agentic-loop): Claude bewertet Ihren Prompt, ruft Werkzeuge auf, um Maßnahmen zu ergreifen, erhält die Ergebnisse und wiederholt dies, bis die Aufgabe abgeschlossen ist. Diese Seite erklärt, was in dieser Schleife passiert, damit Sie Ihre Agenten effektiv erstellen, debuggen und optimieren können.
12
13## Die Schleife auf einen Blick
14
15Jede Agent-Sitzung folgt dem gleichen Zyklus:
16
17<img src="https://mintcdn.com/claude-code/gvy2DIUELtNA8qD3/images/agent-loop-diagram.svg?fit=max&auto=format&n=gvy2DIUELtNA8qD3&q=85&s=192e1bd6c8a2950a16e5ee0b94e27e26" alt="Agent-Schleife: Prompt wird eingegeben, Claude bewertet, verzweigt sich zu Werkzeugaufrufen oder endgültiger Antwort" width="680" height="150" data-path="images/agent-loop-diagram.svg" />
18
191. **Prompt empfangen.** Claude empfängt Ihren Prompt zusammen mit dem System-Prompt, Werkzeugdefinitionen und Gesprächsverlauf. Das SDK gibt eine [`SystemMessage`](#message-types) mit dem Subtyp `"init"` aus, die Sitzungsmetadaten enthält.
202. **Bewerten und antworten.** Claude bewertet den aktuellen Status und bestimmt, wie vorzugehen ist. Es kann mit Text antworten, einen oder mehrere Werkzeugaufrufe anfordern oder beides. Das SDK gibt eine [`AssistantMessage`](#message-types) aus, die den Text und alle Werkzeugaufrufe enthält.
213. **Werkzeuge ausführen.** Das SDK führt jedes angeforderte Werkzeug aus und sammelt die Ergebnisse. Jeder Satz von Werkzeugergebnissen wird an Claude für die nächste Entscheidung zurückgesendet. Sie können [Hooks](/de/agent-sdk/hooks) verwenden, um Werkzeugaufrufe vor ihrer Ausführung abzufangen, zu ändern oder zu blockieren.
224. **Wiederholen.** Die Schritte 2 und 3 wiederholen sich als Zyklus. Jeder vollständige Zyklus ist eine Runde. Claude ruft weiterhin Werkzeuge auf und verarbeitet Ergebnisse, bis es eine Antwort ohne Werkzeugaufrufe erzeugt.
235. **Ergebnis zurückgeben.** Das SDK gibt eine endgültige [`AssistantMessage`](#message-types) mit der Textantwort (keine Werkzeugaufrufe) aus, gefolgt von einer [`ResultMessage`](#message-types) mit dem endgültigen Text, Token-Nutzung, Kosten und Sitzungs-ID.
24
25Eine schnelle Frage („welche Dateien sind hier?") könnte eine oder zwei Runden dauern, in denen `Glob` aufgerufen und die Ergebnisse beantwortet werden. Eine komplexe Aufgabe („refaktorisieren Sie das Auth-Modul und aktualisieren Sie die Tests") kann Dutzende von Werkzeugaufrufen über viele Runden hinweg verketten, Dateien lesen, Code bearbeiten und Tests ausführen, wobei Claude seinen Ansatz basierend auf jedem Ergebnis anpasst.
26
27## Runden und Nachrichten
28
29Eine Runde ist eine Hin- und Rückfahrt in der Schleife: Claude erzeugt eine Ausgabe, die Werkzeugaufrufe enthält, das SDK führt diese Werkzeuge aus, und die Ergebnisse werden automatisch an Claude zurückgesendet. Dies geschieht, ohne die Kontrolle an Ihren Code zurückzugeben. Runden werden fortgesetzt, bis Claude eine Ausgabe ohne Werkzeugaufrufe erzeugt, woraufhin die Schleife endet und das endgültige Ergebnis geliefert wird.
30
31Stellen Sie sich vor, wie eine vollständige Sitzung für den Prompt „Beheben Sie die fehlgeschlagenen Tests in auth.ts" aussehen könnte.
32
33Zunächst sendet das SDK Ihren Prompt an Claude und gibt eine [`SystemMessage`](#message-types) mit den Sitzungsmetadaten aus. Dann beginnt die Schleife:
34
351. **Runde 1:** Claude ruft `Bash` auf, um `npm test` auszuführen. Das SDK gibt eine [`AssistantMessage`](#message-types) mit dem Werkzeugaufruf aus, führt den Befehl aus und gibt dann eine [`UserMessage`](#message-types) mit der Ausgabe (drei Fehler) aus.
362. **Runde 2:** Claude ruft `Read` auf `auth.ts` und `auth.test.ts` auf. Das SDK gibt die Dateiinhalte zurück und gibt eine `AssistantMessage` aus.
373. **Runde 3:** Claude ruft `Edit` auf, um `auth.ts` zu beheben, und ruft dann `Bash` auf, um `npm test` erneut auszuführen. Alle drei Tests bestehen. Das SDK gibt eine `AssistantMessage` aus.
384. **Letzte Runde:** Claude erzeugt eine nur-Text-Antwort ohne Werkzeugaufrufe: „Behobener Auth-Bug, alle drei Tests bestehen jetzt." Das SDK gibt eine endgültige `AssistantMessage` mit diesem Text aus, gefolgt von einer [`ResultMessage`](#message-types) mit dem gleichen Text plus Kosten und Nutzung.
39
40Das waren vier Runden: drei mit Werkzeugaufrufen, eine endgültige nur-Text-Antwort.
41
42Sie können die Schleife mit `max_turns` / `maxTurns` begrenzen, die nur Werkzeug-Nutzungsrunden zählt. Zum Beispiel würde `max_turns=2` in der obigen Schleife vor dem Bearbeitungsschritt gestoppt haben. Sie können auch `max_budget_usd` / `maxBudgetUsd` verwenden, um Runden basierend auf einem Ausgabenschwellenwert zu begrenzen.
43
44Ohne Limits läuft die Schleife, bis Claude von selbst fertig ist, was für gut definierte Aufgaben in Ordnung ist, aber bei offenen Prompts lange laufen kann („verbessern Sie diese Codebasis"). Das Festlegen eines Budgets ist eine gute Standardeinstellung für Produktionsagenten. Siehe [Runden und Budget](#turns-and-budget) unten für die Optionsreferenz.
45
46## Nachrichtentypen
47
48Während die Schleife läuft, gibt das SDK einen Stream von Nachrichten aus. Jede Nachricht trägt einen Typ, der Ihnen sagt, aus welcher Phase der Schleife sie stammt. Die fünf Kerntypen sind:
49
50* **`SystemMessage`:** Sitzungslebenszyklus-Ereignisse. Das Feld `subtype` unterscheidet sie: `"init"` ist die erste Nachricht (Sitzungsmetadaten), und `"compact_boundary"` wird nach [Komprimierung](#automatic-compaction) ausgelöst. In TypeScript ist die Komprimierungsgrenze ihr eigener [`SDKCompactBoundaryMessage`](/de/agent-sdk/typescript#sdkcompactboundarymessage)-Typ statt eines Subtyps von `SDKSystemMessage`.
51* **`AssistantMessage`:** wird nach jeder Claude-Antwort ausgegeben, einschließlich der endgültigen nur-Text-Antwort. Enthält Textinhaltsblöcke und Werkzeugaufrufsblöcke aus dieser Runde.
52* **`UserMessage`:** wird nach jeder Werkzeugausführung mit dem Werkzeugergebnis-Inhalt ausgegeben, der an Claude zurückgesendet wird. Wird auch für alle Benutzereingaben ausgegeben, die Sie mid-loop streamen.
53* **`StreamEvent`:** wird nur ausgegeben, wenn Teilteilnachrichten aktiviert sind. Enthält rohe API-Streaming-Ereignisse (Text-Deltas, Werkzeug-Input-Chunks). Siehe [Stream-Antworten](/de/agent-sdk/streaming-output).
54* **`ResultMessage`:** markiert das Ende der Agent-Schleife. Enthält das endgültige Textergebnis, Token-Nutzung, Kosten und Sitzungs-ID. Überprüfen Sie das Feld `subtype`, um zu bestimmen, ob die Aufgabe erfolgreich war oder ein Limit erreicht hat. Eine kleine Anzahl von nachfolgenden Systemevenementen, wie `prompt_suggestion`, können danach ankommen, daher sollten Sie den Stream bis zum Ende durchlaufen, anstatt beim Ergebnis zu unterbrechen. Siehe [Ergebnis verarbeiten](#handle-the-result).
55
56Diese fünf Typen decken den vollständigen Lebenszyklus der Agent-Schleife in beiden SDKs ab. Das TypeScript SDK gibt auch zusätzliche Observability-Ereignisse aus (Hook-Ereignisse, Werkzeugfortschritt, Ratenlimits, Task-Benachrichtigungen), die zusätzliche Details bieten, aber nicht erforderlich sind, um die Schleife zu steuern. Siehe die [Python-Nachrichtentypen-Referenz](/de/agent-sdk/python#message-types) und [TypeScript-Nachrichtentypen-Referenz](/de/agent-sdk/typescript#message-types) für die vollständigen Listen.
57
58### Nachrichten verarbeiten
59
60Welche Nachrichten Sie verarbeiten, hängt davon ab, was Sie erstellen:
61
62* **Nur endgültige Ergebnisse:** verarbeiten Sie `ResultMessage`, um die Ausgabe, Kosten und ob die Aufgabe erfolgreich war oder ein Limit erreicht hat, zu erhalten.
63* **Fortschritts-Updates:** verarbeiten Sie `AssistantMessage`, um zu sehen, was Claude jede Runde tut, einschließlich welche Werkzeuge es aufgerufen hat.
64* **Live-Streaming:** aktivieren Sie Teilteilnachrichten (`include_partial_messages` in Python, `includePartialMessages` in TypeScript), um `StreamEvent`-Nachrichten in Echtzeit zu erhalten. Siehe [Stream-Antworten in Echtzeit](/de/agent-sdk/streaming-output).
65
66Wie Sie Nachrichtentypen überprüfen, hängt vom SDK ab:
67
68* **Python:** überprüfen Sie Nachrichtentypen mit `isinstance()` gegen Klassen, die aus `claude_agent_sdk` importiert wurden (zum Beispiel, `isinstance(message, ResultMessage)`).
69* **TypeScript:** überprüfen Sie das Feld `type` string (zum Beispiel, `message.type === "result"`). `AssistantMessage` und `UserMessage` umhüllen die rohe API-Nachricht in einem `.message`-Feld, daher befinden sich Inhaltsblöcke bei `message.message.content`, nicht bei `message.content`.
70
71<Accordion title="Beispiel: Nachrichtentypen überprüfen und Ergebnisse verarbeiten">
72 <CodeGroup>
73 ```python Python theme={null}
74 from claude_agent_sdk import query, AssistantMessage, ResultMessage
75
76 async for message in query(prompt="Summarize this project"):
77 if isinstance(message, AssistantMessage):
78 print(f"Turn completed: {len(message.content)} content blocks")
79 if isinstance(message, ResultMessage):
80 if message.subtype == "success":
81 print(message.result)
82 else:
83 print(f"Stopped: {message.subtype}")
84 ```
85
86 ```typescript TypeScript theme={null}
87 import { query } from "@anthropic-ai/claude-agent-sdk";
88
89 for await (const message of query({ prompt: "Summarize this project" })) {
90 if (message.type === "assistant") {
91 console.log(`Turn completed: ${message.message.content.length} content blocks`);
92 }
93 if (message.type === "result") {
94 if (message.subtype === "success") {
95 console.log(message.result);
96 } else {
97 console.log(`Stopped: ${message.subtype}`);
98 }
99 }
100 }
101 ```
102 </CodeGroup>
103</Accordion>
104
105## Werkzeugausführung
106
107Werkzeuge geben Ihrem Agent die Möglichkeit, Maßnahmen zu ergreifen. Ohne Werkzeuge kann Claude nur mit Text antworten. Mit Werkzeugen kann Claude Dateien lesen, Befehle ausführen, Code durchsuchen und mit externen Diensten interagieren.
108
109### Integrierte Werkzeuge
110
111Das SDK enthält die gleichen Werkzeuge, die Claude Code antreiben:
112
113| Kategorie | Werkzeuge | Was sie tun |
114| :----------------- | :----------------------------------------------- | :-------------------------------------------------------------------------------- |
115| **Dateivorgänge** | `Read`, `Edit`, `Write` | Dateien lesen, ändern und erstellen |
116| **Suche** | `Glob`, `Grep` | Dateien nach Muster finden, Inhalte mit Regex durchsuchen |
117| **Ausführung** | `Bash` | Shell-Befehle, Skripte, Git-Vorgänge ausführen |
118| **Web** | `WebSearch`, `WebFetch` | Das Web durchsuchen, Seiten abrufen und analysieren |
119| **Erkennung** | `ToolSearch` | Werkzeuge dynamisch finden und bei Bedarf laden, anstatt alle vorab zu laden |
120| **Orchestrierung** | `Agent`, `Skill`, `AskUserQuestion`, `TodoWrite` | Subagenten spawnen, Fähigkeiten aufrufen, den Benutzer fragen, Aufgaben verfolgen |
121
122Über integrierte Werkzeuge hinaus können Sie:
123
124* **Externe Dienste verbinden** mit [MCP-Servern](/de/agent-sdk/mcp) (Datenbanken, Browser, APIs)
125* **Benutzerdefinierte Werkzeuge definieren** mit [benutzerdefinierten Werkzeug-Handlern](/de/agent-sdk/custom-tools)
126* **Projekt-Fähigkeiten laden** über [Einstellungsquellen](/de/agent-sdk/claude-code-features) für wiederverwendbare Workflows
127
128### Werkzeugberechtigungen
129
130Claude bestimmt, welche Werkzeuge aufgerufen werden sollen, basierend auf der Aufgabe, aber Sie kontrollieren, ob diese Aufrufe ausgeführt werden dürfen. Sie können bestimmte Werkzeuge automatisch genehmigen, andere vollständig blockieren oder Genehmigung für alles verlangen. Drei Optionen arbeiten zusammen, um zu bestimmen, was ausgeführt wird:
131
132* **`allowed_tools` / `allowedTools`** genehmigt automatisch aufgelistete Werkzeuge. Ein schreibgeschützter Agent mit `["Read", "Glob", "Grep"]` in seiner Werkzeugliste für zulässige Werkzeuge führt diese Werkzeuge ohne Aufforderung aus. Werkzeuge, die nicht aufgelistet sind, sind immer noch verfügbar, erfordern aber Berechtigung.
133* **`disallowed_tools` / `disallowedTools`** blockiert aufgelistete Werkzeuge, unabhängig von anderen Einstellungen. Siehe [Berechtigungen](/de/agent-sdk/permissions) für die Reihenfolge, in der Regeln überprüft werden, bevor ein Werkzeug ausgeführt wird.
134* **`permission_mode` / `permissionMode`** kontrolliert, was mit Werkzeugen passiert, die nicht durch Zulassungs- oder Ablehnungsregeln abgedeckt sind. Siehe [Berechtigungsmodus](#permission-mode) für verfügbare Modi.
135
136Sie können auch einzelne Werkzeuge mit Regeln wie `"Bash(npm *)"` einschränken, um nur bestimmte Befehle zuzulassen. Siehe [Berechtigungen](/de/agent-sdk/permissions) für die vollständige Regelsyntax.
137
138Wenn ein Werkzeug abgelehnt wird, erhält Claude eine Ablehnungsnachricht als Werkzeugergebnis und versucht normalerweise einen anderen Ansatz oder meldet, dass es nicht fortfahren konnte.
139
140### Parallele Werkzeugausführung
141
142Wenn Claude mehrere Werkzeugaufrufe in einer einzelnen Runde anfordert, können beide SDKs sie je nach Werkzeug gleichzeitig oder sequenziell ausführen. Schreibgeschützte Werkzeuge (wie `Read`, `Glob`, `Grep` und MCP-Werkzeuge, die als schreibgeschützt gekennzeichnet sind) können gleichzeitig ausgeführt werden. Werkzeuge, die den Status ändern (wie `Edit`, `Write` und `Bash`), werden sequenziell ausgeführt, um Konflikte zu vermeiden.
143
144Benutzerdefinierte Werkzeuge verwenden standardmäßig sequenzielle Ausführung. Um parallele Ausführung für ein benutzerdefiniertes Werkzeug zu aktivieren, setzen Sie `readOnlyHint` in seinen Anmerkungen. Beide [TypeScript](/de/agent-sdk/typescript#tool) und [Python](/de/agent-sdk/python#tool) SDKs verwenden diesen Feldnamen aus dem MCP SDK.
145
146## Kontrollieren Sie, wie die Schleife läuft
147
148Sie können begrenzen, wie viele Runden die Schleife dauert, wie viel sie kostet, wie tief Claude denkt, und ob Werkzeuge vor der Ausführung genehmigt werden müssen. All diese sind Felder auf [`ClaudeAgentOptions`](/de/agent-sdk/python#claudeagentoptions) (Python) / [`Options`](/de/agent-sdk/typescript#options) (TypeScript).
149
150### Runden und Budget
151
152| Option | Was es kontrolliert | Standard |
153| :--------------------------------------------- | :---------------------------------------------- | :--------- |
154| Max Runden (`max_turns` / `maxTurns`) | Maximale Werkzeug-Nutzungs-Hin- und Rückfahrten | Kein Limit |
155| Max Budget (`max_budget_usd` / `maxBudgetUsd`) | Maximale Kosten vor dem Stoppen | Kein Limit |
156
157Wenn eines der Limits erreicht wird, gibt das SDK eine `ResultMessage` mit einem entsprechenden Fehler-Subtyp (`error_max_turns` oder `error_max_budget_usd`) zurück. Siehe [Ergebnis verarbeiten](#handle-the-result) für die Überprüfung dieser Subtypen und [`ClaudeAgentOptions`](/de/agent-sdk/python#claudeagentoptions) / [`Options`](/de/agent-sdk/typescript#options) für die Syntax.
158
159### Anstrengungsgrad
160
161Die Option `effort` kontrolliert, wie viel Denken Claude anwendet. Niedrigere Anstrengungsgrade verwenden weniger Token pro Runde und reduzieren Kosten. Nicht alle Modelle unterstützen den Anstrengungsparameter. Siehe [Anstrengung](https://platform.claude.com/docs/en/build-with-claude/effort) für welche Modelle es unterstützen.
162
163| Stufe | Verhalten | Gut für |
164| :--------- | :----------------------------------- | :----------------------------------------------------------------- |
165| `"low"` | Minimales Denken, schnelle Antworten | Datei-Lookups, Verzeichnisse auflisten |
166| `"medium"` | Ausgewogenes Denken | Routine-Bearbeitungen, Standard-Aufgaben |
167| `"high"` | Gründliche Analyse | Refaktorisierungen, Debugging |
168| `"xhigh"` | Erweiterte Denktiefe | Kodierungs- und agentengesteuerte Aufgaben; empfohlen auf Opus 4.7 |
169| `"max"` | Maximale Denktiefe | Mehrstufige Probleme, die tiefe Analyse erfordern |
170
171Wenn Sie `effort` nicht setzen, lässt das Python SDK den Parameter ungesetzt und überlässt das Standardverhalten dem Modell. Das TypeScript SDK verwendet standardmäßig `"high"`.
172
173<Note>
174 `effort` tauscht Latenz und Token-Kosten gegen Denktiefe innerhalb jeder Antwort. [Erweitertes Denken](https://platform.claude.com/docs/en/build-with-claude/extended-thinking) ist eine separate Funktion, die sichtbare Gedankenketten-Blöcke in der Ausgabe erzeugt. Sie sind unabhängig: Sie können `effort: "low"` mit aktiviertem erweiterten Denken setzen oder `effort: "max"` ohne es.
175</Note>
176
177Verwenden Sie niedrigere Anstrengung für Agenten, die einfache, gut definierte Aufgaben ausführen (wie Dateien auflisten oder ein einzelnes Grep ausführen), um Kosten und Latenz zu reduzieren. Setzen Sie `effort` in den Top-Level-`query()`-Optionen für die gesamte Sitzung oder pro Subagent mit dem Feld `effort` auf [`AgentDefinition`](/de/agent-sdk/subagents#agentdefinition-configuration), um die Sitzungsebene zu überschreiben.
178
179### Berechtigungsmodus
180
181Die Berechtigungsmodus-Option (`permission_mode` in Python, `permissionMode` in TypeScript) kontrolliert, ob der Agent vor der Verwendung von Werkzeugen um Genehmigung fragt:
182
183| Modus | Verhalten |
184| :------------------------ | :---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
185| `"default"` | Werkzeuge, die nicht durch Zulassungsregeln abgedeckt sind, lösen Ihren Genehmigungsrückruf aus; kein Rückruf bedeutet Ablehnung |
186| `"acceptEdits"` | Genehmigt automatisch Dateibearbeitungen und häufige Dateisystem-Befehle (`mkdir`, `touch`, `mv`, `cp`, usw.); andere Bash-Befehle folgen Standardregeln |
187| `"plan"` | Schreibgeschützte Werkzeuge laufen; Claude erkundet und erzeugt einen Plan, ohne Ihre Quelldateien zu bearbeiten |
188| `"dontAsk"` | Fragt nie. Werkzeuge, die durch [Berechtigungsregeln](/de/settings#permission-settings) vorab genehmigt wurden, laufen, alles andere wird abgelehnt |
189| `"auto"` (nur TypeScript) | Verwendet einen Modell-Klassifizierer, um jeden Werkzeugaufruf zu genehmigen oder abzulehnen. Siehe [Auto-Modus](/de/permission-modes#eliminate-prompts-with-auto-mode) für Verfügbarkeit und Verhalten |
190| `"bypassPermissions"` | Führt alle zulässigen Werkzeuge aus, ohne zu fragen. Kann nicht verwendet werden, wenn als Root auf Unix ausgeführt wird. Verwenden Sie nur in isolierten Umgebungen, in denen die Aktionen des Agenten keine Systeme beeinflussen können, die Ihnen wichtig sind |
191
192Für interaktive Anwendungen verwenden Sie `"default"` mit einem Werkzeug-Genehmigungsrückruf, um Genehmigungsaufforderungen anzuzeigen. Für autonome Agenten auf einer Dev-Maschine verwenden Sie `"acceptEdits"`, um Dateibearbeitungen und häufige Dateisystem-Befehle (`mkdir`, `touch`, `mv`, `cp`, usw.) automatisch zu genehmigen, während Sie andere `Bash`-Befehle immer noch hinter Zulassungsregeln gating. Reservieren Sie `"bypassPermissions"` für CI, Container oder andere isolierte Umgebungen. Siehe [Berechtigungen](/de/agent-sdk/permissions) für vollständige Details.
193
194### Modell
195
196Wenn Sie `model` nicht setzen, verwendet das SDK Claude Codes Standard, der von Ihrer Authentifizierungsmethode und Ihrem Abonnement abhängt. Setzen Sie es explizit (zum Beispiel, `model="claude-sonnet-4-6"`), um ein bestimmtes Modell zu fixieren oder um ein kleineres Modell für schnellere, billigere Agenten zu verwenden. Siehe [Modelle](https://platform.claude.com/docs/en/about-claude/models) für verfügbare IDs.
197
198## Das Kontextfenster
199
200Das Kontextfenster ist die Gesamtmenge an Informationen, die Claude während einer Sitzung zur Verfügung stehen. Es wird nicht zwischen Runden innerhalb einer Sitzung zurückgesetzt. Alles sammelt sich an: der System-Prompt, Werkzeugdefinitionen, Gesprächsverlauf, Werkzeugeingaben und Werkzeugergebnisse. Inhalte, die über Runden hinweg gleich bleiben (System-Prompt, Werkzeugdefinitionen, CLAUDE.md), werden automatisch [prompt-gecacht](https://platform.claude.com/docs/en/build-with-claude/prompt-caching), was Kosten und Latenz für wiederholte Präfixe reduziert.
201
202### Was Kontext verbraucht
203
204Hier ist, wie jede Komponente den Kontext im SDK beeinflusst:
205
206| Quelle | Wann es lädt | Auswirkung |
207| :--------------------------- | :------------------------------------------------------------------------- | :--------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
208| **System-Prompt** | Jede Anfrage | Kleine feste Kosten, immer vorhanden |
209| **CLAUDE.md-Dateien** | Sitzungsstart, über [`settingSources`](/de/agent-sdk/claude-code-features) | Vollständiger Inhalt in jeder Anfrage (aber prompt-gecacht, daher zahlt nur die erste Anfrage die vollständigen Kosten) |
210| **Werkzeugdefinitionen** | Jede Anfrage | Jedes Werkzeug fügt sein Schema hinzu; verwenden Sie [MCP-Werkzeugsuche](/de/agent-sdk/mcp#mcp-tool-search), um Werkzeuge bei Bedarf zu laden, anstatt alle auf einmal |
211| **Gesprächsverlauf** | Sammelt sich über Runden an | Wächst mit jeder Runde: Prompts, Antworten, Werkzeugeingaben, Werkzeugergebnisse |
212| **Fähigkeitsbeschreibungen** | Sitzungsstart, über Einstellungsquellen | Kurze Zusammenfassungen; vollständiger Inhalt lädt nur bei Aufruf |
213
214Große Werkzeugergebnisse verbrauchen erheblichen Kontext. Das Lesen einer großen Datei oder das Ausführen eines Befehls mit ausführlicher Ausgabe kann Tausende von Token in einer einzelnen Runde verwenden. Der Kontext sammelt sich über Runden an, daher bauen längere Sitzungen mit vielen Werkzeugaufrufen erheblich mehr Kontext auf als kurze.
215
216### Automatische Komprimierung
217
218Wenn sich das Kontextfenster seinem Limit nähert, komprimiert das SDK automatisch das Gespräch: Es fasst ältere Verlauf zusammen, um Platz freizugeben, während Ihre neuesten Austausche und wichtigen Entscheidungen intakt bleiben. Das SDK gibt eine Nachricht mit `type: "system"` und `subtype: "compact_boundary"` im Stream aus, wenn dies geschieht (in Python ist dies eine `SystemMessage`; in TypeScript ist es ein separater `SDKCompactBoundaryMessage`-Typ).
219
220Die Komprimierung ersetzt ältere Nachrichten durch eine Zusammenfassung, daher können spezifische Anweisungen von früh im Gespräch möglicherweise nicht beibehalten werden. Persistente Regeln gehören in CLAUDE.md (geladen über [`settingSources`](/de/agent-sdk/claude-code-features)) statt in den anfänglichen Prompt, da CLAUDE.md-Inhalte bei jeder Anfrage erneut eingespritzt werden.
221
222Sie können das Komprimierungsverhalten auf mehrere Arten anpassen:
223
224* **Zusammenfassungsanweisungen in CLAUDE.md:** Der Kompressor liest Ihre CLAUDE.md wie jeden anderen Kontext, daher können Sie einen Abschnitt einschließen, der ihm sagt, was beim Zusammenfassen zu bewahren ist. Der Abschnittskopf ist frei (nicht eine magische Zeichenkette); der Kompressor passt auf Absicht an.
225* **`PreCompact`-Hook:** Führen Sie benutzerdefinierte Logik vor der Komprimierung aus, zum Beispiel um das vollständige Transkript zu archivieren. Der Hook erhält ein `trigger`-Feld (`manual` oder `auto`). Siehe [Hooks](/de/agent-sdk/hooks).
226* **Manuelle Komprimierung:** Senden Sie `/compact` als Prompt-String, um Komprimierung bei Bedarf auszulösen. (Schrägstrich-Befehle, die auf diese Weise gesendet werden, sind SDK-Eingaben, keine nur-CLI-Verknüpfungen. Siehe [Schrägstrich-Befehle im SDK](/de/agent-sdk/slash-commands).)
227
228<Accordion title="Beispiel: Zusammenfassungsanweisungen in CLAUDE.md">
229 Fügen Sie einen Abschnitt zu Ihrer Projekt-CLAUDE.md hinzu, der dem Kompressor sagt, was zu bewahren ist. Der Kopfname ist nicht speziell; verwenden Sie ein beliebiges klares Label.
230
231 ```markdown CLAUDE.md theme={null}
232 # Summary instructions
233
234 When summarizing this conversation, always preserve:
235 - The current task objective and acceptance criteria
236 - File paths that have been read or modified
237 - Test results and error messages
238 - Decisions made and the reasoning behind them
239 ```
240</Accordion>
241
242### Kontext effizient halten
243
244Ein paar Strategien für langfristig laufende Agenten:
245
246* **Verwenden Sie Subagenten für Unteraufgaben.** Jeder Subagent startet mit einem frischen Gespräch (kein vorheriger Nachrichtenverlauf, obwohl er seinen eigenen System-Prompt und Projekt-Kontext wie CLAUDE.md lädt). Er sieht nicht die Runden des Elternteils, und nur seine endgültige Antwort kehrt zum Elternteil als Werkzeugergebnis zurück. Der Kontext des Hauptagenten wächst um diese Zusammenfassung, nicht um das vollständige Unteraufgaben-Transkript. Siehe [Was Subagenten erben](/de/agent-sdk/subagents#what-subagents-inherit) für Details.
247* **Seien Sie selektiv mit Werkzeugen.** Jede Werkzeugdefinition nimmt Kontextraum ein. Verwenden Sie das Feld `tools` auf [`AgentDefinition`](/de/agent-sdk/subagents#agentdefinition-configuration), um Subagenten auf die minimale Menge zu beschränken, die sie benötigen, und verwenden Sie [MCP-Werkzeugsuche](/de/agent-sdk/mcp#mcp-tool-search), um Werkzeuge bei Bedarf zu laden, anstatt alle vorab zu laden.
248* **Beobachten Sie MCP-Server-Kosten.** Jeder MCP-Server fügt alle seine Werkzeugschemas zu jeder Anfrage hinzu. Ein paar Server mit vielen Werkzeugen können erheblichen Kontext verbrauchen, bevor der Agent irgendwelche Arbeiten verrichtet. Das Werkzeug `ToolSearch` kann helfen, indem es Werkzeuge bei Bedarf lädt, anstatt alle vorab zu laden. Siehe [MCP-Werkzeugsuche](/de/agent-sdk/mcp#mcp-tool-search) für die Konfiguration.
249* **Verwenden Sie niedrigere Anstrengung für Routine-Aufgaben.** Setzen Sie [Anstrengung](#effort-level) auf `"low"` für Agenten, die nur Dateien lesen oder Verzeichnisse auflisten müssen. Dies reduziert Token-Nutzung und Kosten.
250
251Für eine detaillierte Aufschlüsselung der Pro-Feature-Kontextkosten siehe [Kontextkosten verstehen](/de/features-overview#understand-context-costs).
252
253## Sitzungen und Kontinuität
254
255Jede Interaktion mit dem SDK erstellt oder setzt eine Sitzung fort. Erfassen Sie die Sitzungs-ID aus `ResultMessage.session_id` (verfügbar in beiden SDKs), um später fortzufahren. Das TypeScript SDK macht es auch als direktes Feld auf der Init-`SystemMessage` verfügbar; in Python ist es in `SystemMessage.data` verschachtelt.
256
257Wenn Sie fortfahren, wird der vollständige Kontext aus vorherigen Runden wiederhergestellt: Dateien, die gelesen wurden, Analysen, die durchgeführt wurden, und Aktionen, die ergriffen wurden. Sie können auch eine Sitzung forken, um in einen anderen Ansatz zu verzweigen, ohne das Original zu ändern.
258
259Siehe [Sitzungsverwaltung](/de/agent-sdk/sessions) für den vollständigen Leitfaden zu Resume-, Continue- und Fork-Mustern.
260
261<Note>
262 In Python verwaltet `ClaudeSDKClient` Sitzungs-IDs automatisch über mehrere Aufrufe hinweg. Siehe die [Python SDK-Referenz](/de/agent-sdk/python#choosing-between-query-and-claudesdkclient) für Details.
263</Note>
264
265## Ergebnis verarbeiten
266
267Wenn die Schleife endet, sagt Ihnen die `ResultMessage`, was passiert ist, und gibt Ihnen die Ausgabe. Das Feld `subtype` (verfügbar in beiden SDKs) ist die primäre Methode, um den Beendigungsstatus zu überprüfen.
268
269| Ergebnis-Subtyp | Was passiert ist | Feld `result` verfügbar? |
270| :------------------------------------ | :------------------------------------------------------------------------------------------ | :----------------------: |
271| `success` | Claude hat die Aufgabe normal abgeschlossen | Ja |
272| `error_max_turns` | Hat das `maxTurns`-Limit erreicht, bevor es fertig wurde | Nein |
273| `error_max_budget_usd` | Hat das `maxBudgetUsd`-Limit erreicht, bevor es fertig wurde | Nein |
274| `error_during_execution` | Ein Fehler unterbrach die Schleife (zum Beispiel, ein API-Fehler oder abgebrochene Anfrage) | Nein |
275| `error_max_structured_output_retries` | Strukturierte Ausgabevalidierung fehlgeschlagen nach dem konfigurierten Wiederholungslimit | Nein |
276
277Das Feld `result` (die endgültige Textausgabe) ist nur in der `success`-Variante vorhanden, daher überprüfen Sie immer den Subtyp, bevor Sie es lesen. Alle Ergebnis-Subtypen tragen `total_cost_usd`, `usage`, `num_turns` und `session_id`, daher können Sie Kosten verfolgen und fortfahren, auch nach Fehlern. In Python sind `total_cost_usd` und `usage` als optional typisiert und können auf einigen Fehlerpfaden `None` sein, daher schützen Sie vor dem Formatieren. Siehe [Kosten und Nutzung verfolgen](/de/agent-sdk/cost-tracking) für Details zur Interpretation der `usage`-Felder.
278
279Das Ergebnis enthält auch ein Feld `stop_reason` (`string | null` in TypeScript, `str | None` in Python), das angibt, warum das Modell bei seiner endgültigen Runde die Generierung gestoppt hat. Häufige Werte sind `end_turn` (Modell fertig normal), `max_tokens` (hat das Ausgabe-Token-Limit erreicht) und `refusal` (das Modell lehnte die Anfrage ab). Bei Fehler-Ergebnis-Subtypen trägt `stop_reason` den Wert aus der letzten Assistenten-Antwort, bevor die Schleife endete. Um Ablehnungen zu erkennen, überprüfen Sie `stop_reason === "refusal"` (TypeScript) oder `stop_reason == "refusal"` (Python). Siehe [`SDKResultMessage`](/de/agent-sdk/typescript#sdkresultmessage) (TypeScript) oder [`ResultMessage`](/de/agent-sdk/python#resultmessage) (Python) für den vollständigen Typ.
280
281## Hooks
282
283[Hooks](/de/agent-sdk/hooks) sind Rückrufe, die an bestimmten Punkten in der Schleife ausgelöst werden: bevor ein Werkzeug läuft, nachdem es zurückkommt, wenn der Agent fertig ist, und so weiter. Einige häufig verwendete Hooks sind:
284
285| Hook | Wann es ausgelöst wird | Häufige Verwendungen |
286| :------------------------------- | :----------------------------------------------- | :--------------------------------------------------------------- |
287| `PreToolUse` | Bevor ein Werkzeug ausgeführt wird | Eingaben validieren, gefährliche Befehle blockieren |
288| `PostToolUse` | Nachdem ein Werkzeug zurückkommt | Ausgaben prüfen, Nebenwirkungen auslösen |
289| `UserPromptSubmit` | Wenn ein Prompt gesendet wird | Zusätzlichen Kontext in Prompts injizieren |
290| `Stop` | Wenn der Agent fertig ist | Ergebnis validieren, Sitzungsstatus speichern |
291| `SubagentStart` / `SubagentStop` | Wenn ein Subagent spawnt oder abgeschlossen wird | Parallele Task-Ergebnisse verfolgen und aggregieren |
292| `PreCompact` | Bevor Kontext-Komprimierung auftritt | Vollständiges Transkript archivieren, bevor zusammengefasst wird |
293
294Hooks laufen in Ihrem Anwendungsprozess, nicht im Kontext des Agenten, daher verbrauchen sie keinen Kontext. Hooks können auch die Schleife kurzschließen: ein `PreToolUse`-Hook, der einen Werkzeugaufruf ablehnt, verhindert seine Ausführung, und Claude erhält stattdessen die Ablehnungsnachricht.
295
296Beide SDKs unterstützen alle oben genannten Ereignisse. Das TypeScript SDK enthält zusätzliche Ereignisse, die Python noch nicht unterstützt. Siehe [Ausführung mit Hooks kontrollieren](/de/agent-sdk/hooks) für die vollständige Ereignisliste, Pro-SDK-Verfügbarkeit und die vollständige Callback-API.
297
298## Alles zusammenbringen
299
300Dieses Beispiel kombiniert die Schlüsselkonzepte von dieser Seite in einen einzelnen Agent, der fehlgeschlagene Tests behebt. Es konfiguriert den Agent mit zulässigen Werkzeugen (automatisch genehmigt, damit der Agent autonom läuft), Projekteinstellungen und Sicherheitslimits für Runden und Anstrengungsgrad. Während die Schleife läuft, erfasst sie die Sitzungs-ID für mögliche Wiederaufnahme, verarbeitet das endgültige Ergebnis und gibt die Gesamtkosten aus.
301
302<CodeGroup>
303 ```python Python theme={null}
304 import asyncio
305 from claude_agent_sdk import query, ClaudeAgentOptions, ResultMessage
306
307
308 async def run_agent():
309 session_id = None
310
311 async for message in query(
312 prompt="Find and fix the bug causing test failures in the auth module",
313 options=ClaudeAgentOptions(
314 allowed_tools=[
315 "Read",
316 "Edit",
317 "Bash",
318 "Glob",
319 "Grep",
320 ], # Listing tools here auto-approves them (no prompting)
321 setting_sources=[
322 "project"
323 ], # Load CLAUDE.md, skills, hooks from current directory
324 max_turns=30, # Prevent runaway sessions
325 effort="high", # Thorough reasoning for complex debugging
326 ),
327 ):
328 # Handle the final result
329 if isinstance(message, ResultMessage):
330 session_id = message.session_id # Save for potential resumption
331
332 if message.subtype == "success":
333 print(f"Done: {message.result}")
334 elif message.subtype == "error_max_turns":
335 # Agent ran out of turns. Resume with a higher limit.
336 print(f"Hit turn limit. Resume session {session_id} to continue.")
337 elif message.subtype == "error_max_budget_usd":
338 print("Hit budget limit.")
339 else:
340 print(f"Stopped: {message.subtype}")
341 if message.total_cost_usd is not None:
342 print(f"Cost: ${message.total_cost_usd:.4f}")
343
344
345 asyncio.run(run_agent())
346 ```
347
348 ```typescript TypeScript theme={null}
349 import { query } from "@anthropic-ai/claude-agent-sdk";
350
351 let sessionId: string | undefined;
352
353 for await (const message of query({
354 prompt: "Find and fix the bug causing test failures in the auth module",
355 options: {
356 allowedTools: ["Read", "Edit", "Bash", "Glob", "Grep"], // Listing tools here auto-approves them (no prompting)
357 settingSources: ["project"], // Load CLAUDE.md, skills, hooks from current directory
358 maxTurns: 30, // Prevent runaway sessions
359 effort: "high" // Thorough reasoning for complex debugging
360 }
361 })) {
362 // Save the session ID to resume later if needed
363 if (message.type === "system" && message.subtype === "init") {
364 sessionId = message.session_id;
365 }
366
367 // Handle the final result
368 if (message.type === "result") {
369 if (message.subtype === "success") {
370 console.log(`Done: ${message.result}`);
371 } else if (message.subtype === "error_max_turns") {
372 // Agent ran out of turns. Resume with a higher limit.
373 console.log(`Hit turn limit. Resume session ${sessionId} to continue.`);
374 } else if (message.subtype === "error_max_budget_usd") {
375 console.log("Hit budget limit.");
376 } else {
377 console.log(`Stopped: ${message.subtype}`);
378 }
379 console.log(`Cost: $${message.total_cost_usd.toFixed(4)}`);
380 }
381 }
382 ```
383</CodeGroup>
384
385## Nächste Schritte
386
387Jetzt, da Sie die Schleife verstehen, hier ist, wohin Sie gehen sollten, je nachdem, was Sie erstellen:
388
389* **Haben Sie noch keinen Agent ausgeführt?** Beginnen Sie mit dem [Schnellstart](/de/agent-sdk/quickstart), um das SDK installiert zu bekommen und ein vollständiges Beispiel von Anfang bis Ende laufen zu sehen.
390* **Bereit, in Ihr Projekt zu integrieren?** [Laden Sie CLAUDE.md, Fähigkeiten und Dateisystem-Hooks](/de/agent-sdk/claude-code-features), damit der Agent automatisch Ihren Projektkonventionen folgt.
391* **Erstellen Sie eine interaktive Benutzeroberfläche?** Aktivieren Sie [Streaming](/de/agent-sdk/streaming-output), um Live-Text und Werkzeugaufrufe anzuzeigen, während die Schleife läuft.
392* **Benötigen Sie strengere Kontrolle über das, was der Agent tun kann?** Sperren Sie den Werkzeugzugriff mit [Berechtigungen](/de/agent-sdk/permissions) und verwenden Sie [Hooks](/de/agent-sdk/hooks), um Werkzeugaufrufe vor ihrer Ausführung zu prüfen, zu blockieren oder zu transformieren.
393* **Führen Sie lange oder teure Aufgaben aus?** Lagern Sie isolierte Arbeiten auf [Subagenten](/de/agent-sdk/subagents) aus, um Ihren Hauptkontext schlank zu halten.
394
395Für das breitere konzeptionelle Bild der agentengesteuerten Schleife (nicht SDK-spezifisch) siehe [So funktioniert Claude Code](/de/how-claude-code-works).