Gestión de eventos de salida con la API bidireccional - Amazon Nova

Gestión de eventos de salida con la API bidireccional

Cuando el modelo Amazon Nova Sonic responde, sigue una secuencia de eventos estructurada. El flujo comienza con un evento completionStart que contiene identificadores únicos, como sessionId, promptName y completionId. Estos identificadores son coherentes a lo largo del ciclo de respuesta y unen todos los eventos de respuesta posteriores.

Cada tipo de respuesta sigue un patrón coherente de tres partes: contentStart define el tipo y el formato del contenido, el evento de contenido real, y contentEnd cierra ese segmento. La respuesta suele incluir varios bloques de contenido en secuencia: transcripción de reconocimiento automático de voz (ASR) (lo que dice el usuario), uso de herramientas opcional (cuando se necesita información externa), respuesta en texto (lo que el modelo planea decir) y respuesta en audio (la salida hablada).

La transcripción de ASR aparece primero, haciendo que el modelo comprenda la voz del usuario con role: "USER" y "additionalModelFields": "{\"generationStage\":\"FINAL\"}" en el contentStart. Cuando el modelo necesita datos externos, envía eventos relacionados con herramientas con nombres y parámetros específicos de las herramientas. La respuesta en texto proporciona una vista previa del habla planificada con role: "ASSISTANT" y "additionalModelFields": "{\"generationStage\":\"SPECULATIVE\"}". A continuación, la respuesta en audio entrega fragmentos de voz codificados en base64 que comparten los mismos contentId a lo largo de la transmisión.

Durante la generación de audio, Amazon Nova Sonic permite un flujo de conversación natural a través de su capacidad de interrupción. Cuando un usuario interrumpe a Amazon Nova Sonic mientras está hablando, Nova Sonic deja de generar voz inmediatamente, pasa al modo de escucha y envía una notificación de contenido que indica que se ha producido una interrupción. Como Nova Sonic funciona más rápido que en tiempo real, es posible que parte del audio ya se haya entregado, pero aún no se haya reproducido. La notificación de interrupción permite que la aplicación del cliente borre la cola de audio y detenga la reproducción inmediatamente para crear una experiencia de conversación receptiva.

Una vez finalizada la generación del audio (o interrumpida), Amazon Nova Sonic proporciona una respuesta en texto adicional que contiene una transcripción a nivel de frase de lo que realmente se ha dicho. Esta respuesta en texto incluye un evento contentStart con role: "ASSISTANT" y "additionalModelFields": "{\"generationStage\":\"FINAL\"}".

Durante la gestión de las respuestas, se envían eventos de usageEvent para rastrear el consumo de tokens. Estos eventos contienen métricas detalladas sobre los tokens de entrada y de salida (tanto de voz como de texto) y de sus totales acumulados. Cada usageEvent mantiene el mismo sessionId, promptName y el mismo completionId que otros eventos en el flujo de la conversación. En la sección de detalles se proporcionan tanto los cambios incrementales (delta) como los totales acumulados del uso de tokens, lo que permite un seguimiento preciso del uso durante la conversación.

El modelo envía un evento completionEnd con los identificadores originales y un stopReason que indica cómo terminó la conversación. Esta jerarquía de eventos garantiza que la aplicación pueda rastrear qué partes de la respuesta deben estar juntas y procesarlas en consecuencia, manteniendo el contexto de la conversación a lo largo de múltiples turnos.

El flujo de eventos de salida comienza al entrar en la fase de generación de respuestas. Comienza con el reconocimiento automático de voz, selecciona una herramienta para utilizarla, transcribe la voz, genera audio, finaliza la transcripción y termina la sesión.

Diagrama que explica el flujo de eventos de salida de Amazon Nova Sonic.

Flujo de eventos de salida

En esta sección, se describe la estructura del flujo de eventos de salida.

  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" } }