документация

Справочник aiokno API

Всё, что нужно для интеграции: быстрый старт, модель и имена, подписка и лимиты, цены и резерв, уровни размышления, совместимость с OpenAI-контрактом, лимиты и коды ошибок. Формат — OpenAI-совместимый Chat Completions: работает любой SDK, где меняются base_url и ключ.

быстрый старт

Первый запрос — за минуту

Зарегистрируйтесь, создайте ключ в разделе «API и токены» и подставьте его в пример. Ключ показывается один раз — сохраните сразу.

curl https://aiokno.ru/api/v1/chat/completions \
  -H "Authorization: Bearer sk-aiokno-ВАШ_КЛЮЧ" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "aiokno-standard",
    "messages": [{"role": "user", "content": "Сколько идёт доставка до Казани?"}],
    "max_tokens": 500
  }'

Python — через официальный клиент OpenAI

from openai import OpenAI

client = OpenAI(
    api_key="sk-aiokno-ВАШ_КЛЮЧ",
    base_url="https://aiokno.ru/api/v1",
)

answer = client.chat.completions.create(
    model="aiokno-standard",
    messages=[{"role": "user", "content": "Сколько идёт доставка до Казани?"}],
    max_tokens=500,
)
print(answer.choices[0].message.content)

Библиотека обращается к base_url + /chat/completions, поэтому адрес совпадает с нашим эндпоинтом. Node.js и любой другой OpenAI-совместимый клиент настраиваются так же: меняются только ключ и базовый адрес.

модели

Одна модель, несколько имён

Имя в запросеЧто это
aiokno-standard Рекомендуемое имя. За ним закреплена текущая модель проекта: если мы её обновим, менять код не придётся.
qwen3.8-27b-fp8 Техническое имя той же модели на сегодня.
qwen3.6-27b-fp8 Прежнее имя модели. Продолжает работать и ведёт на текущую модель — код, написанный до обновления, менять не нужно.

Контекст — 262 144 токена. Любое другое имя вернёт ошибку 400 invalid_model.

Каталог моделей — GET /api/v1/models

Эндпоинт живой и требует тот же ключ, что и запросы к модели. Первым элементом data идёт техническое имя текущей модели, за ним — её синонимы из таблицы выше; клиенты, которые берут data[0] как модель по умолчанию, попадут в актуальную. Без ключа или с отозванным ключом придёт 401 invalid_api_key. В коде удобнее оставить постоянное aiokno-standard — оно переживает смену модели.

curl https://aiokno.ru/api/v1/models \
  -H "Authorization: Bearer sk-aiokno-ВАШ_КЛЮЧ"
# Тот же клиент OpenAI, что и в быстром старте
for model in client.models.list().data:
    print(model.id)   # qwen3.8-27b-fp8, aiokno-standard, qwen3.6-27b-fp8

подписка

Подписка и лимиты

Подписка продаёт одновременные запросы — потоки, а не токены. Пока она активна, запросы любых ключей аккаунта идут без денежного резерва: баланс не трогается, 402 не приходит. Оформляется в кабинете с единого баланса, условия — на странице условий подписки.

ТарифПотоков одновременноЦенаНа полной скорости, вычисленных токенов в сутки
1 поток149 ₽ за 1 часдо 2 млн
1 поток1190 ₽ за 24 часадо 2 млн
1 поток1940 ₽ за 7 днейдо 2 млн
1 поток12 790 ₽ за 30 днейдо 2 млн
2 потока298 ₽ за 1 часдо 4 млн
2 потока2380 ₽ за 24 часадо 4 млн
2 потока21 880 ₽ за 7 днейдо 4 млн
2 потока25 580 ₽ за 30 днейдо 4 млн
3 потока3130 ₽ за 1 часдо 6 млн
3 потока3510 ₽ за 24 часадо 6 млн
3 потока32 540 ₽ за 7 днейдо 6 млн
3 потока37 530 ₽ за 30 днейдо 6 млн
5 потоков5220 ₽ за 1 часдо 10 млн
5 потоков5860 ₽ за 24 часадо 10 млн
5 потоков54 230 ₽ за 7 днейдо 10 млн
5 потоков512 560 ₽ за 30 днейдо 10 млн
8 потоков8330 ₽ за 1 часдо 16 млн
8 потоков81 290 ₽ за 24 часадо 16 млн
8 потоков86 390 ₽ за 7 днейдо 16 млн
8 потоков818 970 ₽ за 30 днейдо 16 млн
Пробный1бесплатно: 3 часа, один раз на аккаунтдо 1 млн

Сверх порога подписке до 00:00 UTC (03:00 МСК) остаётся 1 поток — без доплат и без отказов. Подписки, выданные раньше промокодом «токены в сутки», работают на 3 потоках, а прежний дневной лимит стал для них таким же порогом.

