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:
| 1 | import OpenAI from 'openai'; |
| 2 | |
| 3 | const client = new OpenAI({ |
| 4 | apiKey: process.env.ALLTOKEN_API_KEY, |
| 5 | baseURL: 'https://api.alltoken.ai/v1', |
| 6 | }); |
| 7 | |
| 8 | const stream = await client.chat.completions.create({ |
| 9 | model: 'claude-sonnet-4', |
| 10 | messages: [{ role: 'user', content: 'Erkläre Quantencomputing' }], |
| 11 | stream: true, |
| 12 | }); |
| 13 | |
| 14 | for 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: :
| 1 | data: {"choices":[{"delta":{"content":"Hallo"},"index":0}]} |
| 2 | data: {"choices":[{"delta":{"content":" Welt"},"index":0}]} |
| 3 | data: [DONE] |
Der Stream endet mit data: [DONE]. Danach kann ein Kostenkommentar folgen:
| 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:
| 1 | const 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 | |
| 7 | for 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:
| 1 | data: {"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:
| 1 | const controller = new AbortController(); |
| 2 | |
| 3 | const 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 |
| 13 | setTimeout(() => controller.abort(), 5000); |