Streaming-Tool-Aufrufe: Keine eingefrorenen Spinner mehr
Ein gestreamter Tool-Aufruf trifft zuerst mit dem Namen des Tools ein, und seine Eingabe folgt in Teilen, sodass der Bildschirm anzeigen kann, was gerade passiert. Das Video zeigt zwei Versionen des Bildschirms bei Meridian, einer fiktiven Engineering-Beratung, nebeneinander. Die eine hat kein Streaming, die andere schon. Die Demo ist simuliert und läuft mit einem Drittel der Geschwindigkeit.
Dieses Video wurde im September 2026 aufgenommen, und sein Code verwendet Claude Sonnet 5 (claude-sonnet-5). Deine Ergebnisse können bei neueren Modellen abweichen.
Angenommen, dein Nutzer schaut acht Sekunden lang auf einen Spinner. Das passiert, weil deine Tool-Loop jede Anfrage sendet, wartet und eine fertige Antwort zurückbekommt.
In dieser Zeit wählt Claude ein Tool aus und schreibt dessen Eingabe, dein Code führt das Tool aus, und Claude schreibt die Antwort. Dein Code sieht jede Antwort erst, wenn sie fertig ist, also hat deine Benutzeroberfläche nichts anzuzeigen, während Claude schreibt.
Meridian hat dieses Problem heute. Der Support-Agent ist in Python geschrieben und beantwortet Fragen von Mitarbeitenden zu Projekten. Wenn ein Mitarbeiter fragt: „Wie ist der Status des Pumpstation-Auftrags?“, zeigt der Bildschirm „denke nach …“ an, bis die Antwort kommt.
Streaming verändert, was dieser Mitarbeiter sieht. Mit Streaming erhält dein Code die Antwort Stück für Stück, bevor sie fertig ist. So kann Meridians Bildschirm „Suche Projekt …“ anzeigen, sobald Claude das Tool auswählt.
Wie ein gestreamter Tool-Aufruf aussieht
Wo deine Tool-Loop ihre Anfrage sendet, ersetze client.messages.create(...) durch client.messages.stream(...)(öffnet in neuem Tab). Die Antwort trifft dann als eine Reihe von Server-Sent Events(öffnet in neuem Tab) ein, kleinen JSON-Nachrichten, die jeweils einen type haben.
Eine Antwort besteht aus Content-Blöcken, kurz Blöcke genannt, mit einem Block für jeden Textabschnitt von Claude und einem für jeden Tool-Aufruf. Der Block eines Tool-Aufrufs hat den Typ tool_use. Aktuelle Modelle können auch Thinking-Blöcke hinzufügen, die der Code in dieser Lektion ignoriert.
Stell dir vor, ein Freund liest dir am Telefon eine Telefonnummer vor. Zuerst sagt er dir, wessen Nummer es ist: „Hier ist die Nummer des Klempners.“ Dann liest er sie ein paar Ziffern auf einmal vor und hält an, wo er möchte. Am Ende sagt er: „Das war's.“
Der Block eines Tool-Aufrufs trifft genauso ein wie die Telefonnummer. Ein Event eröffnet ihn, ein oder mehrere Events füllen ihn, und ein Event schließt ihn ab. Hier sind die Events von Meridians Tool-Aufruf.
{"type": "content_block_start", "index": 0,
"content_block": {"type": "tool_use", "id": "toolu_01",
"name": "lookup_project_status", "input": {}}}
{"type": "content_block_delta", "index": 0,
"delta": {"type": "input_json_delta", "partial_json": "{\"project_"}}
{"type": "content_block_delta", "index": 0,
"delta": {"type": "input_json_delta", "partial_json": "id\": \"MEG-2"}}
{"type": "content_block_delta", "index": 0,
"delta": {"type": "input_json_delta", "partial_json": "026-0142\"}"}}
{"type": "content_block_stop", "index": 0}Zeige das gewählte Tool, sobald sein Block geöffnet wird
Der Name des Tools steht in content_block_start, dem ersten Event des Blocks. Wenn dieses Event eintrifft, kann dein Code die Statuszeile aktualisieren, die eine Textzeile, die deine Benutzeroberfläche anzeigt, während dein Nutzer wartet.
Meridian führt ein kleines Dict namens STATUS, das den Namen jedes Tools auf Worte für den Nutzer abbildet, sodass lookup_project_status auf dem Bildschirm zu „Suche Projekt …“ wird.
Die Streaming-Anfrage zusammensetzen
Wenn der Stream endet, rufe stream.get_final_message() auf, um die fertige Antwort zu erhalten, dasselbe Objekt, das client.messages.create(...) zurückgibt. So bleibt der Rest deiner Tool-Loop wie er war.
Hier ist Meridians Streaming-Anfrage. on_status ist eine Funktion, die du schreibst und die einen String als Statuszeile anzeigt.
Die wichtigsten Erkenntnisse
- Ein gestreamter Tool-Aufruf trifft zuerst mit dem Namen des Tools ein, dann folgt seine Eingabe in Teilen.
- Sobald
content_block_starteintrifft, zeige das gewählte Tool in Worten, die dein Nutzer versteht. stream.get_final_message()gibt die fertige Antwort zurück, sodass sich der Rest deiner Tool-Loop nicht ändert.