Die Schleife auf einen Blick
Jede Agent-Sitzung folgt dem gleichen Zyklus:- Prompt empfangen. Claude empfängt Ihren Prompt zusammen mit dem System-Prompt, Werkzeugdefinitionen und Gesprächsverlauf. Das SDK gibt eine
SystemMessagemit dem Subtyp"init"aus, die Sitzungsmetadaten enthält. - 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 ein oder mehrere
AssistantMessage-Objekte aus, eines für jeden Inhaltsblock, wie einen Textblock oder eine Werkzeugaufrufsanforderung. - 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 verwenden, um Werkzeugaufrufe vor ihrer Ausführung abzufangen, zu ändern oder zu blockieren.
- 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.
- Ergebnis zurückgeben. Das SDK gibt eine endgültige
AssistantMessagemit der Textantwort (keine Werkzeugaufrufe) aus, gefolgt von einerResultMessagemit dem endgültigen Text, Token-Nutzung, Kosten und Sitzungs-ID.
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.
Runden und Nachrichten
Eine 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. Stellen Sie sich vor, wie eine vollständige Sitzung für den Prompt „Beheben Sie die fehlgeschlagenen Tests in auth.ts“ aussehen könnte. Zunächst sendet das SDK Ihren Prompt an Claude und gibt eineSystemMessage mit den Sitzungsmetadaten aus. Dann beginnt die Schleife:
- Runde 1: Claude ruft
Bashauf, umnpm testauszuführen. Das SDK gibt eineAssistantMessagemit dem Werkzeugaufruf aus, führt den Befehl aus und gibt dann eineUserMessagemit der Ausgabe (drei Fehler) aus. - Runde 2: Claude ruft
Readaufauth.tsundauth.test.tsauf. Das SDK gibt eineAssistantMessagefür jeden Aufruf aus und gibt die Dateiinhalte zurück. - Runde 3: Claude ruft
Editauf, umauth.tszu beheben, und ruft dannBashauf, umnpm testerneut auszuführen. Alle drei Tests bestehen. Das SDK gibt eineAssistantMessagefür jeden Aufruf aus. - Letzte Runde: Claude erzeugt eine nur-Text-Antwort ohne Werkzeugaufrufe: „Behobener Auth-Bug, alle drei Tests bestehen jetzt.“ Das SDK gibt eine endgültige
AssistantMessagemit diesem Text aus, gefolgt von einerResultMessagemit dem gleichen Text plus Kosten und Nutzung.
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.
Ohne 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 unten für die Optionsreferenz.
Nachrichtentypen
Wä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:-
SystemMessage: Sitzungslebenszyklus-Ereignisse. Das Feldsubtypeunterscheidet sie:"init": Sitzungsmetadaten für den Durchlauf. Wenn einSessionStart- oderSetup-Hook während des Sitzungsstarts ausgeführt wird, kommen seine Hook-Lebenszyklus-Nachrichten vor derinit-Nachricht an"compact_boundary": wird nach Komprimierung ausgelöst"informational": einfache Textstatusbanner aus der Schleife"worker_shutting_down": der Host wird beendet oder Remote Control wurde getrennt
"init"sein eigener Typ in derSDKMessage-Union statt eines Subtyps vonSDKSystemMessage. -
AssistantMessage: wird für jeden Inhaltsblock in Claudes Antworten ausgegeben, einschließlich des endgültigen nur-Text-Blocks. Jede trägt einen einzelnen Inhaltsblock, wie Text oder einen Werkzeugaufruf, und die Nachrichten aus einer Antwort teilen sich eine Nachrichten-ID. -
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. -
StreamEvent: wird nur ausgegeben, wenn Teilteilnachrichten aktiviert sind. Enthält rohe API-Streaming-Ereignisse (Text-Deltas, Werkzeug-Input-Chunks). Siehe Stream-Antworten. -
ResultMessage: markiert das Ende der Agent-Schleife. Enthält das endgültige Textergebnis, Token-Nutzung, Kosten und Sitzungs-ID. Überprüfen Sie das Feldsubtype, um zu bestimmen, ob die Aufgabe erfolgreich war oder ein Limit erreicht hat. Eine kleine Anzahl von nachfolgenden Systemevenementen, wieprompt_suggestion, können danach ankommen, daher sollten Sie den Stream bis zum Ende durchlaufen, anstatt beim Ergebnis zu unterbrechen. Siehe Ergebnis verarbeiten.
Nachrichten verarbeiten
Welche Nachrichten Sie verarbeiten, hängt davon ab, was Sie erstellen:- Nur endgültige Ergebnisse: verarbeiten Sie
ResultMessage, um die Ausgabe, Kosten und ob die Aufgabe erfolgreich war oder ein Limit erreicht hat, zu erhalten. - Fortschritts-Updates: verarbeiten Sie
AssistantMessage, um zu sehen, was Claude jede Runde tut, einschließlich welche Werkzeuge es aufgerufen hat. - Live-Streaming: aktivieren Sie Teilteilnachrichten (
include_partial_messagesin Python,includePartialMessagesin TypeScript), umStreamEvent-Nachrichten in Echtzeit zu erhalten. Siehe Stream-Antworten in Echtzeit.
- Python: überprüfen Sie Nachrichtentypen mit
isinstance()gegen Klassen, die ausclaude_agent_sdkimportiert wurden (zum Beispiel,isinstance(message, ResultMessage)). - TypeScript: überprüfen Sie das Feld
typestring (zum Beispiel,message.type === "result").AssistantMessageundUserMessageumhüllen die rohe API-Nachricht in einem.message-Feld, daher befinden sich Inhaltsblöcke beimessage.message.content, nicht beimessage.content.
Beispiel: Nachrichtentypen überprüfen und Ergebnisse verarbeiten
Beispiel: Nachrichtentypen überprüfen und Ergebnisse verarbeiten
Werkzeugausführung
Werkzeuge 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.Integrierte Werkzeuge
Das SDK enthält die gleichen Werkzeuge, die Claude Code antreiben:
Auf den Modellen, die die Aufgabenverfolgungswerkzeuge nicht erhalten, stellt Claude Code
TaskCreate und TaskUpdate nur bereit, wenn Sie sich dafür entscheiden.
Über integrierte Werkzeuge hinaus können Sie:
- Externe Dienste verbinden mit MCP-Servern (Datenbanken, Browser, APIs)
- Benutzerdefinierte Werkzeuge definieren mit benutzerdefinierten Werkzeug-Handlern
- Projekt-Fähigkeiten laden über Einstellungsquellen für wiederverwendbare Workflows
Werkzeugberechtigungen
Claude 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:allowed_tools/allowedToolsgenehmigt aufgelistete Tools automatisch. Ein nur lesender Agent mit["Read", "Glob", "Grep"]in seiner Liste zulässiger Tools führt diese Tools ohne Nachfrage aus, abgesehen von Lesevorgängen aus Netzwerkpfaden. Tools, die nicht aufgelistet sind, sind weiterhin verfügbar, und Aufrufe an sie, die eine Genehmigung benötigen, werden an den Berechtigungsmodus undcanUseToolweitergereicht.disallowed_tools/disallowedToolsblockiert aufgelistete Werkzeuge, unabhängig von anderen Einstellungen. Siehe Berechtigungen für die Reihenfolge, in der Regeln überprüft werden, bevor ein Werkzeug ausgeführt wird.permission_mode/permissionModekontrolliert, wie viel menschliche Überwachung Sie wünschen. Das SDK wertet den aktiven Modus zusammen mit Ihren Zulassungs- und Ablehnungsregeln in einer festen Reihenfolge aus, die in Wie Berechtigungen ausgewertet werden beschrieben ist. Siehe Berechtigungsmodus für verfügbare Modi.
"Bash(npm *)" einschränken, um nur bestimmte Befehle zuzulassen. Siehe Berechtigungen für die vollständige Regelsyntax.
Wenn ein Werkzeug abgelehnt wird, erhält Claude eine Ablehnungsnachricht als Werkzeugergebnis und versucht normalerweise einen anderen Ansatz oder meldet, dass es nicht fortfahren konnte.
Parallele Werkzeugausführung
Wenn Claude mehrere Werkzeugaufrufe in einer einzelnen Runde anfordert, können beide SDKs sie je nach Werkzeug gleichzeitig oder sequenziell ausführen. Schreibgeschützte Werkzeuge (wieRead, 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.
Benutzerdefinierte 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 und Python SDKs verwenden diesen Feldnamen aus dem MCP SDK.
Steuern Sie, wie die Schleife ausgeführt wird
Sie können begrenzen, wie viele Durchläufe die Schleife durchführt, wie viel sie kostet, wie tiefgreifend Claude denkt, und ob Tools vor der Ausführung genehmigt werden müssen. All diese sind Felder aufClaudeAgentOptions (Python) / Options (TypeScript).
Durchläufe und Budget
Wenn eine dieser Grenzen erreicht wird, gibt das SDK eine
ResultMessage mit einem entsprechenden Fehler-Subtyp (error_max_turns oder error_max_budget_usd) zurück. Siehe Handle the result für die Überprüfung dieser Subtypen und ClaudeAgentOptions / Options für die Syntax.
Die Budget-Obergrenze deckt Subagenten ab: ihre Ausgaben zählen zur Gesamtsumme. Sobald die Ausgaben die Obergrenze erreichen, schlägt das Spawnen eines weiteren Subagenten mit Budget limit reached fehl, und Claude Code stoppt alle noch laufenden Hintergrund-Subagenten. Die Durchsetzungsverhalten der Obergrenze erfordern Claude Code v2.1.217 oder später.
Mit Streaming-Eingabe bleibt eine Nachricht, die noch in der Warteschlange steht, wenn ein Durchlauf bei der max-turns-Grenze endet, in der Warteschlange. Claude Code fügt sie nicht zum letzten Modellaufruf dieses Durchlaufs hinzu. Es startet einen neuen Durchlauf für die Nachricht, und die max-turns-Zählung beginnt für diesen Durchlauf von vorne. Das Budget-Gesamtbudget wird über Nachrichten hinweg kumuliert, und sobald die Ausgaben maxBudgetUsd erreichen, enden spätere Nachrichten in derselben Konversation mit dem error_max_budget_usd-Ergebnis. Ein /clear startet das Budget neu.
Budget-Spielraum
Claude Code vergleicht die Ausgaben erst nach dem Eintreffen der Modellantworten mit der Obergrenzemax_budget_usd / maxBudgetUsd, da sich die Kosten jeder Antwort aus der Token-Nutzung ergeben, die die API mit ihr zurückgibt. Die Antwort, die die Obergrenze erreicht, wird dennoch abgeschlossen und zählt zu total_cost_usd. Die Ausgaben können die Obergrenze daher um bis zu die Kosten dieser einen Antwort überschreiten, zuzüglich dessen, was zu diesem Zeitpunkt noch laufende Subagenten ausgeben, bevor sie stoppen. Planen Sie dafür beim Festlegen der Obergrenze Spielraum ein.
Anstrengungsgrad
Dieeffort-Option steuert, wie viel Reasoning Claude anwendet. Niedrigere Anstrengungsgrade verwenden weniger Token pro Durchlauf und reduzieren die Kosten. Nicht alle Modelle unterstützen den effort-Parameter. Siehe Effort für die Modelle, die ihn unterstützen.
Wenn Sie
effort nicht setzen, löst Claude Code den Anstrengungsgrad selbst auf, in der Reihenfolge, die Adjust effort level beschreibt.
effort tauscht Latenz und Token-Kosten gegen Reasoning-Tiefe innerhalb jeder Antwort. Extended thinking ist eine separate Funktion, die thinking-Blöcke in der Ausgabe erzeugt, und das display-Feld auf ThinkingConfig für Python oder TypeScript steuert, ob Sie deren Text erhalten. Sie sind unabhängig: Sie können effort: "low" mit aktiviertem Extended Thinking setzen oder effort: "max" ohne es.effort in den Top-Level-query()-Optionen für die gesamte Sitzung oder pro Subagent mit dem effort-Feld auf AgentDefinition, um die Sitzungsebene zu überschreiben.
Genehmigungsmodus
Die Genehmigungsmodus-Option (permission_mode in Python, permissionMode in TypeScript) steuert, ob der Agent vor der Verwendung von Tools um Genehmigung fragt:
Verwenden Sie für interaktive Anwendungen
"default" mit einem Tool-Genehmigungsrückruf, um Genehmigungsaufforderungen anzuzeigen. Für autonome Agenten auf einem Dev-Computer genehmigt "acceptEdits" automatisch Dateibearbeitungen und häufige Dateisystem-Befehle (mkdir, touch, mv, cp usw.), während andere Bash-Befehle immer noch durch Allow-Regeln kontrolliert werden. Reservieren Sie "bypassPermissions" für CI, Container oder andere isolierte Umgebungen. Siehe Permissions für vollständige Details.
Modell
Setzen Sie diemodel-Option, um auszuwählen, welches Modell die Sitzung ausführt. Weitere Informationen finden Sie unter Choose a model.
Das Kontextfenster
Das 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, was Kosten und Latenz für wiederholte Präfixe reduziert. Informationen dazu, wie ein benutzerdefinierter System-Prompt oderappend-Text die Cache-Wiederverwendung über Sitzungen hinweg beeinflusst, finden Sie unter Modifying system prompts.
Was Kontext verbraucht
Hier ist, wie jede Komponente den Kontext im SDK beeinflusst:
Groß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.
Automatische Komprimierung
Wenn 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 mittype: "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).
Die 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) statt in den anfänglichen Prompt, da CLAUDE.md-Inhalte bei jeder Anfrage erneut eingespritzt werden.
Sie können das Komprimierungsverhalten auf mehrere Arten anpassen:
- 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 Kompressor passt auf Absicht an, daher ist der Abschnittskopf frei.
PreCompact-Hook: Führen Sie benutzerdefinierte Logik vor der Komprimierung aus, zum Beispiel um das vollständige Transkript zu archivieren. Der Hook erhält eintrigger-Feld (manualoderauto). Siehe Hooks.- Manuelle Komprimierung: Senden Sie
/compactals Prompt-String, um Komprimierung bei Bedarf auszulösen. Befehle, die auf diese Weise gesendet werden, sind SDK-Eingaben. Siehe dispatch commands by name.
Beispiel: Zusammenfassungsanweisungen in CLAUDE.md
Beispiel: Zusammenfassungsanweisungen in CLAUDE.md
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.
CLAUDE.md
Kontext effizient halten
Ein paar Strategien für langfristig laufende Agenten:- Verwenden Sie Subagenten für Teilaufgaben. Jeder Subagent startet mit einer neuen Konversation (kein vorheriger Nachrichtenverlauf, er lädt jedoch seinen eigenen System-Prompt und Kontext auf Projektebene wie CLAUDE.md). Er sieht die Turns des übergeordneten Agenten nicht, und nur seine abschließende Antwort wird an den übergeordneten Agenten zurückgegeben. Der Kontext des Hauptagenten wächst um diese Zusammenfassung, nicht um das vollständige Transkript der Teilaufgabe. Siehe Was Subagenten erben für Details.
- Seien Sie selektiv mit Werkzeugen. Jede Werkzeugdefinition nimmt Kontextraum ein. Verwenden Sie das Feld
toolsaufAgentDefinition, um Subagenten auf die minimale Menge zu beschränken, die sie benötigen. - Beobachten Sie MCP-Server-Kosten. MCP tool search schiebt MCP-Werkzeugschemas standardmäßig auf und lädt sie bei Bedarf. Wenn die Werkzeugsuche ausgeschaltet ist oder auf vorherige Laden auf nicht unterstützten Modellen und bestimmten Plattformen zurückgefallen ist, fügt jeder MCP-Server alle seine Werkzeugschemas zu jeder Anfrage hinzu, daher können ein paar Server mit vielen Werkzeugen erheblichen Kontext verbrauchen, bevor der Agent irgendwelche Arbeiten verrichtet. Siehe Configure tool search für die Konfigurationen, bei denen das Fallback angewendet wird.
- Verwenden Sie niedrigere Anstrengung für Routine-Aufgaben. Setzen Sie Anstrengung auf
"low"für Agenten, die nur Dateien lesen oder Verzeichnisse auflisten müssen. Dies reduziert Token-Nutzung und Kosten.
Sitzungen und Kontinuität
Jede Interaktion mit dem SDK erstellt oder setzt eine Sitzung fort. Erfassen Sie die Sitzungs-ID ausResultMessage.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.
Wenn 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.
Siehe Sitzungsverwaltung für den vollständigen Leitfaden zu Resume-, Continue- und Fork-Mustern. Um Sitzungen über zustandslose Container oder serverlose Hosts hinweg fortzusetzen, übergeben Sie einen session_store / sessionStore Adapter, damit das SDK Transkripte in Ihr eigenes Backend spiegelt und ein anderer Host sie fortsetzen kann. Der Claude Code Unterprozess schreibt weiterhin zuerst auf die lokale Festplatte. Siehe Dual-Write-Architektur für die Informationen, welche Kopie eine neue Sitzung überlebt versus einen aus dem Store fortgesetzten Lauf, und wie Sie die lokale Kopie kurzlebig halten.
In Python verwaltet
ClaudeSDKClient Sitzungs-IDs automatisch über mehrere Aufrufe hinweg. Siehe die Python SDK-Referenz für Details.Ergebnis verarbeiten
Wenn die Schleife endet, sagt Ihnen dieResultMessage, 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.
Das Feld
result enthält die endgültige Textausgabe und ist nur in der success-Variante vorhanden, daher überprüfen Sie immer den Subtyp, bevor Sie es lesen.
Alle Ergebnis-Subtypen enthalten total_cost_usd, usage, num_turns und session_id, daher können Sie Kosten verfolgen und fortfahren, auch nach Fehlern. Achten Sie auf diese Fälle:
- Nach einem Sitzungsabsturz ist das endgültige Ergebnis ein
error_during_execution, dessen Kostenfelder möglicherweise auf Null gesetzt sind und dessenstop_reasonnullist, und der Prozess beendet sich nach dem Ausgeben. Siehe Gesamtsummen nach einem Sitzungsabsturz wiederherstellen. - In Python sind
total_cost_usd,usageundmodel_usageals optional typisiert, daher überprüfen Sie, dass sie nichtNonesind, bevor Sie sie lesen.
usage deckt nur die Hauptagentenschleife ab. Verwenden Sie modelUsage oder model_usage in Python für die Gesamtbaum-Token- und Kostenabrechnung. Siehe Kosten und Nutzung verfolgen für Details zur Interpretation der usage-Felder.
Wenn eine Abfrage mit einem Fehler-Ergebnis endet:
- Ein einzelner
query()-Aufruf liefert die endgültige Ergebnis-Nachricht und löst dann einen Fehler aus, der den Fehlertext enthält, wie z. B.Reached maximum number of turns. Das Auslösen ist beabsichtigt. Umhüllen Sie die Schleife mit einem Try-Block, wenn Ihr Code danach fortfahren muss. Der zugrunde liegende Claude Code-Prozess beendet sich auch mit einem Nicht-Null-Code. - Eine Streaming-Eingabe-Sitzung bleibt aktiv, und Sie können weiterhin Nachrichten senden, außer nach einem Sitzungsabsturz, der ein endgültiges
error_during_execution-Ergebnis ausgibt und den Prozess beendet.
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-Ergebnissen, die die Schleife erzeugt hat, trägt stop_reason den Wert aus der letzten Assistenten-Antwort, bevor die Schleife endete; das Ergebnis, das Claude Code nach einem Sitzungsabsturz synthetisiert, trägt null.
Um Ablehnungen zu erkennen, überprüfen Sie stop_reason === "refusal" (TypeScript) oder stop_reason == "refusal" (Python). Siehe SDKResultMessage (TypeScript) oder ResultMessage (Python) für den vollständigen Typ.
Hooks
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:
Hooks 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.
Beide 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 für die vollständige Ereignisliste, Pro-SDK-Verfügbarkeit und die vollständige Callback-API.
Alles zusammenbringen
Dieses 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. Da ein einzelnerquery()-Aufruf nach dem Ausgeben eines Fehlerergebnisses eine Ausnahme auslöst, ist die Schleife in einen Try-Block eingewickelt, damit das Skript sauber beendet wird, wenn ein Limit erreicht wird.
Done:-Zeile mit der Zusammenfassung des Agents zur Behebung aus, gefolgt von einer Zeile wie Cost: $0.0312.
Nächste Schritte
Jetzt, da Sie die Schleife verstehen, hier ist, wohin Sie gehen sollten, je nachdem, was Sie erstellen:- Haben Sie noch keinen Agent ausgeführt? Beginnen Sie mit dem Schnellstart, um das SDK installiert zu bekommen und ein vollständiges Beispiel von Anfang bis Ende laufen zu sehen.
- Bereit, in Ihr Projekt zu integrieren? Laden Sie CLAUDE.md, Fähigkeiten und Dateisystem-Hooks, damit der Agent automatisch Ihren Projektkonventionen folgt.
- Erstellen Sie eine interaktive Benutzeroberfläche? Aktivieren Sie Streaming, um Live-Text und Werkzeugaufrufe anzuzeigen, während die Schleife läuft.
- Benötigen Sie strengere Kontrolle über das, was der Agent tun kann? Sperren Sie den Werkzeugzugriff mit Berechtigungen und verwenden Sie Hooks, um Werkzeugaufrufe vor ihrer Ausführung zu prüfen, zu blockieren oder zu transformieren.
- Führen Sie lange oder teure Aufgaben aus? Lagern Sie isolierte Arbeiten auf Subagenten aus, um Ihren Hauptkontext schlank zu halten.
- Stellen Sie als Service bereit? Siehe Hosting des Agent SDK für Container- und Serverless-Anleitung und Sitzungsspeicher, um Sitzungen in Ihrem eigenen Backend zu speichern.