Решения (Decisions)
Что это
Заголовок раздела «Что это»POST /v1/decisions — эндпоинт для decision-моделей (System One). В отличие от чат-моделей, они не генерируют текст: вы отправляете состояние приложения (state) и один или несколько типизированных вопросов (questions), а получаете обратно типизированные ответы с вероятностями, по которым код ветвится напрямую — без парсинга свободного текста.
Это замена паттерну «спросить у LLM узкий вопрос и вытащить метку из ответа»: быстрее, дешевле и предсказуемее.
Модели: typesafe/jev-1.13 (TypeSafe Jev, контекст 32K) и jaredpalmer/kev-4b (Jared Palmer Kev 4B, компактная открытая Apache-2.0 альтернатива, контекст 8K). Контракт у обеих один — /v1/systemone.
Три примитива
Заголовок раздела «Три примитива»| Примитив | Вопрос | Что возвращается |
|---|---|---|
noul |
Выполняется ли условие? | Вероятность «да» (0…1) |
choice |
Какой из вариантов? | Выбранный вариант, вероятность каждого, уверенность |
score |
Где на упорядоченной шкале? | Взвешенная позиция, вероятности уровней, уверенность |
Один запрос может содержать сколько угодно вопросов разных типов — ответ придёт по каждому.
{ "model": "typesafe/jev-1.13", "state": "…контекст: строка, объект или массив…", "questions": { "is_bug": { "type": "noul", "instructions": "…", "criteria": { "true": "…", "false": "…" } }, "team": { "type": "choice", "instructions": "…", "criteria": { "billing": "…", "tech": "…" } }, "urgency": { "type": "score", "instructions": "…", "criteria": ["…", "…", "…"] } }, "session_id": "опционально — группировка запросов", "user": "опционально — идентификатор конечного пользователя"}| Поле | Тип | Обязательно | Описание |
|---|---|---|---|
model |
string | да | typesafe/jev-1.13 (алиасы jev, jev-1.13) или jaredpalmer/kev-4b (алиасы kev, kev-4b) |
state |
string | object | array | да | Контекст для оценки: текст тикета, объект состояния, массив связанных данных |
questions |
object | да | Map «имя → вопрос». Имя становится ключом в answers |
session_id |
string | нет | Группировка связанных запросов (воркфлоу, диалог) — до 256 символов |
user |
string | нет | Идентификатор конечного пользователя — до 256 символов |
Вопросы
Заголовок раздела «Вопросы»Общие поля: type (обязательно), instructions (обязательно) — сам вопрос словами.
noul—criteriaс ключамиtrueиfalse(оба обязательны): по паре предложений модель понимает границу условия.choice—criteriaкак объект «вариант → описание» (обязательно). В ответе — выбор и распределение по всем вариантам.score—criteriaкак массив упорядоченных уровней (обязательно, ≥1). Уровень 0 — низ шкалы.
Критерии и instructions могут быть не только строками — принимается структурное руководство (объекты/массивы).
{ "id": "gen-dec-…", "model": "typesafe/jev-1.13-20260917", "provider": "TypeSafe", "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, "probabilities": { "0": 0, "1": 0.01, "2": 0.99 }, "legend": { "0": "Can wait", "1": "This week", "2": "Blocking revenue" } } }, "usage": { "cost": 0.00002, "cost_rub": "0.0023", "billing_source": "openrouter", "input_tokens": 476, "output_tokens": 70 }}noul→noul: вероятность «да».choice→choice(выбранный вариант),probabilitiesпо каждому,confidence.score→score(взвешенная позиция 0…N−1),probabilitiesпо уровням,legend— соответствие индексов вашим формулировкам,confidence.usage.cost— стоимость запроса в USD (как у остальных эндпоинтов),cost_rub— списание в рублях.
Цены и биллинг
Заголовок раздела «Цены и биллинг»Платятся только входные токены (state + вопросы) — по цене модели на странице каталога; выходные бесплатны. Типичный запрос (~500 токенов) стоит доли копейки. Списание — по фактическому usage.cost из ответа.
Примеры
Заголовок раздела «Примеры»curl https://api.mixen.ai/v1/decisions \ -H "Authorization: Bearer $MIXEN_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "model": "typesafe/jev-1.13", "state": "My checkout page shows a blank screen after I click Pay. Tried two browsers.", "questions": { "is_bug": { "type": "noul", "instructions": "Is the customer reporting a software defect?", "criteria": { "true": "Describes broken or unexpected product behavior.", "false": "Asks a question or requests a feature." } }, "team": { "type": "choice", "instructions": "Which team should own this ticket?", "criteria": { "payments": "Checkout, billing, payment processing.", "frontend": "Rendering, layout, browser compatibility." } }, "urgency": { "type": "score", "instructions": "How urgent is this ticket?", "criteria": ["Can wait for the next release", "Should be fixed this week", "Blocking revenue right now"] } } }'import requests
r = requests.post( "https://api.mixen.ai/v1/decisions", headers={"Authorization": f"Bearer {KEY}"}, json={ "model": "typesafe/jev-1.13", "state": "Task: clean up inactive accounts. Proposed tool call: delete_rows(...)", "questions": { "safe_to_run": { "type": "noul", "instructions": "Is this action safe to run without a human approving it first?", "criteria": { "true": "Reversible or low-impact, clearly within the task.", "false": "Destructive, irreversible, or broader than the task." }, } }, }, timeout=60,)noul = r.json()["answers"]["safe_to_run"]["noul"]if noul < 0.8: escalate_to_human()const r = await fetch('https://api.mixen.ai/v1/decisions', { method: 'POST', headers: { Authorization: `Bearer ${KEY}`, 'Content-Type': 'application/json' }, body: JSON.stringify({ model: 'typesafe/jev-1.13', state: { channel: '#support', message: 'Help! Payouts failing for 3 days.' }, questions: { escalate: { type: 'noul', instructions: 'Does this message convey urgency?', criteria: { true: 'Explicitly time-sensitive', false: 'No urgency expressed' }, }, }, }),});const { answers } = await r.json();if (answers.escalate.noul > 0.8) notifyOnCall();Сценарии
Заголовок раздела «Сценарии»- Маршрутизация — какой команде/очереди принадлежит обращение.
- Гейтинг агентов — безопасен ли тул-колл (обратим? в рамках задачи?) — выполнять, отказывать или звать человека по порогу
noul. - Классификация и теги — категория + произвольное число бинарных меток за один запрос.
- Каскады — черновик дешёвой моделью, проверка фактов decision-моделью, эскалация на дорогую только при провале проверки.
Выбирайте пороги по confidence/probabilities, а не только по главному ответу: низкая уверенность — сигнал отдать случай человеку или переспросить.
Ограничения
Заголовок раздела «Ограничения»- Модель не генерирует текст и не объясняет решение — только вероятности. Нужна мотивировка — спросите чат-модель после.
- Контекст зависит от модели: 32K у Jev, 8K у Kev 4B (
stateплюс вопросы). - Ошибки — стандартные коды платформы:
400(невалидные параметры, включая ошибки вcriteria),402,404 model_not_found,429,502(сбой апстрима).