88API88API
User GuideAI ApplicationsAPI ReferenceHelp & Support
Realtime

API en temps réel OpenAI

?? Aperçu

Introduction

L'API OpenAI Realtime propose deux méthodes de connexion:

  1. WebRTC – Pour une interaction audio/vidéo en temps réel dans les navigateurs et les clients mobiles

  2. WebSocket - Pour l'intégration d'applications de serveur à serveur

Cas d'utilisation

  • Conversations vocales en temps réel
  • Conférence audio/vidéo
  • Traduction en temps réel
  • Transcription de discours
  • Génération de code en temps réel
  • Intégration en temps réel côté serveur

Principales fonctionnalités

  • Diffusion audio bidirectionnelle
  • Conversations mixtes texte et audio
  • Prise en charge des appels de fonction
  • Détection automatique de l'activité vocale (VAD)
  • Capacités de transcription audio
  • Intégration côté serveur WebSocket

?? Authentification et sécurité

Méthodes d'authentification

  1. Clé API standard (côté serveur uniquement)
  2. Jeton éphémère (utilisation côté client)

Jeton éphémère

  • Validité : 1 minute
  • Limite d'utilisation : Connexion unique
  • Génération: créée via l'API côté serveur
POST https://88api.ai/v1/realtime/sessions
Content-Type: application/json
Authorization: Bearer $NEW_API_KEY

{
  "model": "gpt-4o-realtime-preview-2024-12-17",
  "voice": "verse"
}

Recommandations de sécurité

  • N'exposez jamais les clés API standard côté client
  • Utiliser HTTPS/WSS pour la communication
  • Mettre en place des contrôles d'accès appropriés
  • Surveiller les activités inhabituelles

?? Établissement de la connexion

Connexion WebRTC

  • URL: https://88api.ai/v1/realtime
  • Paramètres de requête: model
  • En-têtes:
  • Authorization: Bearer EPHEMERAL_KEY
  • Content-Type: application/sdp

Connexion WebSocket

  • URL: wss://88api.ai/v1/realtime
  • Paramètres de requête: model
  • En-têtes:
  • Authorization: Bearer YOUR_API_KEY
  • OpenAI-Beta: realtime=v1

Flux de connexion

sequenceDiagram
    participant Client
    participant Server
    participant OpenAI

    alt WebRTC Connection
        Client->>Server: Request ephemeral token
        Server->>OpenAI: Create session
        OpenAI-->>Server: Return ephemeral token
        Server-->>Client: Return ephemeral token

        Client->>OpenAI: Create WebRTC offer
        OpenAI-->>Client: Return answer

        Note over Client,OpenAI: Establish WebRTC connection

        Client->>OpenAI: Create data channel
        OpenAI-->>Client: Confirm data channel
    else WebSocket Connection
        Server->>OpenAI: Establish WebSocket connection
        OpenAI-->>Server: Confirm connection

        Note over Server,OpenAI: Begin real-time conversation
    end

Canal de données

  • Nom : oai-events
  • Finalité : Transmission d'événements
  • Format: JSON

Flux audio

  • Entrée : addTrack()
  • Sortie: ontrack événement

?? Interactions conversationnelles

Modes de conversation

  1. Conversations en texte uniquement
  2. Conversations vocales
  3. Conversations mixtes

Gestion des sessions

  • Créer une séance
  • Séance de mise à jour
  • Fin de séance
  • Paramétrage des séances

Types d'événements

  • Événements texte
  • Événements audio
  • Appels de fonctions
  • Mises à jour du statut
  • Événements d'erreur

?? Options de configuration

Configuration audio

  • Formats d'entrée
  • pcm16
  • g711_ulaw
  • g711_alaw
  • Formats de sortie
  • pcm16
  • g711_ulaw
  • g711_alaw
  • Types de voix
  • alloy
  • echo
  • shimmer

Configuration du modèle

  • Température
  • Longueur de sortie maximale
  • Invite système
  • Paramétrage des outils

Configuration du VAD

  • Seuil
  • Durée des silences
  • Remplissage de préfixe

?? Exemples de demande

Connexion WebRTC ?

Implémentation client (navigateur)

