Streaming

Token-weise Echtzeit-Antworten über Server-Sent Events.

Übersicht

AllToken unterstützt Streaming-Antworten über Server-Sent Events (SSE). Mit stream: true liefert die API Tokens schrittweise während der Generierung, anstatt auf die vollständige Antwort zu warten.

Dies ermöglicht reaktive Benutzeroberflächen – Text erscheint Zeichen für Zeichen und verbessert die wahrgenommene Latenz erheblich.

Grundlegende Verwendung

Fügen Sie stream: true zur Chat-Completions-Anfrage hinzu:

TypeScript
1import OpenAI from 'openai';
2
3const client = new OpenAI({
4 apiKey: process.env.ALLTOKEN_API_KEY,
5 baseURL: 'https://api.alltoken.ai/v1',
6});
7
8const stream = await client.chat.completions.create({
9 model: 'claude-sonnet-4',
10 messages: [{ role: 'user', content: 'Erkläre Quantencomputing' }],
11 stream: true,
12});
13
14for await (const chunk of stream) {
15 const content = chunk.choices[0]?.delta?.content;
16 if (content) process.stdout.write(content);
17}

SSE-Antwortformat

Jedes SSE-Ereignis ist ein JSON-Objekt mit dem Präfix data: :

Antwort-Stream
1data: {"choices":[{"delta":{"content":"Hallo"},"index":0}]}
2data: {"choices":[{"delta":{"content":" Welt"},"index":0}]}
3data: [DONE]

Der Stream endet mit data: [DONE]. Danach kann ein Kostenkommentar folgen:

Kosteninformation
1: {"cost":"0.0012","input_price":"0.0003","output_price":"0.0009","prompt_tokens":15,"completion_tokens":42}

Denk-Modus (erweitertes Reasoning)

Einige Modelle unterstützen erweitertes Reasoning. Wenn aktiviert, gibt das Modell seinen internen Denkprozess aus, bevor es die endgültige Antwort liefert:

TypeScript
1const stream = await client.chat.completions.create({
2 model: 'deepseek-reasoner',
3 messages: [{ role: 'user', content: 'Beweise, dass die Wurzel aus 2 irrational ist' }],
4 stream: true,
5});
6
7for await (const chunk of stream) {
8 // Denkprozess (Gedankenkette)
9 const thinking = chunk.choices[0]?.delta?.reasoning_content;
10 if (thinking) process.stderr.write(thinking);
11
12 // Endgültige Antwort
13 const content = chunk.choices[0]?.delta?.content;
14 if (content) process.stdout.write(content);
15}

Das Feld reasoning_content enthält den schrittweisen Denkprozess des Modells, während content die endgültige Antwort enthält.

Fehlerbehandlung

Fehler beim Streaming werden über das Fehlerfeld des SSE-Ereignisses übermittelt:

Fehlerantwort
1data: {"error":{"message":"Rate limit exceeded","type":"rate_limit_error","code":429}}

Häufige Streaming-Fehler:

  • 401 — API-Schlüssel ungültig oder abgelaufen. AllToken versucht automatisch einmal, den Token zu aktualisieren.
  • 429 — Ratenbegrenzung überschritten. Bitte mit Backoff wiederholen.
  • 500 — Fehler beim Upstream-Anbieter. Die Anfrage kann automatisch bei einem anderen Anbieter wiederholt werden.

Anfragen abbrechen

Verwenden Sie AbortController, um laufende Streaming-Anfragen abzubrechen:

TypeScript
1const controller = new AbortController();
2
3const stream = await client.chat.completions.create(
4 {
5 model: 'deepseek-chat',
6 messages: [{ role: 'user', content: 'Schreibe einen langen Aufsatz' }],
7 stream: true,
8 },
9 { signal: controller.signal }
10);
11
12// Nach 5 Sekunden abbrechen
13setTimeout(() => controller.abort(), 5000);