Beim Erstellen einer Nachricht können Sie "stream": true setzen, um die Antwort inkrementell mit Server-Sent Events (SSE) zu streamen.

Streaming mit SDKs

Unsere Python und TypeScript SDKs bieten mehrere Möglichkeiten des Streamings. Das Python SDK ermöglicht sowohl synchrone als auch asynchrone Streams. Siehe die Dokumentation in jedem SDK für Details.
import anthropic

client = anthropic.Anthropic()

with client.messages.stream(
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hello"}],
    model="claude-sonnet-4-5",
) as stream:
  for text in stream.text_stream:
      print(text, end="", flush=True)

Event-Typen

Jedes Server-Sent Event enthält einen benannten Event-Typ und zugehörige JSON-Daten. Jedes Event verwendet einen SSE-Event-Namen (z.B. event: message_stop) und enthält den passenden Event-type in seinen Daten. Jeder Stream verwendet den folgenden Event-Ablauf:
  1. message_start: enthält ein Message-Objekt mit leerem content.
  2. Eine Serie von Content-Blöcken, von denen jeder ein content_block_start, ein oder mehrere content_block_delta-Events und ein content_block_stop-Event hat. Jeder Content-Block hat einen index, der seinem Index im finalen Message-content-Array entspricht.
  3. Ein oder mehrere message_delta-Events, die Top-Level-Änderungen am finalen Message-Objekt anzeigen.
  4. Ein finales message_stop-Event.
Die Token-Anzahlen, die im usage-Feld des message_delta-Events angezeigt werden, sind kumulativ.

Ping-Events

Event-Streams können auch eine beliebige Anzahl von ping-Events enthalten.

Error-Events

Wir können gelegentlich Fehler im Event-Stream senden. Zum Beispiel können Sie während Zeiten hoher Nutzung einen overloaded_error erhalten, der normalerweise einem HTTP 529 in einem nicht-streamenden Kontext entsprechen würde:
Example error
event: error
data: {"type": "error", "error": {"type": "overloaded_error", "message": "Overloaded"}}

Andere Events

In Übereinstimmung mit unserer Versionierungsrichtlinie können wir neue Event-Typen hinzufügen, und Ihr Code sollte unbekannte Event-Typen elegant behandeln.

Content-Block-Delta-Typen

Jedes content_block_delta-Event enthält ein delta eines Typs, der den content-Block an einem gegebenen index aktualisiert.

Text-Delta

Ein text-Content-Block-Delta sieht so aus:
Text delta
event: content_block_delta
data: {"type": "content_block_delta","index": 0,"delta": {"type": "text_delta", "text": "ello frien"}}

Input-JSON-Delta

Die Deltas für tool_use-Content-Blöcke entsprechen Updates für das input-Feld des Blocks. Um maximale Granularität zu unterstützen, sind die Deltas partielle JSON-Strings, während das finale tool_use.input immer ein Objekt ist. Sie können die String-Deltas akkumulieren und das JSON parsen, sobald Sie ein content_block_stop-Event erhalten, indem Sie eine Bibliothek wie Pydantic für partielles JSON-Parsing verwenden oder unsere SDKs nutzen, die Helfer für den Zugriff auf geparste inkrementelle Werte bereitstellen. Ein tool_use-Content-Block-Delta sieht so aus:
Input JSON delta
event: content_block_delta
data: {"type": "content_block_delta","index": 1,"delta": {"type": "input_json_delta","partial_json": "{\"location\": \"San Fra"}}}
Hinweis: Unsere aktuellen Modelle unterstützen nur das Ausgeben einer vollständigen Schlüssel- und Wert-Eigenschaft aus input gleichzeitig. Daher kann es bei der Verwendung von Tools zu Verzögerungen zwischen Streaming-Events kommen, während das Modell arbeitet. Sobald ein input-Schlüssel und -Wert akkumuliert sind, geben wir sie als mehrere content_block_delta-Events mit aufgeteiltem partiellem JSON aus, damit das Format automatisch feinere Granularität in zukünftigen Modellen unterstützen kann.

Thinking-Delta

Bei der Verwendung von erweitertem Denken mit aktiviertem Streaming erhalten Sie Denk-Inhalte über thinking_delta-Events. Diese Deltas entsprechen dem thinking-Feld der thinking-Content-Blöcke. Für Denk-Inhalte wird ein spezielles signature_delta-Event kurz vor dem content_block_stop-Event gesendet. Diese Signatur wird verwendet, um die Integrität des Denk-Blocks zu verifizieren. Ein typisches Thinking-Delta sieht so aus:
Thinking delta
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "Let me solve this step by step:\n\n1. First break down 27 * 453"}}
Das Signatur-Delta sieht so aus:
Signature delta
event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "signature_delta", "signature": "EqQBCgIYAhIM1gbcDa9GJwZA2b3hGgxBdjrkzLoky3dl1pkiMOYds..."}}

