Al crear un Mensaje, puedes establecer "stream": true para transmitir la respuesta de forma incremental utilizando eventos enviados por el servidor (SSE).

Transmisión con SDKs

Nuestros SDKs de Python y Typescript ofrecen múltiples formas de transmisión. El SDK de Python permite transmisiones síncronas y asíncronas. Consulta la documentación de cada SDK para obtener más detalles.

import anthropic

client = anthropic.Anthropic()

with client.messages.stream(
    max_tokens=1024,
    messages=[{"role": "user", "content": "Hola"}],
    model="claude-3-opus-20240229",
) as stream:
  for text in stream.text_stream:
      print(text, end="", flush=True)

Tipos de eventos

Cada evento enviado por el servidor incluye un tipo de evento con nombre y datos JSON asociados. Cada evento utilizará un nombre de evento SSE (por ejemplo, event: message_stop) e incluirá el type de evento correspondiente en sus datos.

Cada transmisión utiliza el siguiente flujo de eventos:

  1. message_start: contiene un objeto Message con content vacío.
  2. Una serie de bloques de contenido, cada uno de los cuales tiene un evento content_block_start, uno o más eventos content_block_delta y un evento content_block_stop. Cada bloque de contenido tendrá un index que corresponde a su índice en el array content final del Mensaje.
  3. Uno o más eventos message_delta, que indican cambios de nivel superior en el objeto Message final.
  4. Un evento final message_stop.

Eventos de ping

Las transmisiones de eventos también pueden incluir cualquier número de eventos ping.

Eventos de error

Ocasionalmente, podemos enviar errores en la transmisión de eventos. Por ejemplo, durante períodos de alto uso, puedes recibir un overloaded_error, que normalmente correspondería a un HTTP 529 en un contexto sin transmisión:

Ejemplo de error
event: error
data: {"type": "error", "error": {"type": "overloaded_error", "message": "Sobrecargado"}}

Otros eventos

De acuerdo con nuestra política de versiones, podemos agregar nuevos tipos de eventos, y tu código debe manejar tipos de eventos desconocidos de manera adecuada.

Tipos de delta

Cada evento content_block_delta contiene un delta de un tipo que actualiza el bloque de content en un index dado.

Delta de texto

Un delta de bloque de contenido de text se ve así:

Delta de texto
event: content_block_delta
data: {"type": "content_block_delta","index": 0,"delta": {"type": "text_delta", "text": "ola amig"}}

Delta de JSON de entrada

Los deltas para los bloques de contenido tool_use corresponden a actualizaciones para el campo input del bloque. Para admitir la máxima granularidad, los deltas son cadenas JSON parciales, mientras que el tool_use.input final siempre es un objeto.

Puedes acumular los deltas de cadena y analizar el JSON una vez que recibas un evento content_block_stop, utilizando una biblioteca como Pydantic para realizar un análisis JSON parcial, o utilizando nuestros SDKs, que proporcionan ayudantes para acceder a valores incrementales analizados.

Un delta de bloque de contenido tool_use se ve así:

Delta de JSON de entrada
event: content_block_delta
data: {"type": "content_block_delta","index": 1,"delta": {"type": "input_json_delta","partial_json": "{\"location\": \"San Fra"}}}

Nota: Nuestros modelos actuales solo admiten emitir una propiedad de clave y valor completa de input a la vez. Como tal, cuando se utilizan herramientas, puede haber retrasos entre los eventos de transmisión mientras el modelo está trabajando. Una vez que se acumulan una clave y un valor de input, los emitimos como múltiples eventos content_block_delta con JSON parcial fragmentado para que el formato pueda admitir automáticamente una granularidad más fina en modelos futuros.

Respuesta de transmisión HTTP sin procesar

Recomendamos encarecidamente que utilices nuestros SDKs de cliente cuando uses el modo de transmisión. Sin embargo, si estás construyendo una integración de API directa, deberás manejar estos eventos tú mismo.

Una respuesta de transmisión se compone de:

  1. Un evento message_start
  2. Potencialmente múltiples bloques de contenido, cada uno de los cuales contiene: a. Un evento content_block_start b. Potencialmente múltiples eventos content_block_delta c. Un evento content_block_stop
  3. Un evento message_delta
  4. Un evento message_stop