Поток — один запрос в работе

Поток занят от момента, когда шлюз принял запрос, до последнего байта ответа, включая весь стрим. Потоки считаются на аккаунт: все ключи — обычные и «Агент» — делят одно число, и один ключ может занять все потоки тарифа. Сколько запросов уходит за день, не важно — важно, сколько из них идут одновременно. Без подписки действуют лимиты оплаты за токены из раздела «Лимиты».

Очередь вместо мгновенного 429

Если все потоки заняты, запрос не получает отказ сразу: шлюз держит его в очереди до 60 секунд и пропускает, как только поток освободится. Ожидание идёт до чтения тела запроса и до любых денежных операций. Очередь работает и без подписки — на лимитах оплаты за токены.

Мест в очереди ограниченное число — на аккаунт и на весь сервер; когда они заняты, 429 приходит сразу. Строгого порядка нет: свободный поток достаётся тому из ожидающих, кто первым его увидит, но дольше 60 секунд не ждёт никто. Таймаут клиента держите с запасом: к времени генерации может добавиться до 60 секунд очереди.

429 по осям и Retry-After

Отказ по параллели приходит в обычном формате ошибки шлюза — 429 rate_limit_exceeded с заголовком Retry-After, — а текст сообщения называет ось, которая не пропустила запрос. Деньги ни на одной оси не списываются.

ОсьКогдаЧто делать
Ключ и аккаунтВсе потоки подписки заняты дольше, чем длится очередь. Retry-After: 5Повторить через Retry-After секунд; если так часто — снизить параллель клиента или взять тариф с большим числом потоков
Порог честного использованияСуточный порог пройден, и единственный оставшийся поток занятОтправлять запросы по одному до 03:00 МСК — или дождаться сброса
Пробный пулПробные подписки делят общий пул потоков, и он занят. Retry-After: 10Повторить позже; платный тариф в общий пробный пул не входит
СерверЗанят общий потолок одновременных запросов к модели. Retry-After: 10Повторить через Retry-After секунд; текущее состояние — на странице статуса

Заголовок X-Aiokno-Streams

Подписчику на ответах шлюза 200 и 429 приходит заголовок X-Aiokno-Streams: число потоков, которое действует прямо сейчас, по тарифу или 1 после порога честного использования. По нему клиент подстраивает свою параллель: держите одновременных запросов не больше этого числа, и очередь не понадобится. Без подписки заголовка нет.

Честное использование и вычисленные токены

Порог считается в вычисленных токенах — тех, что реально нагружают видеокарту:

вычисленные = max(0, prompt_tokens − cached_tokens) + completion_tokens

Начало запроса, взятое из кэша, почти ничего не стоит видеокарте — а агент повторяет одну и ту же историю десятки раз, — поэтому в порог оно не входит. Счётчик — за сутки по UTC, обнуляется в 00:00 UTC (03:00 МСК). После порога подписке до сброса остаётся 1 поток: денег не списываем, запросов не отклоняем, они просто идут по одному. Сколько набралось сегодня, видно в кабинете.

Пробный период

3 часа, 1 поток, порог 1 млн вычисленных токенов в сутки — один раз на аккаунт, бесплатно и без автопродления. Срок считается с запуска пробного периода кнопкой в кабинете, а не с регистрации. Пробные подписки делят общий пул потоков: если он занят, запрос ждёт в очереди, а через 60 секунд получает 429 с Retry-After. Купить платный тариф можно в любой момент; оставшееся пробное время при этом не переносится.