Vollständige HTTP-Stream-Antwort

Wir empfehlen dringend, dass Sie unsere Client-SDKs bei der Verwendung des Streaming-Modus verwenden. Wenn Sie jedoch eine direkte API-Integration erstellen, müssen Sie diese Events selbst behandeln. Eine Stream-Antwort besteht aus:
  1. Einem message_start-Event
  2. Potenziell mehreren Content-Blöcken, von denen jeder enthält:
    • Ein content_block_start-Event
    • Potenziell mehrere content_block_delta-Events
    • Ein content_block_stop-Event
  3. Einem message_delta-Event
  4. Einem message_stop-Event
Es können auch ping-Events über die Antwort verteilt sein. Siehe Event-Typen für weitere Details zum Format.

Grundlegende Streaming-Anfrage

curl https://api.anthropic.com/v1/messages \
     --header "anthropic-version: 2023-06-01" \
     --header "content-type: application/json" \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --data \
'{
  "model": "claude-sonnet-4-5",
  "messages": [{"role": "user", "content": "Hello"}],
  "max_tokens": 256,
  "stream": true
}'
Response
event: message_start
data: {"type": "message_start", "message": {"id": "msg_1nZdL29xx5MUA1yADyHTEsnR8uuvGzszyY", "type": "message", "role": "assistant", "content": [], "model": "claude-sonnet-4-5-20250929", "stop_reason": null, "stop_sequence": null, "usage": {"input_tokens": 25, "output_tokens": 1}}}

event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}}

event: ping
data: {"type": "ping"}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "Hello"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "!"}}

event: content_block_stop
data: {"type": "content_block_stop", "index": 0}

event: message_delta
data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence":null}, "usage": {"output_tokens": 15}}

event: message_stop
data: {"type": "message_stop"}

Streaming-Anfrage mit Tool-Verwendung

Tool-Verwendung unterstützt jetzt feinkörniges Streaming für Parameterwerte als Beta-Feature. Für weitere Details siehe Feinkörniges Tool-Streaming.
In dieser Anfrage bitten wir Claude, ein Tool zu verwenden, um uns das Wetter zu sagen.
  curl https://api.anthropic.com/v1/messages \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -d '{
      "model": "claude-sonnet-4-5",
      "max_tokens": 1024,
      "tools": [
        {
          "name": "get_weather",
          "description": "Get the current weather in a given location",
          "input_schema": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "The city and state, e.g. San Francisco, CA"
              }
            },
            "required": ["location"]
          }
        }
      ],
      "tool_choice": {"type": "any"},
      "messages": [
        {
          "role": "user",
          "content": "What is the weather like in San Francisco?"
        }
      ],
      "stream": true
    }'
Response
event: message_start
data: {"type":"message_start","message":{"id":"msg_014p7gG3wDgGV9EUtLvnow3U","type":"message","role":"assistant","model":"claude-sonnet-4-5-20250929","stop_sequence":null,"usage":{"input_tokens":472,"output_tokens":2},"content":[],"stop_reason":null}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: ping
data: {"type": "ping"}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Okay"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" let"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"'s"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" check"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" the"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" weather"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" for"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" San"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" Francisco"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" CA"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":":"}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: content_block_start
data: {"type":"content_block_start","index":1,"content_block":{"type":"tool_use","id":"toolu_01T1x1fJ34qAmk2tNTrN7Up6","name":"get_weather","input":{}}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"location\":"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" \"San"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" Francisc"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"o,"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" CA\""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":", "}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"\"unit\": \"fah"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"renheit\"}"}}

event: content_block_stop
data: {"type":"content_block_stop","index":1}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"output_tokens":89}}

event: message_stop
data: {"type":"message_stop"}

Streaming-Anfrage mit erweitertem Denken

In dieser Anfrage aktivieren wir erweitertes Denken mit Streaming, um Claudes schrittweise Argumentation zu sehen.
curl https://api.anthropic.com/v1/messages \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --header "anthropic-version: 2023-06-01" \
     --header "content-type: application/json" \
     --data \
'{
    "model": "claude-sonnet-4-5",
    "max_tokens": 20000,
    "stream": true,
    "thinking": {
        "type": "enabled",
        "budget_tokens": 16000
    },
    "messages": [
        {
            "role": "user",
            "content": "What is 27 * 453?"
        }
    ]
}'
Response
event: message_start
data: {"type": "message_start", "message": {"id": "msg_01...", "type": "message", "role": "assistant", "content": [], "model": "claude-sonnet-4-5-20250929", "stop_reason": null, "stop_sequence": null}}

event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "thinking", "thinking": ""}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "Let me solve this step by step:\n\n1. First break down 27 * 453"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n2. 453 = 400 + 50 + 3"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n3. 27 * 400 = 10,800"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n4. 27 * 50 = 1,350"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n5. 27 * 3 = 81"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "thinking_delta", "thinking": "\n6. 10,800 + 1,350 + 81 = 12,231"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "signature_delta", "signature": "EqQBCgIYAhIM1gbcDa9GJwZA2b3hGgxBdjrkzLoky3dl1pkiMOYds..."}}

