> ## Documentation Index
> Fetch the complete documentation index at: https://docs.sunra.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Create a message

Crea un mensaje utilizando el formato de la API Anthropic Messages. Soporta texto, imágenes, PDFs, herramientas y pensamiento extendido.

## Autenticación

<ParamField header="Authorization" type="string" required>
  Token Bearer. Use su clave API como token Bearer en el encabezado Authorization.

  Formato: `Bearer <SUNRA_KEY>`
</ParamField>

## Solicitud

Este endpoint espera un objeto.

<ParamField body="model" type="string" required>
  El modelo que completará su prompt. Explore los modelos disponibles en [sunra.ai/models](https://sunra.ai/models).
</ParamField>

<ParamField body="messages" type="object[]" required>
  Mensajes de entrada. Cada mensaje de entrada tiene un `role` y `content`.

  <Expandable title="propiedades">
    <ParamField body="role" type="string" required>
      El rol del autor del mensaje. Valores admitidos: `user`, `assistant`.
    </ParamField>

    <ParamField body="content" type="string | object[]" required>
      El contenido del mensaje. Puede ser una cadena de texto simple o un array de bloques de contenido.

      <Expandable title="tipos de bloques de contenido">
        <ParamField body="type" type="string" required>
          El tipo de bloque de contenido. Valores admitidos: `text`, `image`, `tool_use`, `tool_result`.
        </ParamField>

        <ParamField body="text" type="string">
          Contenido de texto. Usado cuando el tipo es `text`.
        </ParamField>

        <ParamField body="source" type="object">
          Fuente de la imagen. Usado cuando el tipo es `image`.

          <Expandable title="propiedades">
            <ParamField body="type" type="string" required>
              El tipo de fuente. Valores admitidos: `base64`, `url`.
            </ParamField>

            <ParamField body="media_type" type="string" required>
              El tipo de medio de la imagen. Por ejemplo, `image/jpeg`, `image/png`, `image/gif`, `image/webp`.
            </ParamField>

            <ParamField body="data" type="string">
              Datos de imagen codificados en base64. Requerido cuando el tipo de fuente es `base64`.
            </ParamField>

            <ParamField body="url" type="string">
              URL de la imagen. Requerido cuando el tipo de fuente es `url`.
            </ParamField>
          </Expandable>
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="max_tokens" type="integer" required>
  El número máximo de tokens a generar antes de detenerse. Tenga en cuenta que el modelo puede detenerse antes de alcanzar este máximo.
</ParamField>

<ParamField body="system" type="string | object[]">
  Prompt del sistema. Un prompt del sistema es una forma de proporcionar contexto e instrucciones al modelo. Puede ser una cadena de texto o un array de bloques de contenido.
</ParamField>

<ParamField body="stream" type="boolean" default={false}>
  Indica si la respuesta debe transmitirse de forma incremental mediante eventos server-sent (SSE).
</ParamField>

<ParamField body="temperature" type="number" default={1}>
  Cantidad de aleatoriedad inyectada en la respuesta. Varía de 0.0 a 1.0. Use `temperature` más cercana a 0.0 para tareas analíticas/de opción múltiple, y más cercana a 1.0 para tareas creativas y generativas.
</ParamField>

<ParamField body="top_p" type="number">
  Usa muestreo por núcleo. En el muestreo por núcleo, calculamos la distribución acumulativa sobre todas las opciones para cada token siguiente en orden decreciente de probabilidad y la cortamos una vez que alcanza una probabilidad particular especificada por `top_p`.
</ParamField>

<ParamField body="top_k" type="integer">
  Solo muestrea entre las K mejores opciones para cada token siguiente. Se utiliza para eliminar respuestas de baja probabilidad de la "cola larga". Recomendado solo para casos de uso avanzados.
</ParamField>

<ParamField body="stop_sequences" type="string[]">
  Secuencias de texto personalizadas que harán que el modelo deje de generar. El texto devuelto no contendrá la secuencia de parada.
</ParamField>

<ParamField body="tools" type="object[]">
  Definiciones de herramientas que el modelo puede usar.

  <Expandable title="propiedades">
    <ParamField body="name" type="string" required>
      Nombre de la herramienta.
    </ParamField>

    <ParamField body="description" type="string">
      Descripción de lo que hace esta herramienta.
    </ParamField>

    <ParamField body="input_schema" type="object" required>
      Esquema JSON para la entrada de esta herramienta. Esto define la forma del `input` que su herramienta acepta.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="tool_choice" type="object">
  Cómo el modelo debe usar las herramientas proporcionadas.

  <Expandable title="propiedades">
    <ParamField body="type" type="string" required>
      Valores admitidos: `auto` (por defecto, el modelo decide), `any` (el modelo debe usar una herramienta), `tool` (el modelo debe usar una herramienta específica).
    </ParamField>

    <ParamField body="name" type="string">
      El nombre de la herramienta a usar. Requerido cuando el tipo es `tool`.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="metadata" type="object">
  Un objeto que describe los metadatos de la solicitud.

  <Expandable title="propiedades">
    <ParamField body="user_id" type="string">
      Un identificador externo para el usuario asociado con la solicitud.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="thinking" type="object">
  Configuración para el pensamiento extendido. Cuando está habilitado, el modelo pensará antes de responder.

  <Expandable title="propiedades">
    <ParamField body="type" type="string" required>
      Debe ser `enabled`.
    </ParamField>

    <ParamField body="budget_tokens" type="integer" required>
      El número máximo de tokens a usar para el pensamiento. Debe ser mayor o igual a 1024.
    </ParamField>
  </Expandable>
</ParamField>

## Respuesta

Respuesta de mensaje exitosa.

<ResponseField name="id" type="string">
  Identificador único del mensaje, por ejemplo `msg_01XFDUDYJgAACzvnptvVoYEL`.
</ResponseField>

<ResponseField name="type" type="string">
  Tipo de objeto. Siempre `message`.
</ResponseField>

<ResponseField name="role" type="string">
  Rol conversacional del mensaje generado. Siempre `assistant`.
</ResponseField>

<ResponseField name="content" type="object[]">
  Contenido generado por el modelo. Este es un array de bloques de contenido.

  <Expandable title="propiedades">
    <ResponseField name="type" type="string">
      El tipo de bloque de contenido. Puede ser `text`, `tool_use` o `thinking`.
    </ResponseField>

    <ResponseField name="text" type="string">
      El texto generado. Presente cuando el tipo es `text`.
    </ResponseField>

    <ResponseField name="id" type="string">
      El ID del bloque de uso de herramienta. Presente cuando el tipo es `tool_use`.
    </ResponseField>

    <ResponseField name="name" type="string">
      El nombre de la herramienta. Presente cuando el tipo es `tool_use`.
    </ResponseField>

    <ResponseField name="input" type="object">
      La entrada de la herramienta. Presente cuando el tipo es `tool_use`.
    </ResponseField>

    <ResponseField name="thinking" type="string">
      El contenido del pensamiento. Presente cuando el tipo es `thinking`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="model" type="string">
  El modelo que procesó la solicitud.
</ResponseField>

<ResponseField name="stop_reason" type="string | null">
  La razón por la que el modelo dejó de generar. Puede ser `end_turn` (el modelo alcanzó un punto de parada natural), `max_tokens` (excedió `max_tokens` o el máximo del modelo), `stop_sequence` (se generó una de sus secuencias de parada personalizadas) o `tool_use` (el modelo invocó una o más herramientas).
</ResponseField>

<ResponseField name="stop_sequence" type="string | null">
  Qué secuencia de parada personalizada se generó, si alguna.
</ResponseField>

<ResponseField name="usage" type="object">
  Uso para facturación y límites de tasa. Los tres buckets de entrada son mutuamente excluyentes — consulte [Uso de tokens](/es/llm/token-usage).

  <Expandable title="propiedades">
    <ResponseField name="input_tokens" type="integer">
      El número de tokens de entrada nuevos utilizados. Excluye ambos buckets de caché.
    </ResponseField>

    <ResponseField name="output_tokens" type="integer">
      El número de tokens de salida utilizados.
    </ResponseField>

    <ResponseField name="total_tokens" type="integer">
      Todos los buckets de entrada más `output_tokens`. Se omite en las respuestas con streaming.
    </ResponseField>

    <ResponseField name="cache_creation_input_tokens" type="integer">
      El número de tokens de entrada utilizados para crear la entrada de caché.
    </ResponseField>

    <ResponseField name="cache_read_input_tokens" type="integer">
      El número de tokens de entrada leídos desde la caché.
    </ResponseField>

    <ResponseField name="sunra_usage_semantics" type="string | null">
      Presente como `anthropic.exclusive.v1` cuando Sunra ha normalizado esta respuesta. Compruebe este valor en lugar de inferir la convención a partir de los números. Consulte [Uso de tokens](/es/llm/token-usage).
    </ResponseField>
  </Expandable>
</ResponseField>

<RequestExample>
  ```bash cURL theme={null}
  curl -X POST https://api-llm.sunra.ai/v1/messages \
    -H "Authorization: Bearer <SUNRA_KEY>" \
    -H "Content-Type: application/json" \
    -d '{
      "model": "anthropic/claude-sonnet-4-20250514",
      "max_tokens": 1024,
      "messages": [
        {
          "role": "user",
          "content": "Hello, how are you?"
        }
      ]
    }'
  ```

  ```python Python theme={null}
  import requests

  response = requests.post(
      "https://api-llm.sunra.ai/v1/messages",
      headers={
          "Authorization": "Bearer <SUNRA_KEY>",
          "Content-Type": "application/json"
      },
      json={
          "model": "anthropic/claude-sonnet-4-20250514",
          "max_tokens": 1024,
          "messages": [
              {"role": "user", "content": "Hello, how are you?"}
          ]
      }
  )
  print(response.json())
  ```

  ```javascript JavaScript theme={null}
  const response = await fetch("https://api-llm.sunra.ai/v1/messages", {
    method: "POST",
    headers: {
      "Authorization": "Bearer <SUNRA_KEY>",
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      model: "anthropic/claude-sonnet-4-20250514",
      max_tokens: 1024,
      messages: [
        { role: "user", content: "Hello, how are you?" }
      ]
    })
  });
  const data = await response.json();
  console.log(data);
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {
    "id": "msg_01XFDUDYJgAACzvnptvVoYEL",
    "type": "message",
    "role": "assistant",
    "content": [
      {
        "type": "text",
        "text": "Hello! I'm doing well, thank you for asking. How can I help you today?"
      }
    ],
    "model": "anthropic/claude-sonnet-4-20250514",
    "stop_reason": "end_turn",
    "stop_sequence": null,
    "usage": {
      "input_tokens": 12,
      "output_tokens": 19,
      "total_tokens": 31,
      "sunra_usage_semantics": "anthropic.exclusive.v1"
    }
  }
  ```
</ResponseExample>