Покупка, продление и смена тарифа

  • Подписка покупается в кабинете с единого баланса; согласие с условиями подписки обязательно. Срок считается с момента покупки.
  • Тариф с тем же числом потоков, купленный поверх действующей подписки, добавляет свой срок к текущему: ничего не пересчитывается. При переходе на тариф с другим числом потоков оставшееся время переводится по стоимости в часы тарифа на 30 дней с новым числом потоков — с точностью до секунды, — и сверху добавляется купленный срок. Срок, сложенный из нескольких покупок с одним числом потоков, оценивается при этом целиком по самому дешёвому часу среди них. Поэтому переход на меньшее число потоков срок только удлиняет: деньги не возвращаются, времени становится больше. У перехода на большее число потоков час дороже, и новый срок может оказаться раньше нынешнего — кабинет называет его до покупки.
  • Остаток пробного периода при покупке тарифа не переносится. Подписка, выданная промокодом «токены в сутки», продлевается тарифом с тем же числом потоков и дальше оценивается по часу тарифа на 30 дней; при прямом переходе с неё на другое число потоков её остаток не переносится.
  • Переход на меньшее число потоков, который всё же сократил бы действующую подписку, сервис не проводит: приходит 409 would_shorten_subscription с обоими сроками в теле, деньги не списаны. С нынешними тарифами так бывает только у промокода с тарифом на меньшее число потоков поверх подписки, выданной промокодом «токены в сутки», — её остаток ничего не стоит. Такой промокод не тратится: активируйте его после окончания текущей подписки.
  • Порог честного использования считается на аккаунт за сутки по UTC; покупка и смена тарифа счётчик не сбрасывают. После окончания подписки запросы оплачиваются за токены с баланса.
  • Если баланса не хватает, кабинет предложит доплатить картой российского банка или через СБП (ЮKassa), и подписка оформится сама после зачисления. Пока приём платежей не подключён, по вопросам подписки — в Telegram @VCameron977: пополним баланс, а подписку вы купите в кабинете сами.
  • Мест на сервере конечное число. Когда новые подписки закончились, кабинет показывает «Мест нет» — продление и переход на тариф с меньшим числом потоков это не затрагивает. На время паузы продаж недоступны и покупка, и продление; действующие подписки работают до конца срока.
  • Тариф, снятый с продажи, в таблице выше не показан: подписка на нём действует до конца срока, и её можно продлить в кабинете — на условиях, которые карточка тарифа называет перед продлением.
  • Возврат за неиспользованное время — пропорционально, по заявлению; порядок — в условиях подписки.
  • В редком случае сбоя хранилища подписок шлюз не блокирует запрос, а проводит его как оплату за токены; при пустом балансе придёт 402. Такое списание вернём на баланс по заявлению — п. 4.6 условий.

цены без подписки

Оплата за токены — только за то, что реально использовано

Расход считает наш сервер по полю usage из ответа модели, сумма округляется вверх до копейки на каждом запросе. Пример: запрос на 2 000 входных токенов с ответом на 500 выходных стоит 2000×20/1e6 + 500×160/1e6 = 0,12 ₽. Тысяча таких запросов — около 120 ₽.

Как удерживаются деньги

На время запроса мы резервируем максимально возможную его стоимость — оценку именно этого запроса, а не какую-то фиксированную сумму. Сразу после ответа неиспользованный остаток возвращается на баланс, и списывается только фактическая стоимость. Считается резерв так:

резерв = (байты тела + 8192 × число картинок) × 20 ₽/млн
       + max_tokens × 160 ₽/млн            ← округление вверх до копейки

Байты тела берутся как верхняя граница входных токенов («каждый токен весит хотя бы байт»), поэтому у запроса без картинок потолок резерва задаёт тип ключа:

Тип ключаРезерв на один запрос без картинокРекомендуемый запас
Обычный API до 8,45 ₽ — предельный запрос: тело 256 КБ, ответ 20 000 токенов от 300 ₽
Агент (агентные клиенты) до 52,19 ₽ — предельный запрос: тело 2 МБ, ответ 64 000 токенов от 1 000 ₽

Картинки считаются сверх этих чисел. Оценка «токенов не больше, чем байт» на изображениях не работает, поэтому на каждую часть image_url резерв закладывает 8192 входных токенов — это +0,16 ₽ к резерву за картинку, сверх потолка строки таблицы. Числа в таблице — потолок запроса без картинок; картинок в запросе не больше восьми, поэтому потолок с ними — те же числа плюс ≈1,3 ₽. Лишнее возвращается после расчёта: списывается фактический usage, а он у мелкой картинки — десятки токенов (см. лимиты).

Полные 52 ₽ агент занимает только на предельном запросе. Короткий запрос резервирует копейки: max_tokens: 1 на маленьком теле — ровно 1 копейку, и именно это число придёт в required_kopecks. А запрос без max_tokens берёт потолок 20 000 токенов и резервирует ≈3,21 ₽ — это и есть minHoldKopecks, которое показывает кабинет: сколько нужно иметь на балансе, чтобы начался запрос, не назвавший длину ответа. Если max_tokens не передан, берётся 20 000 даже для ключа «Агент».

Из этого следуют две вещи, о которых лучше знать заранее. Во-первых, при балансе меньше резерва запрос вернёт 402, даже если по факту стоил бы дешевле: точные числа приходят в теле ошибки — required_kopecks (сколько нужно зарезервировать под этот запрос) и balance_kopecks (сколько есть), обе величины в копейках. Во-вторых, каждый запрос «в полёте» держит свою долю баланса, поэтому запас должен покрывать все одновременные резервы сразу. Сколько запросов идёт параллельно, задаёт не баланс, а лимит одновременных запросов: 2 на обычный ключ, 4 на ключ «Агент» и 6 на аккаунт.

