For the complete documentation index, see llms.txt. Markdown versions of documentation pages are available by appending .md to the page URL.
Navigation principale

Téléphonie et SIP

Choisissez une connexion SIP ou un pont audio applicatif pour les appels téléphoniques.

Choisissez l’API utilisée par votre application. Chaque API possède ses propres mécanismes d’authentification et de création de sessions, ainsi que son propre contrat d’événements.

Choisissez une connexion téléphonique

Un appel téléphonique peut atteindre GPT-Live via un trunk SIP ou une application qui relaie l’audio. Choisissez le mode de connexion adapté à votre système téléphonique existant et à l’endroit où votre application doit traiter l’audio.

ConnexionAudio et responsabilités de l’application
SIP directLe fournisseur échange l’audio de l’appel avec OpenAI. Votre application gère les webhooks, la configuration des sessions, les décisions concernant les appels et la logique métier.
Pont audio côté serveurVotre application relaie l’audio du fournisseur ou du salon vers GPT-Live via WebSocket. Elle gère les deux connexions, la conversion des événements, la lecture audio et le cycle de vie de l’appel.

La connexion du fournisseur à votre application et celle de votre application à OpenAI sont distinctes. Par exemple, un appelant peut rejoindre un salon via SIP tandis qu’un agent présent dans ce salon se connecte à GPT-Live via WebSocket.

Vous utilisez Twilio, Telnyx, LiveKit ou Daily/Pipecat ? Consultez les intégrations partenaires de GPT-Live pour accéder aux guides propres à chaque fournisseur.

SIP direct

Avec SIP direct, l’audio de l’appel reste sur le chemin média reliant le fournisseur à OpenAI. La signalisation SIP utilise TLS, et GPT-Live exige SRTP pour l’audio des appels. Votre backend reste responsable de la décision concernant l’appel entrant, de la configuration de la session, de l’autorisation et de la logique métier.

Utilisez une connexion auxiliaire lorsque votre backend doit recevoir des événements de session ou envoyer des commandes. Elle se rattache à la conversation existante pendant que SIP transporte l’audio. Attribuez un seul gestionnaire à chaque action afin que les livraisons de webhooks en double ou les événements observés sur plusieurs connexions ne déclenchent pas deux fois l’exécution des outils.

Conservez le routage SIP et la configuration du fournisseur avec l’intégration qui les utilise. Les événements webhook, les identifiants d’appel et les charges utiles d’acceptation de Realtime relèvent de la Realtime API ; utilisez le contrat GPT-Live pour une session Live.

Gérez le cycle de vie de l’appel

Vérifiez que la prise en charge de SIP dans GPT-Live est activée pour votre projet et que le trunk SIP de votre fournisseur est routé vers ce projet avant d’utiliser cette procédure. Les charges utiles des webhooks et d’acceptation de Realtime présentées dans l’autre onglet relèvent d’un autre contrat d’API.

Recevez l’appel entrant

Configurez le point de terminaison webhook de votre projet pour live.transport.incoming. Vérifiez la signature du webhook et dédupliquez les livraisons avant de prendre une décision concernant l’appel. Un accusé de réception du webhook ne vaut pas acceptation de l’appel.

Le webhook identifie un appel SIP par data.type: "sip" et fournit data.session_id. Utilisez cet identifiant de session sans le modifier pour chaque action sur l’appel Live. Traitez data.sip_headers comme des métadonnées non fiables provenant de l’appelant, et non comme une autorisation.

Les intégrations existantes peuvent encore recevoir l’événement obsolète live.call.incoming, qui ne comporte pas de champ data.type. Pendant la migration, gérez les deux noms et conservez l’ancien abonnement jusqu’à ce que toutes les livraisons et tentatives de renvoi de l’ancien événement soient terminées. Un même appel en attente peut aussi émettre un webhook Realtime ; confiez la décision d’accepter ou de rejeter l’appel à un seul gestionnaire plutôt que de l’accepter via les deux API.

Acceptez ou rejetez l’appel

Appliquez les règles d’autorisation et de routage de votre application. Pour accepter l’appel, envoyez une requête POST /v1/live/sessions/{session_id}/accept authentifiée avec un objet session à la racine :

{
  "session": {
    "type": "live",
    "model": "gpt-live-1",
    "instructions": "You are answering an inbound support call.",
    "audio": { "output": { "voice": "marin" } },
    "delegation": { "type": "client" }
  }
}

