À retenir
- Symptôme : le microphone se reconnecte, mais la conversation, l’appel d’outil ou l’état métier reste bloqué.
- Solution la plus rapide : ne renvoyez pas tout l’audio ; sauvegardez séparément le flux, la session, les appels d’outils non terminés et la progression visible, puis confirmez chaque état avant de reprendre.
- Cet article s’adresse aux développeurs qui ont déjà branché un flux vocal GPT-Live-1, mais perdent la continuité après une coupure réseau.
- Il vise aussi les ingénieurs produit qui relient un Agent vocal en temps réel à un CRM, un système de notification ou une opération sensible, ainsi que les équipes qui exécutent ce service dans un espace distant où un redémarrage de processus doit être prévisible.
Symptôme : le microphone se reconnecte, mais la conversation, l’appel d’outil ou l’état métier reste bloqué. Solution la plus rapide : ne renvoyez pas tout l’audio ; sauvegardez séparément le flux, la session, les appels d’outils non terminés et la progression visible, puis confirmez chaque état avant de reprendre.
Cet article s’adresse aux développeurs qui ont déjà branché un flux vocal GPT-Live-1, mais perdent la continuité après une coupure réseau. Il vise aussi les ingénieurs produit qui relient un Agent vocal en temps réel à un CRM, un système de notification ou une opération sensible, ainsi que les équipes qui exécutent ce service dans un espace distant où un redémarrage de processus doit être prévisible.
Pourquoi une reconnexion audio ne rétablit-elle pas la conversation ?
Un Agent vocal ne repose pas sur un seul état. Au minimum, vous devez distinguer quatre couches :
- le flux audio, avec les segments capturés, envoyés, confirmés ou encore présents dans le tampon local ;
- la session modèle, qui contient les instructions, le contexte conversationnel et les événements reçus du service temps réel ;
- la transaction d’outil, qui peut être demandée par le modèle sans que votre application ait reçu, exécuté ou confirmé l’appel ;
- l’interface et l’état métier, par exemple « réservation en cours », « notification envoyée » ou « validation humaine requise ».
Cette séparation répond à un piège fréquent : une nouvelle connexion WebSocket peut être ouverte alors que l’ancienne session continue d’exister côté serveur, ou qu’une action métier est déjà partie vers votre système. Renvoyer les mêmes échantillons audio dans ce contexte peut produire une répétition de la demande, tandis que relancer aveuglément un outil peut créer une double écriture ou une double notification.
La documentation officielle de présentation de GPT-Live-1 présente ce modèle comme destiné aux interactions vocales en temps réel. Elle ne constitue toutefois pas une garantie générale de reprise automatique après une coupure. Les comportements de reconnexion, la conservation d’un contexte et la répétition d’un appel d’outil doivent donc être définis dans votre propre architecture, puis vérifiés par injection de panne. Vous pouvez commencer par comparer cette approche avec votre intégration initiale dans notre guide sur le développement de GPT-Live-1 en API, sans confondre l’envoi continu d’audio avec la restauration d’une session.
Les quatre symptômes ne doivent pas être traités de la même manière. Après un changement de réseau dans le navigateur, le microphone peut continuer à produire des données alors que le canal d’envoi est fermé. Après une modification de permission, aucun son ne peut plus être capturé, même si la connexion au serveur paraît saine. Après la mise en veille d’un onglet, les minuteurs, les tampons et les événements reçus peuvent être retardés. Enfin, un redémarrage du processus serveur peut supprimer la mémoire locale de votre orchestrateur sans interrompre nécessairement les systèmes métier déjà sollicités.
Le critère de réussite n’est donc pas « la pastille de connexion est redevenue verte ». Il faut pouvoir répondre à quatre questions :
- Quel est le dernier segment audio confirmé ?
- Quelle session et quelle version du contexte sont actives ?
- Quel outil est en attente, terminé, rejeté ou inconnu ?
- Que voyez-vous à l’écran et que pouvez-vous expliquer à l’utilisateur ?
Première étape : rendre le flux audio rejouable sans créer d’écho
Au niveau client, attribuez un identifiant monotone à chaque fragment audio envoyé. Cet identifiant ne doit pas être confondu avec l’identifiant d’événement fourni par le canal réseau : il représente votre propre ordre logique. Conservez également la durée ou la taille du fragment, le moment de création, son statut d’envoi et l’accusé de réception associé.
Un tampon minimal peut suivre cette logique :
segment_id
session_id
contenu_audio_temporaire
statut : créé | envoyé | confirmé | abandonné
Lorsque la connexion tombe, le client ne doit pas renvoyer indistinctement tout ce qui se trouve en mémoire. Les segments confirmés sont normalement retirés du tampon de reprise. Les segments envoyés mais non confirmés restent « incertains » : vous pouvez les conserver pour diagnostic, mais leur rejeu doit dépendre de la possibilité de dédupliquer côté serveur. Les segments capturés mais jamais envoyés peuvent être abandonnés si leur contenu est devenu obsolète ou si leur interprétation risquerait de répéter une instruction.
Cette règle est particulièrement importante dans un dialogue audio : un fragment conservé quelques instants peut contenir la fin d’une phrase, mais aussi une commande déjà interprétée avant la coupure. Sans identifiant et sans frontière claire entre « envoyé » et « confirmé », vous ne saurez pas si vous reprenez une phrase interrompue ou si vous demandez au modèle de l’entendre une seconde fois.
Le navigateur impose aussi des préconditions concrètes. L’accès au microphone doit être demandé dans un contexte sécurisé, généralement avec HTTPS ou depuis localhost, et l’utilisateur doit avoir accordé la permission correspondante. Ces exigences sont rappelées dans le guide officiel de l’API Live. Une reconnexion réseau ne répare donc pas une permission retirée, une piste audio supprimée ou un périphérique débranché.
Au retour du réseau, exécutez cette séquence :
- interrompez l’envoi des nouveaux fragments ;
- identifiez la connexion et la session actuellement connues ;
- demandez l’état de reprise à votre serveur ;
- marquez les fragments confirmés comme terminés ;
- ne rejouez que les segments dont la déduplication est garantie ;
- reprenez la capture après affichage d’un état cohérent à l’utilisateur.
Pour un produit audio ou vidéo, prévoyez aussi un état « microphone indisponible » distinct de « session en reconnexion ». L’utilisateur doit savoir s’il doit réautoriser le microphone, sélectionner une autre entrée ou simplement patienter pendant la restauration du canal.
GPT-Live-1 API peut-il continuer la session après une coupure ? Oui, votre application peut tenter de restaurer la continuité, mais vous ne devez pas présenter cette reprise comme une propriété automatique du modèle. La méthode fiable consiste à conserver votre propre identifiant de session, un résumé contrôlé du contexte et la liste des événements nécessaires à la reprise, puis à vérifier ce que le serveur et le modèle connaissent encore. Le guide officiel de gestion des conversations Live doit être utilisé comme référence lorsque les événements ou les mécanismes de session évoluent.
Deuxième étape : reconstruire le contexte sans recréer une conversation fantôme
Stockez séparément les éléments suivants :
- l’identifiant interne de l’appel ou de la session utilisateur ;
- les instructions système et leur version ;
- le résumé des intentions déjà exprimées ;
- les derniers résultats d’outils confirmés ;
- les opérations encore ouvertes ;
- l’état visible par l’utilisateur ;
- l’horodatage de la dernière confirmation reçue.
Ne faites pas de l’historique audio brut votre seule sauvegarde. Il peut être volumineux, incomplet ou impossible à rejouer sans ambiguïté. Un résumé structuré est plus utile lors de la reprise : « l’utilisateur demande une modification de réservation ; aucune écriture n’a été confirmée ; une validation humaine est requise ». Ce résumé doit rester distinct de la réponse naturelle prononcée par l’Agent vocal, car le texte destiné à l’utilisateur ne possède pas toujours la précision nécessaire à l’orchestrateur.
À la reconnexion, le serveur doit retourner un état versionné. Si le client possède la version 12 et que le serveur répond avec la version 13, il peut récupérer les événements manquants. Si les versions sont incompatibles ou si l’état est inconnu, ne fabriquez pas une continuité artificielle : annoncez une reprise contrôlée, rechargez le résumé validé et demandez confirmation avant toute action sensible.
Deux situations méritent une stratégie de dégradation :
- contexte expiré ou introuvable : créez une nouvelle session en transmettant uniquement le résumé validé, jamais un tampon audio indéterminé ;
- double connexion du même client : élisez une connexion active grâce à un identifiant de génération ou à un bail court, puis refusez les événements tardifs de l’ancienne connexion.
Le guide officiel de délégation Live est pertinent lorsque plusieurs composants se répartissent la capture, l’orchestration ou l’exécution d’actions. Dans ce cas, chaque composant doit savoir qui possède l’autorité pour confirmer une étape ; sinon une reconnexion peut faire croire à deux agents distincts qu’ils peuvent poursuivre le même travail.
Troisième étape : empêcher un outil de s’exécuter deux fois
La couche outil est souvent plus dangereuse que la couche audio. Une phrase répétée est gênante ; une écriture, un paiement ou une notification répétée peut devenir un incident.
Attribuez à chaque appel d’outil une clé d’idempotence générée avant l’exécution, par exemple à partir de l’identifiant de session, de l’intention logique et de la version de l’opération. La clé doit rester la même lors d’une reconnexion. Votre service métier doit enregistrer au moins :
tool_call_id
idempotency_key
statut : demandé | en cours | confirmé | échoué | inconnu
résultat ou référence métier
moment de dernière mise à jour
Traitez ensuite les branches ambiguës avec prudence.
Le modèle a demandé l’outil, mais le client n’a jamais reçu le résultat : le serveur doit consulter le registre d’idempotence avant de relancer quoi que ce soit. Si l’opération est confirmée, retournez le résultat enregistré. Si elle est encore en cours, suivez-la. Si son état est inconnu, bloquez la répétition automatique pour une action à impact élevé.
Le client a reçu le résultat, mais le système métier n’a pas confirmé l’écriture : affichez un état intermédiaire et lancez une vérification côté serveur. Ne dites pas « c’est terminé » uniquement parce qu’un événement a atteint le navigateur.
Les opérations de lecture peuvent généralement être rejouées si elles sont conçues comme telles, sous réserve que les données soient cohérentes. Une mise à jour, l’envoi d’un message ou une action financière doit être protégée par une clé stable. Pour une réservation, une commande ou une notification à plusieurs destinataires, ajoutez une confirmation humaine lorsque l’état final ne peut pas être établi.
Un Agent vocal en temps réel peut-il répéter un outil après reconnexion ? Il le peut si votre orchestrateur lui renvoie une demande ambiguë ou si votre système ne reconnaît pas la clé d’idempotence. Ce risque ne se résout pas avec un simple message « ne pas répéter ». Il faut une base d’exécution consultable, un statut explicite et une règle de récupération qui distingue « jamais lancé », « lancé mais inconnu » et « confirmé ».
Les instructions vocales doivent également annoncer les états intermédiaires sans révéler de détails internes : « Je vérifie si la demande a été enregistrée avant de la relancer. » Les recommandations de conception des invites Live peuvent aider à encadrer le comportement conversationnel, mais elles ne remplacent pas l’idempotence du système métier.
Quatrième étape : traiter le navigateur en arrière-plan et le redémarrage serveur
Pourquoi un navigateur placé en arrière-plan peut-il ne plus produire de son ? Un onglet suspendu peut retarder les tâches JavaScript, interrompre une piste, perdre la permission d’un périphérique ou empêcher la lecture automatique. Il faut donc distinguer « aucun paquet audio n’arrive » de « le serveur n’est plus joignable ».
À chaque changement de visibilité, d’état de piste ou de périphérique, journalisez une transition explicite. À la reprise de l’onglet, vérifiez :
- si la piste microphone existe encore ;
- si elle est active et possède le bon périphérique ;
- si la permission est toujours accordée ;
- si le dernier fragment porte un numéro cohérent ;
- si une nouvelle connexion est déjà ouverte.
Pour un processus serveur redémarré, externalisez les éléments indispensables : registre des sessions, résumés, appels d’outils et journaux structurés. La mémoire du processus ne doit conserver que des données temporaires. Si vous exécutez l’intégration dans un environnement distant, séparez les secrets d’API, les fichiers de diagnostic et les données de session ; le redémarrage doit pouvoir restaurer l’état sans exposer les informations confidentielles.
Un journal utile contient l’identifiant de session interne, le numéro du segment audio, l’identifiant d’appel d’outil, la transition d’état et la cause de la reconnexion. Évitez d’enregistrer systématiquement l’audio brut ou les données personnelles de la conversation : conservez seulement ce qui est nécessaire pour diagnostiquer la reprise.
Cinquième étape : valider la reprise avec une matrice d’injection de panne
Ne testez pas uniquement un appel vocal qui se déroule normalement. Exécutez chaque scénario pendant une phrase, pendant une réponse du modèle et au moment précis où un outil est en cours.
- [ ] Couper puis rétablir le réseau du navigateur sans fermer la page.
- [ ] Passer l’onglet en arrière-plan, puis vérifier la piste microphone et la sortie audio.
- [ ] Retirer puis réaccorder la permission du microphone.
- [ ] Débrancher le périphérique audio et sélectionner une nouvelle entrée.
- [ ] Redémarrer le processus serveur pendant une session active.
- [ ] Interrompre la connexion modèle après une demande d’outil.
- [ ] Faire expirer un appel d’outil avant de reconnecter le client.
- [ ] Envoyer un événement tardif depuis l’ancienne connexion.
- [ ] Vérifier qu’une opération confirmée n’est jamais exécutée une seconde fois.
- [ ] Afficher à l’utilisateur un état compréhensible lorsque l’issue reste inconnue.
- [ ] Permettre à un opérateur humain de reprendre la conversation.
Pour chaque essai, mesurez les transitions plutôt qu’une prétendue performance générale : dernier segment confirmé, temps jusqu’à l’état connu, session restaurée ou recréée, outil récupéré ou bloqué, et présence d’une action en double. Ces résultats sont vos données de décision ; ils ne doivent pas être remplacés par une promesse de faible latence ou de conversation naturelle.
La validation doit aussi couvrir les erreurs d’observation. Un tableau de bord qui affiche « connecté » alors que le microphone est muet est trompeur. Utilisez des états indépendants : capture audio, canal réseau, session modèle, outil métier et interface. Le support peut alors identifier la couche réellement défaillante au lieu de redémarrer toute l’application.
| Situation | Décision de reprise | Données à conserver | Action interdite |
|---|---|---|---|
| Flux audio interrompu, session connue | Reprendre après vérification du numéro de segment | Tampon non confirmé et identifiant de session | Renvoyer tout l’historique audio |
| Session introuvable ou expirée | Créer une session avec résumé validé | Résumé, instructions versionnées, résultats confirmés | Présenter la nouvelle session comme une continuité certaine |
| Outil de lecture interrompu | Vérifier puis rejouer si la lecture est sûre | Clé d’idempotence et résultat | Multiplier les appels sans déduplication |
| Écriture ou notification à l’état inconnu | Bloquer et demander confirmation ou intervention | Registre métier et statut inconnu | Déclencher automatiquement une seconde écriture |
| Processus serveur redémarré | Restaurer depuis le stockage externe | Sessions, résumés, opérations ouvertes | Dépendre uniquement de la mémoire du processus |
Quelle solution choisir pour un service vocal durable ?
Un poste local convient pour développer le flux, simuler une permission microphone et reproduire rapidement une coupure. Il devient moins adapté lorsque la session doit survivre à la fermeture d’un terminal, à un redémarrage ou à l’absence du développeur. Un environnement distant apporte une exécution persistante et une séparation plus claire des secrets, mais il ne dispense pas de concevoir le registre de reprise, les journaux et l’accès audio du navigateur.
| Option | Atouts | Limites à vérifier avant décision |
|---|---|---|
| Poste local | Diagnostic direct du microphone et du navigateur | Processus interrompu par la veille, la fermeture ou les changements de réseau |
| Instance distante dédiée | Service disponible indépendamment du poste de développement | Périphériques audio, accès sécurisé et observabilité à configurer |
| Environnement temporaire | Adapté aux essais de reconnexion et aux démonstrations | Peu pertinent pour une charge stable ou une transaction métier durable |
| Déploiement avec stockage d’état externe | Reprise plus contrôlable après redémarrage | Architecture plus exigeante : registre, secrets, journaux et procédures d’escalade |
Si votre solution actuelle repose sur une seule connexion WebSocket, une mémoire locale et des relances sans clé d’idempotence, elle présente trois faiblesses concrètes : les événements tardifs peuvent être acceptés, les outils peuvent être exécutés deux fois et le redémarrage du processus peut effacer la seule copie du contexte. Pour un prototype court, cela peut suffire ; pour un service vocal relié à des données ou à des notifications, un environnement distant géré par kvmboot peut offrir une base plus appropriée pour conserver le processus, isoler les identifiants et organiser les tests de panne. Vous pouvez examiner les conditions d’un environnement de développement distant ou contacter l’assistance kvmboot avant de choisir une formule.
La décision ne doit toutefois pas être automatique. Si vous avez besoin d’un périphérique physique spécifique, d’un contrôle local permanent ou d’une charge lourde et stable, l’achat et l’exploitation d’une machine dédiée peuvent rester plus rationnels. En revanche, pour un prototype de GPT-Live-1, une campagne de tests de reprise ou un service vocal temporaire nécessitant un espace de développement accessible à distance, la location d’un Mac chez kvmboot évite de faire dépendre toute la continuité du poste personnel d’un seul développeur. Commencez par appliquer la checklist à une session sans impact métier, puis augmentez progressivement le périmètre après avoir prouvé la reprise audio, la restauration du contexte et l’absence de double exécution.
Développez et testez votre Agent vocal sur un Mac cloud fiable
Avec kvmboot, vous disposez d’un Mac distant accessible à la demande pour développer, tester et déployer vos applications vocales.
Concevoir une mémoire d’agent robuste pour préserver le contexte et l’état après une reconnexion · Rappels, idempotence et validation humaine pour sécuriser la reprise d’exécution des agents