También puede haber eventos ping dispersos a lo largo de la respuesta. Consulta Tipos de eventos para obtener más detalles sobre el formato.

Solicitud de transmisión básica

Solicitud
curl https://api.anthropic.com/v1/messages \
     --header "anthropic-version: 2023-06-01" \
     --header "content-type: application/json" \
     --header "x-api-key: $ANTHROPIC_API_KEY" \
     --data \
'{
  "model": "claude-3-opus-20240229",
  "messages": [{"role": "user", "content": "Hola"}],
  "max_tokens": 256,
  "stream": true
}'
Respuesta
event: message_start
data: {"type": "message_start", "message": {"id": "msg_1nZdL29xx5MUA1yADyHTEsnR8uuvGzszyY", "type": "message", "role": "assistant", "content": [], "model": "claude-3-opus-20240229", "stop_reason": null, "stop_sequence": null, "usage": {"input_tokens": 25, "output_tokens": 1}}}

event: content_block_start
data: {"type": "content_block_start", "index": 0, "content_block": {"type": "text", "text": ""}}

event: ping
data: {"type": "ping"}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "¡Hola"}}

event: content_block_delta
data: {"type": "content_block_delta", "index": 0, "delta": {"type": "text_delta", "text": "!"}}

event: content_block_stop
data: {"type": "content_block_stop", "index": 0}

event: message_delta
data: {"type": "message_delta", "delta": {"stop_reason": "end_turn", "stop_sequence":null}, "usage": {"output_tokens": 15}}

event: message_stop
data: {"type": "message_stop"}

Solicitud de transmisión con uso de herramienta

En esta solicitud, le pedimos a Claude que use una herramienta para decirnos el clima.

Solicitud
  curl https://api.anthropic.com/v1/messages \
    -H "content-type: application/json" \
    -H "x-api-key: $ANTHROPIC_API_KEY" \
    -H "anthropic-version: 2023-06-01" \
    -d '{
      "model": "claude-3-opus-20240229",
      "max_tokens": 1024,
      "tools": [
        {
          "name": "get_weather",
          "description": "Obtener el clima actual en una ubicación determinada",
          "input_schema": {
            "type": "object",
            "properties": {
              "location": {
                "type": "string",
                "description": "La ciudad y el estado, por ejemplo, San Francisco, CA"
              }
            },
            "required": ["location"]
          }
        }
      ],
      "tool_choice": {"type": "any"},
      "messages": [
        {
          "role": "user",
          "content": "¿Cómo está el clima en San Francisco?"
        }
      ],
      "stream": true
    }'
Respuesta
event: message_start
data: {"type":"message_start","message":{"id":"msg_014p7gG3wDgGV9EUtLvnow3U","type":"message","role":"assistant","model":"claude-3-haiku-20240307","stop_sequence":null,"usage":{"input_tokens":472,"output_tokens":2},"content":[],"stop_reason":null}}

event: content_block_start
data: {"type":"content_block_start","index":0,"content_block":{"type":"text","text":""}}

event: ping
data: {"type": "ping"}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":"De acuerdo"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" veamos"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" el"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" clima"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" para"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" San"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" Francisco"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":","}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":" CA"}}

event: content_block_delta
data: {"type":"content_block_delta","index":0,"delta":{"type":"text_delta","text":":"}}

event: content_block_stop
data: {"type":"content_block_stop","index":0}

event: content_block_start
data: {"type":"content_block_start","index":1,"content_block":{"type":"tool_use","id":"toolu_01T1x1fJ34qAmk2tNTrN7Up6","name":"get_weather","input":{}}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"{\"location\":"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" \"San"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" Francisc"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"o,"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":" CA\""}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":", "}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"\"unit\": \"fah"}}

event: content_block_delta
data: {"type":"content_block_delta","index":1,"delta":{"type":"input_json_delta","partial_json":"renheit\"}"}}

event: content_block_stop
data: {"type":"content_block_stop","index":1}

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"tool_use","stop_sequence":null},"usage":{"output_tokens":89}}

event: message_stop
data: {"type":"message_stop"}