# API Anthropic Messages

> Anthropic Messages API в OpenCheese: POST /v1/messages с x-api-key, потоковый ответ, инструменты, изображения, output_config.effort, бесплатный подсчёт токенов.
>
> Веб-страница: https://opencheese.dev/ru/docs/messages/ · Все страницы документации: https://opencheese.dev/ru/docs.md

`POST https://api.opencheese.dev/v1/messages` — это Anthropic Messages API, на котором работают
Claude Code, Claude Desktop и SDK Anthropic. Его базовый URL — `https://api.opencheese.dev`, без `/v1`: SDK сами добавляют `/v1/messages`.

## Первый запрос

```bash
curl https://api.opencheese.dev/v1/messages \
  -H "x-api-key: $OPENCHEESE_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model": "MODEL_ID", "max_tokens": 1024, "system": "Answer in one sentence.", "messages": [{"role": "user", "content": "What is a gateway?"}]}'
```

Вместо `x-api-key` подойдёт и `Authorization: Bearer`. Ответ приходит в формате Anthropic:

```json
{
  "id": "msg_01AbCdEf",
  "type": "message",
  "role": "assistant",
  "model": "MODEL_ID",
  "content": [{ "type": "text", "text": "A gateway passes your requests on to the models behind it." }],
  "stop_reason": "end_turn",
  "usage": { "input_tokens": 24, "output_tokens": 13, "cache_read_input_tokens": 0, "cache_creation_input_tokens": 0 }
}
```

## Параметры

| Поле | Примечания |
| --- | --- |
| `model` | Обязательное. `id` из [`/v1/models`](https://opencheese.dev/ru/docs/models.md); ID Claude с датой, например `...-20251001`, указывают на ту же модель без даты. |
| `messages` | Обязательное. Реплики `user` и `assistant` с блоками текста, изображений, `tool_use` и `tool_result`. |
| `system` | Строка или текстовые блоки. |
| `stream` | `true`, чтобы получить ответ в виде server-sent events. |
| `tools`, `tool_choice` | Использование инструментов, если модель их поддерживает. |
| `output_config.effort` | Уровень из `supported_reasoning_levels` модели. |
| `max_tokens`, `temperature`, `top_p`, `thinking` | Необязательные. Если их не задать, используются значения модели по умолчанию. |

## Уровень рассуждений

Глубину рассуждений модели выбирайте полем Anthropic `output_config.effort` (поле
`reasoning_effort` тоже принимается). Если уровень не задан, используется уровень модели по
умолчанию.

```bash
curl https://api.opencheese.dev/v1/messages \
  -H "x-api-key: $OPENCHEESE_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model": "MODEL_ID", "max_tokens": 4096, "output_config": {"effort": "high"}, "messages": [{"role": "user", "content": "Plan a three-day trip to Lyon."}]}'
```

Уровень, которого у модели нет, отклоняется с ошибкой `unsupported_reasoning_effort`, а поле
`supported_reasoning_levels` в ошибке перечисляет уровни, которые модель поддерживает.
Рассуждения, если модель их возвращает, приходят блоками контента `thinking`.

## Потоковый ответ

С `"stream": true` ответ приходит событиями Anthropic: `message_start`, `content_block_start`,
`content_block_delta` (текст в `delta.text`), `content_block_stop`, `message_delta` со
`stop_reason` и расходом токенов, затем `message_stop`. Сбой после начала потока приходит событием
`error`.

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

event: message_delta
data: {"type":"message_delta","delta":{"stop_reason":"end_turn"},"usage":{"output_tokens":6}}
```

## Изображения и инструменты

Изображения передаются блоками `image` с источником `source` в base64 или источником типа `url` —
для моделей, у которых `modalities.input` содержит `image`. Инструменты работают в формате
Anthropic: `tools` с `input_schema`, блок `tool_use` в ответе и ваш блок `tool_result` в следующей
реплике пользователя.

```json
{
  "model": "MODEL_ID",
  "max_tokens": 1024,
  "tools": [
    {
      "name": "get_weather",
      "description": "Current weather for a city",
      "input_schema": { "type": "object", "properties": { "city": { "type": "string" } }, "required": ["city"] }
    }
  ],
  "messages": [{ "role": "user", "content": "What is the weather in Paris?" }]
}
```

## Подсчёт токенов

`POST /v1/messages/count_tokens` принимает то же тело запроса и возвращает оценку числа его входных
токенов. Это бесплатно: ничего не списывается, и транзакция не записывается.

```bash
curl https://api.opencheese.dev/v1/messages/count_tokens \
  -H "x-api-key: $OPENCHEESE_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "Content-Type: application/json" \
  -d '{"model": "MODEL_ID", "messages": [{"role": "user", "content": "How many tokens is this?"}]}'
```

```json
{ "input_tokens": 9 }
```

## SDK

Python:

```python
import anthropic

client = anthropic.Anthropic(base_url="https://api.opencheese.dev", api_key="YOUR_OPENCHEESE_API_KEY")
message = client.messages.create(
    model="MODEL_ID",
    max_tokens=1024,
    messages=[{"role": "user", "content": "Write a haiku about cheese."}],
)
print(message.content[0].text)
```

JavaScript:

```javascript
import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic({ baseURL: "https://api.opencheese.dev", apiKey: process.env.OPENCHEESE_API_KEY });
const message = await client.messages.create({
  model: "MODEL_ID",
  max_tokens: 1024,
  messages: [{ role: "user", content: "Write a haiku about cheese." }]
});
console.log(message.content[0].text);
```

Ошибки приходят в обёртке Anthropic, `{"type": "error", "error": {...}}`; подробнее — на
странице [Ошибки и лимиты запросов](https://opencheese.dev/ru/docs/errors.md). Добавьте заголовок
[`opencheese-session-uuid`](https://opencheese.dev/ru/docs/sessions.md), чтобы объединить запросы одного разговора.