async function init() {
  // Get ephemeral key from server - see server code below
  const tokenResponse = await fetch('/session');
  const data = await tokenResponse.json();
  const EPHEMERAL_KEY = data.client_secret.value;

  // Create peer connection
  const pc = new RTCPeerConnection();

  // Set up remote audio from model playback
  const audioEl = document.createElement('audio');
  audioEl.autoplay = true;
  pc.ontrack = (e) => (audioEl.srcObject = e.streams[0]);

  // Add local audio track from browser microphone input
  const ms = await navigator.mediaDevices.getUserMedia({
    audio: true,
  });
  pc.addTrack(ms.getTracks()[0]);

  // Set up data channel for sending and receiving events
  const dc = pc.createDataChannel('oai-events');
  dc.addEventListener('message', (e) => {
    // Receive real-time server events here!
    console.log(e);
  });

  // Start session using Session Description Protocol (SDP)
  const offer = await pc.createOffer();
  await pc.setLocalDescription(offer);

  const baseUrl = 'https://88api.ai/v1/realtime';
  const model = 'gpt-4o-realtime-preview-2024-12-17';
  const sdpResponse = await fetch(`${baseUrl}?model=${model}`, {
    method: 'POST',
    body: offer.sdp,
    headers: {
      Authorization: `Bearer ${EPHEMERAL_KEY}`,
      'Content-Type': 'application/sdp',
    },
  });

  const answer = {
    type: 'answer',
    sdp: await sdpResponse.text(),
  };
  await pc.setRemoteDescription(answer);
}

init();

Implémentation du serveur (Node.js)

import express from 'express';

const app = express();

// Create an endpoint for generating ephemeral tokens
// This endpoint works with the client code above
app.get('/session', async (req, res) => {
  const r = await fetch(
    'https://88api.ai/v1/realtime/sessions',
    {
      method: 'POST',
      headers: {
        Authorization: `Bearer ${process.env.NEW_API_KEY}`,
        'Content-Type': 'application/json',
      },
      body: JSON.stringify({
        model: 'gpt-4o-realtime-preview-2024-12-17',
        voice: 'verse',
      }),
    }
  );
  const data = await r.json();

  // Send the JSON received from OpenAI REST API back to client
  res.send(data);
});

app.listen(3000);

Exemple d'envoi/réception d'événement WebRTC

// Create data channel from peer connection
const dc = pc.createDataChannel('oai-events');

// Listen for server events on data channel
// Event data needs to be parsed from JSON string
dc.addEventListener('message', (e) => {
  const realtimeEvent = JSON.parse(e.data);
  console.log(realtimeEvent);
});

// Send client event: serialize valid client events to
// JSON and send via data channel
const responseCreate = {
  type: 'response.create',
  response: {
    modalities: ['text'],
    instructions: 'Write a haiku about code',
  },
};
dc.send(JSON.stringify(responseCreate));

Connexion WebSocket ?

Node.js (module ws)

import WebSocket from 'ws';

const url =
  'wss://88api.ai/v1/realtime?model=gpt-4o-realtime-preview-2024-12-17';
const ws = new WebSocket(url, {
  headers: {
    Authorization: 'Bearer ' + process.env.NEW_API_KEY,
    'OpenAI-Beta': 'realtime=v1',
  },
});

ws.on('open', function open() {
  console.log('Connected to server.');
});

ws.on('message', function incoming(message) {
  console.log(JSON.parse(message.toString()));
});

Python (client websocket)

# Requires websocket-client library:
# pip install websocket-client

import os
import json
import websocket

NEW_API_KEY = os.environ.get("NEW_API_KEY")

url = "wss://88api.ai/v1/realtime?model=gpt-4o-realtime-preview-2024-12-17"
headers = [
    "Authorization: Bearer " + NEW_API_KEY,
    "OpenAI-Beta: realtime=v1"
]

def on_open(ws):
    print("Connected to server.");

def on_message(ws, message):
    data = json.loads(message)
    print("Received event:", json.dumps(data, indent=2))

ws = websocket.WebSocketApp(
    url,
    header=headers,
    on_open=on_open,
    on_message=on_message,
)

ws.run_forever()
/*
Note: In browser and other client environments, we recommend using WebRTC.
But in Deno and Cloudflare Workers and other browser-like environments,
you can also use the standard WebSocket interface.
*/

const ws = new WebSocket(
  'wss://88api.ai/v1/realtime?model=gpt-4o-realtime-preview-2024-12-17',
  [
    'realtime',
    // Authentication
    'openai-insecure-api-key.' + NEW_API_KEY,
    // Optional
    'openai-organization.' + OPENAI_ORG_ID,
    'openai-project.' + OPENAI_PROJECT_ID,
    // Beta protocol, required
    'openai-beta.realtime-v1',
  ]
);

ws.on('open', function open() {
  console.log('Connected to server.');
});

ws.on('message', function incoming(message) {
  console.log(message.data);
});

Exemple d'envoi/réception de message

Node.js/Navigateur
// Receive server events
ws.on('message', function incoming(message) {
  // Need to parse message data from JSON
  const serverEvent = JSON.parse(message.data);
  console.log(serverEvent);
});

