

# Administración del historial del chat
<a name="sonic-chat-history"></a>

Las respuestas de Amazon Nova 2 Sonic incluyen transcripciones de ASR (reconocimiento de voz automático) para las voces de los usuarios y los asistentes. Guardar el historial del chat es una práctica recomendada, no solo para registrarlo, sino también para reanudar las sesiones cuando la conexión se cierra inesperadamente. Esto permite al cliente enviar el contexto a Nova Sonic para continuar la conversación sin problemas.

Consulte los siguientes recursos para obtener más información sobre cómo administrar el historial del chat:

1. [Registro del historial del chat](https://github.com/aws-samples/amazon-nova-samples/tree/main/speech-to-speech/amazon-nova-2-sonic/repeatable-patterns/chat-history-logger)

1. [Reanudación de conversaciones](https://github.com/aws-samples/amazon-nova-samples/tree/main/speech-to-speech/repeatable-patterns/resume-conversation)

## Envío del historial del chat
<a name="sonic-chat-history-sending"></a>

El historial de conversaciones solo se puede incluir una vez, después de la petición del sistema o la voz y antes de que comience la transmisión de audio. El historial del chat general no puede superar los 40 KB. En el siguiente diagrama, se muestra cuándo se transfiere el historial del chat durante el ciclo de vida del evento:

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


Cada mensaje histórico requiere tres eventos: `contentStart`, `textInput` y `contentEnd`.

**Esquema de eventos por mensaje:**
+ `contentStart`: define el rol y la configuración del mensaje

  ```
  {
    "event": {
      "contentStart": {
        "promptName": "<prompt-id>",
        "contentName": "<content-id>",
        "type": "TEXT",
        "interactive": true,
        "role": "ASSISTANT",
        "textInputConfiguration": {
          "mediaType": "text/plain"
        }
      }
    }
  }
  ```
+ `textInput`: incluye el contenido real del mensaje. Una textInput no puede superar 1 KB. Si es así, divídalo en varias textInputs en el mismo bloque de contenido. Si la conversación supera los 40 KB, recorte el historial del chat general.

  ```
  {
    "event": {
      "textInput": {
        "promptName": "<prompt-id>",
        "contentName": "<content-id>",
        "content": "Take your time, Don. I'll be here when you're ready."
      }
    }
  }
  ```
+ `contentEnd`: marca el final del mensaje.

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

Repita estos tres eventos para cada mensaje del historial del chat con alternancia entre los roles USUARIO y ASISTENTE.

**Consideraciones importantes:**
+ El historial del chat solo se puede incluir **una vez** por sesión.
+ El historial del chat debe enviarse **después de la petición del sistema** y **antes de que comience la transmisión de audio**.
+ Todos los mensajes históricos deben enviarse antes de iniciar la transmisión de audio.
+ Cada mensaje debe especificar el rol USUARIO o ASISTENTE.
+ Utilice el contenido de la transcripción almacenado de los eventos de textOutput como valor de contenido en textInput.

## Recepción de transcripciones de ASR
<a name="sonic-chat-history-receiving"></a>

Durante una conversación, Amazon Nova 2 Sonic envía transcripciones de ASR a través de eventos de salida. Cada transcripción se entrega como una secuencia de tres eventos: contentStart, textOutput, and contentEnd.

**Ejemplo, transcripción de la voz del usuario:**

1. contentStart, indica el inicio de una transcripción:

```
{
  "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, incluye el contenido real de la transcripción:

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

3. contentEnd, marca el final de la transcripción:

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

 El mismo patrón de tres eventos se aplica a los roles USUARIO y ASISTENTE. Extraiga el campo `content` del evento `textOutput` y el campo `role` del evento `contentStart` para crear el historial del chat.

## Prácticas recomendadas
<a name="sonic-chat-history-best-practices"></a>

Almacene siempre el historial del chat para habilitar lo siguiente:
+ Reanudaciones de sesiones en diferentes dispositivos
+ Registro y auditoría de conversaciones
+ Conservación del contexto para las interacciones de seguimiento

Importante: Al guardar el historial del chat, utiliza salidas de texto en función de su generationStage:
+ Especulativa: un adelanto de lo que Nova 2 Sonic planea decir, se genera antes de que comience la síntesis de audio
+ Final: la transcripción real por frase de lo que se dijo en la respuesta de audio

Guarde siempre la salida de texto FINAL en el historial del chat, ya que representa el registro exacto de la conversación.

Ejemplo de salida FINAL (guárdela en el historial del chat):

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

Ejemplo de salida ESPECULATIVA (vista previa opcional, no para el historial):

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