View a markdown version of this page

Behandlung von Eingabeereignissen mit der bidirektionalen API - Amazon Nova

Die vorliegende Übersetzung wurde maschinell erstellt. Im Falle eines Konflikts oder eines Widerspruchs zwischen dieser übersetzten Fassung und der englischen Fassung (einschließlich infolge von Verzögerungen bei der Übersetzung) ist die englische Fassung maßgeblich.

Behandlung von Eingabeereignissen mit der bidirektionalen API

Die bidirektionale Stream-API verwendet eine ereignisgesteuerte Architektur mit strukturierten Eingabe- und Ausgabeereignissen. Das Verständnis der richtigen Reihenfolge der Ereignisse ist entscheidend für die Implementierung erfolgreicher Konversationsanwendungen und die Aufrechterhaltung des richtigen Konversationsstatus während der gesamten Interaktionen.

-Übersicht

Die Nova-Sonic-Konversation folgt einer strukturierten Ereignissequenz. Sie senden zunächst ein sessionStart-Ereignis, das die Konfigurationsparameter der Inferenz wie Temperatur- und Token-Grenzwerte enthält. Anschließend senden Sie promptStart, um das Audioausgabeformat und die Toolkonfigurationen zu definieren, und weisen eine eindeutige promptName-ID zu, die in allen nachfolgenden Ereignissen enthalten sein muss.

Für jeden Interaktionstyp (Systemaufforderung, Audio usw.) folgen Sie einem dreiteiligen Muster: Definieren Sie contentStart damit den Inhaltstyp und die Rolle des Inhalts (SYSTEM,,,,SYSTEM_SPEECH) USER ASSISTANTTOOL, geben Sie dann das eigentliche Inhaltsereignis an und schließen Sie mit, contentEnd um das Segment zu schließen. Das contentStart-Ereignis gibt an, ob Sie Toolergebnisse, Streaming-Audio oder einen System-Prompt senden. Das contentStart-Ereignis enthält eine eindeutige contentName-ID.

Verlauf der Konversationen

Ein Konversationsverlauf kann nur einmal hinzugefügt werden, nämlich nach dem System-Prompt und bevor das Audio-Streaming beginnt. Er folgt demselben contentStart/textInput/contentEnd-Muster. Die Rollen USER und ASSISTANT müssen im contentStart-Ereignis für jede historische Nachricht definiert werden. Dies bietet einen wichtigen Kontext für die aktuelle Konversation, muss jedoch abgeschlossen sein, bevor eine neue Benutzereingabe beginnt.

Audio-Streaming

Das Audio-Streaming arbeitet mit kontinuierlicher Mikrofonabtastung. Nach dem Senden eines ersten contentStart, werden Audioframes (jeweils ca. 32 ms) direkt vom Mikrofon aufgenommen und mit demselben contentName sofort als audioInput-Ereignisse gesendet. Diese Audiosamples sollten in Echtzeit gestreamt werden, sobald sie aufgenommen werden, wobei die natürliche Abtastkadenz des Mikrofons während des gesamten Gesprächs beibehalten werden sollte. Alle Audioframes teilen sich einen einzigen Inhaltscontainer, bis die Konversation endet und dieser explizit geschlossen wird.

Die Sitzung wird geschlossen

Nach Beendigung oder Abbruch des Gesprächs ist es unerlässlich, alle offenen Streams ordnungsgemäß zu schließen und die Sitzung in der richtigen Reihenfolge zu beenden. Um eine Sitzung ordnungsgemäß zu beenden und Ressourcenlecks zu vermeiden, müssen Sie eine bestimmte Schlusssequenz befolgen:

  • Schließen Sie alle geöffneten Audio-Streams mit dem contentEnd-Ereignis.

  • Senden Sie ein promptEnd-Ereignis, das auf den Original-promptName verweist.

  • Senden Sie das sessionEnd-Ereignis.

Wenn Sie eines dieser abschließenden Ereignisse überspringen, kann dies zu unvollständigen Konversationen oder verwaisten Ressourcen führen.

Diese Identifikatoren bilden eine hierarchische Struktur: Der promptName verbindet alle Konversationsereignisse miteinander, während jeder einzelne contentName die Grenzen bestimmter Inhaltsblöcke markiert. Diese Hierarchie stellt sicher, dass das Modell während der gesamten Interaktion den richtigen Kontext beibehält.

Ablauf des Eingabeereignisses

In diesem Abschnitt wird die Struktur des Ablaufs der Eingabeereignisse erläutert.

Das Sitzungsstartereignis initialisiert die Konversation mit den Einstellungen für die Inferenzkonfiguration und die Erkennung von Abbiegungen.

Konfiguration der Inferenz:

  • maxTokens: Maximale Anzahl von Token, die in der Antwort generiert werden sollen

  • topP: Nukleus-Probenahmeparameter (0,0 bis 1,0) zur Steuerung der Zufälligkeit

  • temperature: Steuert die Zufälligkeit bei der Generierung (0,0 bis 1,0)

Konfiguration der Abbiegerkennung: Der endpointingSensitivity Parameter steuert, wie schnell Nova Sonic erkennt, wenn ein Benutzer mit dem Sprechen fertig ist:

  • HIGH: Erkennt Pausen schnell und ermöglicht so schnellere Reaktionen, kann aber dazu führen, dass langsamere Lautsprecher ausgeschaltet werden

  • MEDIUM: Ausgewogene Empfindlichkeit für die meisten Konversationsszenarien (empfohlene Standardeinstellung)

  • LOW: Wartet länger, bis das Ende der Rede erkannt wird. Dies ist besser für nachdenkliche oder zögernde Sprecher