// Send events, create JSON data structure conforming to client event format
const event = {
  type: 'response.create',
  response: {
    modalities: ['audio', 'text'],
    instructions: 'Give me a haiku about code.',
  },
};
ws.send(JSON.stringify(event));

#####Python

# Send client events, serialize dictionary to JSON
def on_open(ws):
    print("Connected to server.");

    event = {
        "type": "response.create",
        "response": {
            "modalities": ["text"],
            "instructions": "Please assist the user."
        }
    }
    ws.send(json.dumps(event))

# Receive messages need to parse message payload from JSON
def on_message(ws, message):
    data = json.loads(message)
    print("Received event:", json.dumps(data, indent=2))

?? Gestion des erreurs

Erreurs courantes

  1. Erreurs de connexion
  • Problèmes de réseau
  • Échecs d'authentification
  • Erreurs de configuration
  1. Erreurs audio
  • Autorisations de l'appareil
  • Formats non pris en charge
  • Problèmes de codecs
  1. Erreurs de session
  • Expiration du jeton
  • Délai d'expiration de la session
  • Limites de concurrence

Récupération d'erreur

  1. Reconnexion automatique
  2. Récupération de session
  3. Nouvelle tentative d'erreur
  4. Dégradation gracieuse

?? Référence d'événement

En-têtes de requête courants

Tous les événements doivent inclure les en-têtes de requête suivants:

En-têteTapezDescriptifExemple de valeur
AutorisationChaîneJeton d'authentificationPorteur $NEW_API_KEY
OpenAI-BêtaChaîneVersion APItemps réel=v1

Événements clients

session.mise à jour

Mettez à jour la configuration par défaut de la session.

ParamètreTapezObligatoireDescriptifExemple de valeur/valeurs facultatives
événement_idChaîneNonIdentificateur d'événement généré par le clientévénement_123
tapezChaîneNonType d'événementsession.update
modalitésTableau de chaînesNonTypes de modalités avec lesquels le modèle peut répondre["texte", "audio"]
mode d'emploiChaîneNonInstructions système ajoutées aux appels de modèle"Votre limite de connaissances est 2023-10..."
voixChaîneNonType de voix utilisé par le modèlealliage, écho, miroitement
format_audio_entréeChaîneNonFormat audio d'entréepcm16, g711_ulaw, g711_alaw
format_audio_sortieChaîneNonFormat audio de sortiepcm16, g711_ulaw, g711_alaw
input_audio_transcription.modelChaîneNonModèle utilisé pour la transcriptionmurmure-1
turn_detection.typeChaîneNonType de détection vocaleserveur_vad
turn_detection.thresholdNuméroNonSeuil d'activation VAD (0,0-1,0)0,8
turn_detection.prefix_padding_msEntierNonDurée audio incluse avant le début du discours500
turn_detection.silence_duration_msEntierNonDurée du silence pour détecter l'arrêt de la parole1000
outilsTableauNonListe des outils disponibles pour le modèle[]
choix_outilChaîneNonComment le modèle choisit les outilsauto/aucun/obligatoire
températureNuméroNonTempérature d'échantillonnage du modèle0,8
max_output_tokensChaîne/EntierNonNombre maximum de jetons par réponse"info"/4096

input_audio_buffer.append

Ajoutez des données audio au tampon audio d’entrée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentificateur d'événement généré par le clientévénement_456
tapezChaîneNonType d'événementinput_audio_buffer.append
audioChaîneNonDonnées audio codées en base64Base64EncodedAudioData

input_audio_buffer.commit

Validez les données audio dans le tampon en tant que message utilisateur.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentificateur d'événement généré par le clientévénement_789
tapezChaîneNonType d'événementinput_audio_buffer.commit

input_audio_buffer.clear

Effacez toutes les données audio du tampon audio d’entrée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentificateur d'événement généré par le clientévénement_012
tapezChaîneNonType d'événementinput_audio_buffer.clear

conversation.item.create

Ajoutez un nouvel élément de conversation à la conversation.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentificateur d'événement généré par le clientévénement_345
tapezChaîneNonType d'événementconversation.item.create
précédent_item_idChaîneNonUn nouvel élément sera inséré après cet IDnul
article.idChaîneNonIdentifiant unique de l'élément de conversationmsg_001
article.typeChaîneNonType d'élément de conversationmessage/function_call/function_call_output
article.statutChaîneNonStatut de l'élément de conversationterminé/en_progress/incomplet
article.rôleChaîneNonRôle de l'expéditeur du messageutilisateur/assistant/système
article.contentTableauNonContenu du message[text/audio/transcript]
item.call_idChaîneNonID de l'appel de fonctionappel_001
article.nomChaîneNonNom de la fonction appeléenom_fonction
élément.argumentsChaîneNonArguments pour l'appel de fonction{"param": "value"}
article.sortieChaîneNonRésultat de sortie de l'appel de fonction{"result": "value"}

