Документация API
Полная документация по работе с API Clavis.to. Совместимо с OpenAI SDK.
1. Быстрый старт
Clavis.to предоставляет единый OpenAI-совместимый API для доступа к 80+ языковым моделям. Для начала работы вам понадобится API-ключ.
Шаг 1: Создайте аккаунт
Зарегистрируйтесь на clavis.to и пополните баланс.
Шаг 2: Создайте API-ключ
Перейдите в Dashboard → API-ключи и создайте новый ключ. Ключ начинается с sk- и показывается только один раз — сохраните его в надёжном месте.
Шаг 3: Сделайте первый запрос
curl https://api.clavis.to/v1/chat/completions \
-H "Authorization: Bearer sk-your-api-key" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [{"role": "user", "content": "Hello!"}]
}'2. Аутентификация
Все запросы к API должны содержать заголовок Authorization с вашим API-ключом:
Authorization: Bearer sk-your-api-keyБазовый URL
https://api.clavis.to/v1Если вы используете OpenAI SDK, просто замените base_url на наш эндпоинт — никаких других изменений в коде не требуется.
3. Модели
Получите список всех доступных моделей с информацией о ценах. Этот эндпоинт не требует аутентификации.
/v1/modelscurl https://api.clavis.to/v1/modelsПример ответа
{
"object": "list",
"data": [
{
"id": "gpt-4o",
"object": "model",
"owned_by": "OpenAI",
"display_name": "gpt-4o",
"billing_type": "per_token",
"pricing": {
"input_per_1m_rub": 43.75,
"output_per_1m_rub": 131.25,
"input_per_1m_cny": 2.5,
"output_per_1m_cny": 7.5
},
"endpoints": ["openai"],
"is_active": true
}
]
}/v1/models/{model_id}Получить информацию о конкретной модели по её идентификатору.
4. Chat Completions
/v1/chat/completionsОсновной эндпоинт для генерации ответов. Полностью совместим со спецификацией OpenAI Chat Completions API.
Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
| model | string | Да | Идентификатор модели, например gpt-4o, claude-3.5-sonnet |
| messages | array | Да | Массив сообщений диалога. Каждое сообщение содержит role и content |
| temperature | float | Нет | Температура сэмплирования от 0 до 2. Более высокие значения дают более случайные ответы |
| max_tokens | integer | Нет | Максимальное количество токенов в ответе |
| stream | boolean | Нет | Включить стриминг через Server-Sent Events. По умолчанию false |
| top_p | float | Нет | Nucleus sampling. Альтернатива temperature |
| stop | string | array | Нет | Последовательности, при которых модель прекратит генерацию |
| presence_penalty | float | Нет | Штраф за повторение тем. От -2.0 до 2.0 |
Роли сообщений
| Роль | Описание |
|---|---|
| system | Системное сообщение, задающее контекст и поведение модели |
| user | Сообщение пользователя (запрос) |
| assistant | Ответ модели. Используется для предоставления контекста предыдущих ответов |
Пример запроса
{
"model": "gpt-4o",
"messages": [
{
"role": "system",
"content": "Ты полезный ассистент."
},
{
"role": "user",
"content": "Объясни квантовые вычисления простыми словами"
}
],
"temperature": 0.7,
"max_tokens": 1000
}5. Стриминг
Для получения ответа в режиме реального времени установите параметр "stream": true. Ответ будет возвращаться в формате Server-Sent Events (SSE) — каждый чанк передаётся по мере генерации.
curl
curl https://api.clavis.to/v1/chat/completions \
-H "Authorization: Bearer sk-your-key" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4o","messages":[{"role":"user","content":"Hello"}],"stream":true}'Формат SSE-чанка
data: {"id":"req-abc123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"Hello"},"finish_reason":null}]}
data: {"id":"req-abc123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"!"},"finish_reason":"stop"}]}
data: [DONE]Поток завершается сообщением data: [DONE]. Каждая строка данных — это JSON-объект с полем delta, содержащим сгенерированную часть ответа.
6. Формат ответа
{
"id": "req-a1b2c3d4e5f6g7h8",
"object": "chat.completion",
"created": 1711234567,
"model": "gpt-4o",
"choices": [
{
"index": 0,
"message": {
"role": "assistant",
"content": "Привет! Чем могу помочь?"
},
"finish_reason": "stop"
}
],
"usage": {
"prompt_tokens": 12,
"completion_tokens": 8,
"total_tokens": 20
}
}Поля ответа
| Поле | Описание |
|---|---|
| id | Уникальный идентификатор запроса |
| choices | Массив вариантов ответа |
| choices[].message | Сгенерированное сообщение с role и content |
| choices[].finish_reason | Причина завершения: stop, length, content_filter |
| usage | Использованные токены: prompt, completion, total |
7. Обработка ошибок
API возвращает стандартные HTTP-коды ошибок. Тело ответа содержит объект error с описанием проблемы.
| Код | Описание | Действие |
|---|---|---|
| 400 | Некорректный запрос | Проверьте формат и параметры запроса |
| 401 | Неверный или отсутствующий API-ключ | Проверьте заголовок Authorization |
| 402 | Недостаточно средств на балансе | Пополните баланс в Dashboard → Баланс |
| 403 | Модель не разрешена для данного ключа | Обновите ограничения API-ключа |
| 404 | Модель не найдена | Проверьте model ID через GET /v1/models |
| 429 | Превышен лимит запросов | Подождите и повторите запрос с экспоненциальным бэкоффом |
| 500 | Внутренняя ошибка / ошибка провайдера | Повторите запрос. Если ошибка повторяется — обратитесь в поддержку |
Формат ошибки
{
"detail": "Недостаточно средств. Пожалуйста, пополните баланс."
}8. Биллинг и тарификация
Потокенная тарификация — стоимость рассчитывается отдельно за входные (prompt) и выходные (completion) токены. Цены указаны за 1 миллион токенов в рублях.
Тарификация за запрос — некоторые модели (например, генерация изображений) тарифицируются фиксированной суммой за каждый запрос.
Формула расчёта:
стоимость = (prompt_tokens × цена_ввода + completion_tokens × цена_вывода) / 1 000 000Списание средств происходит автоматически после каждого успешного запроса. Можно отслеживать расходы в Dashboard → Активность.
Наценка: цены провайдеров в CNY конвертируются в рубли по текущему курсу с наценкой 40%. Курс обновляется автоматически каждые 6 часов.
9. Примеры на Python
Используя openai SDK (рекомендуется)
from openai import OpenAI
client = OpenAI(
api_key="sk-your-api-key",
base_url="https://api.clavis.to/v1"
)
# Обычный запрос
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{"role": "system", "content": "Ты полезный ассистент"},
{"role": "user", "content": "Что такое нейронные сети?"}
],
temperature=0.7,
max_tokens=1000
)
print(response.choices[0].message.content)
print(f"Токены: {response.usage.total_tokens}")
print(f"Модель: {response.model}")Стриминг на Python
stream = client.chat.completions.create(
model="claude-3.5-sonnet",
messages=[{"role": "user", "content": "Hello!"}],
stream=True
)
for chunk in stream:
if chunk.choices[0].delta.content:
print(chunk.choices[0].delta.content, end="", flush=True)Используя httpx (без SDK)
import httpx
response = httpx.post(
"https://api.clavis.to/v1/chat/completions",
headers={"Authorization": "Bearer sk-your-key"},
json={
"model": "deepseek-v3",
"messages": [{"role": "user", "content": "Hello!"}]
},
timeout=120.0
)
data = response.json()
print(data["choices"][0]["message"]["content"])10. Примеры на JavaScript
fetch API
const response = await fetch("https://api.clavis.to/v1/chat/completions", {
method: "POST",
headers: {
"Authorization": "Bearer sk-your-key",
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "gpt-4o",
messages: [{ role: "user", content: "Hello!" }],
}),
});
const data = await response.json();
console.log(data.choices[0].message.content);openai npm package
import OpenAI from "openai";
const client = new OpenAI({
apiKey: "sk-your-key",
baseURL: "https://api.clavis.to/v1",
});
const completion = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(completion.choices[0].message.content);Стриминг на JavaScript
const stream = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Hello!" }],
stream: true,
});
for await (const chunk of stream) {
const content = chunk.choices[0]?.delta?.content || "";
process.stdout.write(content);
}11. Лимиты и ограничения
| Параметр | Значение |
|---|---|
| Максимальный таймаут запроса | 300 секунд |
| Максимальный размер тела запроса | 10 MB |
| Контекстное окно | Зависит от модели (см. /v1/models) |
| Минимальный баланс для запроса | Баланс > 0 ₽ (допускается овердрафт до 10 ₽) |
Интерактивная документация
Swagger UI и ReDoc доступны для тестирования API прямо в браузере.