API v1

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

OpenAI-совместимый шлюз: замените base_url — SDK и код остаются вашими. Чат, эмбеддинги, файлы, векторные хранилища, RAG с цитатами, речь и задачи казахского языка Qazgramma — через один ключ и одну квоту.

Быстрый старт

Три шага. После первого у вас есть ключ, после третьего — ответ модели.

  1. 1. Создайте организацию

    Одна форма, письма ждать не нужно: /ru/signup. Сразу даётся 100 000 токенов в месяц.

  2. 2. Выпустите ключ

    В портале: «Разработчикам» → «Ключи API» → «Новый ключ». Ключ показывается один раз.

  3. 3. Сделайте запрос

    curl https://router.tilqazyna.kz/v1/chat/completions \
      -H "Authorization: Bearer $TQ_KEY" \
      -H "Content-Type: application/json" \
      -d '{"model":"qwen","messages":[{"role":"user","content":"Сәлем!"}]}'

Быстрый старт для вайбкодинга

Если вы пишете код вместе с ИИ-агентом, дайте ему это. Дальше он разберётся сам.

Одной строкой в промпт

Используй OpenAI-совместимый API: base_url https://router.tilqazyna.kz/v1, ключ в переменной TQ_KEY, model "qwen". Описание для агентов: https://router.tilqazyna.kz/llms.txt

Python, как есть

from openai import OpenAI

client = OpenAI(
    base_url="https://router.tilqazyna.kz/v1",
    api_key=os.environ["TQ_KEY"],
)

answer = client.chat.completions.create(
    model="qwen",
    messages=[{"role": "user", "content": "Сәлем!"}],
)
print(answer.choices[0].message.content)

TypeScript, тот же SDK

import OpenAI from 'openai';

const client = new OpenAI({
    baseURL: 'https://router.tilqazyna.kz/v1',
    apiKey: process.env.TQ_KEY,
});

const answer = await client.chat.completions.create({
    model: 'qwen',
    messages: [{ role: 'user', content: 'Сәлем!' }],
});
Чего агент не угадает

Задачи казахского языка вызываются через имя модели, а не через отдельный эндпоинт: qazgramma:v1:pro:style.rewrite:news. Полный список — в разделе ниже. Агент, который этого не знает, будет пытаться найти несуществующий /v1/qazgramma.

Подключение

Base URL
https://router.tilqazyna.kz/v1
Авторизация
Authorization: Bearer sk-tq-… — ключ создаётся в портале
Формат
JSON, UTF-8. Ошибки — в формате OpenAI

Модели

ИдентификаторНазначение
qwenДоступна сейчас — список получен от шлюза
qazgrammaДоступна сейчас — список получен от шлюза
autoДоступна сейчас — список получен от шлюза
Список приходит от шлюза

Таблица выше — живой ответ GET /v1/models, а не список, набранный руками. Машинное описание /llms.txt называет те же имена и объясняет задачи Qazgramma — его можно дать ИИ-агенту как есть.

Имена моделей Qazgramma

Задача едет в имени модели. Части можно ставить в любом порядке, лишние — опускать.

qazgramma[:v1][:free|pro][:задача][:вариант]

Без уточнений qazgramma означает qazgramma:v1:free:gec.correct.

Задача не из списка — E_TASK_UNKNOWN. Вариант не из списка задачи — E_VARIANT_UNKNOWN. В обоих случаях ответ называет допустимые значения.

ЗадачаЧто делаетТарифВарианты
gec.correctИсправить ошибкиfree · pro
gec.incorrectВнести ошибку — для учебных заданийproseptik (по умолчанию)
text.summarizeСократитьproshort, medium (по умолчанию), bullets
text.expandРазвернутьpro
text.paraphraseПересказать другими словамиproclose (по умолчанию), free
style.rewriteПереписать в другом стилеproneutral (по умолчанию), news, academic, official, conversational
style.simplifyУпроститьpro
style.complicateУсложнитьpro
gov.reviewПроверить служебный текстprofull (по умолчанию), calque, glossary, tone
gov.composeСоставить служебный текстpro

Примеры имён

qazgramma                                → исправить ошибки, бесплатно
qazgramma:pro                            → то же, платный тариф
qazgramma:v1:pro:text.summarize          → сократить (вариант medium)
qazgramma:v1:pro:text.summarize:bullets  → сократить списком
qazgramma:v1:pro:style.rewrite:news      → переписать в стиле новости
qazgramma:v1:pro:gov.review:glossary     → проверить по глоссарию

Что платформа умеет и чего не умеет

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

