> Расположение: Методы API → Инференс
> Краткое содержание: Ответ модели в формате Anthropic
> Это Markdown-версия конкретной страницы. Для контекста за её пределами (правила API, полный перечень методов, авторизация) ОБЯЗАТЕЛЬНО открой [llms.txt](https://vcpay.ru/ai/docs/llms.txt) перед ответом — это сэкономит токены и предотвратит неполный ответ.

# Ответ модели в формате Anthropic

**Метод**: `POST`

**Путь**: `/v1/messages`

Совместим с Anthropic Messages API: штатный пакет `anthropic` работает, если указать `base_url="https://llm.vcpay.ru"` — **без** `/v1`, путь `/v1/messages` пакет добавляет сам. Claude Code подключается переменными `ANTHROPIC_BASE_URL=https://llm.vcpay.ru` и `ANTHROPIC_AUTH_TOKEN`.

С `"stream": true` ответ приходит событиями SSE.

Здесь перечислены поля, работу которых мы проверяем. Остальные поля формата Anthropic модель может принять, но их поведение не входит в наш контракт.

## Параметры

### Header параметры

- `anthropic-version: string` (required) — Версия формата Anthropic. Пакет `anthropic` ставит её сам.


## Тело запроса

**Обязательно**

Формат: `application/json`

### Схема

- `model: string` (required) — Имя модели из каталога, например `claude-sonnet-5`. Пример: `"claude-sonnet-5"`
- `max_tokens: integer` (required, min: 1) — Потолок токенов ответа. В формате Anthropic обязателен.
- `system: string` — Инструкция модели.
- `messages: array of object` (required) — Диалог по порядку, от первой реплики к последней.
  - `role: string` (required) — Кто говорит.
    Значения: `user`, `assistant`
  - `content: string` (required) — Текст реплики.
- `stream: boolean` (default: false) — Отдавать ответ событиями SSE.

### Пример

```json
{
  "model": "claude-sonnet-5",
  "max_tokens": 256,
  "messages": [
    {
      "role": "user",
      "content": "Привет"
    }
  ]
}
```

## Пример запроса

```bash
curl "https://llm.vcpay.ru/v1/messages" \
  -H "Authorization: Bearer ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{
  "model": "claude-sonnet-5",
  "max_tokens": 256,
  "messages": [
    {
      "role": "user",
      "content": "Привет"
    }
  ]
}'
```

## Ответы

### 200: Ответ модели. При `"stream": true` — поток событий `text/event-stream`.

**Схема ответа:**

- `id: string` (required) — Идентификатор ответа.
- `type: string` (required) — Всегда `message`.
- `role: string` (required) — Всегда `assistant`.
- `model: string` (required) — Модель, которая ответила.
- `content: array of object` (required) — Части ответа.
  - `type: string` (required) — Вид части. Текст — `text`.
  - `text: string` (required) — Текст ответа.
- `stop_reason: string` (required) — Почему ответ закончился. `end_turn` — модель договорила, `max_tokens` — упёрлись в потолок.
- `usage: object` (required) — Токены запроса. По ним считается расход.
  - `input_tokens: integer` (required) — Токенов на входе.
  - `output_tokens: integer` (required) — Токенов на выходе, включая размышления модели.

**Пример ответа:**

```json
{
  "id": "msg_01ABCDEF",
  "type": "message",
  "role": "assistant",
  "model": "claude-sonnet-5",
  "content": [
    {
      "type": "text",
      "text": "Привет! Чем помочь?"
    }
  ],
  "stop_reason": "end_turn",
  "usage": {
    "input_tokens": 9,
    "output_tokens": 8
  }
}
```

### 401: Ключ неизвестен, отключён или удалён — или ключу нечего тратить: исчерпан его потолок либо кончились деньги на счёте компании. Тело отказа — в формате OpenAI, как у `/v1/chat/completions`.

**Схема ответа при ошибке:**

- `error: object` (required) — Что случилось.
  - `message: string` (required) — Текст отказа для человека. В конце — номер запроса в скобках, его стоит приложить к обращению в поддержку.
  - `type: string` — Класс отказа.
  - `code: string` — Код отказа. Сейчас чаще пустой — ветвитесь по HTTP-коду.

**Пример ответа:**

```json
{
  "error": {
    "code": "",
    "message": "Invalid token (request id: 202610120924428084477238268d9d650vH0Yey)",
    "type": "new_api_error"
  }
}
```

### 403: Запрос не помещается в остаток ключа, или ключу не разрешена эта модель.

**Схема ответа при ошибке:**

- `error: object` (required) — Что случилось.
  - `message: string` (required) — Текст отказа для человека. В конце — номер запроса в скобках, его стоит приложить к обращению в поддержку.
  - `type: string` — Класс отказа.
  - `code: string` — Код отказа. Сейчас чаще пустой — ветвитесь по HTTP-коду.

**Пример ответа:**

```json
{
  "error": {
    "message": "Пример текста",
    "type": "string",
    "code": "string"
  }
}
```

### 429: Слишком много запросов. Повторите с задержкой и увеличивайте её при повторных отказах.

### 503: Такой модели нет — вероятна опечатка в имени. Сверьтесь с каталогом.

**Схема ответа при ошибке:**

- `error: object` (required) — Что случилось.
  - `message: string` (required) — Текст отказа для человека. В конце — номер запроса в скобках, его стоит приложить к обращению в поддержку.
  - `type: string` — Класс отказа.
  - `code: string` — Код отказа. Сейчас чаще пустой — ветвитесь по HTTP-коду.

**Пример ответа:**

```json
{
  "error": {
    "message": "Пример текста",
    "type": "string",
    "code": "string"
  }
}
```

