Streaming
Antworten Token für Token über Server-Sent Events streamen
Setzen Sie stream: true, um die Antwort als Server-Sent Events statt als einen einzelnen finalen JSON-Body zu erhalten.
from openai import OpenAI
client = OpenAI(
base_url="https://api.ablatic.ai/v1",
api_key="sk-ablatic-...",
)
stream = client.chat.completions.create(
model="talos",
messages=[{"role": "user", "content": "Write a haiku about Linz."}],
stream=True,
)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")Beide API-Oberflächen streamen über SSE, das Eventformat unterscheidet sich jedoch. SSE-Antworten setzen Cache-Control: no-cache.
OpenAI-Oberfläche
Bei /v1/chat/completions ist jedes Event ein chat.completion.chunk. Der inkrementelle Text steckt in choices[0].delta. Der Stream endet mit einer data: [DONE]-Zeile.
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"Lin"}}]}
data: {"object":"chat.completion.chunk","choices":[{"delta":{"content":"z"}}]}
data: [DONE]Anthropic-Oberfläche
Bei /v1/messages ist der Stream eine Folge benannter Events, derselbe Graph, den das Anthropic SDK erwartet: message_start, dann content_block_start, dann ein oder mehrere content_block_delta, dann content_block_stop, dann message_delta, dann message_stop. Es gibt keinen [DONE]-Abschluss.
event: message_start
data: {"type":"message_start","message":{"id":"msg_..."}}
event: content_block_start
data: {"type":"content_block_start","index":0}
event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"Linz"}}
event: content_block_stop
data: {"type":"content_block_stop","index":0}
event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"}}
event: message_stop
data: {"type":"message_stop"}Der OpenAI-Stream endet mit data: [DONE]. Der Anthropic-Stream endet mit einem message_stop-Event und sendet niemals [DONE].