LLMoxy предоставляет полностью совместимый интерфейс Anthropic Messages API, оптимизированный для моделей серии Claude. Пользователям официального SDK Anthropic достаточно изменить base_url для переключения.
Базовый URL
https://llmoxy.com/v1
Аутентификация
Поддерживаются два способа аутентификации:
Способ 1: x-api-key (рекомендуется)
x-api-key: YOUR_API_KEY
Способ 2: Authorization
Authorization: Bearer YOUR_API_KEY
Messages API
Основной диалоговый интерфейс Claude.
URL запроса
POST /v1/messages
Пример запроса
curl https://llmoxy.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "Напишите алгоритм бинарного поиска на Python"
}
]
}'
Параметры запроса
| Параметр | Тип | Обязательно | Описание |
|---|---|---|---|
| model | string | Да | Название модели |
| messages | array | Да | Список сообщений диалога |
| max_tokens | integer | Да | Максимальное количество генерируемых токенов |
| system | string | Нет | Системный промпт |
| temperature | number | Нет | Параметр температуры, 0–1 |
| top_p | number | Нет | Параметр nucleus sampling |
| stream | boolean | Нет | Включить потоковый вывод |
| stop_sequences | array | Нет | Стоп-последовательности |
Формат сообщений
В отличие от OpenAI, формат Anthropic использует отдельный параметр для системного промпта:
{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"system": "Вы эксперт по программированию на Python",
"messages": [
{
"role": "user",
"content": "Напишите быструю сортировку"
},
{
"role": "assistant",
"content": "Хорошо, я напишу быструю сортировку на Python..."
},
{
"role": "user",
"content": "Добавьте подробные комментарии"
}
]
}
Примечание
- messages могут содержать только роли
userиassistant- Должны начинаться с сообщения
user- Сообщения
userиassistantдолжут чередоваться
Формат ответа
{
"id": "msg_123",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Это содержимое ответа Claude"
}
],
"model": "claude-sonnet-4-20250514",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 25,
"output_tokens": 150
}
}
Потоковый вывод
Установите stream: true для включения потокового вывода:
curl https://llmoxy.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [{"role": "user", "content": "Привет"}],
"stream": true
}'
Формат потокового ответа
event: message_start
data: {"type":"message_start","message":{"id":"msg_123",...}}
event: content_block_delta
data: {"type":"content_block_delta","delta":{"type":"text_delta","text":"П"}}
event: content_block_delta
data: {"type":"content_block_delta","delta":{"type":"text_delta","text":"р"}}
event: message_stop
data: {"type":"message_stop"}
Поддерживаемые модели
| Модель | Описание | Доступные группы |
|---|---|---|
| claude-opus-4-20250514 | Максимальная производительность | Max, Kiro |
| claude-sonnet-4-20250514 | Сбалансированный выбор | Max, Kiro |
| claude-haiku-4-20250414 | Быстрый ответ | Max, Kiro |
ПОДСКАЗКА Точный список доступных моделей см. на официальной площадке.
Поддержка мультимодальности
Claude поддерживает ввод изображений:
{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
},
{
"type": "text",
"text": "Что на этой картинке?"
}
]
}
]
}
Поддерживаемые форматы изображений: JPEG, PNG, GIF, WebP. Максимум 5 МБ на изображение.
Примеры кода
Python (официальный SDK)
from anthropic import Anthropic
client = Anthropic(
api_key="YOUR_API_KEY",
base_url="https://llmoxy.com/v1"
)
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{"role": "user", "content": "Напишите декоратор Python"}
]
)
print(message.content[0].text)
Python (потоковый)
with client.messages.stream(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "Напишите статью"}]
) as stream:
for text in stream.text_stream:
print(text, end="", flush=True)
Node.js (официальный SDK)
import Anthropic from '@anthropic-ai/sdk';
const client = new Anthropic({
apiKey: 'YOUR_API_KEY',
baseURL: 'https://llmoxy.com/v1'
});
const message = await client.messages.create({
model: 'claude-sonnet-4-20250514',
max_tokens: 1024,
messages: [
{ role: 'user', content: 'Напишите быструю сортировку' }
]
});
console.log(message.content[0].text);
cURL
curl https://llmoxy.com/v1/messages \
-H "content-type: application/json" \
-H "x-api-key: YOUR_API_KEY" \
-d '{
"model": "claude-sonnet-4-20250514",
"max_tokens": 1024,
"messages": [
{"role": "user", "content": "Hello, Claude!"}
]
}'
Обработка ошибок
Формат ответа об ошибке
{
"type": "error",
"error": {
"type": "invalid_request_error",
"message": "Описание ошибки"
}
}
Распространённые типы ошибок
| Тип ошибки | Описание |
|---|---|
| invalid_request_error | Ошибка параметра запроса |
| authentication_error | Ошибка аутентификации |
| permission_error | Недостаточно прав |
| not_found_error | Ресурс не найден |
| rate_limit_error | Превышен лимит запросов |
| api_error | Внутренняя ошибка |
| overloaded_error | Перегрузка сервиса |
Пример обработки ошибок
from anthropic import Anthropic, APIError
client = Anthropic(
api_key="YOUR_API_KEY",
base_url="https://llmoxy.com/v1"
)
try:
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[{"role": "user", "content": "Hello"}]
)
except APIError as e:
print(f"Тип ошибки: {e.type}")
print(f"Сообщение об ошибке: {e.message}")
Расширенное использование
1. Системный промпт
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
system="Вы эксперт по Python, хорошо разбираетесь в анализе данных и машинном обучении.",
messages=[
{"role": "user", "content": "Как обработать пропущенные значения с помощью pandas?"}
]
)
2. Многоходовой диалог
conversation = [
{"role": "user", "content": "Напишите класс пользователя"},
{"role": "assistant", "content": "Хорошо, я напишу класс User..."},
{"role": "user", "content": "Добавьте шифрование пароля"}
]
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=conversation
)
3. Анализ изображений
import base64
with open("image.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode()
message = client.messages.create(
model="claude-sonnet-4-20250514",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": image_data
}
},
{
"type": "text",
"text": "Проанализируйте эту архитектурную диаграмму"
}
]
}
]
)
Лучшие практики
1. Разумно задавайте max_tokens
Разные модели имеют разные максимальные выходы: Opus 32K, Sonnet 64K, Haiku 8K. Задавайте в соответствии с реальными потребностями, чтобы избежать лишних расходов.
2. Используйте параметр system для промптов
Помещайте определения ролей в параметр system, а не в messages:
# ✅ Рекомендуется
message = client.messages.create(
system="Вы эксперт по Python",
messages=[{"role": "user", "content": "Напишите код"}],
...
)
# ❌ Не рекомендуется
message = client.messages.create(
messages=[{"role": "user", "content": "Вы эксперт по Python. Напишите код"}],
...
)
3. Обрабатывайте длинные диалоги
Claude имеет контекстное окно 200K, но рекомендуется периодически подводить итоги диалогов и удалять неважные исторические сообщения для экономии токенов.
4. Реализуйте механизм повторных попыток
from tenacity import retry, stop_after_attempt, wait_exponential
@retry(
stop=stop_after_attempt(3),
wait=wait_exponential(multiplier=1, min=4, max=10)
)
def call_claude():
return client.messages.create(...)
Следующие шаги
- Группы и тарифы — подробности о тарифах
- Получить поддержку — свяжитесь с нами при возникновении проблем
