> ## 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

Создаёт сообщение в формате API Anthropic Messages. Поддерживает текст, изображения, PDF, инструменты и расширенное мышление.

## Аутентификация

<ParamField header="Authorization" type="string" required>
  Bearer-токен. Используйте ваш API-ключ в качестве Bearer-токена в заголовке Authorization.

  Формат: `Bearer <SUNRA_KEY>`
</ParamField>

## Запрос

Этот эндпоинт принимает объект.

<ParamField body="model" type="string" required>
  Модель, которая завершит ваш промпт. Просмотрите доступные модели на [sunra.ai/models](https://sunra.ai/models).
</ParamField>

<ParamField body="messages" type="object[]" required>
  Входные сообщения. Каждое входное сообщение имеет `role` и `content`.

  <Expandable title="properties">
    <ParamField body="role" type="string" required>
      Роль автора сообщения. Поддерживаемые значения: `user`, `assistant`.
    </ParamField>

    <ParamField body="content" type="string | object[]" required>
      Содержание сообщения. Может быть одной строкой или массивом блоков контента.

      <Expandable title="content block types">
        <ParamField body="type" type="string" required>
          Тип блока контента. Поддерживаемые значения: `text`, `image`, `tool_use`, `tool_result`.
        </ParamField>

        <ParamField body="text" type="string">
          Текстовое содержание. Используется, когда type — `text`.
        </ParamField>

        <ParamField body="source" type="object">
          Источник изображения. Используется, когда type — `image`.

          <Expandable title="properties">
            <ParamField body="type" type="string" required>
              Тип источника. Поддерживаемые значения: `base64`, `url`.
            </ParamField>

            <ParamField body="media_type" type="string" required>
              Медиатип изображения. Например, `image/jpeg`, `image/png`, `image/gif`, `image/webp`.
            </ParamField>

            <ParamField body="data" type="string">
              Данные изображения в кодировке base64. Обязательно, когда тип источника — `base64`.
            </ParamField>

            <ParamField body="url" type="string">
              URL изображения. Обязательно, когда тип источника — `url`.
            </ParamField>
          </Expandable>
        </ParamField>
      </Expandable>
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="max_tokens" type="integer" required>
  Максимальное количество токенов для генерации перед остановкой. Обратите внимание, что модель может остановиться до достижения этого максимума.
</ParamField>

<ParamField body="system" type="string | object[]">
  Системный промпт. Способ предоставления контекста и инструкций модели. Может быть строкой или массивом блоков контента.
</ParamField>

<ParamField body="stream" type="boolean" default={false}>
  Передавать ли ответ в потоковом режиме с использованием Server-Sent Events (SSE).
</ParamField>

<ParamField body="temperature" type="number" default={1}>
  Степень случайности, добавляемая в ответ. Диапазон от 0.0 до 1.0. Используйте `temperature` ближе к 0.0 для аналитических задач/задач с множественным выбором и ближе к 1.0 для творческих и генеративных задач.
</ParamField>

<ParamField body="top_p" type="number">
  Использовать nucleus-сэмплирование. При nucleus-сэмплировании мы вычисляем кумулятивное распределение по всем вариантам для каждого последующего токена в порядке убывания вероятности и обрезаем его, когда оно достигает определённой вероятности, заданной `top_p`.
</ParamField>

<ParamField body="top_k" type="integer">
  Сэмплирование только из верхних K вариантов для каждого последующего токена. Используется для удаления маловероятных ответов из «длинного хвоста». Рекомендуется только для продвинутых случаев использования.
</ParamField>

<ParamField body="stop_sequences" type="string[]">
  Пользовательские текстовые последовательности, которые заставят модель прекратить генерацию. Возвращённый текст не будет содержать стоп-последовательность.
</ParamField>

<ParamField body="tools" type="object[]">
  Определения инструментов, которые модель может использовать.

  <Expandable title="properties">
    <ParamField body="name" type="string" required>
      Имя инструмента.
    </ParamField>

    <ParamField body="description" type="string">
      Описание того, что делает этот инструмент.
    </ParamField>

    <ParamField body="input_schema" type="object" required>
      JSON-схема для входных данных этого инструмента. Определяет структуру `input`, которую принимает ваш инструмент.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="tool_choice" type="object">
  Как модель должна использовать предоставленные инструменты.

  <Expandable title="properties">
    <ParamField body="type" type="string" required>
      Поддерживаемые значения: `auto` (по умолчанию, решает модель), `any` (модель должна использовать инструмент), `tool` (модель должна использовать конкретный инструмент).
    </ParamField>

    <ParamField body="name" type="string">
      Имя инструмента для использования. Обязательно, когда type — `tool`.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="metadata" type="object">
  Объект, описывающий метаданные запроса.

  <Expandable title="properties">
    <ParamField body="user_id" type="string">
      Внешний идентификатор пользователя, связанного с запросом.
    </ParamField>
  </Expandable>
</ParamField>

<ParamField body="thinking" type="object">
  Конфигурация расширенного мышления. При включении модель будет думать перед ответом.

  <Expandable title="properties">
    <ParamField body="type" type="string" required>
      Должно быть `enabled`.
    </ParamField>

    <ParamField body="budget_tokens" type="integer" required>
      Максимальное количество токенов для размышлений. Должно быть больше или равно 1024.
    </ParamField>
  </Expandable>
</ParamField>

## Ответ

Успешный ответ сообщения.

<ResponseField name="id" type="string">
  Уникальный идентификатор сообщения, например `msg_01XFDUDYJgAACzvnptvVoYEL`.
</ResponseField>

<ResponseField name="type" type="string">
  Тип объекта. Всегда `message`.
</ResponseField>

<ResponseField name="role" type="string">
  Роль сгенерированного сообщения в беседе. Всегда `assistant`.
</ResponseField>

<ResponseField name="content" type="object[]">
  Контент, сгенерированный моделью. Это массив блоков контента.

  <Expandable title="properties">
    <ResponseField name="type" type="string">
      Тип блока контента. Может быть `text`, `tool_use` или `thinking`.
    </ResponseField>

    <ResponseField name="text" type="string">
      Сгенерированный текст. Присутствует, когда type — `text`.
    </ResponseField>

    <ResponseField name="id" type="string">
      Идентификатор блока использования инструмента. Присутствует, когда type — `tool_use`.
    </ResponseField>

    <ResponseField name="name" type="string">
      Имя инструмента. Присутствует, когда type — `tool_use`.
    </ResponseField>

    <ResponseField name="input" type="object">
      Входные данные инструмента. Присутствует, когда type — `tool_use`.
    </ResponseField>

    <ResponseField name="thinking" type="string">
      Содержание размышлений. Присутствует, когда type — `thinking`.
    </ResponseField>
  </Expandable>
</ResponseField>

<ResponseField name="model" type="string">
  Модель, обработавшая запрос.
</ResponseField>

<ResponseField name="stop_reason" type="string | null">
  Причина остановки модели. Может быть `end_turn` (модель достигла естественной точки остановки), `max_tokens` (превышен `max_tokens` или максимум модели), `stop_sequence` (сгенерирована одна из ваших пользовательских стоп-последовательностей) или `tool_use` (модель вызвала один или несколько инструментов).
</ResponseField>

<ResponseField name="stop_sequence" type="string | null">
  Какая пользовательская стоп-последовательность была сгенерирована, если таковая имеется.
</ResponseField>

<ResponseField name="usage" type="object">
  Использование для выставления счетов и ограничения скорости. Три входные корзины взаимоисключающие — см. [Использование токенов](/ru/llm/token-usage).

  <Expandable title="properties">
    <ResponseField name="input_tokens" type="integer">
      Количество использованных свежих входных токенов. Исключает обе корзины кэша.
    </ResponseField>

    <ResponseField name="output_tokens" type="integer">
      Количество использованных выходных токенов.
    </ResponseField>

    <ResponseField name="total_tokens" type="integer">
      Все входные корзины плюс `output_tokens`. Не включается в потоковые ответы.
    </ResponseField>

    <ResponseField name="cache_creation_input_tokens" type="integer">
      Количество входных токенов, использованных для создания записи кэша.
    </ResponseField>

    <ResponseField name="cache_read_input_tokens" type="integer">
      Количество входных токенов, прочитанных из кэша.
    </ResponseField>

    <ResponseField name="sunra_usage_semantics" type="string | null">
      Присутствует со значением `anthropic.exclusive.v1`, когда Sunra нормализовала этот ответ. Проверяйте это значение, а не выводите соглашение из чисел. См. [Использование токенов](/ru/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>
