Jev — модель решений
MarkdownМодель решений Jev от TypeSafe отвечает на типизированные вопросы о тексте или JSON: выбор варианта, оценка по шкале или «да/нет» с вероятностями. Это не чат и не генерация текста.
Полное руководство
https://api.ailoot.ai/v1/systemonecurl https://api.ailoot.ai/v1/systemone \
-H "Authorization: Bearer $AILOOT_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "jev-latest",
"state": "Help! My payouts have been failing for 3 days.",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Does this convey urgency?"
}
}
}' import json, os, urllib.request
body = {
"model": "jev-latest",
"state": "Help! My payouts have been failing for 3 days.",
"questions": {
"is_urgent": {"type": "noul", "instructions": "Does this convey urgency?"},
},
}
req = urllib.request.Request(
"https://api.ailoot.ai/v1/systemone",
data=json.dumps(body).encode(),
headers={"Authorization": "Bearer " + os.environ["AILOOT_API_KEY"],
"Content-Type": "application/json"},
)
with urllib.request.urlopen(req, timeout=60) as resp:
result = json.load(resp)
print(result["answers"]["is_urgent"]["noul"]) # 0.95const resp = await fetch("https://api.ailoot.ai/v1/systemone", {
method: "POST",
headers: {
Authorization: `Bearer ${process.env.AILOOT_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
model: "jev-latest",
state: "Help! My payouts have been failing for 3 days.",
questions: {
is_urgent: { type: "noul", instructions: "Does this convey urgency?" },
},
}),
});
const result = await resp.json();
if (!resp.ok) throw new Error(`${resp.status} ${JSON.stringify(result)}`);
console.log(result.answers.is_urgent.noul); // 0.95{
"model": "jev-1.13.0",
"answers": {
"is_urgent": {
"type": "noul",
"noul": 0.95
}
},
"usage": { "input_tokens": 296, "output_tokens": 20 }
}Jev — модель решений класса System One от TypeSafe. Она не пишет текст и не ведёт диалог: вы передаёте состояние (state) — текст или JSON — и набор вопросов, а в ответ получаете типизированные значения с вероятностями. По ним код сразу ветвится, сортирует и маршрутизирует, без разбора свободного текста.
Все вопросы одного запроса оцениваются параллельно и независимо друг от друга, против одного и того же state. По данным TypeSafe, добавление вопросов почти не меняет время ответа, а вопросы не мешают друг другу.
| Что | Коротко |
|---|---|
| Модель | jev-latest — псевдоним последней стабильной версии Jev; карточка в каталоге |
| Метод | POST /v1/systemone. Это не чат: форматы OpenAI, Anthropic и Gemini для Jev не подходят. Ответ приходит целиком, одним JSON |
| Что принимает | Только текст: строку, объект JSON или массив текстов. Картинки, аудио и видео сначала переведите в текст |
| Контекст | 64K токенов на запрос — state и все вопросы вместе; state вместе с самым длинным вопросом — до 32K |
| Язык | По данным TypeSafe, точнее всего модель работает на английском; другие языки она принимает, но точность ниже — проверьте на своих данных |
| Цена | Вход $0.084 за 1 млн токенов, выход бесплатно |
Запрос
Авторизация
- Authorizationheaderобязательный
Ключ Ailoot в виде
Bearer sk-….
Тело запроса
- modelstringобязательный
jev-latest. - statestring | object | arrayобязательный
Что оценивать: строка с текстом или JSON — обращение клиента, запись из базы, переписка, текущее состояние вашего приложения. Объект с понятными именами полей обычно удобнее одной строки.
- questionsobjectобязательный
Вопросы. Ключи выбираете вы, ответы придут под теми же ключами; на ответ ключ не влияет — сам вопрос задаётся в
instructions. - questions.*.typestringобязательный
noul,choiceилиscore— см. ниже. - questions.*.instructionsstring | object | arrayобязательный
Сам вопрос. Длинный вопрос с данными можно передать объектом: вопрос в одном поле, данные в других; ссылайтесь на поля по имени в обратных кавычках.
- questions.*.criteriaobject | array
Варианты ответа, свои у каждого типа: описания «да» и «нет» у noul (необязательно), словарь вариантов у choice, упорядоченный список уровней у score.
Типы вопросов
| Тип | Что спрашивает | Что возвращает |
|---|---|---|
noul | Верно ли утверждение: да или нет | noul — вероятность «да» от 0 до 1 |
choice | Какой вариант из заданных подходит | choice, probabilities, confidence |
score | Где state на вашей шкале уровней | score, legend, probabilities, confidence |
Типы можно смешивать в одном запросе.
noul — да или нет
Поле criteria необязательно: в нём можно описать, что значит «да» (true) и «нет» (false). Ответ noul — число от 0 (нет) до 1 (да).
"is_urgent": {
"type": "noul",
"instructions": "Does this convey urgency?",
"criteria": {
"true": "Explicitly time-sensitive",
"false": "No urgency expressed"
}
}"is_urgent": {
"type": "noul",
"noul": 0.95
}choice — выбор варианта
criteria — словарь «вариант → описание»; если описание не нужно, укажите null. До 255 вариантов. В ответе choice — самый вероятный вариант, probabilities — вероятность каждого варианта (в сумме 1), confidence — уверенность от 0 до 1.
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoicing, refunds",
"technical": "Bugs, outages, integrations",
"sales": "Pricing, upgrades, new customers"
}
}"department": {
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.88, "technical": 0.12, "sales": 0.0 },
"confidence": 0.81
}score — оценка по шкале
criteria — уровни от низшего к высшему, не больше 10 (TypeSafe советует не меньше двух). В ответе score — значение, взвешенное по вероятностям уровней (может оказаться между уровнями), legend — номер уровня и его описание, probabilities и confidence. По данным TypeSafe, score годится для сравнения с порогом, но не для точного числа между уровнями.
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"]
}"frustration": {
"type": "score",
"score": 1.05,
"legend": { "0": "Calm", "1": "Frustrated", "2": "Very angry" },
"probabilities": { "0": 0.0, "1": 0.95, "2": 0.05 },
"confidence": 0.92
}Ответ
- modelstring
Какая версия модели ответила. Псевдоним jev-latest со временем переходит на новые версии: если вы подобрали пороги
confidenceпод конкретную версию, следите за этим полем. - answersobject
По одному ответу на каждый вопрос, под теми же ключами. У каждого ответа есть
type, у choice и score — ещёconfidence. - usageobject
input_tokensиoutput_tokens. Оплачиваются только входные токены.
Несколько вопросов за один запрос
Задавайте все вопросы к одному state одним запросом: они оцениваются параллельно, а state передаётся один раз. По данным TypeSafe, в их примере с 13 вопросами один общий запрос вышел в 12,2 раза дешевле и в 10 раз быстрее, чем 13 отдельных запросов, если отправлять их по очереди, при тех же ответах.
Сложное суждение лучше разбить на простые вопросы и объединить ответы в коде: например, вместо «оцени заявку» — отдельные оценки рынка, реализуемости и отличий от конкурентов. Веса тогда меняются в коде, а не в тексте вопроса.
{
"model": "jev-latest",
"state": "Help! My payouts have been failing for 3 days.",
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle this?",
"criteria": {
"billing": "Payments, invoicing, refunds",
"technical": "Bugs, outages, integrations",
"sales": "Pricing, upgrades, new customers"
}
},
"frustration": {
"type": "score",
"instructions": "How frustrated is the customer?",
"criteria": ["Calm", "Frustrated", "Very angry"]
},
"is_urgent": {
"type": "noul",
"instructions": "Does this convey urgency?"
}
}
}Когда подходит
- Маршрутизация. Отправить обращение в нужный отдел, а запрос — нужному обработчику: простому коду, большой модели или человеку.
- Сортировка и приоритет. Срочность, тональность, риск — по шкале, с порогами в коде.
- Модерация и проверки. Нарушает ли сообщение правила, подтверждает ли источник цитату, есть ли в документе ответ на вопрос — до того, как текст пойдёт дальше.
- Скоринг и ранжирование. Оценить документы, кандидатов или найденные фрагменты по своей рубрике и решить в коде, что пойдёт дальше.
- Вместо хрупкого «верни JSON». Вызов, который возвращает типизированные значения по построению, а не текст, который нужно разбирать.
Когда не подходит
- Чат, ответы пользователю, генерация текста или кода. Jev не пишет текст — для этого есть текстовые модели.
- Модель для Claude Code, Cursor и других агентов. Подставить jev-latest вместо модели агента не получится: агенту нужна модель, которая пишет текст и вызывает инструменты. Jev можно вызывать из кода, который агент пишет для вас.
- Арифметика, подсчёт, сравнение дат. По данным TypeSafe, это надёжнее делать в коде, а у модели спрашивать только смысловую часть — например, извлечь части даты через choice.
- Картинки, аудио и видео. Модель принимает только текст — переведите такие данные в текст заранее.
Цена
Оплачиваются только входные токены — поле usage.input_tokens ответа: $0.084 за 1 млн. Выходные токены бесплатны.
Запрос из примера на этой странице (296 входных токенов) стоит меньше $0.0001.
Перед запросом Ailoot резервирует сумму на балансе и после ответа списывает один раз по фактическому расходу — как это работает.
Лимиты
| Что | Лимит |
|---|---|
| Запрос целиком: state и все вопросы | 64K токенов |
| state вместе с самым длинным вопросом | 32K токенов |
| Вариантов в одном choice | до 255 |
| Уровней в одном score | от 2 до 10 |
| Вход | только текст: строка, объект JSON или массив текстов |
Лимиты модели — по данным TypeSafe. Ограничения вашего ключа и баланса действуют как для любой модели Ailoot: Ошибки и лимиты.
Ошибки
Ошибки приходят в общем формате Ailoot API: код, понятный текст и Request ID. Чаще всего у этого метода встречаются:
| Код | Когда | Что делать |
|---|---|---|
400 invalid_request | Тело не прошло проверку: нет state, model или questions, неизвестный type, у choice больше 255 вариантов, у score больше 10 уровней | Исправьте запрос по тексту ошибки: без правки он снова не пройдёт |
400 context_length_exceeded | state и вопросы вместе длиннее лимита модели | Отфильтруйте state в коде, оставьте то, что нужно вопросам |
401 invalid_api_key | Ключа нет или он неверный | Передайте ключ в заголовке Authorization |
402 insufficient_balance | Не хватает свободного баланса на резерв | Пополните баланс |
404 model_not_found, unsupported_endpoint | ID с ошибкой или модель вызвана не тем методом, например через /v1/chat/completions | Вызывайте jev-latest только через POST /v1/systemone |
429 rate_limit_exceeded | Слишком много запросов | Подождите столько секунд, сколько в заголовке Retry-After, и повторите |
503 model_overloaded, model_unavailable | Модель временно перегружена или недоступна | Если X-Should-Retry: true — повторите через Retry-After секунд; если false — сначала проверьте Request ID в истории |
504 model_timeout | Модель не ответила вовремя | Не отправляйте запрос заново, пока не проверите Request ID в истории |
Полный список кодов — на странице Ошибки и лимиты.