{ "event": { "sessionStart": { "inferenceConfiguration": { "maxTokens": "int", "topP": "float", "temperature": "float" }, "turnDetectionConfiguration": { "endpointingSensitivity": "HIGH" | "MEDIUM" | "LOW" } } } }

Beispiel:

{ "event": { "sessionStart": { "inferenceConfiguration": { "maxTokens": 2048, "topP": 0.9, "temperature": 0.7 }, "turnDetectionConfiguration": { "endpointingSensitivity": "MEDIUM" } } } }

Das Ereignis zum Starten der Aufforderung definiert die Konversationskonfiguration, einschließlich der Ausgabeformate, der Sprachauswahl und der verfügbaren Tools.

Eine Liste der verfügbaren Sprach-IDs finden Sie unter Sprachunterstützung und mehrsprachige Funktionen

{ "event": { "promptStart": { "promptName": "string", // unique identifier same across all events i.e. UUID "textOutputConfiguration": { "mediaType": "text/plain" }, "audioOutputConfiguration": { "mediaType": "audio/lpcm", "sampleRateHertz": 8000 | 16000 | 24000, "sampleSizeBits": 16, "channelCount": 1, "voiceId": "matthew" | "tiffany" | "amy" | "olivia" | "lupe" | "carlos" | "ambre" | "florian" | "lennart" | "beatrice" | "lorenzo" | "tina" | "carolina" | "leo" | "kiara" | "arjun", "encoding": "base64", "audioType": "SPEECH" }, "toolUseOutputConfiguration": { "mediaType": "application/json" }, "toolConfiguration": { "tools": [ { "toolSpec": { "name": "string", "description": "string", "inputSchema": { "json": "{}" } } } ] } } } }

Text

Das Startereignis für Textinhalte wird für Systemaufforderungen, den Konversationsverlauf und die modalübergreifende Texteingabe verwendet.

Interaktiver Parameter:

  • true: Ermöglicht modalübergreifende Eingabe und ermöglicht Textnachrichten während einer aktiven Sprachsitzung

  • false: Standardtexteingabe für Systemaufforderungen und Gesprächsverlauf

Rollentypen:

  • SYSTEM: Systemanweisungen und Eingabeaufforderungen

  • USER: Benutzernachrichten im Konversationsverlauf oder modalübergreifende Eingabe

  • ASSISTANT: Antworten des Assistenten im Konversationsverlauf

  • SYSTEM_SPEECH: Steuert die Transkriptionsformatierung für die Umschaltung zwischen Hindi-Codes (Skripte) Latin/Devanagari/mixed

{ "event": { "contentStart": { "promptName": "string", // same unique identifier from promptStart event "contentName": "string", // unique identifier for the content block "type": "TEXT", "interactive": "boolean", // true for cross-modal input "role": "SYSTEM" | "USER" | "ASSISTANT" | "TOOL" | "SYSTEM_SPEECH", "textInputConfiguration": { "mediaType": "text/plain" } } } }

Beispiel — Systemaufforderung:

{ "event": { "contentStart": { "promptName": "conv-12345", "contentName": "system-prompt-1", "type": "TEXT", "interactive": false, "role": "SYSTEM", "textInputConfiguration": { "mediaType": "text/plain" } } } }

Beispiel — Cross-modal Eingabe:

{ "event": { "contentStart": { "promptName": "conv-12345", "contentName": "user-text-1", "type": "TEXT", "interactive": true, "role": "USER", "textInputConfiguration": { "mediaType": "text/plain" } } } }

Audio

{ "event": { "contentStart": { "promptName": "string", // same unique identifier from promptStart event "contentName": "string", // unique identifier for the content block "type": "AUDIO", "interactive": true, "role": "USER", "audioInputConfiguration": { "mediaType": "audio/lpcm", "sampleRateHertz": 8000 | 16000 | 24000, "sampleSizeBits": 16, "channelCount": 1, "audioType": "SPEECH", "encoding": "base64" } } } }

Tool

{ "event": { "contentStart": { "promptName": "string", // same unique identifier from promptStart event "contentName": "string", // unique identifier for the content block "interactive": false, "type": "TOOL", "role": "TOOL", "toolResultInputConfiguration": { "toolUseId": "string", // existing tool use id "type": "TEXT", "textInputConfiguration": { "mediaType": "text/plain" } } } } }
{ "event": { "textInput": { "promptName": "string", // same unique identifier from promptStart event "contentName": "string", // unique identifier for the content block "content": "string" } } }
{ "event": { "audioInput": { "promptName": "string", // same unique identifier from promptStart event "contentName": "string", // same unique identifier from its contentStart "content": "base64EncodedAudioData" } } }
"event": { "toolResult": { "promptName": "string", // same unique identifier from promptStart event "contentName": "string", // same unique identifier from its contentStart "content": "{\"key\": \"value\"}" // stringified JSON object as a tool result } }
{ "event": { "contentEnd": { "promptName": "string", // same unique identifier from promptStart event "contentName": "string" // same unique identifier from its contentStart } } }
{ "event": { "promptEnd": { "promptName": "string" // same unique identifier from promptStart event } } }
{ "event": { "sessionEnd": {} } }