Модель, яка не вміє говорити: навіщо потрібен Jev і що з ним уже будують

Більшість коду, який ми пишемо навколо LLM, існує з однієї причини: модель повертає текст, а програмі потрібне значення. Звідси прохання «поверни валідний JSON», ретраї, парсери, санітайзери і той невиразний сором, коли на проді падає json_decode, бо модель цього разу вирішила додати пояснення перед фігурною дужкою.
15 вересня TypeSafe AI випустила Jev — модель, яка вирішує цю проблему з іншого боку: вона не повертає текст взагалі. Ви передаєте їй стан і типізовані питання, вона повертає відповіді з ймовірностями за
Компанію заснував Дієго Алмейда, співавтор RLHF та InstructGPT в OpenAI. На запуску вона підняла $40 млн на чолі з DCVC.
System 1 замість System 2
Назва класу моделей — «System One» — відсилає до Канемана: перша система мислення швидка й інтуїтивна, друга повільна й розмірковувальна. Теза TypeSafe у тому, що переважна більшість рішень усередині програми — це судження першої системи. «До якої категорії належить цей тикет?», «це терміново?», «чи варто це показувати?», «який із двадцяти варіантів тут доречний?».
Досі під ці питання ми орендували другу систему. Модель, яка вміє писати есе й доводити теореми, витрачає секунди й центи на те, щоб відповісти «білінг». Причому відповідає вона текстом, який ще треба перетворити на значення.
Увесь API Jev — це три типи питань:
- Choice — один варіант із набору, до 255 варіантів;
- Score — позиція на шкалі з
2-10 названих рівнів, причому результат може опинитися між рівнями, наприклад 1.035; - Noul — «так/ні» у вигляді одного числа від 0 до 1.
Стан — рядок, JSON-об’єкт або масив реплік, тільки текст, до 64k токенів разом з питаннями. Зображень і звуку немає.

Чим це принципово відрізняється від LLM
Різниця не в розмірі моделі й навіть не в ціні, а в тому, що повертається.
Коли ви просите GPT або Claude віддати JSON за схемою, ви просите генератор тексту випадково потрапити у валідну структуру. Structured output і grammar-based decoding цю ймовірність підвищують, але сама постановка задачі лишається такою: текст, який має форму даних. Jev структуру не генерує — вона обмежена схемою за своєю побудовою. Обрати неправильний варіант зі списку модель може, а повернути варіант поза списком — ні.
Як це виглядає у цифрах, за даними TypeSafe:
| Jev | Провідні LLM | |
|---|---|---|
| Затримка end-to-end | ||
| Ціна входу | $0.042 / млн токенів | $0.20-10 / млн токенів |
| Ціна виходу | безкоштовно | ~5x від входу |
Далі — наслідки, і вони цікавіші за сам факт:
Затримка
Вихідні токени безкоштовні, вхідні коштують $0.042 за мільйон. Тому додати ще п’ять питань або розширити список із трьох опцій до двадцяти майже нічого не коштує.
Питання рахуються паралельно за один прохід по стану. Це перевертає звичний інстинкт «спочатку дешевий виклик, потім уточнювальний, якщо знадобиться». Тут дешевше спитати все одразу, а що з цього виявилося релевантним — вирішить код. У документації TypeSafe наводять приклад: 13 питань до довгої статті одним викликом замість тринадцяти окремих — у 12.2 раза дешевше і в 10 разів швидше за ідентичних відповідей.
Впевненість відкалібрована. Модель тренували методом RLCD (Reinforcement Learning for Calibrated Decisions), який оптимізує ймовірності проти результатів, а не проти людських уподобань.
Останній пункт змінює архітектуру сильніше за решту. Якщо число впевненості справді щось означає, поріг перестає бути одним на всю систему і стає окремим на кожну дію — пропорційно до ціни помилки. Поставити тег на статтю можна при 0.6. Списати гроші — хіба що при 0.9. Усе, що нижче, передати людині. Це звичайний if у вашому коді, а не чергова спроба вмовити модель промптом.
Побічний ефект: рівний розподіл ймовірностей теж стає сигналом. Зазвичай він означає не те, що модель розгубилася, а те, що з переданого стану ваші варіанти нерозрізненні. Тобто проблема в критеріях, і це видно з даних.
Де це доречно, а де ні
Робочий сценарій — каскад. Jev дешево класифікує й маршрутизує, звичайний код обробляє те, що вміє, а провідна модель отримує лише складну меншість. За наявними оцінками, на мільйоні тикетів це приблизно $6480 замість $30 400, причому близько 800 тисяч відповідей укладаються в півсекунди.