Остаток не нужно запрашивать отдельно: непотоковый ответ, за который списаны деньги, несёт заголовок X-Aiokno-Balance-Kopecks — баланс в копейках уже после списания. У успешного ответа, за который денег не сняли, заголовка нет: это запрос в рамках подписки. Отказ 402 заголовок несёт — в нём баланс до отказа, тот же, что в поле balance_kopecks тела. Идемпотентный повтор обычно несёт заголовок с балансом на момент повтора; у повтора, догнавшего ещё не завершившийся первый запрос, заголовка может не быть. В потоковом режиме заголовка может не быть.

Кэш начала запроса — и сколько он живёт

Когда начало запроса повторяется (системная подсказка, инструкция, неизменный длинный контекст), сервер модели берёт его из кэша, и такие токены считаются по цене кэша — в 10 раз дешевле обычного входа. Сколько токенов попало в кэш, видно в ответе — usage.prompt_tokens_details.cached_tokens.

Срока хранения у кэша нет. Он живёт в памяти сервера модели и обнуляется при её перезапуске или обновлении, а записи вытесняются новыми. Повтор в пределах одной сессии сервера — попадание (на длинном префиксе замерено 96 % токенов из кэша), повтор через неделю или после рестарта — полная цена входа. Считайте кэш скидкой, а не обещанной ценой: бюджет планируйте по полной ставке входа.

Кэш изолирован по аккаунту. Сервер подмешивает к каждому запросу невидимую соль, свою у каждого аккаунта: все ключи одного аккаунта греют общий кэш и пользуются им, а в чужой попасть нельзя. Поэтому по cached_tokens невозможно узнать, присылал ли похожий текст кто-то ещё.

Пополнение — пока вручную

Приём оплаты картой российского банка и через СБП пойдёт через ЮKassa, но ещё не подключён. Пока баланс зачисляет оператор промокодом: напишите в Telegram или на почту — обычно подтверждаем в течение рабочего дня. Баланс на аккаунте один: с него оплачивается и API — подписка и токены, — и тариф программы.

уровни размышления

Модель умеет думать перед ответом — вы решаете, сколько

Поле reasoning_effort управляет внутренним рассуждением модели. По умолчанию оно выключено — ответ приходит сразу и дешевле. Включите уровень — и модель сначала разберёт задачу по шагам: ход рассуждения вернётся в отдельном поле reasoning, а чистый ответ — как обычно в content.

reasoning_effortЧто происходитКогда выбирать
none (по умолчанию) Без размышления — модель отвечает сразу Чат-боты, классификация, извлечение данных, короткие ответы
low Короткая прикидка перед ответом Простая математика, проверка условий
medium Развёрнутый разбор задачи Многошаговые задачи, анализ текста
high Максимальное усилие (наибольший объём рассуждения) Сложная логика, код, планирование
answer = client.chat.completions.create(
    model="aiokno-standard",
    messages=[{"role": "user", "content": "Реши: у поезда 9 вагонов..."}],
    reasoning_effort="medium",
    max_tokens=4000,
)
print(answer.choices[0].message.reasoning)  # ход рассуждения
print(answer.choices[0].message.content)    # чистый ответ

Как это тарифицируется. Токены размышления — обычные выходные токены (160 ₽ за миллион): они входят в usage.completion_tokens и ограничены вашим max_tokens вместе с ответом. Отсюда практическое правило: с включённым размышлением ставьте max_tokens с запасом (от 2 000) — если бюджета не хватит, модель потратит его на рассуждение и вернёт пустой content с finish_reason: "length". Значение вне списка вернёт 400 invalid_reasoning_effort — до списания.

совместимость

Что из OpenAI-контракта работает

Таблица собрана внешней приёмкой на живом шлюзе 6 сентября 2026: каждая строка — выполненный запрос, а не намерение. Где поведение менялось в тот же день, это отмечено в строке.

ВозможностьКак ведёт себя
tools — вызов функцийодин и несколько вызовов за ответ, дельты в потоке, ответ инструмента обратно в истории (role: "tool")
tool_choiceauto, none, required и именованная функция. required и именованный выбор принуждают вызов с 6 сентября 2026 — до этого модель могла ответить текстом
response_formatjson_object и json_schema
logprobs, top_logprobsвозвращаются
stopстрока и массив строк
seed, temperature, top_p, presence_penalty, frequency_penalty, logit_biasпринимаются; при temperature: 0 и одном seed ответы совпадают
streamSSE как у OpenAI; рассуждение тоже приходит дельтами, в том числе вместе с вызовами функций
Картинки (image_url)только data:-URI (base64 в теле): принимаются, тарифицируются как входные токены, не больше 8 на запрос. Внешняя ссылка — 400. Резерв — в лимитах
Длинный контекстпроверено до 60 000 входных токенов в одном запросе; выше упирается в размер тела

