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": "..."}}; см. Ошибки.