conversation.item.truncate

Tronquez le contenu audio dans les messages de l'assistant.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentificateur d'événement généré par le clientévénement_678
tapezChaîneNonType d'événementconversation.item.truncate
article_idChaîneNonID de l'élément de message de l'assistant à tronquermsg_002
contenu_indexEntierNonIndex de la partie du contenu à tronquer0
audio_end_msEntierNonHeure de fin pour la troncature audio1500

conversation.item.delete

Supprimez l'élément de conversation spécifié de l'historique des conversations.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentificateur d'événement généré par le clientévénement_901
tapezChaîneNonType d'événementconversation.item.delete
article_idChaîneNonID de l'élément de conversation à supprimermsg_003

réponse.create

Génération de réponse de déclenchement.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentificateur d'événement généré par le clientévénement_234
tapezChaîneNonType d'événementréponse.create
réponse.modalitésTableau de chaînesNonTypes de modalités de réponse["texte", "audio"]
réponse.instructionsChaîneNonInstructions pour le modèle"Veuillez aider l'utilisateur."
réponse.voixChaîneNonType de voix utilisé par le modèlealliage/écho/chatoyant
réponse.output_audio_formatChaîneNonFormat audio de sortiepcm16
réponse.toolsTableauNonListe des outils disponibles pour le modèle["type", "nom", "description"]
réponse.tool_choiceChaîneNonComment le modèle choisit les outilsautomobile
réponse.températureNuméroNonTempérature d'échantillonnage0,7
réponse.max_output_tokensEntier/ChaîneNonJetons de sortie maximale150/"inf"

réponse.annuler

Annulez la génération de réponse en cours.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentificateur d'événement généré par le clientévénement_567
tapezChaîneNonType d'événementréponse.annuler

Événements du serveur

erreur

Événement renvoyé lorsqu'une erreur se produit.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idTableau de chaînesNonIdentifiant unique pour l'événement serveur["événement_890"]
tapezChaîneNonType d'événementerreur
erreur.typeChaîneNonType d'erreurinvalid_request_error/server_error
erreur.codeChaîneNonCode d'erreurinvalid_event
erreur.messageChaîneNonMessage d'erreur lisible par l'homme"Le champ 'type' est manquant."
erreur.paramChaîneNonParamètre lié à l'erreurnul
erreur.event_idChaîneNonID de l'événement associéévénement_567

conversation.item.input_audio_transcription.completed

Renvoyé lorsque la transcription audio d’entrée est activée et que la transcription réussit.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_2122
tapezChaîneNonType d'événementconversation.item.input_audio_transcription.completed
article_idChaîneNonID de l'élément de message utilisateurmsg_003
contenu_indexEntierNonIndex de la partie de contenu contenant de l'audio0
transcriptionChaîneNonContenu du texte transcrit"Bonjour comment allez-vous?"

conversation.item.input_audio_transcription.failed

Renvoyé lorsque la transcription audio d’entrée est configurée mais que la demande de transcription pour le message utilisateur échoue.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_2324
tapezTableau de chaînesNonType d'événement["conversation.item.input_audio_transcription.failed"]
article_idChaîneNonID de l'élément de message utilisateurmsg_003
contenu_indexEntierNonIndex de la partie de contenu contenant de l'audio0
erreur.typeChaîneNonType d'erreurerreur_transcription
erreur.codeChaîneNonCode d'erreuraudio_inintelligible
erreur.messageChaîneNonMessage d'erreur lisible par l'homme"L'audio n'a pas pu être transcrit."
erreur.paramChaîneNonParamètre lié à l'erreurnul

conversation.item.truncated

Renvoyé lorsque le client tronque l’élément précédent du message audio de l’assistant.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_2526
tapezChaîneNonType d'événementconversation.item.truncated
article_idChaîneNonID de l'élément de message de l'assistant tronquémsg_004
contenu_indexEntierNonIndex de la partie de contenu tronquée0
audio_end_msEntierNonMoment auquel l’audio a été tronqué (millisecondes)1500

conversation.item.deleted

Renvoyé lorsqu'un élément de la conversation est supprimé.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_2728
tapezChaîneNonType d'événementconversation.item.deleted
article_idChaîneNonID de l'élément de conversation supprimémsg_005

input_audio_buffer.commis

Renvoyé lorsque les données du tampon audio sont validées.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_1121
tapezChaîneNonType d'événementinput_audio_buffer.commis
précédent_item_idChaîneNonUn nouvel élément de conversation sera inséré après cet IDmsg_001
article_idChaîneNonID de l'élément de message utilisateur à créermsg_002

input_audio_buffer.cleared

