Эндпоинты, параметры и формат ответа повторяют OpenAI API. Если ваш код уже работает с OpenAI — поменяйте base_url и ключ, остальное не трогайте.
https://api.cheapai.io/v1https://api.cheapai.io (клиент сам добавляет /v1/messages)Authorization: Bearer cai-.... Ключ — из раздела API-ключи.Имя модели — из каталога: gpt-4o, claude-3-5-sonnet, gemini-1-5-pro и т. д. Шлюз сам направляет запрос к нужному провайдеру по имени модели.
| Метод и путь | Назначение |
|---|---|
POST /v1/chat/completions | Чат-комплишены — основной эндпоинт для диалоговых моделей. Поддерживает stream. |
POST /v1/embeddings | Векторные представления текста. |
GET /v1/models | Список доступных моделей и их идентификаторов. |
POST /v1/messages | Anthropic-совместимый эндпоинт (его используют Claude Code и Anthropic SDK). |
Основные параметры тела запроса:
| Поле | Тип | Описание |
|---|---|---|
model | string | Обязательно. Имя модели из каталога. |
messages | array | Обязательно. Список сообщений . |
stream | bool | Если true — ответ приходит по частям (SSE). По умолчанию false. |
temperature | number | Степень случайности, обычно 0–2. По умолчанию — как у модели. |
max_tokens | int | Ограничение на длину ответа в токенах. |
top_p, stop, presence_penalty, frequency_penalty | — | Передаются провайдеру как есть, если он их поддерживает. |
Запрос:
curl
curl https://api.cheapai.io/v1/chat/completions \
-H "Authorization: Bearer $CHEAPAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [
{"role": "system", "content": "Отвечай кратко."},
{"role": "user", "content": "Что такое токен в LLM?"}
]
}'Ответ:
json
{
"id": "chatcmpl-abc123",
"object": "chat.completion",
"created": 1730000000,
"model": "gpt-4o",
"choices": [
{
"index": 0,
"message": {"role": "assistant", "content": "Минимальная единица текста..."},
"finish_reason": "stop"
}
],
"usage": {"prompt_tokens": 21, "completion_tokens": 14, "total_tokens": 35}
}То же через SDK:
python
from openai import OpenAI
client = OpenAI(base_url="https://api.cheapai.io/v1", api_key="cai-...")
resp = client.chat.completions.create(
model="claude-3-5-sonnet",
messages=[{"role": "user", "content": "Привет!"}],
)
print(resp.choices[0].message.content)node (openai sdk)
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.cheapai.io/v1",
apiKey: "cai-...",
});
const resp = await client.chat.completions.create({
model: "gpt-4o",
messages: [{ role: "user", content: "Привет!" }],
});
console.log(resp.choices[0].message.content);С "stream": true ответ приходит как поток событий text/event-stream: каждое событие — строка data: с объектом chat.completion.chunk, где в choices[0].delta лежит очередной кусочек. Поток завершается строкой data: [DONE].
поток событий
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"role":"assistant","content":""},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"При"},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{"content":"вет"},"finish_reason":null}]}
data: {"id":"chatcmpl-abc123","object":"chat.completion.chunk","choices":[{"index":0,"delta":{},"finish_reason":"stop"}]}
data: [DONE]python · стриминг
stream = client.chat.completions.create(
model="gpt-4o",
messages=[{"role": "user", "content": "Считай до пяти."}],
stream=True,
)
for chunk in stream:
delta = chunk.choices[0].delta.content or ""
print(delta, end="", flush=True)curl
curl https://api.cheapai.io/v1/embeddings \
-H "Authorization: Bearer $CHEAPAI_API_KEY" \
-H "Content-Type: application/json" \
-d '{"model": "text-embedding-3", "input": "пример текста"}'Ответ — массив data[].embedding с числами и поле usage. input может быть строкой или массивом строк (батч).
Для инструментов, заточенных под Anthropic (Claude Code, Anthropic SDK), есть нативный эндпоинт /v1/messages. Базовый URL — без /v1: клиент добавит путь сам.
терминал
export ANTHROPIC_BASE_URL="https://api.cheapai.io"
export ANTHROPIC_AUTH_TOKEN="cai-..."Подробнее — Claude Code.
В ответе без стриминга поле usage содержит prompt_tokens, completion_tokens и total_tokens. По этим числам и тарифу модели считается стоимость запроса; итоговая сумма по каждому запросу — в истории расходов в кабинете. Как устроена тарификация — на странице Тарификация.
У каждой модели есть ограничение на частоту запросов; при его превышении приходит 429 — в этом случае повторите запрос с экспоненциальной задержкой. Полный список кодов и что с ними делать — на странице Коды ошибок.
Дальше: Коды ошибок · FAQ для разработчиков · Каталог моделей.