

# チャット履歴の管理
<a name="sonic-chat-history"></a>

Amazon Nova 2 Sonic レスポンスには、ユーザー音声とアシスタント音声の両方の ASR (自動音声認識) トランスクリプトが含まれます。チャット履歴の保存はベストプラクティスです。ログ記録の目的だけでなく、接続が予期せず閉じられたときにセッションを再開する場合にも当てはまります。これにより、クライアントは Nova Sonic にコンテキストを送信して、会話をシームレスに続行できます。

チャット履歴の管理の詳細については、以下のリソースを参照してください。

1. [チャット履歴のログ記録](https://github.com/aws-samples/amazon-nova-samples/tree/main/speech-to-speech/amazon-nova-2-sonic/repeatable-patterns/chat-history-logger)

1. [会話の再開](https://github.com/aws-samples/amazon-nova-samples/tree/main/speech-to-speech/repeatable-patterns/resume-conversation)

## チャット履歴の送信
<a name="sonic-chat-history-sending"></a>

会話履歴は、システム/音声プロンプトの後、音声ストリーミングが開始される前に 1 回のみ含めることができます。全体的なチャット履歴は 40KB を超えることはできません。次の図は、イベントライフサイクル中にチャット履歴がいつ渡されるかを示しています。

![\[alt text not found\]](http://docs.aws.amazon.com/ja_jp/nova/latest/nova2-userguide/images/Sending-Chat-History_4.png)


各履歴メッセージには、`contentStart`、`textInput`、`contentEnd` の 3 つのイベントが必要です。

**メッセージあたりのイベントスキーマ:**
+ `contentStart` – メッセージロールと設定を定義します

  ```
  {
    "event": {
      "contentStart": {
        "promptName": "<prompt-id>",
        "contentName": "<content-id>",
        "type": "TEXT",
        "interactive": true,
        "role": "ASSISTANT",
        "textInputConfiguration": {
          "mediaType": "text/plain"
        }
      }
    }
  }
  ```
+ `textInput` – 実際のメッセージコンテンツが含まれます。1 つの textInput は 1KB を超えることはできません。その場合は、同じコンテンツブロック内の複数の textInputs に分割します。会話が 40KB を超える場合は、チャット履歴全体を切り詰めてサイズを調整します。

  ```
  {
    "event": {
      "textInput": {
        "promptName": "<prompt-id>",
        "contentName": "<content-id>",
        "content": "Take your time, Don. I'll be here when you're ready."
      }
    }
  }
  ```
+ `contentEnd` – メッセージの終了をマークします

  ```
  {
    "event": {
      "contentEnd": {
        "promptName": "<prompt-id>",
        "contentName": "<content-id>"
      }
    }
  }
  ```

チャット履歴内のメッセージごとに、USER ロールと ASSISTANT ロールを交互に、これら 3 つのイベントを繰り返します。

**重要な考慮事項:**
+ チャット履歴はセッションごとに **1 回**のみ含めることができます
+ チャット履歴は、**システムプロンプトの後**、**オーディオストリーミングを開始する前に**送信する必要があります
+ オーディオストリーミングを開始する前に、すべての履歴メッセージを送信する必要があります
+ 各メッセージでは、USER ロールまたは ASSISTANT ロールを指定する必要があります
+ textOutput イベントの保存されたトランスクリプトコンテンツを textInput のコンテンツ値として使用する

## ASR トランスクリプトの受信
<a name="sonic-chat-history-receiving"></a>

会話中、Amazon Nova 2 Sonic は出力イベントを通じて ASR トランスクリプトを送信します。各トランスクリプトは、contentStart、textOutput、contentEnd の 3 つのイベントのシーケンスとして配信されます。

**例: ユーザー音声トランスクリプト:**

1 contentStart – トランスクリプトの開始を示します。

```
{
  "event": {
    "contentStart": {
      "additionalModelFields": "{\"generationStage\":\"FINAL\"}",
      "completionId": "<completion-id>",
      "contentId": "<content-id>",
      "promptName": "<prompt-id>",
      "role": "USER",
      "sessionId": "<session-id>",
      "textOutputConfiguration": {
        "mediaType": "text/plain"
      },
      "type": "TEXT"
    }
  }
}
```

2. textOutput – 実際のトランスクリプトコンテンツが含まれます。

```
{
  "event": {
    "textOutput": {
      "completionId": "<completion-id>",
      "content": "hello how are you",
      "contentId": "<content-id>",
      "promptName": "<prompt-id>",
      "role": "USER",
      "sessionId": "<session-id>"
    }
  }
}
```

3. contentEnd – トランスクリプトの最後であることをマークします。

```
{
  "event": {
    "contentEnd": {
      "completionId": "<completion-id>",
      "contentId": "<content-id>",
      "promptName": "<prompt-id>",
      "sessionId": "<session-id>",
      "stopReason": "PARTIAL_TURN",
      "type": "TEXT"
    }
  }
}
```

 USER ロールと ASSISTANT ロールの両方に同じ 3 つのイベントパターンが適用されます。`textOutput` イベントから `content` フィールドを抽出し、`contentStart` イベントから `role`フィールドを抽出してチャット履歴を構築します。

## ベストプラクティス
<a name="sonic-chat-history-best-practices"></a>

チャット履歴を常に保存して、以下を有効にします。
+ 異なるデバイス間のセッション再開
+ 会話のログ記録と監査
+ フォローアップインタラクションのコンテキスト保存

重要: チャット履歴を保存するときは、generationStage に基づいてテキスト出力を使用します。
+ 投機的 – 音声合成が開始される前に生成された、Nova 2 Sonic が何を言うかのプレビュー
+ 最終 – 音声レスポンスで話された内容の実際の文レベルの文字起こし

会話の正確な記録を表すため、常に最終テキスト出力をチャット履歴に保存します。

最終出力の例 (これをチャット履歴に保存):

```
ContentStart event: { 
  "additionalModelFields": "{\"generationStage\":\"FINAL\"}", 
  "completionId": "<completion-id>", 
  "contentId": "<content-id>", 
  "role": "ASSISTANT", 
  "sessionId": "<session-id>", 
  "type": "TEXT" 
}
```

投機的出力の例 (履歴用ではなく、オプションのプレビュー):

```
ContentStart event: { 
  "additionalModelFields": "{\"generationStage\":\"SPECULATIVE\"}", 
  "completionId": "<completion-id>", 
  "contentId": "<content-id>", 
  "role": "ASSISTANT", 
  "sessionId": "<session-id>", 
  "type": "TEXT" 
}
```