Renvoyé lorsque le client efface le tampon audio d’entrée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_1314
tapezChaîneNonType d'événementinput_audio_buffer.cleared

input_audio_buffer.speech_started

En mode de détection vocale du serveur, renvoyé lorsqu'une entrée vocale est détectée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_1516
tapezChaîneNonType d'événementinput_audio_buffer.speech_started
audio_start_msEntierNonMillisecondes entre le début de la session et la détection vocale1000
article_idChaîneNonID de l'élément de message utilisateur à créer lorsque la voix s'arrêtemsg_003

input_audio_buffer.speech_stopped

En mode de détection vocale du serveur, renvoyé lorsque la saisie vocale s'arrête.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_1718
tapezChaîneNonType d'événementinput_audio_buffer.speech_stopped
audio_start_msEntierNonMillisecondes entre le début de la session et la détection de l'arrêt vocal2000
article_idChaîneNonID de l'élément de message utilisateur à créermsg_003

réponse.créée

Renvoyé lorsqu'une nouvelle réponse est créée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_2930
tapezChaîneNonType d'événementréponse.créé
réponse.idChaîneNonIdentifiant unique pour la réponseresp_001
réponse.objectChaîneNonType d'objettemps réel.response
réponse.statutChaîneNonÉtat de la réponseen cours
réponse.status_detailsObjetNonDétails supplémentaires sur le statutnul
réponse.sortieTableau de chaînesNonListe des éléments de sortie générés par la réponse["[]"]
réponse.usageObjetNonStatistiques d'utilisation pour la réponsenul

réponse.done

Renvoyé lorsque la diffusion des réponses est terminée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_3132
tapezChaîneNonType d'événementréponse.done
réponse.idChaîneNonIdentifiant unique pour la réponseresp_001
réponse.objectChaîneNonType d'objettemps réel.response
réponse.statutChaîneNonÉtat final de la réponseterminé/annulé/échoué/incomplet
réponse.status_detailsObjetNonDétails supplémentaires sur le statutnul
réponse.sortieTableau de chaînesNonListe des éléments de sortie générés par la réponse["[...]"]
réponse.usage.total_tokensEntierNonTotal des jetons50
réponse.usage.input_tokensEntierNonJetons d'entrée20
réponse.usage.output_tokensEntierNonJetons de sortie30

réponse.output_item.ajouté

Renvoyé lorsqu'un nouvel élément de sortie est créé lors de la génération de réponse.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_3334
tapezChaîneNonType d'événementréponse.output_item.added
réponse_idChaîneNonID de la réponse à laquelle appartient l'élément de sortieresp_001
index_de sortieChaîneNonIndex de l'élément de sortie en réponse0
article.idChaîneNonIdentifiant unique de l'élément de sortiemsg_007
article.objetChaîneNonType d'objettemps réel.item
article.typeChaîneNonType d'élément de sortiemessage/function_call/function_call_output
article.statutChaîneNonStatut de l'élément de sortieen cours/terminé
article.rôleChaîneNonRôle associé à l'élément de sortieassistante
article.contentTableauNonContenu de l'élément de sortie["type", "texte", "audio", "transcription"]

réponse.output_item.done

Renvoyé lorsque la diffusion en continu des éléments de sortie est terminée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_3536
tapezChaîneNonType d'événementréponse.output_item.done
réponse_idChaîneNonID de la réponse à laquelle appartient l'élément de sortieresp_001
index_de sortieChaîneNonIndex de l'élément de sortie en réponse0
article.idChaîneNonIdentifiant unique de l'élément de sortiemsg_007
article.objetChaîneNonType d'objettemps réel.item
article.typeChaîneNonType d'élément de sortiemessage/function_call/function_call_output
article.statutChaîneNonStatut final de l'élément de sortiecomplété/incomplet
article.rôleChaîneNonRôle associé à l'élément de sortieassistante
article.contentTableauNonContenu de l'élément de sortie["type", "texte", "audio", "transcription"]

réponse.content_part.ajouté

Renvoyé lorsqu'une nouvelle partie de contenu est ajoutée à l'élément de message de l'assistant lors de la génération de la réponse.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_3738
tapezChaîneNonType d'événementréponse.content_part.added
réponse_idChaîneNonID de la réponseresp_001
article_idChaîneNonID de l'élément de message auquel ajouter une partie de contenumsg_007
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
contenu_indexEntierNonIndex de la partie de contenu dans le tableau de contenu d'élément de message0
pièce.typeChaîneNonType de contenutexte/audio
partie.textChaîneNonContenu du texte"Bonjour"
partie.audioChaîneNonDonnées audio codées en base64"base64_encoded_audio_data"
partie.transcriptChaîneNonTexte transcrit de l'audio"Bonjour"

