Решения через API
Один POST тем же ключом, что и чат: состояние и вопросы на вход, вероятности на выход. Здесь собраны типы вопросов, формат ответа, примеры на трёх языках и правила списания.
Эндпоинт и авторизация
Модель решений не пишет текст: вы передаёте состояние и вопросы, она возвращает откалиброванные вероятности по каждому вопросу. Работает тем же ключом, что и чат.
| Метод | Путь | Назначение |
|---|---|---|
| POST | https://api.tokenator.top/v1/decisions | Ответы на вопросы о переданном состоянии. |
| GET | https://api.tokenator.top/v1/decisions/models | Модели решений, доступные ключу. |
Ключ передаётся заголовком Authorization: Bearer sk-your-tokenator-key. Для клиентов, настроенных под OpenRouter, тот же обработчик отвечает на /v1/alpha/decisions и /v1/api/alpha/decisions.
Первый запрос
curl https://api.tokenator.top/v1/decisions \ -H "Authorization: Bearer sk-your-tokenator-key" \ -H "Content-Type: application/json" \ -d '{ "model": "jev-latest", "state": "После нажатия «Оплатить» страница оформления заказа становится пустой. Пробовал в двух браузерах.", "questions": { "is_bug": { "type": "noul", "instructions": "Сообщает ли клиент о дефекте в продукте?", "criteria": { "true": "Клиент описывает сломанное или неожиданное поведение продукта.", "false": "Клиент задаёт вопрос или просит новую функцию." } }, "team": { "type": "choice", "instructions": "Какая команда должна взять тикет?", "criteria": { "account": "Вход, права доступа, профиль.", "frontend": "Отрисовка, вёрстка, совместимость с браузерами.", "payments": "Оформление заказа, биллинг, приём платежей." } }, "urgency": { "type": "score", "instructions": "Насколько срочен тикет?", "criteria": [ "Подождёт до следующего релиза", "Исправить на этой неделе", "Блокирует выручку прямо сейчас" ] } } }'
{
"id": "dec-6f1c9a2e4b7d0c3a5e8f91b2",
"model": "jev-latest",
"answers": {
"is_bug": { "type": "noul", "noul": 0.96 },
"team": {
"type": "choice",
"choice": "payments",
"confidence": 0.75,
"probabilities": { "account": 0, "frontend": 0.16, "payments": 0.84 }
},
"urgency": {
"type": "score",
"score": 1.99,
"confidence": 0.99,
"legend": {
"0": "Подождёт до следующего релиза",
"1": "Исправить на этой неделе",
"2": "Блокирует выручку прямо сейчас"
},
"probabilities": { "0": 0, "1": 0.01, "2": 0.99 }
}
},
"usage": { "input_tokens": 476, "output_tokens": 70 }
}Ответ всегда этой формы: свой id, имя модели Tokenator, answers по ключам ваших вопросов и usage. Имя провайдера, его идентификатор запроса и стоимость до клиента не доходят.
Три типа вопросов
| Тип | Что передать в criteria | Что придёт в ответе |
|---|---|---|
noul | Да или нет: объект с описаниями true и false, оба обязательны. | noul — вероятность того, что верно true, от 0 до 1. |
choice | Один вариант из нескольких: объект «ключ варианта → описание», хотя бы один вариант. | choice — самый вероятный вариант, confidence — уверенность в нём, probabilities — вероятность каждого варианта. |
score | Уровень на упорядоченной шкале: массив уровней от низшего к высшему, пустых уровней быть не может. | score — ожидаемый уровень как дробный индекс от 0, confidence, legend — индекс → текст уровня, probabilities — вероятность каждого уровня. |
Какие модели отвечают на вопросы
| Модель | API ID | Контекст | Множитель |
|---|---|---|---|
| Jev Latest | jev-latest | 32K токенов | 1.1× |
| Span-01 | span-01 | 32K токенов | 1× |
| Solar Decide | solar-decide | 524.3K токенов | 1.1× |
| D1 | d1 | 65.5K токенов | 1× |
| GPT-6 Luna Decisions | gpt-6-luna-decisions | 1.05M токенов | 1.1× |
Параметры запроса
| Поле | Тип | Что делает |
|---|---|---|
model | string, обязательное | API ID модели из каталога. Модель, которая не отмечена как модель решений, отклоняется с кодом 400 — запрос до провайдера не доходит. |
state | string, объект или массив, обязательное | То, о чём задаются вопросы: текст обращения, запись из базы, история диалога. |
questions | объект, обязательное | Вопросы по ключам, от 1 до 256. У каждого — type, instructions (сам вопрос) и criteria. Ключ вопроса вернётся ключом ответа. |
provider, user, session_id, trace | необязательные | Принимаются для совместимости с клиентами OpenRouter, но дальше Tokenator не уходят: провайдера выбирает маршрутизация Tokenator. |
Из кода
В OpenAI SDK отдельного метода для решений нет, поэтому это обычный POST с JSON.
import requests result = requests.post( "https://api.tokenator.top/v1/decisions", headers={"Authorization": "Bearer sk-your-tokenator-key"}, json={ "model": "jev-latest", "state": "После нажатия «Оплатить» страница оформления заказа становится пустой. Пробовал в двух браузерах.", "questions": { "is_bug": { "type": "noul", "instructions": "Сообщает ли клиент о дефекте в продукте?", "criteria": {"true": "Клиент описывает сломанное или неожиданное поведение продукта.", "false": "Клиент задаёт вопрос или просит новую функцию."}, }, }, }, ).json() print(result["answers"]["is_bug"]["noul"])
const res = await fetch("https://api.tokenator.top/v1/decisions", { method: "POST", headers: { Authorization: "Bearer sk-your-tokenator-key", "Content-Type": "application/json", }, body: JSON.stringify({ model: "jev-latest", state: "После нажатия «Оплатить» страница оформления заказа становится пустой. Пробовал в двух браузерах.", questions: { team: { type: "choice", instructions: "Какая команда должна взять тикет?", criteria: { account: "Вход, права доступа, профиль.", frontend: "Отрисовка, вёрстка, совместимость с браузерами.", payments: "Оформление заказа, биллинг, приём платежей.", }, }, }, }), }) const { answers } = await res.json() console.log(answers.team.choice, answers.team.probabilities)
Как списываются решения
Платный только вход, как и у самих провайдеров этих моделей. Считается input_tokens из ответа провайдера, умножается на множитель модели и списывается с лимита ключа. output_tokens показывается в ответе, но не списывается. Если провайдер не прислал счётчик, списывается оценка по размеру запроса.
Расход виден в дашборде ключа вместе с чатом, а остаток — в /v1/tokens.
Коды ошибок
| Код | Когда приходит | Что делать |
|---|---|---|
400 model is required | В теле нет поля model или тело не JSON. | Проверьте Content-Type: application/json и непустой model. |
404 model_not_found | Модели с таким именем нет в каталоге — чаще всего это опечатка. | Сверьте ID с таблицей выше или со списком /v1/decisions/models. |
400 is not a decision model | Модель есть в каталоге, но это не модель решений. | Возьмите модель из таблицы выше. Обычные чат-модели работают на /v1/chat/completions. |
400 needs instructions, has an unknown type | Запрос не прошёл проверку: нет состояния или вопросов, у вопроса нет инструкции или критериев, неизвестный тип. Текст ошибки называет ключ вопроса. | Исправьте названный вопрос. Такой запрос до провайдера не доходит и ничего не стоит. |
401 | Ключ не передан, просрочен или отозван. | Проверьте заголовок Authorization: Bearer и срок ключа в личном кабинете. |
502 Request error | Ошибка на стороне провайдера. Её текст клиенту не пересылается. | Повторите запрос — Tokenator сам переключается на следующего провайдера. Если ошибка стабильна, напишите в поддержку. |
503 Model temporarily unavailable | Ни один провайдер модели не ответил. | Повторите позже или возьмите другую модель из таблицы. |
Частые вопросы
Чем модель решений отличается от чат-модели?
Она не пишет текст, а оценивает: на вход — состояние и вопросы, на выход — вероятность по каждому. Ответ всегда одной формы, его не нужно разбирать из текста, и он заметно дешевле, чем просить чат-модель ответить JSON: платный только вход.
Почему модель отвечает 400 на /v1/decisions?
Эндпоинт обслуживает только модели, отмеченные как модели решений. Список — в таблице выше и в каталоге под фильтром «Решения». Запрос с обычной чат-моделью отклоняется до обращения к провайдеру, поэтому такая ошибка ничего не стоит.
Можно ли обратиться к модели решений из чата?
Нет. На /v1/chat/completions, /v1/responses и /v1/messages такая модель отвечает 400 с указанием нужного пути. В общем списке /v1/models её тоже нет, как и у OpenRouter: она видна по /v1/models?output_modalities=decisions и /v1/decisions/models.
Сколько вопросов можно задать за раз?
До 256 в одном запросе. Вместе с состоянием они должны поместиться в контекст модели — он написан в таблице выше и на странице модели.
Хранит ли Tokenator то, что я отправил?
Тело запроса попадает в технический лог ключа, как и у остальных эндпоинтов. Что именно хранится и сколько — написано в разделе о безопасности.