event: content_block_stop
data: {"type": "content_block_stop", "index": 0}

event: content_block_start
data: {"type": "content_block_start", "index": 1, "content_block": {"type": "text", "text": ""}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 1, "delta": {"type": "text_delta", "text": "27 * 453 = 12,231"}}

event: content_block_stop
data: {"type": "content_block_stop", "index": 1}

event: message_delta
data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence": null}}

event: message_stop
data: {"type": "message_stop"}

Streaming-Anfrage mit Web-Such-Tool-Verwendung

In dieser Anfrage bitten wir Claude, das Web nach aktuellen Wetterinformationen zu durchsuchen.
curl https://api.anthropic.com/v1/messages \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --header "anthropic-version: 2023-06-01" \
     --header "content-type: application/json" \
     --data \
'{
    "model": "claude-sonnet-4-5",
    "max_tokens": 1024,
    "stream": true,
    "tools": [
        {
            "type": "web_search_20250305",
            "name": "web_search",
            "max_uses": 5
        }
    ],
    "messages": [
        {
            "role": "user",
            "content": "What is the weather like in New York City today?"
        }
    ]
}'
Response
event: message_start
data: {"type":"message_start","message":{"id":"msg_01G...","type":"message","role":"assistant","model":"claude-sonnet-4-5-20250929","content":[],"stop_reason":null,"stop_sequence":null,"usage":{"input_tokens":2679,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":3}}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"I'll check"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" the current weather in New York City for you"}}

event: ping
data: {"type": "ping"}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"."}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: content_block_start
data: {"type":"content_block_start","index":1,"content_block":{"type":"server_tool_use","id":"srvtoolu_014hJH82Qum7Td6UV8gDXThB","name":"web_search","input":{}}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"query"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"\":"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" \"weather"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" NY"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"C to"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"day\"}"}}

event: content_block_stop
data: {"type":"content_block_stop","index":1 }

event: content_block_start
data: {"type":"content_block_start","index":2,"content_block":{"type":"web_search_tool_result","tool_use_id":"srvtoolu_014hJH82Qum7Td6UV8gDXThB","content":[{"type":"web_search_result","title":"Weather in New York City in May 2025 (New York) - detailed Weather Forecast for a month","url":"https://world-weather.info/forecast/usa/new_york/may-2025/","encrypted_content":"Ev0DCioIAxgCIiQ3NmU4ZmI4OC1k...","page_age":null},...]}}

event: content_block_stop
data: {"type":"content_block_stop","index":2}

event: content_block_start
data: {"type":"content_block_start","index":3,"content_block":{"type":"text","text":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":"Here's the current weather information for New York"}}

event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":" City:\n\n# Weather"}}

event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":" in New York City"}}

event: content_block_delta
data: {"type":"content_block_delta","index":3,"delta":{"type":"text_delta","text":"\n\n"}}

...

event: content_block_stop
data: {"type":"content_block_stop","index":17}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn","stop_sequence":null},"usage":{"input_tokens":10682,"cache_creation_input_tokens":0,"cache_read_input_tokens":0,"output_tokens":510,"server_tool_use":{"web_search_requests":1}}}

event: message_stop
data: {"type":"message_stop"}

Fehlerwiederherstellung

Wenn eine Streaming-Anfrage aufgrund von Netzwerkproblemen, Timeouts oder anderen Fehlern unterbrochen wird, können Sie sich erholen, indem Sie dort fortfahren, wo der Stream unterbrochen wurde. Dieser Ansatz erspart Ihnen die erneute Verarbeitung der gesamten Antwort. Die grundlegende Wiederherstellungsstrategie umfasst:
  1. Erfassen der partiellen Antwort: Speichern Sie alle Inhalte, die erfolgreich empfangen wurden, bevor der Fehler auftrat
  2. Konstruieren einer Fortsetzungsanfrage: Erstellen Sie eine neue API-Anfrage, die die partielle Assistenten-Antwort als Beginn einer neuen Assistenten-Nachricht enthält
  3. Streaming fortsetzen: Empfangen Sie weiterhin den Rest der Antwort von dort, wo sie unterbrochen wurde

Best Practices für Fehlerwiederherstellung

  1. SDK-Features verwenden: Nutzen Sie die eingebauten Nachrichtenakkumulations- und Fehlerbehandlungsfähigkeiten des SDK
  2. Content-Typen behandeln: Seien Sie sich bewusst, dass Nachrichten mehrere Content-Blöcke enthalten können (text, tool_use, thinking). Tool-Verwendung und erweiterte Denk-Blöcke können nicht teilweise wiederhergestellt werden. Sie können das Streaming vom letzten Text-Block fortsetzen.