Lovely RouterДокументация
Получить ключ
Models API

Anthropic Messages

Вызывайте Claude через Anthropic Messages API с помощью официальных SDK. Потоковая передача, расширенное мышление, использование инструментов, кеширование промптов и подсчёт токенов работают так, как описано в документации Anthropic.

Lovely Router обслуживает POST /v1/messages и POST /v1/messages/count_tokens ровно так, как их определяет Anthropic. Оставьте свой код, смените базовый URL на https://lovelyrouter.com и используйте ключ Lovely Router. Тела запросов передаются без изменений, поэтому справочником по каждому параметру служит документация Anthropic.

Настройка SDK#

Anthropic SDK передаёт ключ в x-api-key. Authorization: Bearer тоже работает.

curl https://lovelyrouter.com/v1/messages \
  -H "x-api-key: $LOVELY_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-sonnet-5.5",
    "max_tokens": 1024,
    "messages": [{"role": "user", "content": "Explain HTTP caching in two sentences."}]
  }'

SDK также читают ANTHROPIC_BASE_URL и ANTHROPIC_API_KEY из окружения, поэтому для кода, который создаёт клиент по умолчанию, достаточно export ANTHROPIC_BASE_URL=https://lovelyrouter.com.

Доступные сейчас модели Claude: claude-fable-5.1, claude-opus-5.5, claude-sonnet-5.5, claude-haiku-5.5 и более ранние версии. Актуальный список с ценами — в GET /v1/models.

Потоковая передача ответов#

Задайте stream: true или используйте потоковый хелпер SDK. Вы получите стандартную последовательность событий: message_start, content_block_start, content_block_delta, content_block_stop, message_delta, message_stop.

with client.messages.stream(
    model="claude-sonnet-5.5",
    max_tokens=2048,
    messages=[{"role": "user", "content": "Write a limerick about latency."}],
) as stream:
    for text in stream.text_stream:
        print(text, end="", flush=True)
    final = stream.get_final_message()
print("\n", final.usage)

Шлюз удерживает поток до первого токена, поэтому канал, давший сбой в самом начале, заменяется незаметно для вас. Подробности — в разделе Потоковая передача.

Расширенное мышление#

Отправляйте thinking и output_config так, как Anthropic описывает их для вызываемой модели. Текущие модели используют адаптивное мышление с уровнем усилий; более старые модели (Claude 4.5 и ранее) принимают фиксированный budget_tokens. Правила для каждой модели — в руководстве Anthropic по мышлению.

message = client.messages.create(
    model="claude-opus-5.5",
    max_tokens=16000,
    thinking={"type": "adaptive", "display": "summarized"},
    output_config={"effort": "high"},
    messages=[{"role": "user", "content": "How many weekdays are there in 2027?"}],
)
for block in message.content:
    if block.type == "thinking":
        print("Thinking:", block.thinking)
    elif block.type == "text":
        print("Answer:", block.text)

Токены мышления входят в usage.output_tokens и тарифицируются по цене вывода. Когда продолжаете разговор с инструментами, передавайте блоки мышления обратно без изменений.

Использование инструментов#

Описывайте инструменты через JSON Schema в input_schema. Если в ответе есть stop_reason: "tool_use", выполните инструмент и отправьте результат обратно в блоке tool_result.

tools = [{
    "name": "get_weather",
    "description": "Current weather for a city.",
    "input_schema": {
        "type": "object",
        "properties": {"city": {"type": "string"}},
        "required": ["city"],
    },
}]
messages = [{"role": "user", "content": "Do I need an umbrella in Lisbon?"}]

response = client.messages.create(
    model="claude-sonnet-5.5", max_tokens=1024, tools=tools, messages=messages,
)
if response.stop_reason == "tool_use":
    call = next(b for b in response.content if b.type == "tool_use")
    result = {"city": call.input["city"], "forecast": "light rain"}  # your code here
    messages += [
        {"role": "assistant", "content": response.content},
        {"role": "user", "content": [
            {"type": "tool_result", "tool_use_id": call.id, "content": str(result)},
        ]},
    ]
    response = client.messages.create(
        model="claude-sonnet-5.5", max_tokens=1024, tools=tools, messages=messages,
    )
print(response.content[0].text)

Остальные параметры инструментов, например tool_choice и strict, передаются без изменений. Они описаны в руководстве Anthropic по использованию инструментов.

Кеширование длинных промптов#

Отметьте конец стабильной части промпта с помощью cache_control. Первый запрос записывает кеш; последующие запросы, начинающиеся с того же префикса, читают его за долю цены ввода.

response = client.messages.create(
    model="claude-sonnet-5.5",
    max_tokens=1024,
    system=[{
        "type": "text",
        "text": LONG_REFERENCE_DOCUMENT,
        "cache_control": {"type": "ephemeral"},
    }],
    messages=[{"role": "user", "content": "Summarize section 3."}],
)
u = response.usage
print(u.cache_creation_input_tokens, u.cache_read_input_tokens, u.input_tokens)

Для claude-sonnet-5.5 запись в кеш стоит $2.50, а чтение из кеша — $0.10 за миллион токенов против $2.00 за некешированный ввод. Префиксы короче минимума модели не кешируются, и оба поля для них равны нулю. Шлюз держит каждый разговор на канале, где лежит его кеш; см. Кеширование промптов.

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

POST /v1/messages/count_tokens принимает то же тело, что и запрос сообщения, без max_tokens, и возвращает input_tokens. Он бесплатный и работает при нулевом балансе.

curl https://lovelyrouter.com/v1/messages/count_tokens \
  -H "x-api-key: $LOVELY_API_KEY" \
  -H "anthropic-version: 2023-06-01" \
  -H "content-type: application/json" \
  -d '{"model": "claude-sonnet-5.5",
       "messages": [{"role": "user", "content": "Hello, Claude"}]}'

Подсчёт приблизительный

Используйте count_tokens, чтобы проверить, укладывается ли промпт в контекстное окно, или чтобы спланировать бюджет. Списание за вызов всегда рассчитывается по usage, который модель сообщает в ответе.

Claude Code#

Claude Code говорит на этом API. Задайте ANTHROPIC_BASE_URL=https://lovelyrouter.com, а в ANTHROPIC_AUTH_TOKEN укажите свой ключ, и каждый сеанс будет оставаться на одном канале, чтобы его кеш промптов продолжал работать. Полная настройка, включая выбор моделей, — в разделе Использовать в своих инструментах.

Заголовки#

ЗаголовокПримечания
x-api-key или Authorization: BearerВаш ключ Lovely Router. Обязателен.
anthropic-versionПересылается. Если не указан, используется 2023-06-01.
anthropic-betaПересылается как есть.
x-lovely-groupНеобязателен. Закрепляет запрос за группой каналов, если ваш ключ к ней не привязан.
x-session-idНеобязателен. Объединяет запросы в один разговор для маршрутизации с учётом кеша. То же делает metadata.user_id в теле.

Остальные заголовки запроса не пересылаются. Ошибки возвращаются в формате Anthropic, {"type": "error", "error": {"type": "...", "message": "..."}}; см. Ошибки.