Не поддержано: embeddings, генерация изображений (/v1/images/generations), Responses API, старый /v1/completions, несколько вариантов ответа (n, best_of), выбор из нескольких моделей и звук с видео на вход (audio_url, video_url, input_audio — модель текстово-зрительная, такие части возвращают 400).

лимиты

Границы, в которых работает шлюз

ЧтоЗначение
Размер тела запросадо 256 КБ; ключ «Агент» — до 2 МБ. Больше — 413
Длина ответаmax_tokens или max_completion_tokens до 20 000; ключ «Агент» — до 64 000. Не передали — берётся 20 000. Значение — целое ≥ 1, иначе 400
Частота120 запросов в минуту с одного IP-адреса
Ключей на аккаунтдо 10 активных одновременно
Каталог моделейGET /api/v1/models с тем же ключом — см. раздел «Модели»
Повтор запроса без двойного списаниязаголовок Idempotency-Key, см. ниже
Контекст модели262 144 токена
Время ожидания ответадо 25 минут (долгая генерация с рассуждением); в потоковом режиме первые токены приходят сразу
Потоковая передача (stream)поддерживается: stream: true отдаёт ответ по мере генерации (SSE, как у OpenAI). usage приходит ровно один раз — в финальном чанке с пустым choices: [], и только если передать stream_options: {"include_usage": true}. Контентные чанки поля usage не несут: суммировать их не нужно и нечего
Рассуждения (reasoning)по умолчанию выключены; включаются полем reasoning_effort
Несколько вариантов (n, best_of)всегда один ответ
Картинки на входпринимаются в поле image_url только как data:-URI и не больше 8 частей на запрос (считаются по всему телу, вместе с историей); списываются по факту, резервируются с запасом — см. абзац «Про картинки» под таблицей

Про длину ответа. Модель выдаёт около 60 токенов в секунду, потолок ожидания — 25 минут, так что максимальные 20 000 токенов ответа успевают сгенерироваться с запасом. Для долгих ответов удобнее stream: true — текст приходит по мере генерации. Обрыв оплачивается по тому, что модель успела сгенерировать к моменту, когда шлюз узнал о разрыве. Разрыв — это закрытие соединения клиентом: через край сети он доходит до шлюза за 1–2 секунды, то есть плюс до ~100 токенов сверх прочитанного (замер 7 сентября 2026: 23 токена напрямую, 91 через край). Если клиент просто перестал читать поток, не закрыв соединение, модель догенерирует ответ до конца или до max_tokens — и это будет списано целиком.

Про пустой ответ. Без режима рассуждения модель иногда завершала ответ первым же токеном: 200, finish_reason: stop, пустой content и одна копейка за ничего. С 8 сентября 2026 шлюз всегда передаёт модели min_tokens (по умолчанию 2, ваше значение уважается, но не больше max_tokens) — первый токен не может быть концом ответа. Если пустой ответ всё же пришёл, пришлите X-Request-Id.

Про счётчики. max_tokens, max_completion_tokens и n обязаны быть целыми числами не меньше 1. Ноль, дробь, строка и отрицательное значение возвращают 400 invalid_request_error — до того, как с баланса что-то резервируется. Отсутствующее поле и явный null по-прежнему означают «не задано»: тогда берётся 20 000 токенов — в том числе для ключа «Агент», его 64 000 нужно попросить явно.

Про картинки. Изображение передаётся частью image_url и только как data:image/…;base64,… строго в нижнем регистре (DATA:, IMAGE/, BASE64 — 400) (base64 прямо в теле запроса): ссылку на внешний адрес шлюз отклоняет 400 invalid_request_error — до резерва и до вызова модели. Картинок в одном запросе — не больше 8, и считаются они по всему телу, вместе с историей переписки; девятая — тоже 400. Списывается изображение по факту, из usage: замер приёмки 6 сентября 2026 — +66 входных токенов на картинку, одинаково для 1×1, 64×64 и 256×256; более крупные не измерялись и могут стоить дороже. Резерв заранее факт не знает, поэтому закладывает 8 192 входных токенов на каждую часть image_url (≈0,16 ₽) и возвращает лишнее после расчёта. Этот запас идёт сверх потолков из раздела «Цены»: предельные восемь картинок поднимают резерв примерно на 1,3 ₽.

