Перейти к основному содержимому

API Anthropic Messages

/ Документация API

← Быстрый старт с APIОткрыть как Markdown

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; 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": {...}}; подробнее — на странице Ошибки и лимиты запросов. Добавьте заголовок opencheese-session-uuid, чтобы объединить запросы одного разговора.

В сыре есть дырки. В вашей инфраструктуре их быть не должно.