réponse.content_part.done

Renvoyé lorsque la partie contenu de la diffusion en continu des éléments de message de l'assistant est terminée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_3940
tapezChaîneNonType d'événementréponse.content_part.done
réponse_idChaîneNonID de la réponseresp_001
article_idChaîneNonID de l'élément de message auquel ajouter une partie de contenumsg_007
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
contenu_indexEntierNonIndex de la partie de contenu dans le tableau de contenu d'élément de message0
pièce.typeChaîneNonType de contenutexte/audio
partie.textChaîneNonContenu du texte"Bonjour"
partie.audioChaîneNonDonnées audio codées en base64"base64_encoded_audio_data"
partie.transcriptChaîneNonTexte transcrit de l'audio"Bonjour"

réponse.text.delta

Renvoyé lorsque la valeur texte de la partie de contenu de type « texte » est mise à jour.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_4142
tapezChaîneNonType d'événementréponse.text.delta
réponse_idChaîneNonID de la réponseresp_001
article_idChaîneNonID de l'élément de messagemsg_007
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
contenu_indexEntierNonIndex de la partie de contenu dans le tableau de contenu d'élément de message0
deltaChaîneNonContenu de mise à jour du texte delta"Bien sûr, je peux"

réponse.text.done

Renvoyé lorsque la diffusion de texte de la partie de contenu de type « texte » est terminée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_4344
tapezChaîneNonType d'événementréponse.text.done
réponse_idChaîneNonID de la réponseresp_001
article_idChaîneNonID de l'élément de messagemsg_007
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
contenu_indexEntierNonIndex de la partie de contenu dans le tableau de contenu d'élément de message0
deltaChaîneNonContenu final du texte complet"Bien sûr, je peux vous aider."

réponse.audio_transcript.delta

Renvoyé lorsque le contenu de transcription de la sortie audio générée par le modèle est mis à jour.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_4546
tapezChaîneNonType d'événementréponse.audio_transcript.delta
réponse_idChaîneNonID de la réponseresp_001
article_idChaîneNonID de l'élément de messagemsg_008
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
contenu_indexEntierNonIndex de la partie de contenu dans le tableau de contenu d'élément de message0
deltaChaîneNonContenu de la mise à jour delta du texte de transcription"Bonjour, comment puis-je"

réponse.audio_transcript.done

Renvoyé lorsque la transcription du streaming de sortie audio généré par le modèle est terminée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_4748
tapezChaîneNonType d'événementréponse.audio_transcript.done
réponse_idChaîneNonID de la réponseresp_001
article_idChaîneNonID de l'élément de messagemsg_008
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
contenu_indexEntierNonIndex de la partie de contenu dans le tableau de contenu d'élément de message0
transcriptionChaîneNonTexte final transcrit complet de l'audio"Bonjour, comment puis-je vous aider aujourd'hui ?"

réponse.audio.delta

Renvoyé lorsque le contenu audio généré par le modèle est mis à jour.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_4950
tapezChaîneNonType d'événementréponse.audio.delta
réponse_idChaîneNonID de la réponseresp_001
article_idChaîneNonID de l'élément de messagemsg_008
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
contenu_indexEntierNonIndex de la partie de contenu dans le tableau de contenu d'élément de message0
deltaChaîneNonDelta de données audio codées en base64"Base64EncodedAudioDelta"

réponse.audio.done

Renvoyé lorsque l’audio généré par le modèle est terminé.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_5152
tapezChaîneNonType d'événementréponse.audio.done
réponse_idChaîneNonID de la réponseresp_001
article_idChaîneNonID de l'élément de messagemsg_008
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
contenu_indexEntierNonIndex de la partie de contenu dans le tableau de contenu d'élément de message0

Appel de fonction

réponse.function_call_arguments.delta

Renvoyé lorsque les arguments d’appel de fonction générés par le modèle sont mis à jour.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_5354
tapezChaîneNonType d'événementréponse.function_call_arguments.delta
réponse_idChaîneNonID de la réponseresp_002
article_idChaîneNonID de l'élément de messagefc_001
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
id_appelChaîneNonID de l'appel de fonctionappel_001
deltaChaîneNonArguments d'appel de fonction au format JSON delta{"emplacement": "San"}

réponse.function_call_arguments.done

Renvoyé lorsque la diffusion des arguments d’appel de fonction générés par le modèle est terminée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_5556
tapezChaîneNonType d'événementréponse.function_call_arguments.done
réponse_idChaîneNonID de la réponseresp_002
article_idChaîneNonID de l'élément de messagefc_001
index_de sortieEntierNonIndex de l'élément de sortie en réponse0
id_appelChaîneNonID de l'appel de fonctionappel_001
argumentsChaîneNonArguments finaux complets de l'appel de fonction (format JSON){"emplacement": "San Francisco"}