Про размер запроса. Контекст модели — 262 144 токена, но тело запроса обычного ключа ограничено 256 КБ (ключ типа «Агент» — 2 МБ), поэтому реально в запрос помещается меньше. Тело больше потолка возвращает 413 payload_too_large — с телом ошибки и заголовком X-Request-Id, на любом превышении, вплоть до нескольких байт за границей.

Текущее состояние сервисов — на странице статуса. Частота считается по IP-адресу, а не по ключу: несколько ключей с одного сервера делят общий лимит. При превышении приходит 429 с заголовком Retry-After — повторяйте с экспоненциальной задержкой. Тот же 429 приходит и на слишком много одновременных запросов: без подписки по одному ключу — 2 (обычный) и 4 («Агент»), и не больше 6 на аккаунт, а у подписки — число потоков тарифа. Сначала такой запрос до 60 секунд ждёт свободного места в очереди, и 429 приходит, только если место не освободилось; деньги при этом не списываются.

Поля запроса, которые сервер меняет сам

Несколько полей OpenAI-контракта сервер обрабатывает сам. Ошибку они не вызывают — запрос выполняется без них:

  • chat_template, mm_processor_kwargs, prompt, echo, documents — вырезаются молча: сборку промпта на сервере мы наружу не отдаём.
  • n и best_of — приводятся к одному варианту ответа (сам n при этом обязан быть целым ≥ 1, иначе 400).
  • max_tokens и max_completion_tokens — зажимаются в потолок вашего ключа; если переданы оба, берётся меньшее.
  • cache_salt — серверный: именно он разделяет кэш между аккаунтами.
  • stream_options — в потоке сервер сам включает подсчёт usage (иначе нечем подтвердить списание при обрыве), но usage-чанк приходит вам, только если вы попросили его сами.

Поля управления шаблоном add_generation_prompt и continue_final_message отвергает сама модель — 400 invalid_request_error.

Повтор запроса без двойного списания — Idempotency-Key

OpenAI-совместимые SDK сами повторяют POST на 408, 429 и 5xx. Если первый запрос успел сгенерироваться и списаться, а ответ до вас не дошёл, «безопасный» повтор запустил бы вторую генерацию и второе списание. Чтобы этого не случилось, передайте свой уникальный идентификатор запроса в заголовке Idempotency-Key.

curl https://aiokno.ru/api/v1/chat/completions \
  -H "Authorization: Bearer sk-aiokno-ВАШ_КЛЮЧ" \
  -H "Idempotency-Key: 8f14e45f-ea0b-4c1e-9f8a-0b7c2f1d3e55" \
  -H "Content-Type: application/json" \
  -d '{"model":"aiokno-standard","messages":[{"role":"user","content":"Привет!"}]}'
  • Заголовок необязателен — без него всё работает как раньше.
  • Действует только на непотоковые запросы: поток не переигрывается.
  • Запоминаются только успешные ответы, и живут они 24 часа; после этого тот же ключ снова считается новым.
  • Повтор с тем же ключом отдаёт сохранённый ответ бесплатно и помечает его заголовком Idempotent-Replay: true; в X-Request-Id при этом приходит идентификатор первого запроса — по нему и ищется списание.
  • Один ключ — один запрос: тот же ключ с другим телом вернёт 422 idempotency_key_reuse, а не чужой ответ. Генерируйте новый идентификатор на каждый логически новый вызов.
  • Область действия — аккаунт, а не отдельный API-ключ: тот же Idempotency-Key с другим ключом того же аккаунта отдаст сохранённый ответ и не спишет деньги повторно (замена ключа посреди ретраев не должна приводить ко второй генерации). У другого аккаунта тот же идентификатор независим — чужой ответ не отдаётся никогда.
  • Пока первый запрос с этим ключом ещё выполняется, второй получит 409 idempotency_in_progress с Retry-After — дождитесь ответа вместо параллельного повтора.
  • Длина ключа — до 255 символов, иначе 400 invalid_request_error; нижней границы нет, но берите UUID — короткий идентификатор легко столкнётся с вашим же прошлым запросом.

коды ошибок

Что означает ответ и что с ним делать

Все ошибки приходят в привычном виде {"error":{"code":"…","message":"…"}}. На каждом ответе шлюза — и успешном, и ошибочном — есть заголовок X-Request-Id: назовите его в обращении, и мы найдём запрос в логах. Заголовок ставится в самом начале обработки, поэтому он есть и там, куда запрос не дошёл: 404 на несуществующий путь, 405 на неверный метод, 429 от ограничителя частоты. Единственное исключение — редкий обрыв соединения между краем сети и шлюзом: тогда приходит голый 502 без нашего формата и без заголовка. Денег такой ответ не списывает (списывать нечего — usage нет), запрос можно повторить.