Де це добре працює:
- тріаж і маршрутизація звернень, листів, заявок;
- модерація та фільтрація;
- відбір релевантного перед дорогим контекстним вікном;
- guardrails: перевірка відповіді генеративної моделі перед показом користувачу;
- категоризація на обсягах, де це раніше було невигідно;
- будь-яке рішення всередині запиту, якому потрібна відповідь за півсекунди.
Де не варто: генерація будь-чого, арифметика, підрахунки й роботу з датами, рішення, які потребують письмового обґрунтування для аудитора, разові складні міркування, справді відкриті простори відповідей.
Корисна ментальна поправка: це не дешевша LLM. Це інший примітив — виклик функції, який випадково виявився «розумним», повертає тип і повідомляє, наскільки йому можна вірити.
Як це виглядає в коді
Офіційні SDK є для Python і JavaScript:
response = client.system_one(
state={"ticket": {"subject": "Duplicate charge", "messages": [...]}},
questions={
"department": Choice(
instructions="Which team should handle this",
criteria={
"billing": "Payment or subscription issues",
"technical": "Bugs or integration problems",
"sales": "Pricing or account questions",
},
),
"frustration": Score(
instructions="How frustrated the customer appears",
criteria=["Calm, just stating facts", "Frustrated but civil", "Very angry"],
),
"refund_requested": Noul(
instructions="The customer is explicitly asking for a refund"),
},
)
dept = response.answers["department"]
print(dept.choice, dept.confidence)
У PHP поки немає офіційного клієнта — на Packagist з’явилися сторонні пакети, але вони версії v0.1.0 від 17 вересня з одиничними завантаженнями. Зате підтримка з’явилася там, де вона для Laravel-розробника доречніша: у сам Laravel AI SDK, у гілку 1.x. Тейлор Отвелл анонсував це 17 вересня.
use Laravel\Ai\Classification;
use Laravel\Ai\Classification\Boolean;
use Laravel\Ai\Classification\Choice;
use Laravel\Ai\Classification\Score;
$result = Classification::of($supportRequest)
->questions([
'urgent' => new Boolean('Does this request need an immediate response?', [
'true' => 'Explicitly time-sensitive',
'false' => 'No urgency expressed',
]),
'department' => new Choice('Which team should handle this request?', [
'billing' => 'Payments, invoices, and refunds',
'technical' => 'Bugs, outages, and integrations',
'sales' => 'Pricing, plans, and upgrades',
]),
'frustration' => new Score('How frustrated is the customer?', [
'Calm',
'Frustrated',
'Very angry',
]),
])
->classify();
$result['urgent']->probability; // 0.94
$result['urgent']->isTrue(threshold: 0.8); // true
$result['department']->choice; // 'technical'
$result['department']->probabilityOf('technical'); // 0.87
$result['department']->confidence; // 0.82, або null
$result['frustration']->score; // 1.24, зважений за ймовірностями рівень
$result['frustration']->label(); // 'Frustrated'
$result['frustration']->normalized(); // 0.62
Окремо варто відзначити те, що зазвичай додають через рік після релізу: класифікацію відразу зробили тестованою. Classification::fake() генерує відповіді правильної форми без жодного мережевого виклику, є assertClassified(), assertNotClassified(), assertNothingClassified() і події Classifying / Classified. Валідація падає одразу й зрозуміло: порожній стан, нуль питань, Choice з однією опцією, Score з асоціативним масивом замість списку.
Що встигли побудувати за перші дві доби
Це демо, а не продакшн-кейси, і всі цифри — самозвіти авторів. Але вони добре показують форму задач, під які модель підходить.
1018 наукових статей за $0.08. Проєкт 1kpapers.com проганяє статті через генеративну модель заради самарі, а потім віддає Jev назву плюс 24 кандидатські теми і просить один Choice. Самарі коштувало $3.99, класифікація — $0.08, медіанна затримка 256 мс на статтю. Показова тут навіть не економія, а те, що в одному конвеєрі працюють дві різні моделі, кожна на своїй ділянці.
Браузерний агент, який бронює квиток за 7.1 секунди. У browser-use/jev-ultrafast кожна сторінка перетворюється на пронумеровану таблицю елементів, і один запит обирає одразу і операцію (CLICK, TYPE_TEXT, SELECT, SCROLL, DONE...), і її ціль. Маленька LLM підключається лише тоді, коли треба ввести текст. Цюрих — Лондон на справжньому Google Flights: 7.1 секунди і $0.0039 разом із завантаженням сторінок.
Керування комп’ютером за $0.0002 на крок. У awlevin/typesafe-computer-use екран читає OCR, наступну дію обирає Jev, генеративна модель викликається лише для вільного тексту. Проти $0.032 за рішення в Opus 5 по голому скріншоту. Найкорисніша фраза в репозиторії — застереження автора: усе, що провідна модель робить безкоштовно й між іншим (наприклад, прочитати дати з пікселів і порівняти їх), тут доводиться перебудовувати як детермінований стан.
Маркет-мейкер, який вирішує кожні ~300 мс. jarrodwatts/jev-trader читає стакан і відповідає «купувати чи продавати» раз на блок Monad, із затримкою моделі близько 81 мс.
Дрон із судженням на 2.5 Гц. RomanSlack/jev-drone цікавий тим, як акуратно він ставить модель на місце: 500 Гц — польотний контролер, 50 Гц — безпека, 15 Гц — класичний комп’ютерний зір, і лише ~2.5 Гц — тактичне рішення від Jev. Як пише автор, Jev не може бути шаром сприйняття і не може працювати на частоті керування.
Спільне в усіх цих проєктах одне: цикл, безпека й арифметика лишаються у звичайному коді, а моделі віддають вузьке судження посередині — те, яке кодом важко сформулювати.
Де це підійшло б нам
Щоб не говорити абстрактно, приміряю до власного проєкту. На laravelukraine.com частину роботи з текстом виконує Haiku 4.5: дешева модель, яку ми свідомо відокремили від основної й тримаємо на коротких задачах. Ось як ці задачі розкладаються за критерієм «рішення чи текст».
Аналіз вакансії — найпоказовіший випадок. З опису витягується десяток полів, і вони різні за природою:
'level' => enum: junior | middle | senior | lead | unknown 'employment_type' => enum: full-time | part-time | contract | freelance 'english_level' => enum: none | beginner | ... | fluent 'has_reservation' => bool // чи згадано бронювання від мобілізації 'is_php_role' => bool // чи PHP тут основна мова, а не випадкова згадка 'summary' => string(500) // короткий опис вакансії 'salary_min/max' => int|null // вилучені з тексту числа
Перші три — це Choice у чистому вигляді, наступні два — Noul. Тобто п’ять полів із десяти лягають на типізовані рішення точно: простір відповідей фіксований, і саме його Jev гарантує за побудовою. Причому is_php_role — поле, де впевненість була б доречнішою за булеве значення: вакансія «Fullstack (Laravel/Vue)» це PHP-роль чи ні? Зараз модель мусить відповісти так або ні, а поріг вирішував би код.
А summary і зарплатні вилки — ні. Перше є генерацією тексту, чого Jev не вміє взагалі. Друге — вилучення чисел із довільного формулювання («від 2000 до 3500 $»,
Автоматичні теги для вакансій — складніше. Модель отримує опис і перелік уже наявних тегів, а повертає релевантні. Якби перелік був закритим, це був би Choice на кожен тег або серія Noul. Але список поповнюваний, і саме на цьому Jev зупиняється: нового тега, якого немає у схемі, він не вигадає.
Генерація SEO-полів — взагалі не його. Meta-заголовок і опис треба написати, а не обрати зі списку, тож класифікатор тут не допоміг би нічим.
Підсумок приміряння: з шести задач, які в нас виконує дешева модель, повністю на Jev перейшла б одна (частина аналізу вакансій), частково — ще одна (теги, якби зафіксувати словник), а чотири лишилися б на генеративній моделі. Це, схоже, і є реалістична пропорція: не заміна LLM, а зняття з неї того, що нею ніколи й не мало бути.
Чого вона не вміє
TypeSafe опублікувала сторінку «jaggedness» із переліком слабких місць. Для дня запуску це рідкісна чесність, і прочитати її варто раніше, ніж писати перший виклик.
Читає буквально. Заперечення, уточнення й неявні умови сприймаються буквально. Характерна ознака: ви дивитесь на неправильну відповідь і подумки пояснюєте, що ви насправді мали на увазі. Це пояснення і є пропущеною половиною інструкції.
Не рахує. Ні кількість елементів (похибка росте разом із розміром), ні дати. Дати для неї — текст, а не впорядковані величини: що було раніше, скільки минуло, чи потрапляє в інтервал — усе ненадійно. Витягти місяць Choice-ом можна, а впорядкувати — лише кодом.
Зайвий контекст псує точність. Що більше в стані матеріалу, який питанню не потрібен, то гірша відповідь. Фільтруйте в коді, передавайте тільки потрібні поля.
Стан не вважається ворожим. Текст, який агітує за власну класифікацію, здатен зсунути відповідь. Якщо у стан потрапляє контент від користувача — це ваша модель загроз, і це потрібно тестувати.
Нічого не генерує. Витягти значення з вільного тексту модель не може: дайте їй кандидатів регуляркою або генеративною моделлю, а вона обере.
Правило з їхньої документації, яке варто повісити над будь-яким промптом узагалі: не питайте модель те, що код може обчислити точно, і не ховайте кілька суджень в одному питанні.
Цифри, до яких потрібен скепсис
На власному бенчмарку TypeSafe модель набирає 67.8%. Це рівно стільки ж, скільки Claude Sonnet 5, і трохи менше за Opus 5 (73.1%) та Sol (74.1%); GPT-5.6 Terra поруч із 67.9%. За деякими підрахунками, та сама якість обходиться у 293 рази дешевше і дається у 195 разів швидше.
Цифра приваблива, але перш ніж порівнювати ці відсотки, варто розуміти, що саме виміряно.
Передусім це не точність. Еталонних відповідей не існує: за правильну беруть консенсус GPT-6 Astra і Claude Fable 5.1 у високому режимі міркування. Тобто насправді вимірюється згода з двома провідними моделями — тому самі вони в результатах і не фігурують. TypeSafe прямо зазначає, що така методика зміщує оцінку на користь OpenAI та Anthropic.
Далі, перевірка повністю самостійна. Компанія придумала завдання, зібрала обгортку і прогнала все сама. Незалежного відтворення поки немає, тож єдиний спосіб дізнатися свою цифру — прогнати модель на власному трафіку.
І окремо про нуль помилок структури з таблиці вище, бо це найгучніше число з усіх. Воно не виміряне, а виведене з означення: відповідність схемі гарантована конструкцією, тому нуль просто поставили замість результату. Верхня межа діапазону, 45.5%, теж потребує обережності — це поодинокий викид (Haiku 4.5), тоді як більшість моделей тримається в межах
Нарешті, ціна. Компанія не може довести, що не субсидує запуск, хоча й каже, що очікує здешевлення, а не подорожчання. Закладати поточний тариф у розрахунки на рік наперед зарано.
Як спробувати
Доступ поки за списком очікування: ключ видають у консолі console.typesafe.ai/settings/keys, альтернативний шлях — через шлюз Vercel AI. Далі ключ кладеться у TYPESAFE_API_KEY, який читають і SDK, і провайдер у Laravel.
pip install typesafe-sdk # Python 3.10+ npm install @typesafe-ai/sdk # Node 20+
Без SDK є один ендпоїнт: POST https://api.typesafe.ai/v1/systemone. Ліміти на jev-1.13 — 250 000 токенів на секунду і 1200 запитів на хвилину, вище повертається 429; TypeSafe попереджає, що змінюватиме їх без анонсу, поки додаються потужності.
Для Laravel-проєктів варто дочекатися релізу. Код класифікації лежить у гілці 1.x, а останній тег laravel/ai — v0.11.2 від 3 вересня, тобто в релізі його поки немає. Автор PR прямо писав, що схиляється притримати мердж, «поки вляжеться пил», або віддати це як експериментальний API після виходу 1.x.
І якщо все ж вирішите спробувати зараз — фіксуйте версію моделі. jev-latest сьогодні вказує на jev-1.13.0, але надалі ця прив’язка змінюватиметься. Разом із версією моделі можуть змінитися й результати, а отже — і пороги, які ви для них налаштували. Фактична версія моделі повертається в полі model, тож зберігайте її в логах.
Підсумок
Jev цікавий не тим, що він дешевий, і навіть не тим, що швидкий. Він цікавий тим, що прибирає цілий пласт коду, який існував лише для того, щоб пережити рядковий вивід моделі.
Це не заміна GPT чи Claude, і сама TypeSafe цього не стверджує. Це нижчий поверх: тонкий шар рішень, під яким лишається звичайний детермінований код, а над яким — провідна модель для тих випадків, де справді потрібні міркування. Судячи з того, що зібрали за перші дві доби, найкращі результати дає саме така розкладка, а не спроба замінити моделлю все підряд.
Перевіряти все одно доведеться на своєму трафіку: незалежних вимірювань поки немає взагалі.
15 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарівА чим розробник займався?
доволі якісний summary по JEV — x.com/...tatus/2102388833488892382
Ви хоча б 1 раз прочитали свою згенеровану AI статтю :(
meatproxy.me
Цікаво!
Що сказати...дуже крутий роутер і класифікатор, але порівняння з фронтіром — дуже дивне. Я отримав ранній доступ. Якщо ви працюєте в компанії, яка займається чимось дотичним до розробки агентів, тренувань моделей чи просто інтеграцією рішень на базі ШІ, то вам, скоріш за все, теж дадуть доступ — подавайтесь, але те треба буде підтвердити

Його учора відкрили для всіх:
x.com/...tatus/2101786156572823624
але сьогодні прикрили сайнапи знов:
x.com/...tatus/2102281508950307159
так, я бачив, але вони видають доступи, просто в пріорітет-лісті
я так-то вчора цей коммент написав))
Звідки0,58-45,5%?
Structured Outputs is a feature that ensures the model will always generate responses that adhere to your supplied JSON Schema, so you don’t need to worry about the model omitting a required key, or hallucinating an invalid enum value.
developers.openai.com/...utputs?api-mode=responses
Ви маєте рацію. Якщо модель підтримує strict structured output, помилок структури в неї не буде — constrained decoding не дає згенерувати токен, що ламає схему. Нуль там такий самий «за побудовою», як і в Jev.
Прибрав рядок із таблиці. Дякую.
Цікаво коли ми побачимо її в Open Source.
Бачив моделі, які створені надихаючись Jev, але це не вона.
Якщо б вона вийшла в public — проблема повільного inference стала менш болючою.
Так, open source самого Jev немає — він лишається закритим і тільки через API TypeSafe.
Зате за кілька днів з’явилися незалежні реалізації тієї ж ідеї з відкритими вагами:
— Laya — ModernBERT-large (421M) + два трансформерні шари, PPO-скоринг, entropy-based впевненість. Мультимовна, є роутер за мовою.
— DiffusionGemmaJev — дифузійний підхід, PR у vLLM, «досить близько на бенчмарках».
— Bespoke Nimble — LoRA на Qwen3.5-9B: базова модель 90%, у Jev 93%. ~100ms на H100.
— SemIf (колишній OpenJev) — Qwen3.5 з трикласовим NLI-класифікатором на фінальному токені, 4B і 35B.
— Jevlike — легкий option-attention на 40K byte embeddings.
— Kev-0.5B — LoRA + readout head на Qwen2.5-0.5B, «запускається на MacBook Pro».
досить дивно зрівнювати з лорами на ллм-ки, бо треба самі ллм-ки і сам сенс jev-а втрачається
Якщо в мене паралельно вже є умовна Qwen, то я можу мати в фоні LoRA-Jev, який швидко класифікує, і потім коли класифікація зафіксувала якийсь стан — можу одразу запустити якийсь pipeline і описати детальніше що сталось.
Я думаю, що адаптери поверх 9b+ ллм-ки нівелюють суть ідеї легкого незалежного інструменту й не є повноцінною заміною нативного джеву у сценаріях, де потрібна ізольована й дешева робота, але це ІМХО
У прагматичному контексті, якщо модель уже є в інфрі, я розумію ваш поінт, АЛЕ сенс подібних рішень — це гіперсуперультрашвидкий, копійчаний і детермінований гард. Його задача — відсікаємо запити або класифікуваємо стейти за мілісєкунди до того, як дьоргаєм важку ллм-ку. Робити це через 9b модельку — це стріляти з гармати по горобцях, навіть якщо гармата вже заряджена й стоїть у дворі.
Навіть якщо лор-ка перемикається швидко в vLLM, сам інференс forward pass для 9B моделі займає більше часу і ресурсів, ніж прогон через енкодер рівня модернберту чи байти. Пахне підміною понять.
Я от саме з такої точки зору дивлюсь на це
+ Strands Decider 2B, an open-source decision model from AWS