

# 使用双向 API 处理输入事件
<a name="input-events"></a>

**注意**  
本文档适用于 Amazon Nova 版本 1。如需 Amazon Nova 2 Sonic 指南，请访问[使用双向 API 处理输入事件](https://docs.aws.amazon.com/nova/latest/nova2-userguide/sonic-input-events.html)。

双向流式 API 使用具有结构化输入和输出事件的事件驱动架构。对于成功实施对话式应用程序，并在整个交互过程中保持适当的对话状态而言，理解正确的事件顺序至关重要。

Nova Sonic 的对话遵循结构化事件顺序。首先，发送一个包含推理配置参数（例如温度和词元限制）的 `sessionStart` 事件。接下来，您发送 `promptStart` 以定义音频输出格式和工具配置，并且分配一个唯一的 `promptName` 标识符，该标识符必须包含在所有后续事件中。

对于每种交互类型（系统提示、音频等），遵循由三个部分组成的模式：使用 `contentStart` 定义内容类型和内容的角色（`SYSTEM`、`USER`、`ASSISTANT`、`TOOL`），然后提供实际的内容事件，最后以 `contentEnd` 结束片段。`contentStart` 事件指定了您是在发送工具结果、流式音频还是系统提示。`contentStart` 事件包含一个唯一的 `contentName` 标识符。

对话历史记录只能在系统提示之后和音频流开始之前包含一次。其遵循相同的 `contentStart`/`textInput`/`contentEnd` 模式。在 `contentStart` 事件中，必须为每条历史消息定义 `USER` 和 `ASSISTANT` 角色。这可为当前对话提供基本上下文信息，但必须在任何新用户输入开始之前完成。

音频流式传输通过连续麦克风采样运行。发送初始 `contentStart` 后，音频帧（每帧约 32 毫秒）将直接从麦克风捕获音频帧，并立即使用相同的 `contentName` 作为 `audioInput` 事件发送。这些音频样本应在捕获时实时流式传输，并在整个对话过程中保持自然的麦克风采样节奏。所有音频帧在对话结束并明确关闭之前都共享一个内容容器。

在对话结束或需要终止之后，必须正确关闭所有打开的流并按正确的顺序结束会话。要正确结束会话并避免资源泄漏，必须遵循特定的顺序关闭：

1. 关闭 `contentEnd` 事件中所有打开的音频流。

1. 发送引用原始 `promptName` 的 `promptEnd` 事件。

1. 发送 `sessionEnd` 事件。

跳过这些正在关闭的事件中的任何一个，都可能导致对话不完整或资源被孤立。

这些标识符创建了这样的层次结构：`promptName` 将所有对话事件联系在一起，而每个 `contentName` 都标记了特定内容块的边界。这种层次结构可确保模型在整个交互过程中保持恰当的上下文信息。

![\[示意图，其中解释了 Amazon Nova Sonic 输入事件流程。\]](http://docs.aws.amazon.com/zh_cn/nova/latest/userguide/images/input-events.png)


## 输入事件流程
<a name="input-event-flow"></a>

本节介绍了输入事件流程的结构。

1. `RequestStartEvent`

   ```
   {
       "event": {
           "sessionStart": {
               "inferenceConfiguration": {
                   "maxTokens": "int",
                   "topP": "float",
                   "temperature": "float"
               }
           }
       }
   }
   ```

1. `PromptStartEvent`

   ```
   {
       "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" |
                           "lupe" | "carlos" | "ambre" | "florian" |
                           "greta" | "lennart" | "beatrice" | "lorenzo",
                   "encoding": "base64",
                   "audioType": "SPEECH",
               },
               "toolUseOutputConfiguration": {
                   "mediaType": "application/json"
               },
               "toolConfiguration": {
                   "tools": [{
                       "toolSpec": {
                           "name": "string",
                           "description": "string",
                           "inputSchema": {
                               "json": "{}"
                           }
                       }
                   }]
               }
           }
       }
   }
   ```

1. `InputContentStartEvent`
   + `Text`

     ```
     {
         "event": {
             "contentStart": {
                 "promptName": "string", // same unique identifier from promptStart event
                 "contentName": "string", // unique identifier for the content block
                 "type": "TEXT",
                 "interactive": false,
                 "role": "SYSTEM" | "USER" | "ASSISTANT",
                 "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"
                     }
                 }
             }
         }
     }
     ```

1. `TextInputContent`

   ```
   {
       "event": {
           "textInput": {
               "promptName": "string", // same unique identifier from promptStart event
               "contentName": "string", // unique identifier for the content block
               "content": "string"
           }
       }
   }
   ```

1. `AudioInputContent`

   ```
   {
       "event": {
           "audioInput": {
               "promptName": "string", // same unique identifier from promptStart event
               "contentName": "string", // same unique identifier from its contentStart
               "content": "base64EncodedAudioData"
           }
       }
   }
   ```

1. `ToolResultContentEvent`

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

1. `InputContentEndEvent`

   ```
   {
       "event": {
           "contentEnd": {
               "promptName": "string", // same unique identifier from promptStart event
               "contentName": "string" // same unique identifier from its contentStart
           }
       }
   }
   ```

1. `PromptEndEvent`

   ```
   {
       "event": {
           "promptEnd": {
               "promptName": "string" // same unique identifier from promptStart event
           }
       }
   }
   ```

1. `RequestEndEvent`

   ```
   {
       "event": {
           "sessionEnd": {}
       }
   }
   ```