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

Streaming mit SDKs

Unsere Python und Typescript SDKs bieten mehrere Möglichkeiten für Streaming. Das Python SDK erlaubt sowohl synchrone als auch asynchrone Streams. Details finden Sie in der Dokumentation der jeweiligen SDKs.

import anthropic

client = anthropic.Anthropic()

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

Ereignistypen

Jedes Server-Sent Event enthält einen benannten Ereignistyp und zugehörige JSON-Daten. Jedes Ereignis verwendet einen SSE-Ereignisnamen (z. B. event: message_stop) und enthält den passenden Ereignis-type in seinen Daten.

Jeder Stream verwendet den folgenden Ereignisablauf:

  1. message_start: enthält ein Message-Objekt mit leerem content.
  2. Eine Reihe von Inhaltsblöcken, von denen jeder ein content_block_start, ein oder mehrere content_block_delta-Ereignisse und ein content_block_stop-Ereignis hat. Jeder Inhaltsblock hat einen index, der seinem Index im endgültigen Message-content-Array entspricht.
  3. Ein oder mehrere message_delta-Ereignisse, die Änderungen auf oberster Ebene am endgültigen Message-Objekt anzeigen.
  4. Ein abschließendes message_stop-Ereignis.

Ping-Ereignisse

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

Fehlerereignisse

Gelegentlich senden wir möglicherweise Fehler im Ereignis-Stream. Beispielsweise können Sie bei hoher Auslastung einen overloaded_error erhalten, der normalerweise einem HTTP 529 in einem nicht-streamenden Kontext entsprechen würde:

Beispielfehler
event: error
data: {"type": "error", "error": {"type": "overloaded_error", "message": "Überlastet"}}

Andere Ereignisse

In Übereinstimmung mit unseren Versionierungsrichtlinien können wir neue Ereignistypen hinzufügen, und Ihr Code sollte unbekannte Ereignistypen angemessen behandeln.

Delta-Typen

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

Text-Delta

Ein text-Inhaltsblock-Delta sieht folgendermaßen aus:

Text-Delta
event: content_block_delta
data: {"type": "content_block_delta","index": 0,"delta": {"type": "text_delta", "text": "allo Freun"}}

Input JSON-Delta

Die Deltas für tool_use-Inhaltsblöcke entsprechen Aktualisierungen für das input-Feld des Blocks. Um maximale Granularität zu unterstützen, sind die Deltas partielle JSON-Strings, während das endgültige tool_use.input immer ein Objekt ist.

Sie können die String-Deltas akkumulieren und das JSON parsen, sobald Sie ein content_block_stop-Ereignis erhalten, indem Sie eine Bibliothek wie Pydantic verwenden, um partielles JSON-Parsing durchzuführen, oder indem Sie unsere SDKs verwenden, die Hilfsfunktionen für den Zugriff auf geparste inkrementelle Werte bereitstellen.

Ein tool_use-Inhaltsblock-Delta sieht folgendermaßen 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 Werteigenschaft von input gleichzeitig. Daher kann es bei der Verwendung von Tools zu Verzögerungen zwischen Streaming-Ereignissen kommen, während das Modell arbeitet. Sobald ein input-Schlüssel und -Wert akkumuliert sind, geben wir sie als mehrere content_block_delta-Ereignisse mit gestückeltem partiellem JSON aus, sodass das Format automatisch eine feinere Granularität in zukünftigen Modellen unterstützen kann.

Roh-HTTP-Stream-Antwort

Wir empfehlen dringend, unsere Client-SDKs im Streaming-Modus zu verwenden. Wenn Sie jedoch eine direkte API-Integration erstellen, müssen Sie diese Ereignisse selbst behandeln.

Eine Stream-Antwort besteht aus:

  1. Einem message_start-Ereignis
  2. Potenziell mehreren Inhaltsblöcken, von denen jeder Folgendes enthält: a. Ein content_block_start-Ereignis b. Potenziell mehrere content_block_delta-Ereignisse c. Ein content_block_stop-Ereignis
  3. Einem message_delta-Ereignis
  4. Einem message_stop-Ereignis

Außerdem können in der gesamten Antwort ping-Ereignisse verteilt sein. Weitere Details zum Format finden Sie unter Ereignistypen.

Einfache Streaming-Anfrage

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-3-opus-20240229",
  "messages": [{"role": "user", "content": "Hallo"}],
  "max_tokens": 256,
  "stream": true
}'
Antwort
event: message_start
data: {"type": "message_start", "message": {"id": "msg_1nZdL29xx5MUA1yADyHTEsnR8uuvGzszyY", "type": "message", "role": "assistant", "content": [], "model": "claude-3-opus-20240229", "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": "Hallo"}}

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

In dieser Anfrage bitten wir Claude, ein Tool zu verwenden, um uns das Wetter mitzuteilen.

Anfrage
  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-3-opus-20240229",
      "max_tokens": 1024,
      "tools": [
        {
          "name": "get_weather",
          "description": "Hole das aktuelle Wetter für einen bestimmten Ort",
          "input_schema": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "Die Stadt und der Bundesstaat, z. B. San Francisco, CA"
              }
            },
            "required": ["location"]
          }
        }
      ],
      "tool_choice": {"type": "any"},
      "messages": [
        {
          "role": "user",
          "content": "Wie ist das Wetter in San Francisco?"
        }
      ],
      "stream": true
    }'
Antwort
event: message_start
data: {"type":"message_start","message":{"id":"msg_014p7gG3wDgGV9EUtLvnow3U","type":"message","role":"assistant","model":"claude-3-haiku-20240307","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":" lass"}}

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

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

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

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

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":" überprüfen"}}

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"}