Dieser Artikel ist ein praktischer Leitfaden für Entwickler, die GPT-Realtime-2 in ihr Projekt integrieren möchten. Wir werden die Architektur der Realtime API untersuchen, die richtige Verbindungsmethode für Ihr Szenario auswählen, die erste funktionierende Sitzung von Grund auf neu schreiben und Preambles, Tool-Aufrufe und Wiederherstellung mit echtem Code einrichten.
Wenn Sie Kontext darüber benötigen, worum es bei dieser Veröffentlichung geht und warum sie wichtig ist – lesen Sie zuerst den Nachrichtenartikel: → OpenAI hat GPT-Realtime-2 veröffentlicht: das erste Sprachmodell mit GPT-5-Denkniveau
Kurz gesagt: GPT-Realtime-2 wird über WebSocket (Server), WebRTC (Browser) oder SIP (Telefonie) verbunden. Dies ist keine REST-API – es ist eine kontinuierliche bidirektionale Verbindung. Alle Codebeispiele im Artikel stammen aus der offiziellen OpenAI-Dokumentation und wurden auf Aktualität im Mai 2026 überprüft.
Inhalt des Artikels
Realtime API vs. Chat Completions API – Was ist der prinzipielle Unterschied der Protokolle
Bevor Sie mit dem Codieren beginnen, ist es wichtig zu verstehen, womit Sie arbeiten. Realtime API und Chat Completions API sind keine zwei Versionen desselben Tools. Es handelt sich um grundlegend unterschiedliche Protokolle für unterschiedliche Aufgaben.
Chat Completions API – HTTP-Anfrage-Antwort
Die Chat Completions API funktioniert nach dem klassischen HTTP-Schema:
- Der Client sendet eine POST-Anfrage mit Nachrichten
- Der Server verarbeitet und gibt eine Antwort zurück
- Die Verbindung wird geschlossen
Selbst das Streaming in Chat Completions (wenn Text schrittweise erscheint) wird über Server-Sent Events (SSE) implementiert – technisch gesehen ist dies ein unidirektionaler Stream über HTTP, keine bidirektionale Verbindung. Der Client hört zu, der Server schreibt – aber nicht umgekehrt gleichzeitig.
Realtime API – Kontinuierliches bidirektionales WebSocket
Die Realtime API arbeitet über WebSocket – ein Protokoll, das eine kontinuierliche Verbindung zwischen Client und Server herstellt. Nach dem Handshake können beide Seiten jederzeit unabhängig voneinander Daten senden:
- Der Client streamt Audio-Chunks, während der Benutzer spricht
- Das Modell antwortet mit Audio-Chunks, noch bevor die Frage vollständig ist
- Beide Streams laufen gleichzeitig über eine einzige Verbindung
- Die Verbindung bleibt während des gesamten Gesprächs bestehen (maximal 60 Minuten pro Sitzung)
Der entscheidende Unterschied für den Entwickler: Bei Chat Completions senden Sie eine Anfrage und warten. Bei der Realtime API pflegen Sie eine kontinuierliche Verbindung und reagieren auf Ereignisse. Dies ähnelt eher der Entwicklung eines WebSocket-Chats als eines herkömmlichen API-Clients. Wenn Sie noch nicht mit WebSocket gearbeitet haben – planen Sie Zeit für die Einarbeitung in das ereignisgesteuerte Modell ein.
Vergleichstabelle:
| Merkmal |
Chat Completions API |
Realtime API |
| Protokoll |
HTTP / SSE |
WebSocket / WebRTC / SIP |
| Verbindung |
Anfrage → Antwort → Geschlossen |
Kontinuierlich, bidirektional |
| Eingabe |
Text, Bild, Audiodatei |
Streaming-Audio-Chunk |
| Ausgabe |
Text (+ optional Audio) |
Streaming-Audio + Text |
| Abrechnung |
Nach Tokens |
Nach Audio-Tokens (oder Min. für Translate/Whisper) |
| Aggregatoren (OpenRouter) |
Unterstützt |
Nicht unterstützt |
| Geeignet für |
Chat, Analyse, Textgenerierung |
Sprachagenten, Live-Übersetzung, Transkription |
Speech-to-Speech-Architektur – Wie das Modell Audio ohne Zwischenschritte verarbeitet
Das Verständnis, wie das Modell Audio intern verarbeitet, ist wichtig für die korrekte Systemgestaltung und das Verständnis der Latenz.
Alter Ansatz: Kaskadierender Pipeline
Vor dem Aufkommen von End-to-End-Sprachmodellen sah die Standardarchitektur so aus:
Mikrofon → [ASR] → Text → [LLM] → Text → [TTS] → Audio
~300ms ~2-6s ~300ms
Jede Pfeilspitze ist eine separate HTTP-Anfrage oder ein separater Dienst. Jeder Schritt fügt Latenz hinzu. Das Reasoning innerhalb des LLM erhöhte den zweiten Schritt auf 5–7 Sekunden. Gesamtlatenz: 1,5–8 Sekunden je nach Komplexität.
GPT-Realtime-2: End-to-End-Audio
GPT-Realtime-2 ersetzt die gesamte Kaskade durch ein einziges Modell:
Mikrofon → [GPT-Realtime-2] → Audio
~500-1200ms (erste Runde)
~300-600ms (folgende Runden)
Audio kommt am Eingang an, das Reasoning findet innerhalb des Modells im Audiobereich statt, Audio kommt am Ausgang heraus. Es gibt keine Konvertierung in Text zwischen den Schritten – dies eliminiert Latenz bei Übergängen und ermöglicht es dem Modell, Tonfall, Pausen und Unterbrechungen besser zu verstehen.
Audioformat
Die Realtime API akzeptiert und gibt Audio im Format PCM16 mit einer Abtastrate von 24.000 Hz (oder Opus) zurück. Dies ist wichtig zu wissen, wenn Sie eine Verbindung mit einem Mikrofon oder einem Telefonsystem herstellen – das Format muss vor der Übertragung konvertiert werden.
Ereignisgesteuertes Interaktionsmodell
Die Sitzung wird über Client-Ereignisse und Server-Ereignisse gesteuert. Der Client sendet Ereignisse – der Server reagiert mit Ereignissen. Haupttypen:
Client-Ereignisse (Sie senden):
session.update – Aktualisierung der Sitzungskonfiguration (Anweisungen, Stimme, Tools)
input_audio_buffer.append – Senden eines Audio-Chunks
input_audio_buffer.commit – Signal, dass die Runde abgeschlossen ist
response.create – Anfrage zur Generierung einer Antwort
conversation.item.create – Hinzufügen einer Textnachricht
Server-Ereignisse (Sie erhalten):
session.created – Sitzung ist bereit
session.updated – Bestätigung der Aktualisierung
response.audio.delta – Audio-Antwort-Chunk
response.text.delta – Texttranskriptions-Chunk
response.function_call_arguments.delta – Argumente für Tool-Aufrufe
response.done – Antwort abgeschlossen
error – Sitzungsfehler
Die maximale Dauer einer Realtime-Sitzung beträgt 60 Minuten. Danach wird die Verbindung geschlossen und Sie müssen eine neue Sitzung öffnen. Planen Sie eine Wiederverbindungslogik, wenn Ihr Szenario längere Interaktionen vorsieht.
Drei Verbindungsmethoden: WebSocket, WebRTC, SIP – Welche für Ihr Szenario wählen
Die Realtime API unterstützt drei Verbindungsmethoden. Die Wahl hängt nicht von der Präferenz ab, sondern davon, wo sich das Audio in Ihrem System befindet.
WebSocket – für serverseitige Anwendungen
WebSocket eignet sich für Server-zu-Server-Integrationen: Node.js-Backend, Python-Dienst, jede serverseitige Anwendung, die bereits Audio hat oder es auf dem Server verarbeitet.
Vorteile: Volle Kontrolle über die Sitzung, geeignet für komplexe Agenten-Workflows, Sie können einen regulären API-Schlüssel verwenden (kein kurzlebiger Token erforderlich).
Einschränkungen: Sie sind selbst für die Erfassung und Übertragung von Base64-kodierten Audio-Chunks verantwortlich.
WebRTC – für Browseranwendungen
WebRTC ist die empfohlene Methode für Browser- und mobile Clients, bei denen Audio direkt vom Mikrofon des Benutzers erfasst wird. WebRTC ist für minimale Latenz bei Echtzeit-Audio optimiert.
Für die Browserverbindung benötigen Sie einen kurzlebigen Token (temporärer Schlüssel) – Ihr Haupt-API-Schlüssel kann nicht auf dem Client verwendet werden. Der kurzlebige Token wird auf Ihrem Backend generiert und an den Client übergeben.
SIP – für Telefonie
SIP ist für die Integration mit Telefonsystemen. Wenn Sie einen Agenten für echte Telefonanrufe erstellen, ist dies das offizielle Protokoll. Im Jahr 2026 befindet sich der native SIP-Endpunkt von OpenAI noch in der Beta-Phase; für die Produktion verwenden die meisten Teams SIP über Twilio oder Telnyx als Brücke zu WebSocket.
Tabelle zur Auswahl der Methode:
Browser / mobile App → WebRTC (+ kurzlebiger Token von Ihrem Backend)
Node.js / Python Backend → WebSocket (direkter API-Schlüssel)
Echte Telefonanrufe → SIP (oder SIP über Twilio/Telnyx → WebSocket)
Deno / Cloudflare Workers → WebSocket über die Standard-WebSocket-API des Browsers
Verbindung über WebSocket — Schritt-für-Schritt-Anleitung mit JS- und Python-Code
Lassen Sie uns die Verbindung über WebSocket untersuchen – die gängigste Methode für serverseitige Anwendungen. Alle Beispiele stammen aus der offiziellen OpenAI-Dokumentation.
Schritt 1. Abhängigkeiten installieren
Node.js:
npm install ws
Python:
pip install websocket-client
Schritt 2. Verbindung zur Realtime API herstellen
JavaScript (Node.js):
import WebSocket from "ws";
const url = "wss://api.openai.com/v1/realtime?model=gpt-realtime-2";
const ws = new WebSocket(url, {
headers: {
Authorization: "Bearer " + process.env.OPENAI_API_KEY,
// Wenn Ihre Anwendung Benutzer-IDs hat –
// übergeben Sie eine gehashte Benutzer-ID zur Sicherheitsüberwachung
"OpenAI-Safety-Identifier": "hashed-user-id",
},
});
ws.on("open", function open() {
console.log("Verbindung hergestellt");
});
ws.on("message", function incoming(message) {
const event = JSON.parse(message.toString());
console.log("Ereignis vom Server:", event.type);
});
ws.on("error", function error(err) {
console.error("WebSocket-Fehler:", err);
});
ws.on("close", function close() {
console.log("Verbindung geschlossen");
});
Python:
import os
import json
import websocket
OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
url = "wss://api.openai.com/v1/realtime?model=gpt-realtime-2"
headers = [
"Authorization: Bearer " + OPENAI_API_KEY,
"OpenAI-Safety-Identifier: hashed-user-id",
]
def on_open(ws):
print("Verbindung hergestellt")
def on_message(ws, message):
data = json.loads(message)
print("Ereignis:", data["type"])
def on_error(ws, error):
print("Fehler:", error)
def on_close(ws, close_status_code, close_msg):
print("Verbindung geschlossen")
ws = websocket.WebSocketApp(
url,
header=headers,
on_open=on_open,
on_message=on_message,
on_error=on_error,
on_close=on_close,
)
ws.run_forever()
Schritt 3. Sitzung über session.update konfigurieren
Sofort nach Erhalt des session.created-Ereignisses – senden Sie session.update mit der Konfiguration:
// JavaScript
ws.on("open", function open() {
// Sitzungskonfiguration senden
ws.send(JSON.stringify({
type: "session.update",
session: {
type: "realtime",
model: "gpt-realtime-2",
// Audioformat: PCM16 24kHz
output_modalities: ["audio"],
audio: {
input: {
format: {
type: "audio/pcm",
rate: 24000,
},
// Semantic VAD – das Modell erkennt das Ende der Phrase selbst
turn_detection: {
type: "semantic_vad"
}
},
output: {
format: {
type: "audio/pcm",
},
// Stimme: alloy, echo, shimmer, cedar, marin
voice: "marin",
}
},
instructions: "Sie sind ein hilfreicher Assistent. Antworten Sie kurz und bündig.",
}
}));
});
Wichtig zur Stimme: Die Stimme kann nur geändert werden, wenn das Modell in dieser Sitzung noch keine Audioantwort gesendet hat. Nach der ersten Audioantwort – wird voice für die gesamte Sitzung unveränderlich. Planen Sie die Stimmenauswahl im Voraus.
Erste Arbeitssitzung: Verbindung öffnen, Audio senden, Antwort erhalten
Nun sammeln wir den vollständigen Zyklus: Verbindung → Konfiguration → Audioübertragung → Antwort erhalten.
Ereignisfluss in der WebSocket-Sitzung
Hier ist die Ereignissequenz für einen typischen Sprach-Turn:
Client Server
| |
|--- WebSocket connect --------->|
|<-- session.created ------------|
| |
|--- session.update ------------>|
|<-- session.updated ------------|
| |
|--- input_audio_buffer.append ->| (wiederholt für jeden Chunk)
|--- input_audio_buffer.commit ->| (oder semantic_vad macht dies automatisch)
|--- response.create ----------->|
| |
|<-- response.audio.delta -------| (wiederholt – jeder Audio-Chunk)
|<-- response.text.delta --------| (Transkription der Antwort)
|<-- response.done --------------|
Audio-Chunks übertragen
Audio wird als Base64-kodierte Chunks über input_audio_buffer.append übertragen. Bei Verwendung von semantic_vad – das Modell erkennt selbst, wann der Benutzer zu sprechen aufgehört hat und startet die Antwort. Bei manueller Steuerung – senden Sie selbst input_audio_buffer.commit:
// Audio-Chunk senden (Base64-kodiertes PCM16)
function sendAudioChunk(audioBuffer) {
const base64Audio = Buffer.from(audioBuffer).toString("base64");
ws.send(JSON.stringify({
type: "input_audio_buffer.append",
audio: base64Audio,
}));
}
// Manueller Turn-Abschluss (wenn Sie semantic_vad nicht verwenden)
function commitAudio() {
ws.send(JSON.stringify({
type: "input_audio_buffer.commit",
}));
// Antwort anfordern
ws.send(JSON.stringify({
type: "response.create",
}));
}
Audioantwort verarbeiten
ws.on("message", function incoming(message) {
const event = JSON.parse(message.toString());
switch (event.type) {
case "session.created":
console.log("Sitzung bereit:", event.session.id);
// Hier session.update senden
break;
case "response.audio.delta":
// Audio-Chunk erhalten – abspielen
const audioChunk = Buffer.from(event.delta, "base64");
playAudio(audioChunk); // Ihre Wiedergabefunktion
break;
case "response.text.delta":
// Texttranskription der Antwort
process.stdout.write(event.delta);
break;
case "response.done":
console.log("\nAntwort abgeschlossen");
break;
case "error":
console.error("Sitzungsfehler:", event.error);
break;
}
});
Preambles, parallele Tool-Aufrufe und Recovery – Konfiguration und Codebeispiele
Preambles – wie Phrasen während des Denkens konfiguriert werden
Preambles – kurze Phrasen, die das Modell spricht, während die Logik im Hintergrund läuft. Aktiviert in session.update über instructions:
ws.send(JSON.stringify({
type: "session.update",
session: {
type: "realtime",
model: "gpt-realtime-2",
instructions: `Sie sind ein hilfreicher Assistent.
Vor jeder Antwort, die eine Suche oder Berechnung erfordert –
sprechen Sie eine kurze Phrase: 'einen Moment', 'ich prüfe gerade',
'einen Augenblick' oder etwas Ähnliches. Dies gibt dem Benutzer zu verstehen, dass Sie arbeiten.
Wenn Sie calendar_tool aufrufen – sagen Sie 'ich prüfe Ihren Kalender'.
Wenn Sie order_tool aufrufen – sagen Sie 'ich suche Ihre Bestellung'.`,
}
}));
Preambles sind kein separater API-Parameter, sondern eine Anweisung an das Modell im System-Prompt. Das GPT-Realtime-2-Modell folgt diesen Anweisungen und generiert den Preamble kontextabhängig – je nachdem, welches Tool es aufrufen möchte.
Tool-Aufrufe – Registrierung und Verarbeitung
Tools werden in session.update registriert und funktionieren genauso wie Function Calling in Chat Completions – aber asynchron über Ereignisse:
// Tools in der Sitzung registrieren
ws.send(JSON.stringify({
type: "session.update",
session: {
type: "realtime",
model: "gpt-realtime-2",
tools: [
{
type: "function",
name: "get_order_status",
description: "Bestellstatus anhand der Bestellnummer abrufen",
parameters: {
type: "object",
properties: {
order_id: {
type: "string",
description: "Bestellnummer, z. B. ORD-12345"
}
},
required: ["order_id"]
}
},
{
type: "function",
name: "check_calendar",
description: "Verfügbare Zeitfenster im Kalender prüfen",
parameters: {
type: "object",
properties: {
date: {
type: "string",
description: "Datum im Format YYYY-MM-DD"
}
},
required: ["date"]
}
}
],
tool_choice: "auto", // Das Modell entscheidet selbst, wann Tools aufgerufen werden
}
}));
// Tool-Aufruf vom Server verarbeiten
ws.on("message", function incoming(message) {
const event = JSON.parse(message.toString());
if (event.type === "response.function_call_arguments.done") {
const toolName = event.name;
const args = JSON.parse(event.arguments);
// Tool-Aufruf auf Ihrem Backend ausführen
const result = await executeToolCall(toolName, args);
// Ergebnis an die Sitzung zurückgeben
ws.send(JSON.stringify({
type: "conversation.item.create",
item: {
type: "function_call_output",
call_id: event.call_id,
output: JSON.stringify(result),
}
}));
// Das Modell bitten, das Gespräch mit dem Ergebnis fortzusetzen
ws.send(JSON.stringify({
type: "response.create",
}));
}
});
Recovery – Fehlerbehandlung in der Sitzung
GPT-Realtime-2 verarbeitet Fehler nativ und spricht sie für den Benutzer aus. Auf Code-Ebene sollten Sie jedoch auch serverseitige error-Ereignisse behandeln:
ws.on("message", function incoming(message) {
const event = JSON.parse(message.toString());
if (event.type === "error") {
console.error("Sitzungsfehler:", event.error.code, event.error.message);
// Wenn der Fehler ein Rate-Limit ist – warten und neu verbinden
if (event.error.code === "rate_limit_exceeded") {
setTimeout(() => reconnect(), 5000);
}
// Wenn die Sitzung abgelaufen ist – eine neue öffnen
if (event.error.code === "session_expired") {
openNewSession();
}
}
});
Reasoning effort und Kontextfenster — wie man die Balance zwischen Qualität, Geschwindigkeit und Kosten einstellt
Reasoning effort: Fünf Stufen
GPT-Realtime-2 unterstützt fünf Stufen von reasoning effort, die über session.update eingestellt werden können:
ws.send(JSON.stringify({
type: "session.update",
session: {
type: "realtime",
model: "gpt-realtime-2",
// Verfügbare Werte: "minimal", "low", "medium", "high", "xhigh"
// Standard: "low"
reasoning_effort: "medium",
}
}));
Praktische Auswahl der Stufe:
| Stufe |
Latenz |
Kosten |
Wann zu verwenden |
| minimal |
~300ms |
minimal |
Einfache Befehle, Navigation, Ja/Nein-Antworten |
| low (Standard) |
~500ms |
niedrig |
FAQs, Bestellbestätigungen, Standard-Support |
| medium |
~800ms |
mittel |
Mehrstufige Szenarien, mehrere Tool-Aufrufe |
| high |
~1.5s |
hoch |
Komplexe Agenten-Flows, Compliance-sensible Aufgaben |
| xhigh |
~2-3s |
höchste |
Maximale Genauigkeit, kritische Entscheidungen |
Praktischer Tipp: Die Marketing-Benchmarks von OpenAI (+15,2 % Big Bench Audio, +13,8 % Audio MultiChallenge) wurden auf dem Niveau high / xhigh gemessen. Mit dem Standardwert low sind die Ergebnisse anders. Beginnen Sie mit low, messen Sie die Qualität in realen Szenarien und erhöhen Sie den effort nur dort, wo es ein objektives Problem mit der Antwortqualität gibt.
Kontextfenster 128K — was das praktisch bedeutet
128K Token Kontext bedeutet ungefähr:
- ~60–90 Minuten Sprachdialog (abhängig von der Sprechdichte)
- Eine vollständige Sitzung mit 10–15 Tool-Aufrufen und deren Ergebnissen
- Ein detaillierter System-Prompt + die gesamte Kundenhistorie + das aktuelle Gespräch
Wichtig: Audio-Token sind deutlich teurer als Text-Token. Bei 128K Kontext darf die Gesamtsumme der Token (einschließlich Audio-Chunks) dieses Limit nicht überschreiten. Für sehr lange Sitzungen ist eine Kompaktierungslogik erforderlich — das Zusammenfassen des Kontexts:
// Wenn die Sitzung das Limit erreicht —
// kann der Kontext über die Responses API zusammengefügt und eine neue Sitzung gestartet werden
// mit einer kompakten Zusammenfassung des vorherigen Gesprächs
// Überprüfung der Token-Nutzung im Ereignis response.done:
if (event.type === "response.done") {
const usage = event.response.usage;
console.log("Verwendete Token:", usage.total_tokens);
if (usage.total_tokens > 100000) {
// Limit wird erreicht — Kompaktierung planen
scheduleContextCompaction();
}
}
GPT-Realtime-Translate und GPT-Realtime-Whisper — Anbindung und Anwendungsfälle
GPT-Realtime-Translate — Live-Übersetzung
Die Anbindung erfolgt über dieselbe Realtime API, jedoch mit einem anderen Sitzungstyp. Die offizielle Dokumentation empfiehlt WebRTC für Browser-Medien und WebSocket für serverseitige Medien-Pipelines.
Der Hauptunterschied in der Konfiguration: Für Translate muss response.create nicht aufgerufen werden — die Übersetzung beginnt automatisch, sobald Audio vorhanden ist.
// Konfiguration der Sitzung für Live-Übersetzung
ws.send(JSON.stringify({
type: "session.update",
session: {
type: "translation", // Sitzungstyp — translation
model: "gpt-realtime-translate",
translation: {
source_language: "uk", // Sprache der eingehenden Sprache
target_language: "en", // Sprache der ausgehenden Sprache
}
// Rufen Sie response.create nicht auf — die Übersetzung erfolgt automatisch
}
}));
Unterstützte Ausgangssprachen (13): Englisch, Spanisch, Französisch, Deutsch, Portugiesisch, Japanisch, Koreanisch, Chinesisch (vereinfacht), Arabisch, Hindi, Italienisch, Niederländisch, Polnisch.
Eingangssprachen — 70+, darunter Ukrainisch, Russisch, Türkisch, Hindi, Tamil, Telugu und andere.
GPT-Realtime-Whisper — Streaming-Transkription
Für die Transkription wird ein separater Sitzungstyp transcription verwendet:
// Konfiguration der Sitzung für Streaming-Transkription
ws.send(JSON.JSON.stringify({
type: "session.update",
session: {
type: "transcription", // Sitzungstyp — transcription
model: "gpt-realtime-whisper",
transcription: {
language: "uk", // Sprache der Transkription (optional, auto-detect wenn nicht angegeben)
// Steuerung der Latenz:
// niedriger Wert = schnellere partielle Transkripte
// hoher Wert = bessere Qualität
delay: "low", // "low" | "medium" | "high"
}
}
}));
// Erhalt von Transkripten
ws.on("message", function incoming(message) {
const event = JSON.parse(message.toString());
if (event.type === "conversation.item.input_audio_transcription.delta") {
// Partielle Transkription — erscheint in Echtzeit
process.stdout.write(event.delta);
}
if (event.type === "conversation.item.input_audio_transcription.completed") {
// Finale Transkription eines Turns
console.log("\nFinale:", event.transcript);
}
});
Whisper ≠ GPT-Realtime-Whisper: Das klassische whisper-1 über die Speech-to-Text API ist eine Batch-Transkription einer fertigen Audiodatei nach der Aufnahme. GPT-Realtime-Whisper ist Streaming, Wort für Wort, während die Person noch spricht. Unterschiedliche Endpunkte, unterschiedliches Modell, unterschiedliches Szenario. Ersetzen Sie sie nicht gegenseitig.
Typische Fehler und wie man sie vermeidet
❌ Versuch, sich über OpenRouter oder einen anderen Aggregator zu verbinden
OpenRouter und ähnliche Aggregatoren basieren auf HTTP-Infrastruktur. Die Realtime API benötigt WebSocket. Architektonische Inkompatibilität — nicht durch Einstellungen lösbar. Die einzige Lösung: ein direkter OpenAI-Schlüssel.
❌ Verwendung des API-Schlüssels auf dem Client (Browser) bei WebSocket
Übergeben Sie bei der Verbindung über WebSocket vom Browser aus nicht den Haupt-API-Schlüssel — er wäre im Code sichtbar. Verwenden Sie für Browser-Clients WebRTC mit einem ephemeral token, das auf Ihrem Backend generiert wird:
// Auf Ihrem Backend — Generierung eines ephemeral token
const response = await fetch("https://api.openai.com/v1/realtime/client_secrets", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.OPENAI_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
session: {
type: "realtime",
model: "gpt-realtime-2",
audio: { output: { voice: "marin" } },
},
}),
});
const data = await response.json();
const ephemeralKey = data.value; // Übergabe an den Client
❌ Kein Reconnect bei session_expired behandeln
Die maximale Sitzungsdauer beträgt 60 Minuten. Ohne Reconnect-Logik friert Ihr Agent nach einer Stunde ein. Implementieren Sie eine automatische Wiederverbindung mit Übergabe eines gekürzten Kontexts des vorherigen Gesprächs.
❌ xhigh effort für alle Anfragen einstellen
xhigh = maximale Qualität, aber auch maximale Latenz (~2-3s) und maximale Anzahl von Ausgabe-Token. Für einen FAQ-Agenten mit Tausenden von Anrufen pro Monat kann der Kostenunterschied zwischen low und xhigh um ein Vielfaches betragen. Beginnen Sie mit low, messen Sie, erhöhen Sie punktuell.
❌ Audioformat ignorieren
Die Realtime API erwartet PCM16 mit einer Frequenz von 24.000 Hz. Wenn Ihr Mikrofon oder Telefonsystem ein anderes Format liefert — konvertieren Sie es vor der Übertragung. Ein falsches Format führt entweder zu Stille oder zu verzerrter Sprache ohne expliziten API-Fehler.
❌ Stimme nach der ersten Audio-Antwort ändern
Die Stimme wird nach der ersten Audio-Antwort des Modells festgelegt. Der Versuch, voice über session.update danach zu ändern, wird ohne Fehler ignoriert. Wenn Sie die Stimme ändern müssen — öffnen Sie eine neue Sitzung.
FAQ
Benötige ich einen separaten API-Schlüssel für die Realtime API?
Nein. Wenn Sie bereits einen Schlüssel für GPT-4o oder GPT-5 haben — er funktioniert auch für die Realtime API. Derselbe Schlüssel, dasselbe Konto auf platform.openai.com.
Wie kann ich GPT-Realtime-2 ohne Code testen?
Über das OpenAI Playground — dort gibt es eine Benutzeroberfläche für Realtime-Modelle mit Mikrofon direkt im Browser. Der schnellste Weg, das Modell zu hören, bevor Sie Code schreiben.
Kann ich GPT-Realtime-2 über OpenRouter verwenden?
Nein. OpenRouter basiert auf HTTP-Infrastruktur, die Realtime API benötigt WebSocket. Architektonische Inkompatibilität.
Was ist die maximale Sitzungsdauer?
60 Minuten. Danach schließt der Server die Verbindung. Implementieren Sie eine Reconnect-Logik für längere Interaktionen.
Wird die ukrainische Sprache unterstützt?
Ja — sowohl für GPT-Realtime-2 (versteht und antwortet), als auch als Eingangssprache für GPT-Realtime-Translate (70+ Eingangssprachen beinhalten Ukrainisch), als auch für GPT-Realtime-Whisper (Transkription).
Was ist semantic_vad und wann sollte es verwendet werden?
Voice Activity Detection — ein Mechanismus, der das Ende der Sprecherphrase bestimmt. semantic_vad nutzt das Verständnis des Kontexts, um Sätze nicht mitten im Satz abzubrechen. Empfohlen für die meisten Szenarien — besser als klassisches silence-based VAD, das Sätze bei natürlichen Pausen abschneidet.
Wie werden Token für Audio berechnet?
1 Sekunde Audio ≈ 40 Token. Bei einem Preis von 32 $/1M Eingabe-Token kostet 1 Minute Audio-Eingabe etwa 0,077 $. Eine detaillierte Kostenberechnung — in der offiziellen Dokumentation.
Schlussfolgerungen
GPT-Realtime-2 ist eine andere Art der Integration im Vergleich zur Chat Completions API. Event-gesteuertes Modell, ständige WebSocket-Verbindung, Base64-kodierte Audio-Chunks — wenn Sie noch nicht mit diesem Stack gearbeitet haben, planen Sie Zeit für die Einarbeitung ein.
Aber architektonisch läuft alles auf einige Schlüsselpunkte hinaus:
- Wählen Sie die richtige Methode: WebSocket (Server), WebRTC (Browser), SIP (Telefonie)
- Verbindung öffnen →
session.created erhalten → session.update senden
- Audio in Chunks über
input_audio_buffer.append streamen
- Auf
response.audio.delta reagieren und Audio abspielen
- Tool-Aufrufe verarbeiten und Ergebnisse über
conversation.item.create zurückgeben
Beginnen Sie mit dem Playground für erste Tests, nehmen Sie dann das WebSocket-Beispiel aus diesem Artikel und passen Sie es an Ihren Stack an. Reasoning effort — beginnen Sie mit low.
Kontext zum Release selbst, reale Anwendungsfälle und Vergleiche von Modellen — im Nachrichtenartikel:
→ OpenAI hat GPT-Realtime-2 veröffentlicht: das erste Sprachmodell mit GPT-5-Denkniveau
Wenn Sie sich für das breitere OpenAI-Ökosystem für Entwickler interessieren:
→ Codex von OpenAI: Der vollständige Leitfaden 2026
Quellen: OpenAI Realtime API Overview, WebSocket Guide, WebRTC Guide, SIP Guide, Managing Conversations, Managing Costs