Один баланс для чата и API
Glasira — шлюз к моделям ИИ с оплатой в рублях. API повторяет OpenAI, поэтому подойдёт любая библиотека, которая умеет работать с OpenAI: достаточно подменить адрес и ключ.
(работает и путь /api/v1, как у OpenRouter)Authorization: Bearer ВАШ_КЛЮЧfrom openai import OpenAI
client = OpenAI(api_key="ВАШ_КЛЮЧ", base_url="BASE_URL")
answer = client.chat.completions.create(
model="openai/gpt-6-luna",
messages=[{"role": "user", "content": "Привет! Чем можешь помочь?"}],
)
print(answer.choices[0].message.content)
print(answer.usage.cost, "₽") # сколько списано
import OpenAI from "openai";
const client = new OpenAI({ apiKey: process.env.GLASIRA_KEY, baseURL: "BASE_URL" });
const answer = await client.chat.completions.create({
model: "openai/gpt-6-luna",
messages: [{ role: "user", content: "Привет!" }],
});
console.log(answer.choices[0].message.content);
curl BASE_URL/chat/completions \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"model":"openai/gpt-6-luna","messages":[{"role":"user","content":"Привет!"}]}'
Имя модели пишется целиком, вместе с разработчиком: openai/gpt-6-luna, а не gpt-6-luna. Короткое имя шлюз не найдёт и ответит 404.
Список моделей с ценами: GET /v1/models или страница Модели, где видно цены, контекст, поддержку инструментов и реальную скорость. Цены в ответе даны в рублях за один токен, на странице — за миллион.
curl BASE_URL/models -H "Authorization: Bearer ВАШ_КЛЮЧ"
Можно передать запасные модели и порядок провайдеров — шлюз попробует их по очереди, пока кто-то не ответит.
{
"model": "openai/gpt-6-luna",
"models": ["anthropic/claude-sonnet-5.5", "deepseek/deepseek-v4.1-flash"],
"provider": { "order": ["openai", "openrouter"], "allow_fallbacks": true },
"messages": [{ "role": "user", "content": "Привет!" }]
}
POST /v1/chat/completions — как у OpenAI. В ответ, кроме обычных полей, приходят:
provider — через кого выполнен запрос;usage.cost — сколько списано в рублях;id и заголовок X-Generation-Id — номер запроса в истории.Для потоковой выдачи передайте "stream": true. Ответ придёт как SSE, а расход — в последнем фрагменте, в поле usage. Запрашивать stream_options не нужно, шлюз добавит их сам.
Инструменты описываются как у OpenAI, в поле tools. Ничего особенного делать не нужно.
{
"model": "openai/gpt-6-luna",
"messages": [{ "role": "user", "content": "Какая погода в Москве?" }],
"tools": [{
"type": "function",
"function": {
"name": "get_weather",
"description": "Погода в городе",
"parameters": { "type": "object", "properties": { "city": { "type": "string" } }, "required": ["city"] }
}
}]
}
Глубину рассуждения задаёт reasoning_effort со значениями none, low, medium или high. Принимается и вариант OpenRouter: "reasoning": {"effort": "low"} либо "reasoning": {"enabled": false} — шлюз приведёт его к нужному виду. Поле max_tokens тоже принимается.
"reasoning_effort": "none" — будет быстрее и дешевле.POST /v1/responses работает у провайдеров, которые его поддерживают: OpenAI и OpenRouter. Запрос уходит как есть, с двумя оговорками.
store по умолчанию false: шлюз общий, переписку у провайдера не храним.previous_response_id принимается только для ваших же ответов и требует "store": true.Чтобы рассуждение сохранялось между ходами без хранения на стороне провайдера, передайте "include": ["reasoning.encrypted_content"] и возвращайте полученные элементы output обратно в input.
POST /v1/images/generations — как у OpenAI. Работает с моделями openai/gpt-image-2 и openai/gpt-image-2.5-flare.
curl BASE_URL/images/generations \
-H "Authorization: Bearer ВАШ_КЛЮЧ" \
-H "Content-Type: application/json" \
-d '{"model":"openai/gpt-image-2","prompt":"рыжий кот в скафандре","size":"1024x1024","quality":"low"}'
Картинка возвращается в data[0].b64_json. Оплата идёт по токенам ответа, как за текст: низкое качество обходится примерно в рубль, высокое — заметно дороже. Ждать ответа шлюз готов до пяти минут.
Модели, которые рисуют внутри диалога (Gemini Image, GPT-5 Image), вызывайте обычным /v1/chat/completions.
POST /v1/embeddings — как у OpenAI, с теми же параметрами. Списывается по токенам входа.
Баланс один на всё: чат в кабинете и запросы по API. Деньги списываются по факту, после ответа модели, и видны сразу в usage.cost.
GET /v1/key.GET /v1/generation?id=gen-… — стоимость, токены, задержка, статус и причина ошибки.Ошибка 402 означает одно из двух: закончился баланс или исчерпан лимит ключа. Текст ошибки говорит, что именно.
Ключ создаётся в кабинете на странице Ключи. Показывается он один раз, потом хранится только отпечаток — восстановить ключ нельзя, можно выпустить новый.
Ошибка 401 — ключ неверный, отключён или передан не в том заголовке. Нужен именно Authorization: Bearer ВАШ_КЛЮЧ.
Своих ограничений по частоте запросов шлюз не ставит: предел задаёт провайдер модели. Если провайдер ответил отказом из-за нагрузки, шлюз сам пробует следующего из списка, когда он есть.
Таймаут обычного запроса — две минуты, генерации картинки — пять. Долгие потоковые ответы деплой не обрывает: при обновлении шлюз дожидается начатых запросов.
Ошибки приходят в привычном виде, с кодом и текстом. Там же бывает metadata с подробностями и ссылка на нужный раздел этой страницы.
{
"error": {
"code": 402,
"message": "Недостаточно средств на балансе",
"docs": "PUBLIC_URL/docs#money"
}
}
| Код | Что значит |
|---|---|
| 400 | Запрос не принят: не хватает поля или параметр не подходит модели |
| 401 | Ключ неверный или отключён |
| 402 | Кончился баланс или лимит ключа |
| 404 | Модель не найдена — проверьте полное имя, вместе с разработчиком |
| 502 | Ни один провайдер не смог ответить; в metadata.attempts видно, кто и почему отказал |
Каждый ответ содержит заголовок X-Generation-Id. По нему можно посмотреть, что произошло, включая ответ провайдера при ошибке:
curl "BASE_URL/generation?id=gen-…" -H "Authorization: Bearer ВАШ_КЛЮЧ"
В «Истории» выберите ключ и диалог. Переписка открывается как чат для чтения с расходами под ответами. Продолжения Chat Completions автоматически связываются по переданной истории, если она однозначно совпадает с сохранённым ответом того же ключа. Новый запрос без предыдущей переписки создаёт новый диалог.
Учёт расходов и сохранение переписки включены по умолчанию для всех API-ключей, MCP-ключей и веб-чата. Сохранение текста можно отключить при создании API-ключа или через API настроек истории. Старую переписку восстановить нельзя.
Для объединения запросов отправляйте заголовок X-Glasira-Session-Id: my-session-1 или поле JSON glasira_session_id. В OpenAI SDK поле можно передать через extra_body={"glasira_session_id": "my-session-1"}. Идентификатор: 1–128 латинских букв, цифр, точек, двоеточий, дефисов или подчёркиваний. Он действует в пределах одного ключа и только группирует историю; контекст по-прежнему передаётся в messages.
Инструменты MCP chat и compare_models принимают session_id. Для Responses API продолжение через previous_response_id автоматически наследует сессию того же ключа. Веб-чат передаёт идентификатор автоматически. Несколько шагов модели при вызовах инструментов объединяются в одно сообщение, стоимость складывается из всех шагов.
Сохраняются зашифрованные снимки запроса и ответа, включая полученный текст потокового ответа при остановке. Вложения и бинарные данные не хранятся; до 128 тысяч символов на запрос и ответ. Текст можно удалить, финансовый журнал сохраняется. Ретрансляция сторонних MCP-инструментов не является вызовом модели: её внешний тариф Glasira не знает и в расходы сообщения не включает.
То же самое видно в кабинете на странице История: причина ошибки показывается под статусом запроса.
Ретрансляция во внешние ассистенты. В разделе Подключения создайте MCP-ключ с выбранными инструментами. Подключите адрес с этим ключом в ваш MCP-клиент: он получит инструменты подключённых сервисов через Glasira. Имена инструментов включают идентификатор подключения и стабильный суффикс; исходные названия указаны в описаниях. MCP-ключ работает только на /mcp. Права редактируются или отзываются в кабинете; новые инструменты автоматически не добавляются. Ретрансляция не вызывает модели Glasira. Их инструменты можно включить отдельно — тогда вызовы моделей списываются с баланса. Первая версия передаёт инструменты и их ответы; ресурсы и промпты как отдельные методы MCP пока не ретранслируются.
В чате Glasira можно использовать сторонние MCP-серверы: откройте Подключения, добавьте HTTPS-адрес и ключ, проверьте соединение и отметьте доступные агенту инструменты. Под полем сообщения выберите подключения для этого диалога. Вызовы и результаты отображаются в ответе; расходы всех шагов модели суммируются. Поддерживается Streamable HTTP с Bearer-ключом или дополнительными заголовками. OAuth, локальные stdio-серверы и старый транспорт HTTP+SSE пока не поддерживаются.
У шлюза есть MCP-сервер: Claude Code, Cursor, Claude Desktop и другие клиенты могут сами смотреть модели и баланс, отправлять запросы и сравнивать ответы моделей.
, авторизация — тем же ключом.list_models, chat, compare_models, get_balance, list_generations, get_generation.Готовые команды подключения лежат в кабинете на странице Ключи.
Полный перечень методов и схем — автосправочник OpenAPI. Он генерируется из кода, поэтому всегда совпадает с тем, что работает.
Добавьте HTTPS-адрес MCP-сервера, проверьте соединение и отметьте разрешённые инструменты. Затем выберите подключение под полем сообщения в чате. Ключи хранятся зашифрованными.
Создайте отдельный ключ для каждого ассистента и выберите его инструменты. Добавьте этот адрес и MCP-ключ во внешний сервис. Ретрансляция не вызывает модели Glasira; подключённые сервисы применяют свои тарифы.
В журнале сохраняются сервис, инструмент, ключ, статус и время выполнения. Аргументы, результаты и секреты в журнал не записываются.