Ausgabeereignisse mit der bidirektionalen API behandeln - Amazon Nova

Ausgabeereignisse mit der bidirektionalen API behandeln

Wenn das Amazon-Nova-Sonic-Modell antwortet, folgt es einer strukturierten Ereignissequenz. Der Ablauf beginnt mit einem completionStart-Ereignis, das eindeutige Identifikatoren wie sessionId, promptName und completionId enthält. Diese Identifikatoren sind während des gesamten Antwortzyklus konsistent und vereinen alle nachfolgenden Reaktionsereignisse.

Jeder Antworttyp folgt einem konsistenten dreiteiligen Muster: contentStart definiert den Inhaltstyp und das Format, das eigentliche Inhaltsereignis und contentEnd schließt dieses Segment. Die Antwort umfasst in der Regel mehrere aufeinanderfolgende Inhaltsblöcke: Transkription mittels automatischer Spracherkennung (ASR) (was der Benutzer gesagt hat), optionale Verwendung von Tools (wenn externe Informationen benötigt werden), Textantwort (was das Modell zu sagen plant) und Audioantwort (die gesprochene Ausgabe).

Die ASR-Transkription erscheint zuerst und vermittelt das Verständnis des Modells für die Sprache des Benutzers mit role: "USER" und "additionalModelFields": "{\"generationStage\":\"FINAL\"}" in contentStart. Wenn das Modell externe Daten benötigt, sendet es Tool-bezogene Ereignisse mit bestimmten Tool-Namen und -Parametern. Die Textantwort bietet eine Vorschau des geplanten Sprachbeitrags mit role: "ASSISTANT" und "additionalModelFields": "{\"generationStage\":\"SPECULATIVE\"}". Die Audioantwort liefert dann Base64-kodierte Sprachblöcke, die im gesamten Stream dieselbe contentId verwenden.

Während der Audiogenerierung unterstützt Amazon Nova Sonic durch seine Barge-In-Funktion den natürlichen Gesprächsfluss. Wenn ein Benutzer Amazon Nova Sonic unterbricht, während es spricht, stoppt Nova Sonic sofort die Sprachgenerierung, wechselt in den Hörmodus und sendet eine Inhaltsbenachrichtigung, die darauf hinweist, dass die Unterbrechung aufgetreten ist. Da Nova Sonic schneller als in Echtzeit arbeitet, wurden einige Audiodaten möglicherweise bereits übertragen, aber noch nicht abgespielt. Die Unterbrechungsbenachrichtigung ermöglicht es der Client-Anwendung, ihre Audiowarteschlange zu löschen und die Wiedergabe sofort zu beenden, wodurch ein responsives Konversationserlebnis entsteht.

Nachdem die Audiogenerierung abgeschlossen ist (oder per Barge-In unterbrochen wurde), bietet Amazon Nova Sonic eine zusätzliche Textantwort, die eine Transkription des tatsächlich Gesprochenen auf Satzebene enthält. Diese Textantwort beinhaltet ein contentStart-Ereignis mit role: "ASSISTANT" und "additionalModelFields": "{\"generationStage\":\"FINAL\"}".

Während der gesamten Antwortverarbeitung werden usageEvent-Ereignisse gesendet, um den Token-Verbrauch zu verfolgen. Diese Ereignisse enthalten detaillierte Metriken zu Eingabe- und Ausgabetoken (sowohl Sprache als auch Text) sowie deren kumulierte Gesamtwerte. Jedes usageEvent-Ereignis behält dieselben sessionId, promptName und completionId wie andere Ereignisse im Konversationsablauf bei. Der Abschnitt „Details“ enthält sowohl inkrementelle Änderungen (Delta) als auch laufende Summen der Token-Verwendung, wodurch eine genaue Überwachung der Verwendung während der Konversation ermöglicht wird.

Das Modell sendet ein completionEnd-Ereignis mit den ursprünglichen Kennungen und einem stopReason, der angibt, wie die Konversation endete. Diese Ereignishierarchie stellt sicher, dass Ihre Anwendung nachverfolgen kann, welche Teile der Antwort zusammengehören, und diese entsprechend verarbeiten kann, wobei der Konversationskontext über mehrere Gesprächsrunden hinweg beibehalten wird.

Der Ablauf der Ausgabeereignisse beginnt mit dem Eintritt in die Phase der Antwortgenerierung. Er beginnt mit der automatischen Spracherkennung, wählt ein zu verwendendes Tool aus, transkribiert Sprache, generiert Audio, schließt die Transkription ab und beendet die Sitzung.

Diagramm, das den Ablauf der Ausgabeereignisse in Amazon Nova Sonic erklärt.

Ausgabeereignis-Ablauf

In diesem Abschnitt wird die Struktur des Ausgabe-Ereignisflusses beschrieben.

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