Processamento de eventos de saída com a API bidirecional
Quando o modelo Amazon Nova Sonic responde, ele segue uma sequência estruturada de eventos. O fluxo começa com um evento completionStart
que contém identificadores exclusivos, como sessionId
, promptName
e completionId
. Esses identificadores são consistentes em todo o ciclo de resposta e unem todos os eventos de resposta subsequentes.
Cada tipo de resposta segue um padrão consistente de três partes: contentStart
define o tipo e o formato do conteúdo, o evento real do conteúdo e contentEnd
conclui esse segmento. A resposta normalmente inclui vários blocos de conteúdo em sequência: transcrição do reconhecimento automático de fala (ASR) (o que o usuário disse), uso opcional de ferramentas (quando informações externas são necessárias), resposta de texto (o que o modelo planeja dizer) e resposta de áudio (a saída falada).
A transcrição do ASR aparece primeiro, fornecendo a compreensão do modelo sobre a fala do usuário com role: "USER"
e "additionalModelFields":
"{\"generationStage\":\"FINAL\"}"
no contentStart
. Quando o modelo precisa de dados externos, ele envia eventos relacionados à ferramenta com nomes e parâmetros específicos da ferramenta. A resposta de texto fornece uma prévia do discurso planejado com role:
"ASSISTANT"
e "additionalModelFields":
"{\"generationStage\":\"SPECULATIVE\"}"
. A resposta de áudio então fornece trechos de fala codificados no Base64 que compartilham o mesmo contentId
em todo o streaming.
Durante a geração de áudio, o Amazon Nova Sonic é compatível com o fluxo natural de conversação por meio de seu recurso de barge-in. Quando um usuário interrompe o Amazon Nova Sonic enquanto ele está falando, o Nova Sonic imediatamente para de gerar fala, muda para o modo de escuta e envia uma notificação de conteúdo indicando que a interrupção ocorreu. Como o Nova Sonic opera mais rápido do que em tempo real, o áudio pode já ter sido entregue, mas ainda não foi reproduzido. A notificação de interrupção permite que a aplicação cliente limpe sua fila de áudios e interrompa a reprodução imediatamente, criando uma experiência conversacional responsiva.
Depois que a geração de áudio é concluída (ou interrompida via barge-in), o Amazon Nova Sonic fornece uma resposta de texto adicional que contém uma transcrição em nível de frase do que foi realmente falado. Essa resposta de texto inclui um evento contentStart
com role:
"ASSISTANT"
e "additionalModelFields":
"{\"generationStage\":\"FINAL\"}"
.
Durante todo o tratamento da resposta, eventos usageEvent
são enviados para rastrear o consumo de tokens. Esses eventos contêm métricas detalhadas para tokens de entrada e de saída (tanto de fala quanto de texto) e seus totais acumulados. Cada usageEvent
mantém o mesmo sessionId
, promptName
e completionId
que outros eventos no fluxo da conversa. A seção de detalhes fornece as alterações incrementais (delta) e os totais acumulados do uso de tokens, permitindo o monitoramento preciso do uso durante a conversa.
O modelo envia um evento completionEnd
com os identificadores originais e um stopReason
que indica como a conversa terminou. Essa hierarquia de eventos garante que a aplicação possa rastrear quais partes da resposta estão associadas e processá-las adequadamente, mantendo o contexto em vários turnos.
O fluxo de eventos de saída começa entrando na fase de geração de resposta. Ele começa com o reconhecimento automático de fala, seleciona uma ferramenta para uso, transcreve a fala, gera áudio, finaliza a transcrição e encerra a sessão.

Fluxo de eventos de saída
A estrutura do fluxo de eventos de saída é fornecida nesta seção.
-
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" } }