Документация 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. Модели

Получите список всех доступных моделей с информацией о ценах. Этот эндпоинт не требует аутентификации.

GET/v1/models
curl 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
    }
  ]
}
GET/v1/models/{model_id}

Получить информацию о конкретной модели по её идентификатору.

4. Chat Completions

POST/v1/chat/completions

Основной эндпоинт для генерации ответов. Полностью совместим со спецификацией OpenAI Chat Completions API.

Параметры запроса

ПараметрТипОбязательныйОписание
modelstringДаИдентификатор модели, например gpt-4o, claude-3.5-sonnet
messagesarrayДаМассив сообщений диалога. Каждое сообщение содержит role и content
temperaturefloatНетТемпература сэмплирования от 0 до 2. Более высокие значения дают более случайные ответы
max_tokensintegerНетМаксимальное количество токенов в ответе
streambooleanНетВключить стриминг через Server-Sent Events. По умолчанию false
top_pfloatНетNucleus sampling. Альтернатива temperature
stopstring | arrayНетПоследовательности, при которых модель прекратит генерацию
presence_penaltyfloatНетШтраф за повторение тем. От -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 прямо в браузере.