УмеетНе умеет
Чат-запросы, совместимые с OpenAIДообучать модели под вас
Потоковый ответКартинки, видео, генерацию изображений
Базы знаний с поиском по документамДокументы в форматах, кроме перечисленных ниже
Telegram-бот и виджет на сайтГолосовые каналы и звонки
Ключи в боевом и тестовом режимахОплату картой в личном кабинете
Задачи казахского языка — раздел QazgrammaГарантию отсутствия ошибок в ответе модели

Ограничения

Числа настоящие: столько выдаётся и столько проверяется на сервере.

Квота новой организации100 000 токенов в месяц
Увеличение без обращения к намдо 200 000
Запросов в минуту30
Размер документа15 МБ
Форматы документовtxt, md, csv, pdf, docx
Срок сессии в портале30 дней
Ответ в песочнице на главнойдо 300 токенов

Эндпоинты

POST/v1/chat/completions

Массив messages. Проходят stream, tools, response_format, seed, n.

POST/v1/embeddings

input — строка или массив строк.

GET/v1/models

Список доступных моделей.

POST/v1/files

multipart, поле file. PDF, DOCX, TXT, MD, CSV.

DELETE/v1/files/:id

Удаление загруженного файла.

POST/v1/vector_stores/:id/search

{"query": "…"} — поиск по хранилищу.

POST/v1/responses

Управляемый RAG с цитатами в annotations.

POST/v1/audio/speech

{"input": "…"}audio/wav.

Ошибки

Формат
{ "error": { "message": "…", "type": "…", "code": "…" } }
Важное свойство шлюза

Успехом считается только код 2xx от движка. Любой другой ответ — включая осмысленный 4xx — шлюз трактует как отказ узла и отдаёт 502. Поэтому прикладные ошибки сервисы за шлюзом возвращают внутри ответа 200, а не кодом HTTP.

Qazgramma: API задач

Инструменты казахского языка: правка ошибок, стиль, суммаризация, госдокументы и обратная генерация ошибок для обучающих наборов. Задача называется в имени модели — отдельное поле в теле не проходит ни через типизированный TypeScript SDK, ни через ноду OpenAI в n8n.

qazgramma[:версия][:тариф][:задача][:вариант]
qazgramma:v1:pro:style.rewrite:news   канонический вид

qazgramma                       → qazgramma:v1:free:gec.correct
qazgramma:pro                   → qazgramma:v1:pro:gec.correct
qazgramma:v1:pro:style.rewrite  → …:style.rewrite:neutral

Сегменты опознаются по значению, а не по позиции. Дефолт подставляется за пропущенный сегмент и никогда за нераспознанный: gec.corect с опечаткой вернёт E_TASK_UNKNOWN, а не выполнит молча другую задачу.

Ответ · пример снят с боевой модели
{
  "schema_version": "1.0",
  "status": "ok",
  "task":   "gec.correct",
  "model":  "qazgramma:v1:free:gec.correct",
  "result": { "text": "Мен кітапты оқыдым.", "changed": true },
  "corrections": [ {
    "edit_type": "replace",
    "spans": [ {"start": 4, "end": 11} ],   // руны, [start, end)
    "original": "кітапды", "corrected": "кітапты",
    "layer": "GRAM",
    "codes": [ "GEC.SEPTIK", "GEC.UNDESTIK" ],
    "confidence": 0.6, "classified_by": "rules"
  } ]
}
Честно о классификаторе

Категорию правки ставят правила по морфемам. Чего они не распознали — GEC.UNKNOWN с confidence: 0. Поле codes — массив: одна морфема бывает сразу двух категорий, как в примере выше, где выбор аффикса -ты это и падеж, и закон благозвучия.

Рецепты

Python · официальный openai SDK, без правок
from openai import OpenAI
import json

client = OpenAI(base_url="https://router.tilqazyna.kz/v1", api_key="sk-tq-…")

r = client.chat.completions.create(
    model="qazgramma:v1:free:gec.correct",
    messages=[{"role": "user", "content": "Мен кітапды оқыдым."}],
)
data = json.loads(r.choices[0].message.content)
print(data["result"]["text"])          # Мен кітапты оқыдым.
curl · вариант задаётся пятым сегментом
curl https://router.tilqazyna.kz/v1/chat/completions \
  -H "Authorization: Bearer sk-tq-…" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "qazgramma:v1:pro:style.rewrite:news",
    "messages": [{"role":"user","content":"Кеше мектепте жиналыс болды."}]
  }'

В n8n укажите модель строкой в ноде OpenAI Chat Model — ничего сверх стандартных полей не требуется. Ради этого задача и живёт в имени модели.