Autres mises à jour de statut

rate_limits.mis à jour

Déclenché après chaque événement « response.done » pour indiquer les limites de débit mises à jour.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_5758
tapezChaîneNonType d'événementrate_limits.mis à jour
taux_limitesTableau d'objetsNonListe des informations sur les limites de débit[{"name": "requests_per_min", "limit": 60, "remaining": 45, "reset_seconds": 35}]

conversation.créée

Renvoyé lorsque la conversation est créée.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_9101
tapezChaîneNonType d'événementconversation.créé
conversationObjetNonObjet de ressource de conversation{"id": "conv_001", "object": "realtime.conversation"}

conversation.item.créé

Renvoyé lors de la création d’un élément de conversation.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_1920
tapezChaîneNonType d'événementconversation.item.créé
précédent_item_idChaîneNonID de l'élément de conversation précédentmsg_002
articleObjetNonObjet d'élément de conversation{"id": "msg_003", "object": "realtime.item", "type": "message", "status": "completed", "role": "user", "content": [{"type": "text", "text": "Hello"}]}

session.créée

Renvoyé lors de la création de la session.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_1234
tapezChaîneNonType d'événementsession.créée
séanceObjetNonObjet de session{"id": "sess_001", "object": "realtime.session", "model": "gpt-4", "modalities": ["text", "audio"]}

session.mise à jour

Renvoyé lorsque la session est mise à jour.

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneNonIdentifiant unique pour l'événement serveurévénement_5678
tapezChaîneNonType d'événementsession.mise à jour
séanceObjetNonObjet de session mis à jour{"id": "sess_001", "object": "realtime.session", "model": "gpt-4", "modalities": ["text", "audio"]}

Tableau des paramètres d'événement de limite de débit

ParamètreTapezObligatoireDescriptifExemple de valeur
nomChaîneOuiNom de la limiterequêtes_per_min
limiteEntierOuiValeur limite60
restantEntierOuiMontant restant disponible45
réinitialiser_secondesEntierOuiTemps de réinitialisation (secondes)35

Tableau des paramètres d'appel de fonction

ParamètreTapezObligatoireDescriptifExemple de valeur
tapezChaîneOuiType de fonctionfonction
nomChaîneOuiNom de la fonctionget_weather
descriptifChaîneNonDescription de la fonctionObtenez la météo actuelle
paramètresObjetOuiDéfinition des paramètres de fonction{"type": "object", "properties": {...}}

Tableau des paramètres du format audio

ParamètreTapezDescriptifValeurs facultatives
taux_échantillonEntierTaux d'échantillonnage8 000, 16 000, 24 000, 44 100, 48 000
chaînesEntierNombre de chaînes1 (mono), 2 (stéréo)
bits_per_sampleEntierBits par échantillon16 (pcm16), 8 (g711)
encodageChaîneMéthode d'encodagepcm16, g711_ulaw, g711_alaw

Tableau des paramètres de détection vocale

ParamètreTapezDescriptifValeur par défautGamme
seuilFlotteurSeuil d'activation VAD0,50,0-1,0
préfixe_padding_msEntierRemplissage du préfixe vocal (millisecondes)5000-5000
silence_duration_msEntierDurée de détection du silence (millisecondes)1000100-10000

Tableau des paramètres de sélection d'outil

ParamètreTapezDescriptifValeurs facultatives
choix_outilChaîneMéthode de sélection des outilsautomatique, aucun, obligatoire
outilsTableauListe des outils disponibles[{type, name, description, parameters}]

Tableau des paramètres de configuration du modèle

ParamètreTapezDescriptifPlage/Valeurs facultativesValeur par défaut
températureFlotteurTempérature d'échantillonnage0,0-2,01.0
max_output_tokensEntier/ChaîneLongueur de sortie maximale1-4096/"info""inf"
modalitésTableau de chaînesModalités de réponse["texte", "audio"]["texte"]
voixChaîneType de voixalliage, écho, miroitementalliage

Tableau des paramètres communs de l'événement

ParamètreTapezObligatoireDescriptifExemple de valeur
événement_idChaîneOuiIdentifiant unique de l'événementévénement_123
tapezChaîneOuiType d'événementsession.update
horodatageEntierNonHorodatage de l'événement (millisecondes)1677649363000

Tableau des paramètres d'état de la session

ParamètreTapezDescriptifValeurs facultatives
statutChaîneStatut de la sessionactif, terminé, erreur
erreurObjetInformations sur les erreurs{"type": "error_type", "message": "error message"}
métadonnéesObjetMétadonnées de session{"client_id": "web", "session_type": "chat"}

