Gestion des événements de sortie avec l’API bidirectionnelle
Lorsque le modèle Amazon Nova Sonic répond, il suit une séquence d’événements structurée. Le flux commence par un événement completionStart qui contient des identifiants uniques tels que sessionId, promptName et completionId. Ces identifiants sont cohérents tout au long du cycle de réponse et relient tous les événements de réponse suivants.
Chaque type de réponse suit un modèle cohérent en trois parties : contentStart définit le type et le format du contenu, l’événement de contenu réel, et contentEnd clôt ce segment. La réponse comprend généralement plusieurs blocs de contenu en séquence : transcription par reconnaissance vocale automatique (ASR) (ce que l’utilisateur a dit), utilisation facultative d’un outil (lorsque des informations externes sont nécessaires), réponse textuelle (ce que le modèle prévoit de dire) et réponse audio (la sortie vocale).
La transcription ASR apparaît en premier, fournissant la compréhension du modèle de la parole de l’utilisateur avec role: "USER" et "additionalModelFields":
"{\"generationStage\":\"FINAL\"}" dans le contentStart. Lorsque le modèle a besoin de données externes, il envoie des événements liés à des outils avec des noms et des paramètres d’outils spécifiques. La réponse textuelle fournit un aperçu de la parole prévue avec role:
"ASSISTANT" et "additionalModelFields":
"{\"generationStage\":\"SPECULATIVE\"}". La réponse audio fournit ensuite des segments de parole encodés en base64 partageant le même contentId tout au long du flux.
Pendant la génération audio, Amazon Nova Sonic prend en charge le flux naturel de la conversation grâce à sa fonctionnalité d’interruption. Lorsqu’un utilisateur interrompt Amazon Nova Sonic pendant qu’il parle, Nova Sonic arrête immédiatement de générer la parole, passe en mode écoute et envoie une notification de contenu indiquant que l’interruption s’est produite. Comme Nova Sonic fonctionne plus rapidement qu’en temps réel, certains éléments audio peuvent avoir déjà été transmis mais ne pas avoir encore été lus. La notification d’interruption permet à l’application cliente d’effacer sa file d’attente audio et d’arrêter immédiatement la lecture, créant ainsi une expérience conversationnelle réactive.
Une fois la génération audio terminée (ou interrompue via l’interruption), Amazon Nova Sonic fournit une réponse textuelle supplémentaire qui contient une transcription au niveau de la phrase de ce qui a été réellement dit. Cette réponse textuelle comprend un événement contentStart avec role:
"ASSISTANT" et "additionalModelFields":
"{\"generationStage\":\"FINAL\"}".
Tout au long du traitement de la réponse, des événements usageEvent sont envoyés pour suivre la consommation de jetons. Ces événements contiennent des métriques détaillées sur les jetons d’entrée et de sortie (voix et texte), ainsi que leurs totaux cumulés. Chaque usageEvent conserve les mêmes sessionId, promptName et completionId que les autres événements du flux de conversation. La section des détails fournit à la fois les changements incrémentiels (delta) et les totaux cumulés de l’utilisation des jetons, ce qui permet un suivi précis de l’utilisation pendant la conversation.
Le modèle envoie un événement completionEnd avec les identifiants d’origine et un stopReason qui indique comment la conversation s’est terminée. Cette hiérarchie d’événements garantit que votre application peut suivre les parties de la réponse qui vont ensemble et les traiter en conséquence, en conservant le contexte de la conversation tout au long des multiples tours.
Le flux d’événements de sortie commence par entrer dans la phase de génération de réponse. Il commence par la reconnaissance vocale automatique, sélectionne un outil à utiliser, transcrit la parole, génère l’audio, finalise la transcription et termine la session.
Flux d’événements de sortie
La structure du flux d’événements de sortie est décrite dans cette section.
-
UsageEvent"event": { "usageEvent": { "completionId": "string", // unique identifier for completion "details": { "delta": { // incremental changes since last event "input": { "speechTokens": number, // input speech tokens "textTokens": number // input text tokens }, "output": { "speechTokens": number, // speech tokens generated "textTokens": number // text tokens generated } }, "total": { // cumulative counts "input": { "speechTokens": number, // total speech tokens processed "textTokens": number // total text tokens processed }, "output": { "speechTokens": number, // total speech tokens generated "textTokens": number // total text tokens generated } } }, "promptName": "string", // same unique identifier from promptStart event "sessionId": "string", // unique identifier "totalInputTokens": number, // cumulative input tokens "totalOutputTokens": number, // cumulative output tokens "totalTokens": number // total tokens in the session } } -
CompleteStartEvent"event": { "completionStart": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier } } -
TextOutputContent-
ContentStart"event": { "contentStart": { "additionalModelFields": "{\"generationStage\":\"FINAL\"}" | "{\"generationStage\":\"SPECULATIVE\"}", "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "contentId": "string", // unique identifier for the content block "type": "TEXT", "role": "USER" | "ASSISTANT", "textOutputConfiguration": { "mediaType": "text/plain" } } } -
TextOutput"event": { "textOutput": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "contentId": "string", // same unique identifier from its contentStart "content": "string" // User transcribe or Text Response } } -
ContentEnd"event": { "contentEnd": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "contentId": "string", // same unique identifier from its contentStart "stopReason": "PARTIAL_TURN" | "END_TURN" | "INTERRUPTED", "type": "TEXT" } }
-
-
ToolUse-
ContentStart"event": { "contentStart": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "contentId": "string", // unique identifier for the content block "type": "TOOL", "role": "TOOL", "toolUseOutputConfiguration": { "mediaType": "application/json" } } } -
ToolUse"event": { "toolUse": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "contentId": "string", // same unique identifier from its contentStart "content": "json", "toolName": "string", "toolUseId": "string" } } -
ContentEnd"event": { "contentEnd": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "contentId": "string", // same unique identifier from its contentStart "stopReason": "TOOL_USE", "type": "TOOL" } }
-
-
AudioOutputContent-
ContentStart"event": { "contentStart": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "contentId": "string", // unique identifier for the content block "type": "AUDIO", "role": "ASSISTANT", "audioOutputConfiguration": { "mediaType": "audio/lpcm", "sampleRateHertz": 8000 | 16000 | 24000, "sampleSizeBits": 16, "encoding": "base64", "channelCount": 1 } } } -
AudioOutput"event": { "audioOutput": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "contentId": "string", // same unique identifier from its contentStart "content": "base64EncodedAudioData", // Audio } } -
ContentEnd"event": { "contentEnd": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "contentId": "string", // same unique identifier from its contentStart "stopReason": "PARTIAL_TURN" | "END_TURN", "type": "AUDIO" } }
-
-
CompletionEndEvent"event": { "completionEnd": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "stopReason": "END_TURN" } }