> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.kontinent.ai/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.kontinent.ai/_mcp/server.

# Streaming

Setzen Sie `stream: true` bei einer Chat-Completion, um Tokens zu empfangen,
während sie generiert werden — über Server-Sent Events (`text/event-stream`).

## Wire-Format

Jedes Event ist eine `data:`-Zeile mit einem JSON-Chunk, abgeschlossen durch
einen Sentinel:

```
data: {"id":"chatcmpl-…","choices":[{"delta":{"content":"Hal"}}]}

data: {"id":"chatcmpl-…","choices":[{"delta":{"content":"lo!"}}]}

data: {"id":"chatcmpl-…","choices":[],"usage":{"prompt_tokens":3,"completion_tokens":8,"total_tokens":11}}

data: [DONE]
```

Kontinent injiziert `stream_options: {"include_usage": true}` upstream, sodass
der **letzte Chunk vor `[DONE]` das Feld `usage` trägt**. Lässt ein Anbieter es
weg, schätzt das Gateway die Tokens (abgerechnet wird trotzdem).

```ts title="TypeScript"
const stream = await client.chat.completions.create({
  model: "mistral/mistral-small-latest",
  messages: [{ role: "user", content: "Write a haiku about Europe." }],
  stream: true,
});

for await (const chunk of stream) {
  process.stdout.write(chunk.choices[0]?.delta?.content ?? "");
}
```

```bash title="curl"
curl -N https://api.kontinent.ai/v1/chat/completions \
  -H "Authorization: Bearer $KONTINENT_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"model":"mistral/mistral-small-latest","stream":true,
       "messages":[{"role":"user","content":"Hallo!"}]}'
```

## Timeouts

* Streams haben **keine übergreifende Frist**.
* Ein **inaktiver Upstream wird nach 90 s** Stille abgebrochen. Die Chunks des
  Anbieters wirken als Keep-Alives.
* Hinter dem Load Balancer beträgt das Idle-Timeout 120 s.

## Fallback und Fehler

Definiert das Modell Fallback-Anbieter, werden Upstream-Fehler
(`429`/`5xx`/Verbindungsfehler) **nur vor dem ersten gestreamten Byte** beim
nächsten Anbieter erneut versucht. Sobald das erste Byte draußen ist, taucht ein
Fehler mitten im Stream als **abgebrochene Verbindung** auf — behandeln Sie
einen abgeschnittenen Stream sauber.

Ein Verbindungsabbruch mitten im Stream **berechnet dennoch die bis dahin
generierten Tokens**. Das Abbrechen einer Anfrage macht sie nicht kostenlos.