RawLine / Документация API
Справочник API
OpenAI-совместимый. Базовый URL https://app.rawline.dev,
инференс под /v1. Машиночитаемый двойник:
openapi.json. Авторизация: Authorization: Bearer rlk_…
на каждом вызове /v1/*. Форма ошибок:
{"error":{"type":"<код>","message":"…"}} для инференса,
{"ok":false,"error":{"code":"<код>"}} для вызовов кабинета.
Быстрый старт
cURL, обычный запрос
curl https://app.rawline.dev/v1/chat/completions \
-H "Authorization: Bearer rlk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o-mini",
"messages": [{"role": "user", "content": "Привет!"}],
"max_tokens": 256,
"temperature": 0.7
}'
Python (OpenAI SDK)
# Базовый URL реле + ваш ключ
from openai import OpenAI
client = OpenAI(base_url="https://app.rawline.dev/v1", api_key="rlk_YOUR_KEY")
r = client.chat.completions.create(model="gpt-4o-mini",
messages=[{"role": "user", "content": "Привет!"}])
print(r.choices[0].message.content)
Node (OpenAI SDK)
// Базовый URL реле + ваш ключ
import OpenAI from "openai";
const client = new OpenAI({ baseURL: "https://app.rawline.dev/v1", apiKey: "rlk_YOUR_KEY" });
const r = await client.chat.completions.create({ model: "gpt-4o-mini",
messages: [{ role: "user", content: "Привет!" }] });
console.log(r.choices[0].message.content);
Модели и цены
curl https://app.rawline.dev/v1/models -H "Authorization: Bearer rlk_YOUR_KEY"
Каждая запись содержит id, name,
context_length (+ context_source:
members = гарантированный минимум среди провайдеров,
declared = план оператора),
max_output_tokens, supported_parameters,
architecture.input_modalities и цены тенанта
pricing {prompt, completion} в USD за токен.
В списке только обслуживаемые модели: модель, у провайдеров которой нет ключей, скрыта.
Модель без цены отвечает 402 price_not_set — задайте цену в
дашборде перед вызовом.
Стриминг (SSE)
curl -N https://app.rawline.dev/v1/chat/completions \
-H "Authorization: Bearer rlk_YOUR_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"gpt-4o-mini","messages":[{"role":"user","content":"Привет"}],
"stream":true, "max_tokens": 64}'
Фреймы — это data: {…} чанки OpenAI, завершаются
data: [DONE]. Python:
# Стриминг: печатаем дельты по мере прихода
stream = client.chat.completions.create(model="gpt-4o-mini",
messages=[{"role": "user", "content": "Привет"}], stream=True)
for chunk in stream:
print(chunk.choices[0].delta.content or "", end="")
Другие диалекты
| Маршрут | Формат |
|---|---|
POST /v1/messages | Anthropic Messages |
POST /v1/responses | OpenAI Responses |
POST /v1beta/models/*… | Gemini :generateContent / :streamGenerateContent |
Все декодируются в одно IR, идут через одну цепочку отказоустойчивости и биллингуются один раз.
Опциональные заголовки: X-Relay-Preset: <имя> применяет пресет,
X-Rawline-Session: <id> задаёт область памяти диалога (изолирована по тенанту).
Кабинет
| Вызов | Примечания |
|---|---|
POST /api/auth/telegram | JSON виджета входа. Первый вход выпускает API-ключ (api_key в ответе); позже ключ не возвращается. |
GET /v1/balance | balance_usd / hold_usd / spendable_usd + сырая квота. |
GET+POST /v1/keys, DELETE /v1/keys/{id} | Ключи самообслуживания, максимум 5 живых. Секрет показывается один раз. |
POST /v1/topup {"amount_usd": 25} | Счёт Heleket → pay_url. Вебхук зачисляет номинал. |
GET /v1/invoices | Свои счета, сначала новые, pending включены. |
GET /v1/usage?limit=50 | Свои траты, сначала новые, плюс 30-дневная summary. Строки отозванных ключей сохраняются. |
POST /v1/promo/redeem {"code":"…"} | Одно погашение на пользователя на код. |
Все вызовы кабинета живут на хосте приложения: кабинет.
Ошибки
Инференс (error.type)
| HTTP | type | Значение |
|---|---|---|
| 400 | invalid_request | Тело — не JSON или диалект не удалось декодировать. |
| 400 | preset_conflict | Бандл с привязанным пресетом + X-Relay-Preset вместе. |
| 401 | authentication_error | Отсутствующий, неизвестный, отозванный или просроченный ключ — одно тело на всех. |
| 402 | insufficient_balance | Холд превышает доступный остаток. Пополните баланс. |
| 402 | price_not_set | У модели нет цены оператора. Бесплатно не обслуживается. |
| 403 | model_not_allowed | Ключ ограничен другими моделями. |
| 404 | no_such_preset | Неизвестное имя в X-Relay-Preset. |
| 404 | model_not_available | Сейчас эту модель не обслуживает ни один настроенный провайдер. |
| 422 | preset_unusable | Пресет не удалось применить к этому запросу. |
| 429 | rate_limit_error | Бюджет ключа исчерпан (Retry-After выставлен) или провайдер троттлит реле. |
| 502 | provider_credential_error | Апстрим отклонил ключ реле — проблема оператора, специально отдаётся как 502. |
| 502 | bad_gateway / api_error | Вызов апстрима не удался. |
| 502 | relay_encoding_error | Реле собрало запрос, который провайдер отклонил. |
| 503 | no_provider_available / overloaded_error | Запрос нечем обслужить. |
| 503 | billing_unavailable | Хранилище недоступно — отказ вместо небиллингуемого обслуживания. |
| 500 | relay_configuration_error / cache_error | Сбой на стороне оператора, детали в логе реле. |
Кабинет (error.code)
| HTTP | code | Где |
|---|---|---|
| 401 | login_disabled / bad_signature / bad_id / stale / future / missing_hash | Вход через Telegram |
| 404 | no_billing_account | Операторский ключ просит кошелёк |
| 409 | key_limit | Уже 5 живых ключей |
| 404 | no_such_key | Отзыв чужого (или несуществующего) ключа |
| 422 | bad_amount | Пополнение вне допустимого диапазона |
| 503 | payments_disabled / payments_not_receivable | Heleket не настроен / нет callback-URL |
| 502 | heleket_error / invoice_not_created | Шлюз отклонил счёт |
| 422 | invalid_code / code_expired / code_exhausted / already_redeemed | Погашение промокода |
Память диалогов
Отправляйте X-Rawline-Session: <id> (любая строка до 128 символов,
по умолчанию default), и реле будет подставлять записанные ответы ассистента
между отправляемыми вами сообщениями пользователя: пересылайте свои пользовательские реплики (или всю историю)
и пропускайте ответы ассистента — реле их восстановит, и провайдер посчитает меньше
повторных токенов. Запрос, несущий только совсем новую реплику, не совпадёт с записанным префиксом
и уйдёт как есть. Изоляция по тенанту — сессии никогда не протекают между кошельками.
Хранятся только завершённые ответы; оборванный ответ не отравляет последующие ходы.
Лимиты
Бюджеты RPM / TPM / конкурентности на ключ отвечают 429 с
Retry-After. Попадания в кэш и присоединения к одиночному полёту не тратят апстрим-токены
и не требуют холда. Один процесс на базу данных: лимиты действуют на процесс.