КодЧто означаетЧто делать
401 invalid_api_keyКлюч отсутствует, отозван или не начинается с sk-aiokno-Создать новый ключ в кабинете
402 insufficient_balanceНа балансе меньше, чем требуется зарезервировать. В теле — точные числа: required_kopecks и balance_kopecksПополнить баланс (см. раздел «Цены»)
400 invalid_modelЗапрошена неизвестная модельИспользовать aiokno-standard
400 invalid_request_errorТело — не JSON-объект, либо модель отвергла параметры (роль, top_p, отсутствующий messages)Поправить тело запроса. Повтор без изменений не поможет
413 payload_too_largeТело больше 256 КБ; для ключа «Агент» — больше 2 МБ. Приходит с телом ошибки и X-Request-Id на любом превышении, вплоть до нескольких байт за границейСократить историю сообщений
400 invalid_reasoning_effortreasoning_effort вне списка none/low/medium/highВзять значение из таблицы уровней. Деньги не списываются
409 too_many_keysУже 10 активных ключей на аккаунтОтозвать ненужный ключ в кабинете
422 idempotency_key_reuseПрисланный Idempotency-Key уже использован с ДРУГИМ телом запроса — чужой ответ мы не отдаёмВзять новый ключ. Повтор без изменений не поможет
409 idempotency_in_progressЗапрос с этим Idempotency-Key ещё выполняетсяПодождать Retry-After секунд и повторить
503 server_misconfiguredСервер модели не настроенНаписать нам, это на нашей стороне
429 rate_limit_exceededЛибо слишком часто с одного адреса (по умолчанию 120 запросов в минуту), либо все одновременные запросы ключа или аккаунта (у подписки — все потоки) заняты дольше, чем длится очередь, либо модель перегружена. Ось называет текст сообщения — см. «429 по осям»Подождать Retry-After секунд. Деньги не списываются
502 upstream_unavailableСбой на НАШЕЙ стороне: недоступен бэкенд модели (туннель, ключ сервера, имя модели)Повторить позже — сначала загляните на страницу статуса. Деньги не списываются, тело запроса менять не нужно
504 upstream_timeoutМодель не уложилась во время ожиданияПовторить, а если ответ длинный — уменьшить max_tokens. Деньги не списываются
502 upstream_errorМодель не ответила либо ответила неразборчиво — без блока usage списывать нечегоПовторить; если повторяется — проверить статус сервисов. Деньги не списываются
503 server_unavailableВременно недоступно хранилищеПовторить позже; текущее состояние — на странице статуса

Ошибки кабинета — другой формат

