Interaction en temps réel
Traitez le texte, l’audio et les appels de fonctions en temps réel via Realtime WebSocket.
OpenAI Realtime utilise une connexion persistante et des événements bidirectionnels pour traiter le texte, l’audio et les appels de fonctions en temps réel. Le client envoie des événements de session, de tampon audio, d’éléments de conversation et de contrôle des réponses ; le serveur renvoie continuellement l’état de session, les transcriptions, le texte, l’audio, les arguments de fonction et les erreurs.
Cette page utilise principalement WebSocket. Lors de la connexion, remplacez MODEL_ID par l’ID d’un modèle visible pour le compte actuel et compatible avec Realtime.
Les usages courants comprennent les conversations vocales en temps réel, la transcription de réunions et les assistants vocaux, la traduction en temps réel, la transcription vocale, les interactions de code en temps réel et les intégrations serveur en temps réel. Une connexion peut transporter du texte et de l’audio, et gérer la VAD, les appels de fonctions et les mises à jour d’état par événements.
wss://api.agtcloud.cn/v1/realtime?model=MODEL_IDAuthentification et connexion
Authentification WebSocket
Les applications serveur établissent une connexion WSS avec une clé API Bearer et transmettent le Header Realtime Beta dans la requête de handshake.
| Élément | Valeur |
|---|---|
| Adresse de connexion | wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID |
| Authorization | Bearer your-api-key |
| OpenAI-Beta | realtime=v1 |
Utilisez les clés API de longue durée uniquement sur des serveurs de confiance ; ne les intégrez pas dans un navigateur, un paquet mobile ou un dépôt public. Toutes les connexions doivent utiliser HTTPS/WSS.
Jetons temporaires
Pour connecter un client, un serveur de confiance peut d’abord créer un jeton temporaire valable une minute et destiné à une seule connexion.
POST https://api.agtcloud.cn/v1/realtime/sessions
Content-Type: application/json
Authorization: Bearer your-api-key
{
"model": "MODEL_ID",
"voice": "verse"
}Déroulement de la connexion
Dans le flux WebSocket principal, le serveur établit directement la connexion avec une clé API ; une fois le handshake réussi, il envoie les événements client et reçoit les événements serveur sur cette même connexion.
Dans le flux WebRTC, le client demande d’abord un jeton temporaire à son propre serveur applicatif, qui appelle l’interface de session pour le créer. Le client génère ensuite une SDP Offer, l’envoie à l’endpoint Realtime et reçoit une SDP Answer, puis échange des événements JSON via le canal de données oai-events.
Exemples de connexion WebSocket
Les exemples suivants présentent Node.js, Python, l’envoi et la réception d’événements. Après connexion, le client envoie des événements JSON et le serveur renvoie continuellement les résultats sous la même forme.
import WebSocket from 'ws';
const ws = new WebSocket('wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID', {
headers: {
Authorization: 'Bearer your-api-key',
'OpenAI-Beta': 'realtime=v1',
},
});
ws.on('open', () => {
console.log('Connexion au serveur établie.');
});
ws.on('message', (message) => {
console.log(JSON.parse(message.toString()));
});Intégration WebRTC
WebSocket est actuellement recommandé. Avant d’utiliser WebRTC, vérifiez que le modèle cible le prend en charge ; les exemples suivants illustrent la structure de connexion avec jeton temporaire, SDP, pistes audio et canal de données.
L’adresse WebRTC est https://api.agtcloud.cn/v1/realtime?model=MODEL_ID. Le client envoie application/sdp avec un jeton temporaire ; le canal de données se nomme oai-events et les événements sont en JSON. L’audio d’entrée est envoyé avec addTrack() et l’audio de sortie reçu avec ontrack.
Client navigateur et échange SDP
async function init() {
const tokenResponse = await fetch('/session');
const data = await tokenResponse.json();
const ephemeralKey = data.client_secret.value;
const pc = new RTCPeerConnection();
const audioElement = document.createElement('audio');
audioElement.autoplay = true;
pc.ontrack = (event) => {
audioElement.srcObject = event.streams[0];
};
const mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true });
pc.addTrack(mediaStream.getTracks()[0]);
const dataChannel = pc.createDataChannel('oai-events');
dataChannel.addEventListener('message', (event) => {
console.log(JSON.parse(event.data));
});
const offer = await pc.createOffer();
await pc.setLocalDescription(offer);
const response = await fetch(
'https://api.agtcloud.cn/v1/realtime?model=MODEL_ID',
{
method: 'POST',
body: offer.sdp,
headers: {
Authorization: `Bearer ${ephemeralKey}`,
'Content-Type': 'application/sdp',
},
},
);
await pc.setRemoteDescription({
type: 'answer',
sdp: await response.text(),
});
}
init();Création du jeton temporaire côté serveur
import express from 'express';
const app = express();
app.get('/session', async (_request, response) => {
const result = await fetch('https://api.agtcloud.cn/v1/realtime/sessions', {
method: 'POST',
headers: {
Authorization: 'Bearer your-api-key',
'Content-Type': 'application/json',
},
body: JSON.stringify({
model: 'MODEL_ID',
voice: 'verse',
}),
});
response.send(await result.json());
});
app.listen(3000);Envoi et réception d’événements sur le canal de données
const dataChannel = pc.createDataChannel('oai-events');
dataChannel.addEventListener('message', (event) => {
const realtimeEvent = JSON.parse(event.data);
console.log(realtimeEvent);
});
dataChannel.send(JSON.stringify({
type: 'response.create',
response: {
modalities: ['text'],
instructions: 'Écrivez un haïku sur le code',
},
}));Exemple WebSocket standard dans un environnement de type navigateur
Les environnements de type navigateur, comme Deno ou Cloudflare Workers, peuvent transmettre l’authentification via les sous-protocoles. Vérifiez d’abord la prise en charge par l’environnement et le nœud actuels ; il est déconseillé de placer une clé API de longue durée dans une page de navigateur ordinaire.
const ws = new WebSocket(
'wss://api.agtcloud.cn/v1/realtime?model=MODEL_ID',
[
'realtime',
'openai-insecure-api-key.your-api-key',
'openai-organization.ORGANIZATION_ID',
'openai-project.PROJECT_ID',
'openai-beta.realtime-v1',
],
);
ws.addEventListener('open', () => {
console.log('Connexion au serveur établie.');
});
ws.addEventListener('message', (event) => {
console.log(JSON.parse(event.data));
});Session, audio et conversation
Realtime prend en charge les conversations textuelles, vocales et combinant texte et audio. La configuration de session peut inclure les formats audio d’entrée et de sortie, la voix, la température, la longueur maximale de sortie, les outils et les paramètres VAD.
- Formats audio d’entrée et de sortie :
pcm16,g711_ulaw,g711_alaw. - Exemples de voix :
alloy,echo,shimmer. - La configuration VAD comprend le seuil, le préfixe audio avant la parole et la durée de silence.
- La conversation progresse via la session, les éléments de conversation, les parties de contenu et les événements de réponse.
Consultez les champs précis dans le navigateur d’événements ci-dessous ; les paramètres et domaines de valeurs partagés sont regroupés dans « Types communs ».
Référence des événements
Sélectionnez un événement pour consulter ses champs et son exemple JSON. Vous pouvez changer de direction, filtrer par catégorie ou rechercher un nom d’événement.
session.update
Met à jour la configuration par défaut de la session.
| Champ | Type | Obligatoire | Description | Exemple |
|---|---|---|---|---|
event_id | string | Non | Identifiant d’événement généré par le client | event_123 |
type | string | Non | Type d’événement | session.update |
modalities | string[] | Non | Modalités auxquelles le modèle peut répondre | ["text", "audio"] |
instructions | string | Non | Instructions système insérées avant l’appel du modèle | "Répondez de manière concise et précise." |
voice | string | Non | Voix utilisée par le modèle | alloy, echo, shimmer |
input_audio_format | string | Non | Format audio d’entrée | pcm16, g711_ulaw, g711_alaw |
output_audio_format | string | Non | Format audio de sortie | pcm16, g711_ulaw, g711_alaw |
input_audio_transcription.model | string | Non | Modèle utilisé pour la transcription | whisper-1 |
turn_detection.type | string | Non | Type de détection vocale | server_vad |
turn_detection.threshold | number | Non | Seuil d’activation de la VAD (0.0–1.0) | 0.8 |
turn_detection.prefix_padding_ms | integer | Non | Durée audio incluse avant le début de la parole | 500 |
turn_detection.silence_duration_ms | integer | Non | Durée de silence utilisée pour détecter la fin de la parole | 1000 |
tools | array | Non | Liste des outils disponibles pour le modèle | [] |
tool_choice | string | Non | Mode de sélection des outils par le modèle | auto/none/required |
temperature | number | Non | Température d’échantillonnage du modèle | 0.8 |
max_output_tokens | string or integer | Non | Nombre maximal de tokens par réponse | "inf"/4096 |
{
"event_id": "event_123",
"type": "session.update",
"modalities": [
"text",
"audio"
],
"instructions": "Répondez de manière concise et précise.",
"voice": "alloy, echo, shimmer",
"input_audio_format": "pcm16, g711_ulaw, g711_alaw",
"output_audio_format": "pcm16, g711_ulaw, g711_alaw",
"input_audio_transcription": {
"model": "whisper-1"
},
"turn_detection": {
"type": "server_vad",
"threshold": 0.8,
"prefix_padding_ms": 500,
"silence_duration_ms": 1000
},
"tools": [],
"tool_choice": "auto",
"temperature": 0.8,
"max_output_tokens": "inf"
}Types communs
Les sections repliables suivantes regroupent les paramètres des limites de débit, appels de fonctions, audio, VAD, outils, modèles, événements, sessions, éléments de conversation, contenu, réponses, transcription, flux audio et WebRTC.
Paramètres des événements de limite de débit4 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
name | string | Oui | Nom de la limite | Exemple : requests_per_min |
limit | integer | Oui | Valeur de la limite | Exemple : 60 |
remaining | integer | Oui | Quota disponible restant | Exemple : 45 |
reset_seconds | integer | Oui | Délai de réinitialisation (secondes) | Exemple : 35 |
Paramètres d’appel de fonction4 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
type | string | Oui | Type de fonction | Exemple : function |
name | string | Oui | Nom de la fonction | Exemple : get_weather |
description | string | Non | Description de la fonction | Exemple : Obtenir la météo actuelle |
parameters | object | Oui | Définition des paramètres de la fonction | Exemple : {"type": "object", "properties": {...}} |
Paramètres du format audio4 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
sample_rate | integer | — | Fréquence d’échantillonnage | Valeurs possibles : 8000, 16000, 24000, 44100, 48000 |
channels | integer | — | Nombre de canaux | Valeurs possibles : 1 (mono), 2 (stéréo) |
bits_per_sample | integer | — | Profondeur d’échantillonnage | Valeurs possibles : 16 (pcm16), 8 (g711) |
encoding | string | — | Encodage | Valeurs possibles : pcm16, g711_ulaw, g711_alaw |
Paramètres de détection vocale3 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
threshold | number | — | Seuil d’activation de la VAD | Valeur par défaut : 0.5 ; plage : 0.0–1.0 |
prefix_padding_ms | integer | — | Préfixe audio avant la parole (millisecondes) | Valeur par défaut : 500 ; plage : 0–5000 |
silence_duration_ms | integer | — | Durée de détection du silence (millisecondes) | Valeur par défaut : 1000 ; plage : 100–10000 |
Paramètres de sélection des outils2 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
tool_choice | string | — | Mode de sélection des outils | Valeurs possibles : auto, none, required |
tools | array | — | Liste des outils disponibles | Valeurs possibles : [{type, name, description, parameters}] |
Paramètres de configuration du modèle4 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
temperature | number | — | Température d’échantillonnage | Plage/valeurs possibles : 0.0–2.0 ; valeur par défaut : 1.0 |
max_output_tokens | integer or string | — | Longueur maximale de sortie | Plage/valeurs possibles : 1–4096/"inf" ; valeur par défaut : "inf" |
modalities | string[] | — | Modalités de réponse | Plage/valeurs possibles : ["text", "audio"] ; valeur par défaut : ["text"] |
voice | string | — | Voix | Plage/valeurs possibles : alloy, echo, shimmer ; valeur par défaut : alloy |
Paramètres communs des événements3 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
event_id | string | Oui | Identifiant unique de l’événement | Exemple : event_123 |
type | string | Oui | Type d’événement | Exemple : session.update |
timestamp | integer | Non | Horodatage de l’événement (millisecondes) | Exemple : 1677649363000 |
Paramètres d’état de session3 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
status | string | — | État de la session | Valeurs possibles : active, ended, error |
error | object | — | Informations d’erreur | Valeurs possibles : {"type": "error_type", "message": "message d’erreur"} |
metadata | object | — | Métadonnées de la session | Valeurs possibles : {"client_id": "web", "session_type": "chat"} |
Paramètres d’état des éléments de conversation3 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
status | string | — | État de l’élément de conversation | Valeurs possibles : completed, in_progress, incomplete |
role | string | — | Rôle de l’expéditeur | Valeurs possibles : user, assistant, system |
type | string | — | Type d’élément de conversation | Valeurs possibles : message, function_call, function_call_output |
Paramètres de type de contenu3 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
type | string | — | Type de contenu | Valeurs possibles : text, audio, transcript |
format | string | — | Format du contenu | Valeurs possibles : plain, markdown, html |
encoding | string | — | Encodage | Valeurs possibles : utf-8, base64 |
Paramètres d’état de réponse3 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
status | string | — | État de la réponse | Valeurs possibles : completed, cancelled, failed, incomplete |
status_details | object | — | Détails de l’état | Valeurs possibles : {"reason": "user_cancelled"} |
usage | object | — | Statistiques d’utilisation | Valeurs possibles : {"total_tokens": 50, "input_tokens": 20, "output_tokens": 30} |
Paramètres de transcription audio4 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
enabled | boolean | — | Activation de la transcription | Exemple : true |
model | string | — | Modèle de transcription | Exemple : whisper-1 |
language | string | — | Langue de transcription | Exemple : en, zh, auto |
prompt | string | — | Prompt de transcription | Exemple : "Transcription d’une conversation" |
Paramètres du flux audio3 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
chunk_size | integer | — | Taille des blocs audio (octets) | Valeurs possibles : 1024, 2048, 4096 |
latency | string | — | Mode de latence | Valeurs possibles : low, balanced, high |
compression | string | — | Compression | Valeurs possibles : none, opus, mp3 |
Paramètres de configuration WebRTC3 champs
| Champ | Type | Obligatoire | Description | Valeurs possibles ou exemple |
|---|---|---|---|---|
ice_servers | array | — | Liste des serveurs ICE | Valeur par défaut : [{"urls": "stun:stun.l.google.com:19302"}] |
audio_constraints | object | — | Contraintes audio | Valeur par défaut : {"echoCancellation": true} |
connection_timeout | integer | — | Délai de connexion (millisecondes) | Valeur par défaut : 30000 |
Gestion des erreurs et reprise
Les erreurs Realtime relèvent généralement de quatre catégories : connexion, authentification, audio ou session.
| Type | Causes courantes | Mesures à prendre |
|---|---|---|
| Erreur de connexion | Coupure réseau, échec du handshake ou configuration incorrecte | Vérifiez l’adresse WSS, le réseau et le handshake ; limitez le nombre de reconnexions |
| Erreur d’authentification | Clé API non valide, jeton temporaire expiré ou incompatibilité avec l’adresse API | Renouvelez les identifiants et assurez-vous que la clé API correspond à l’adresse API utilisée |
| Erreur audio | Autorisations de périphérique, format non pris en charge ou codecs incompatibles | Vérifiez les autorisations, l’échantillonnage et l’encodage, puis rétablissez le flux audio |
| Erreur de session | Expiration, limite de concurrence ou états d’événements incohérents | Conservez l’événement d’erreur, recréez la session et, si nécessaire, utilisez une interface non temps réel |
La reprise peut comprendre la reconnexion automatique, la restauration de session, des tentatives limitées et un mode dégradé. En cas d’erreur, lisez d’abord l’événement error, conservez event_id, error.type, error.code, error.message et les informations d’événement associées, puis décidez si un renvoi est nécessaire.