Gestione degli eventi di output con l’API bidirezionale - Amazon Nova

Gestione degli eventi di output con l’API bidirezionale

Quando il modello Amazon Nova Sonic risponde, segue una sequenza di eventi strutturata. Il flusso inizia con un evento completionStart che contiene identificatori univoci come sessionId, promptName e completionId. Questi identificatori sono coerenti per tutto il ciclo di risposta e uniscono tutti gli eventi di risposta successivi.

Ogni tipo di risposta segue uno schema coerente in tre parti: contentStart definisce il tipo e il formato del contenuto, l’effettivo evento del contenuto e contentEnd chiude il segmento. Di norma, la risposta include più blocchi di contenuto in sequenza: riconoscimento vocale automatico (ASR), trascrizione (ciò che ha detto l’utente), uso opzionale di strumenti (quando sono necessarie informazioni esterne), risposta testuale (ciò che il modello intende dire) e risposta audio (l’output vocale).

La trascrizione ASR viene visualizzata per prima e consente al modello di comprendere il discorso dell’utente con role: "USER" e "additionalModelFields": "{\"generationStage\":\"FINAL\"}" nel contentStart. Quando il modello ha bisogno di dati esterni, invia eventi relativi allo strumento con nomi e parametri specifici degli strumenti. La risposta testuale fornisce un’anteprima del contenuto vocale pianificato con role: "ASSISTANT" e "additionalModelFields": "{\"generationStage\":\"SPECULATIVE\"}". La risposta audio fornisce quindi blocchi vocali codificati in base 64 che condividono lo stesso contentId durante lo streaming.

Durante la generazione audio, Amazon Nova Sonic supporta un flusso di conversazione naturale tramite la sua funzionalità di barge-in. Quando un utente interrompe Amazon Nova Sonic mentre sta parlando, Nova Sonic interrompe immediatamente la generazione vocale, passa alla modalità di ascolto e invia una notifica di contenuto in cui si indica che è avvenuta un’interruzione. Poiché Nova Sonic funziona più velocemente rispetto al tempo reale, parte dell’audio potrebbe essere già stata trasmessa ma non ancora riprodotta. La notifica dell’interruzione consente all’applicazione client di cancellare la coda audio e interrompere immediatamente la riproduzione, creando un’esperienza di conversazione reattiva.

Una volta completata la generazione audio (o interrotta tramite barge-in), Amazon Nova Sonic fornisce una risposta testuale aggiuntiva che contiene una trascrizione a livello di frase di ciò che è stato effettivamente pronunciato. Questa risposta testuale include un evento contentStart con role: "ASSISTANT" e "additionalModelFields": "{\"generationStage\":\"FINAL\"}".

Durante la gestione della risposta, vengono inviati eventi usageEvent per monitorare il consumo di token. Questi eventi contengono metriche dettagliate sui token di input e output (sia vocali che testuali) e i relativi totali cumulativi. Ciascun usageEvent mantiene gli stessi eventi sessionId, promptName e completionId degli altri eventi nel flusso di conversazione. La sezione dei dettagli fornisce sia le modifiche incrementali (delta) che i totali attuali dell’utilizzo dei token, consentendo un monitoraggio preciso dell’utilizzo durante la conversazione.

Il modello invia un evento completionEnd con gli identificatori originali e un stopReason che indica come è terminata la conversazione. Questa gerarchia di eventi garantisce che l’applicazione possa monitorare quali parti della risposta vanno combinate tra loro e le elabora di conseguenza, mantenendo il contesto della conversazione per più turni.

Il flusso di eventi di output inizia entrando nella fase di generazione della risposta. Parte dal riconoscimento vocale automatico, seleziona uno strumento da utilizzare, trascrive il contenuto vocale, genera audio, finalizza la trascrizione e termina la sessione.

Diagramma che spiega il flusso di eventi di output di Amazon Nova Sonic.

Flusso di eventi di output

La struttura del flusso di eventi di output è descritta in questa sezione.

  1. 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 } }
  2. CompleteStartEvent

    "event": { "completionStart": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier } }
  3. 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" } }
  4. ToolUse

    1. 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" } } }
    2. 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" } }
    3. 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" } }
  5. AudioOutputContent

    1. 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 } } }
    2. 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 } }
    3. 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" } }
  6. CompletionEndEvent

    "event": { "completionEnd": { "sessionId": "string", // unique identifier "promptName": "string", // same unique identifier from promptStart event "completionId": "string", // unique identifier "stopReason": "END_TURN" } }