
Кодинг-агенты вроде Claude Code или OpenCode спрашивают разрешение на каждую команду: bun test, git status, ls src. За сессию набираются десятки таких запросов, и почти все — про безобидные команды. Выключите проверку, и агент получит дорогу к git push --force. Оставите — будете кликать «разрешить» весь день.
Такой вопрос можно делегировать модели Jev от TypeSafe. Но она вообще устроена не так, как привычные LLM: Jev ничего не генерирует, а отвечает на заранее заданные вопросы вероятностями от 0 до 1. И пригодна она не только для кнопки «Approve».
В запросе к Jev две части. state — данные для оценки: текст тикета, заказ, политика возвратов, команда из терминала. questions — вопросы трёх типов:
criteria.Ответ типизированный, поэтому код ветвится по числу напрямую: if (verdict.confidence >= 0.8). Парсить свободный текст не нужно.
Формулировки вопросов имеют значение. Хороший вопрос — это утверждение, которое либо истинно, либо ложно для данного state: «клиент просит вернуть деньги», «ситуация покрывается политикой». Плохой вопрос — «стоит ли одобрить возврат»: это уже решение, и его должен принимать ваш код по нескольким ответам, а не модель за один раз.
В поддержку пришёл тикет: «My checkout page shows a blank screen after I click Pay. I have tried two browsers». Одним запросом спрашиваем у Jev, баг ли это, какой команде отдать и насколько срочно:
curl https://api.vega.chat/api/v1/decisions \
-H "Authorization: Bearer $VEGA_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "typesafe/jev-1.13",
"state": {
"customer_tier": "enterprise",
"ticket": "My checkout page shows a blank screen after I click Pay. I have tried two browsers."
},
"questions": {
"is_bug": {
"type": "noul",
"instructions": "Is the customer reporting a software defect?"
},
"team": {
"type": "choice",
"instructions": "Which team should own this ticket?",
"criteria": {
"payments": "Checkout, billing, or payment processing issues.",
"frontend": "Rendering, layout, or browser compatibility issues.",
"account": "Login, permissions, or profile issues."
}
},
"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"
]
}
}
}'Ответ из документированного примера:
{
"id": "gen-dec-1790015143-AIaTutprXsJ5EwohRSjb",
"model": "typesafe/jev-1.13-20260917",
"provider": "TypeSafe",
"answers": {
"is_bug": { "type": "noul", "noul": 0.96 },
"team": {
"type": "choice",
"choice": "payments",
"confidence": 0.67,
"probabilities": { "payments": 0.78, "frontend": 0.22, "account": 0 }
},
"urgency": {
"type": "score",
"score": 1.99,
"confidence": 0.99,
"probabilities": { "0": 0, "1": 0, "2": 1 },
"legend": {
"0": "Can wait for the next release",
"1": "Should be fixed this week",
"2": "Blocking revenue right now"
}
}
},
"usage": { "input_tokens": 476, "output_tokens": 70 }
}Как это читать. is_bug: 0.96 — почти наверняка дефект; значение около 0.5 значило бы «и так, и так с равной вероятностью», а не «баг средней тяжести». В team.probabilities видно расклад по вариантам: payments 0.78, frontend 0.22. urgency: 1.99 на шкале из трёх пунктов прижалось почти вплотную к «блокирует выручку прямо сейчас». В usage видно, сколько токенов ушло на запрос — здесь меньше пятисот входных.
Обратите внимание на поле model: отправляли typesafe/jev-1.13, а ответил датированный снапшот typesafe/jev-1.13-20260917. Так и задумано — версия резолвится в конкретный релиз в момент запроса.
| Чат-модель | Jev | |
|---|---|---|
| Ответ | Свободный текст, нужно парсить | Типизированное значение |
| Уверенность | Числа нет | probability и confidence от 0 до 1 |
| Решение в коде | Зависит от промпта | Порог на числе |
Поэтому её вызывают на каждый элемент потока: каждый комментарий, каждый вызов инструмента, каждый черновик ответа.
Хук отправляет Jev команду, задачу и путь к проекту с двумя вопросами: «команда обратима и не выходит за пределы проекта?» и «это разумный шаг к задаче?». Автоодобрение — только если обе вероятности выше 0.9. До модели срабатывает статический список опасного: rm -rf, форс-пуши, деплои, файлы с креденшелами — такие команды к Jev вообще не доходят. Любая ошибка или таймаут означают «оставить обычный промпт», так что сбой превращается в лишний вопрос пользователю, а не в выполненную команду. Рецепт описан для OpenCode, Claude Code, Codex CLI и Cursor; для OpenCode есть готовый плагин Jevvy.
Схема для RAG-поддержки: дешёвая модель пишет черновик по выдержкам из базы знаний, Jev сверяет черновик с этими выдержками и выносит вердикт — supported, unsupported или declined. Дорогая модель переписывает ответ только при провале проверки. На бенчмарке из 50 вопросов каскад дал те же ноль ошибок, что и прогон всего потока через топовую модель, при этом большинство вопросов до эскалации вообще не дошло.
Вместо правила «каждый вызов refund показать человеку» Jev смотрит тикет, заказы и текст политики и отвечает на три вопроса: клиент просил возврат? речь о том заказе? ситуация покрывается политикой? Дальше пороги в коде: approve — инструмент выполняется, block — агент получает отказ с причиной, review — пауза для человека. Человек видит только спорные вызовы, а каждое решение остаётся в аудит-логе с объяснением.
Один запрос возвращает категорию (вопрос choice) и вероятность каждого тега (по noul на тег). Пороги по тегам подбирают на небольшой размеченной вручную выборке, а не из круглого числа. В документированном примере так размечали датасет TweetTopic из 550 твитов. Та же схема работает для триажа комментариев с Reddit и YouTube: вероятность релевантности теме плюс тональность, и на выходе решение — записать, отдать человеку или игнорировать.
POST https://api.vega.chat/api/v1/decisions. Работает и https://api.vega.chat/api/alpha/decisions — этот путь повторяет оригинальный адрес метода, поэтому если код уже рассчитан на такой base URL, достаточно поменять домен и ключ.@typesafe-ai/sdk или typesafe_sdk), укажите baseURL: 'https://api.vega.chat/api' — SDK сам добавит /v1/systemone. Либо задайте переменные TYPESAFE_BASE_URL и TYPESAFE_API_KEY с ключом VEGA.В запросах указывайте typesafe/jev-1.13, а если нужна всегда свежая версия — алиас ~typesafe/jev-latest. В TypeSafe SDK можно писать короткие id: jev-1.13 или jev-latest. Страница модели в нашем каталоге: api.vega.chat/aimodels/jev-1.13.
[!NOTE] Jev — не чат-модель. Если отправить её в
/chat/completions, API вернёт ошибкуwrong_endpointс подсказкой использовать/api/v1/decisions.
state. Команда cat ~/.aws/credentials выглядит для неё как обычный cat, если имя файла не попало в ваш список рисков. Граница безопасности — статические правила до модели, а не её порог.