Эндпоинты кабинета (/api/account/*: вход, ключи, баланс, промокоды, подписка) обслуживают сам сайт и отвечают плоской строкой {"error":"код"} — без вложенного объекта, как у шлюза. Неизвестные поля тела они игнорируют; создание ключа отвечает 201 Created. Частые коды:

ОтветКогда приходит
401 unauthenticatedнет сессии кабинета или она истекла
401 invalid_credentialsневерная пара почта / пароль
400 invalid_jsonтело не разобралось как JSON
400 invalid_requestобязательное поле тела отсутствует или пусто — например, newPassword у /password-set и /password-change
415 unsupported_media_typeтело прислано без Content-Type: application/json
400 consent_requiredрегистрация без согласия на обработку данных
400 invalid_email, 409 email_takenадрес не разобран или уже занят
400 weak_passwordпароль короче 8 или длиннее 200 символов
409 password_already_set/password-set нужен аккаунту без пароля (вход через Telegram); когда пароль уже есть, его меняют через /password-change. Поле нового пароля в обоих — newPassword
400 invalid_scopeтип ключа не api и не agent
409 too_many_keysуже 10 активных ключей на аккаунте; выдача ключей идёт по своему бюджету, поэтому потолок достижим подряд, без пауз
404 not_foundотзыв чужого или уже отозванного ключа
400 invalid_code, 409 already_redeemed, 410 expiredпромокод не найден, уже активирован или просрочен
409 plan_unavailable, 409 would_shorten_subscriptionпромокод с тарифом: тарифа больше нет в каталоге (снятый с продажи тариф код по-прежнему выдаёт) либо код с тарифом на меньшее число потоков сократил бы действующую подписку (в теле — expiresUtc и wouldExpireUtc). Код не потрачен — его можно активировать позже
402 insufficient_balanceпокупка подписки: на балансе меньше цены тарифа; в теле — requiredKopecks, balanceKopecks и shortfallKopecks
400 unknown_plan, 400 offer_not_acceptedпокупка подписки или пробный период: тариф не найден или не продаётся (снятый с продажи тариф продлевает только его держатель) либо не передано согласие с офертой (acceptOffer: true)
409 would_shorten_subscriptionпокупка подписки: переход на меньшее число потоков закончился бы раньше действующей подписки; в теле — expiresUtc (срок действующей) и wouldExpireUtc (срок после покупки). Ничего не списано
409 sold_out, 409 idempotency_conflictпокупка подписки: мест нет либо тот же idempotencyKey уже использован для другого тарифа
409 trial_used, 409 already_activeпробный период уже был на этом аккаунте либо подписка уже активна
503 sales_disabled, 503 trial_disabledпродажа подписок или пробный период временно выключены; действующие подписки работают
503 payments_not_configuredпополнение картой: приём платежей не подключён
400 invalid_intent, 400 offer_not_accepted, 400 unknown_plan, 503 sales_disabled, 409 would_shorten_subscriptionпополнение с намерением купить подписку: намерение не разобрано, нет согласия с условиями, тариф не продаётся, продажи на паузе или переход на меньшее число потоков сократил бы действующую подписку — всё это до создания платежа, деньги не списаны
429 rate_limitedслишком часто: вход и регистрация — 20 попыток за 10 минут с адреса, создание ключей — 30 за 10 минут на аккаунт. Ответ несёт Retry-After и поле retryAfterSeconds
503 storage_unavailableбаза кабинета временно недоступна

границы раннего доступа

Что мы обещаем и чего пока не обещаем

Обещаем

  • Ключ выдаётся сразу, без ожидания
  • Вызов функций (tools) и картинки на вход
  • Списание — по usage из ответа модели
  • При ошибке модели деньги не списываются
  • Запросы обрабатываются в России
  • X-Request-Id для разбора любого списания

Пока не обещаем

  • Соглашение об уровне сервиса (SLA)
  • Выбор из нескольких моделей
  • Генерация изображений
  • Оплата картой без участия оператора
  • Круглосуточная поддержка

Данные запросов

Текст запроса уходит на наш сервер в России — иначе модель не сможет ответить. Мы не используем ваши запросы для обучения. При этом сервер модели ведёт технический журнал, поэтому не отправляйте в API персональные данные и секреты, пока мы не закроем этот пункт отдельно.

вопросы по интеграции

Коротко о главном

Подойдёт ли мой код, написанный под OpenAI?

Да, если он использует Chat Completions. Достаточно поменять api_key и base_url на https://aiokno.ru/api/v1.

Работает: вызов функций (tools, tool_choice — auto, required и по имени), картинки на вход (image_url с data:-URI), response_format (включая json_schema), seed, stop, logprobs, штрафы и temperature/top_p.

Не сработает: embeddings, генерация изображений (/v1/images/generations), Responses API и старый /v1/completions. Построчно проверенная таблица — в разделе «Совместимость».

Почему пришёл 402, если на балансе есть деньги?

Перед запросом резервируется максимально возможная стоимость этого запроса: вход по размеру тела плюс max_tokens по цене вывода. Запрос без max_tokens берёт потолок 20 000 токенов и резервирует ≈3,21 ₽; предельный запрос без картинок — 8,45 ₽ у обычного ключа и 52,19 ₽ у ключа «Агент», а каждая часть image_url добавляет к резерву ещё ≈0,16 ₽ сверх этих чисел. Если баланса не хватает на резерв, запрос отклоняется, даже когда по факту он стоил бы дешевле; сколько именно нужно на этот запрос, видно в теле ответа — required_kopecks и balance_kopecks. Пополните баланс: рекомендуемый запас — от 300 ₽ для обычного ключа и от 1 000 ₽ для агента. Разбор резерва — в разделе «Цены». У активной подписки резерва нет, и такой 402 ей не приходит.

Как посчитать расход самостоятельно?

В ответе есть блок usage с числом входных и выходных токенов. Умножьте их на цены из раздела «Цены». В личном кабинете тот же расход показывается по дням, там же виден остаток баланса.

Что будет, если модель не ответит?

Придёт 502 (или 504, если модель не уложилась во время ожидания), резерв вернётся на баланс полностью — за такой запрос вы не платите. Отдельный код 502 upstream_unavailable означает, что сломалось на нашей стороне и тело запроса менять не нужно. Повторите запрос; если ошибка держится, напишите нам и назовите X-Request-Id.

Можно ли получить счёт и закрывающие документы?

Пока нет: продажа идёт в раннем доступе, оплату подтверждает оператор вручную. Если нужны документы для юридического лица — напишите, обсудим отдельно.

ранний доступ

Ключ — в личном кабинете

Регистрация занимает минуту, ключ создаётся сразу. Начните с пробной подписки — 3 часа бесплатно — или пополните баланс промокодом.

Открыть кабинет

По вопросам подписки и баланса — в Telegram @VCameron977