Utilisez Authorization: Bearer $OPENAI_API_KEY depuis votre backend de confiance pour les requêtes de contrôle des appels. Choisissez la voix et le mode de délégation au moment de l’acceptation. SIP négocie le format audio : omettez donc audio.format. L’exemple sélectionne la délégation au client ; votre backend doit prendre en charge le travail délégué. Consultez Délégation et outils pour les configurations client et Responses.

Une acceptation réussie renvoie 200 OK avec un corps vide après l’initialisation de la session. Gérez les erreurs HTTP avant de considérer l’appel comme accepté.

Pour rejeter l’appel, envoyez POST /v1/live/sessions/{session_id}/reject avec un code d’état SIP, par exemple { "status_code": 486 } pour indiquer que la ligne est occupée. Ce code doit être un entier compris entre 300 et 699 inclus. La première décision d’acceptation ou de rejet est retenue ; toute décision concurrente ultérieure renvoie decision_already_made.

Rattachez votre backend

Après l’acceptation, ouvrez une connexion WebSocket auxiliaire à l’adresse wss://api.openai.com/v1/live/sessions/{session_id}/attach. Utilisez l’identifiant de la session acceptée, ainsi que les mêmes informations d’authentification du projet et les mêmes en-têtes de connexion. N’envoyez pas de nouveau session.start.

SIP transporte l’audio de l’appel. Utilisez la connexion auxiliaire pour les transcriptions, la délégation, les outils, les commandes et l’audio retransmis. Désignez un seul responsable pour chaque effet de bord, même si plusieurs connexions observent un événement.

Observez les événements du clavier téléphonique

La connexion auxiliaire reçoit transport.dtmf.received lorsque l’appelant appuie sur une touche et transport.dtmf.send après qu’un outil hébergé a envoyé une tonalité avec succès. Le champ event de l’événement contient une valeur parmi 09, *, # ou AD.

Il s’agit de notifications d’observation, et non de commandes client. N’envoyez pas transport.dtmf.send pour demander une tonalité et ne supposez pas que le canal de données du navigateur reçoit les événements du clavier téléphonique.

Transférez l’appel ou mettez-y fin

Pour transférer l’appel, envoyez POST /v1/live/sessions/{session_id}/refer avec { "target_uri": "sip:agent@example.com" } pour indiquer la destination. Pour raccrocher, envoyez POST /v1/live/sessions/{session_id}/hangup sans corps de requête. Les deux opérations renvoient 200 OK avec un corps vide en cas de réussite.

Gardez votre connexion auxiliaire ouverte pour recevoir les derniers événements et les données d’utilisation avant de libérer les ressources de l’application. Une requête de raccrochage réussie ou une déconnexion inattendue ne remplace pas session.closed. Consultez Utilisation et fermeture en douceur pour en savoir plus sur la finalisation et les motifs de fermeture.

Cette procédure permet d’accepter les appels entrants. La création d’un appel SIP sortant via POST /v1/live/sessions n’est pas prise en charge ; utilisez l’intégration partenaire appropriée pour les appels sortants gérés par le fournisseur.

Ponts audio côté serveur

Utilisez la connexion WebSocket de GPT-Live lorsque votre application reçoit un flux audio d’un fournisseur de téléphonie ou d’un framework d’agents. L’application authentifie les deux connexions, convertit leurs enveloppes d’événements et relaie l’audio dans les deux sens.

GPT-Live prend en charge l’audio brut G.711 μ-law et A-law à 8 kHz via WebSocket. Lorsque le flux du fournisseur utilise le même codec, la même fréquence d’échantillonnage et le même nombre de canaux, votre application peut transmettre les octets audio bruts sans les convertir en PCM. Préservez l’ordre des données audio et utilisez le format de message requis par chaque connexion. Des formats audio identiques ne rendent pas les deux protocoles d’événements interchangeables.

Le pont est également responsable de l’audio qu’il met en file d’attente pour la lecture. Tenez compte de la mise en mémoire tampon chez le fournisseur, des interruptions et de la fin de l’appel dans la conception de votre application. Consultez Gestion des sessions pour le cycle de vie des sessions Live et Migrez vers GPT-Live pour les changements concernant les tours de parole et le contrôle de la lecture.

Conservez l’identifiant d’appel ou de salon du fournisseur avec l’identifiant de session OpenAI afin de pouvoir suivre une conversation dans les deux systèmes.

Prochaines étapes avec GPT-Live