Tableau des paramètres d'état des éléments de conversation

ParamètreTapezDescriptifValeurs facultatives
statutChaîneStatut de l'élément de conversationterminé, en cours, incomplet
rôleChaîneRôle de l'expéditeurutilisateur, assistant, système
tapezChaîneType d'élément de conversationmessage, appel_fonction, sortie_appel_fonction

Tableau des paramètres du type de contenu

ParamètreTapezDescriptifValeurs facultatives
tapezChaîneType de contenutexte, audio, transcription
formatsChaîneFormat du contenusimple, démarque, html
encodageChaîneMéthode d'encodageutf-8, base64

Tableau des paramètres d'état de la réponse

ParamètreTapezDescriptifValeurs facultatives
statutChaîneStatut de la réponseterminé, annulé, échoué, incomplet
statut_détailsObjetDétails du statut{"reason": "user_cancelled"}
utilisationObjetStatistiques d'utilisation{"total_tokens": 50, "input_tokens": 20, "output_tokens": 30}

Tableau des paramètres de transcription audio

ParamètreTapezDescriptifExemple de valeur
activéBooléenSi la transcription est activéevrai
modèleChaîneModèle de transcriptionmurmure-1
langueChaîneLangue de transcriptionfr, zh, auto
inviteChaîneInvite de transcription"Transcription d'une conversation"

Tableau des paramètres du flux audio

ParamètreTapezDescriptifValeurs facultatives
taille_morceauEntierTaille du morceau audio (octets)1024, 2048, 4096
latenceChaîneMode latencefaible, équilibré, élevé
compressionChaîneMéthode de compressionaucun, opus, mp3

Tableau des paramètres de configuration WebRTC

ParamètreTapezDescriptifValeur par défaut
serveurs_iceTableauListe des serveurs ICE[{"urls": "stun:stun.l.google.com:19302"}]
contraintes_audioObjetContraintes audio{"echoCancellation": true}
connexion_timeoutEntierDélai d'expiration de la connexion (millisecondes)30000

Sommaire

?? Aperçu
Introduction
Cas d'utilisation
Principales fonctionnalités
?? Authentification et sécurité
Méthodes d'authentification
Jeton éphémère
Recommandations de sécurité
?? Établissement de la connexion
Connexion WebRTC
Connexion WebSocket
Flux de connexion
Canal de données
Flux audio
?? Interactions conversationnelles
Modes de conversation
Gestion des sessions
Types d'événements
?? Options de configuration
Configuration audio
Configuration du modèle
Configuration du VAD
?? Exemples de demande
Connexion WebRTC ?
Implémentation client (navigateur)
Implémentation du serveur (Node.js)
Exemple d'envoi/réception d'événement WebRTC
Connexion WebSocket ?
Node.js (module ws)
Python (client websocket)
Navigateur (WebSocket standard)
Exemple d'envoi/réception de message
Node.js/Navigateur
?? Gestion des erreurs
Erreurs courantes
Récupération d'erreur
?? Référence d'événement
En-têtes de requête courants
Événements clients
session.mise à jour
input_audio_buffer.append
input_audio_buffer.commit
input_audio_buffer.clear
conversation.item.create
conversation.item.truncate
conversation.item.delete
réponse.create
réponse.annuler
Événements du serveur
erreur
conversation.item.input_audio_transcription.completed
conversation.item.input_audio_transcription.failed
conversation.item.truncated
conversation.item.deleted
input_audio_buffer.commis
input_audio_buffer.cleared
input_audio_buffer.speech_started
input_audio_buffer.speech_stopped
réponse.créée
réponse.done
réponse.output_item.ajouté
réponse.output_item.done
réponse.content_part.ajouté
réponse.content_part.done
réponse.text.delta
réponse.text.done
réponse.audio_transcript.delta
réponse.audio_transcript.done
réponse.audio.delta
réponse.audio.done
Appel de fonction
réponse.function_call_arguments.delta
réponse.function_call_arguments.done
Autres mises à jour de statut
rate_limits.mis à jour
conversation.créée
conversation.item.créé
session.créée
session.mise à jour
Tableau des paramètres d'événement de limite de débit
Tableau des paramètres d'appel de fonction
Tableau des paramètres du format audio
Tableau des paramètres de détection vocale
Tableau des paramètres de sélection d'outil
Tableau des paramètres de configuration du modèle
Tableau des paramètres communs de l'événement
Tableau des paramètres d'état de la session
Tableau des paramètres d'état des éléments de conversation
Tableau des paramètres du type de contenu
Tableau des paramètres d'état de la réponse
Tableau des paramètres de transcription audio
Tableau des paramètres du flux audio
Tableau des paramètres de configuration WebRTC