Jev — model decyzyjny
MarkdownModel decyzyjny Jev firmy TypeSafe odpowiada na typowane pytania dotyczące tekstu lub JSON: wybór wariantu, ocena na skali lub „tak/nie” z prawdopodobieństwami. To nie czat ani generowanie tekstu.
Pełny przewodnik
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": "Pomocy! Od 3 dni moje wypłaty kończą się niepowodzeniem.",
"questions": {
"is_urgent": {
"type": "noul",
"instructions": "Czy ta wiadomość wskazuje na pilną sprawę?"
}
}
}' import json, os, urllib.request
body = {
"model": "jev-latest",
"state": "Pomocy! Od 3 dni moje wypłaty kończą się niepowodzeniem.",
"questions": {
"is_urgent": {"type": "noul", "instructions": "Czy ta wiadomość wskazuje na pilną sprawę?"},
},
}
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: "Pomocy! Od 3 dni moje wypłaty kończą się niepowodzeniem.",
questions: {
is_urgent: { type: "noul", instructions: "Czy ta wiadomość wskazuje na pilną sprawę?" },
},
}),
});
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 — model decyzyjny klasy System One firmy TypeSafe. Nie generuje tekstu ani nie prowadzi dialogu: przekazujesz stan (state) — tekst lub JSON — i zestaw pytań, a w odpowiedzi otrzymujesz typowane wartości z prawdopodobieństwami. Na ich podstawie kod od razu rozgałęzia wykonanie, sortuje i wyznacza dalszą ścieżkę, bez analizowania swobodnego tekstu.
Wszystkie pytania jednego żądania są oceniane równolegle i niezależnie od siebie, względem tego samego state. Według TypeSafe dodawanie pytań prawie nie zmienia czasu odpowiedzi, a pytania nie wpływają na siebie nawzajem.
| Co | W skrócie |
|---|---|
| Model | jev-latest — alias najnowszej stabilnej wersji Jev; karta w katalogu |
| Metoda | POST /v1/systemone. To nie czat: formaty OpenAI, Anthropic i Gemini nie pasują do Jev. Odpowiedź przychodzi w całości jako jeden JSON |
| Co przyjmuje | Tylko tekst: ciąg znaków, obiekt JSON lub tablica tekstów. Obrazy, audio i wideo najpierw przekształć w tekst |
| Kontekst | 64K tokenów na żądanie — state i wszystkie pytania łącznie; state z najdłuższym pytaniem — do 32K |
| Język | Według TypeSafe model najdokładniej działa po angielsku; inne języki przyjmuje, ale dokładność jest niższa — sprawdź na własnych danych |
| Cena | Wejście $0.084 za 1 mln tokenów, wyjście bez opłat |
Żądanie
Autoryzacja
- Authorizationheaderwymagany
Klucz Ailoot w postaci
Bearer sk-….
Treść żądania
- modelstringwymagany
jev-latest. - statestring | object | arraywymagany
Co oceniać: ciąg z tekstem lub JSON — zgłoszenie klienta, rekord z bazy, korespondencję, bieżący stan Twojej aplikacji. Obiekt z czytelnymi nazwami pól zwykle jest wygodniejszy niż pojedynczy ciąg znaków.
- questionsobjectwymagany
Pytania. Klucze wybierasz sam; odpowiedzi otrzymasz pod tymi samymi kluczami. Klucz nie wpływa na odpowiedź — samo pytanie jest zadawane w
instructions. - questions.*.typestringwymagany
noul,choicelubscore— zobacz poniżej. - questions.*.instructionsstring | object | arraywymagany
Samo pytanie. Długie pytanie z danymi można przekazać jako obiekt: pytanie w jednym polu, dane w innych; odwołuj się do pól po nazwie w grawisach.
- questions.*.criteriaobject | array
Opcje odpowiedzi, różne dla każdego typu: opisy „tak” i „nie” dla noul (opcjonalnie), słownik wariantów dla choice, uporządkowana lista poziomów dla score.
Typy pytań
| Typ | O co pyta | Co zwraca |
|---|---|---|
noul | Czy stwierdzenie jest prawdziwe: tak czy nie | noul — prawdopodobieństwo „tak” od 0 do 1 |
choice | Który z podanych wariantów pasuje | choice, probabilities, confidence |
score | Gdzie znajduje się state na Twojej skali poziomów | score, legend, probabilities, confidence |
Typy można łączyć w jednym żądaniu.
noul — tak czy nie
Pole criteria jest opcjonalne: można w nim opisać, co oznacza „tak” (true) i „nie” (false). Odpowiedź noul — liczba od 0 (nie) do 1 (tak).
"is_urgent": {
"type": "noul",
"instructions": "Czy ta wiadomość wskazuje na pilną sprawę?",
"criteria": {
"true": "Wyraźnie wymaga szybkiej reakcji",
"false": "Nie wskazuje na pilną sprawę"
}
}"is_urgent": {
"type": "noul",
"noul": 0.95
}choice — wybór wariantu
criteria — słownik „wariant → opis”; jeśli opis nie jest potrzebny, podaj null. Do 255 wariantów. W odpowiedzi choice — najbardziej prawdopodobny wariant, probabilities — prawdopodobieństwo każdego wariantu (łącznie 1), confidence — pewność od 0 do 1.
"department": {
"type": "choice",
"instructions": "Który zespół powinien się tym zająć?",
"criteria": {
"billing": "Płatności, fakturowanie, zwroty",
"technical": "Błędy, awarie, integracje",
"sales": "Ceny, przejście na wyższy plan, nowi klienci"
}
}"department": {
"type": "choice",
"choice": "billing",
"probabilities": { "billing": 0.88, "technical": 0.12, "sales": 0.0 },
"confidence": 0.81
}score — ocena na skali
criteria — poziomy od najniższego do najwyższego, nie więcej niż 10 (TypeSafe zaleca co najmniej dwa). W odpowiedzi score — wartość ważona prawdopodobieństwami poziomów (może znaleźć się między poziomami), legend — numer poziomu i jego opis, probabilities i confidence. Według TypeSafe, score nadaje się do porównania z progiem, ale nie do wyznaczania dokładnej liczby między poziomami.
"frustration": {
"type": "score",
"instructions": "Jak bardzo sfrustrowany jest klient?",
"criteria": ["Spokojny", "Sfrustrowany", "Bardzo rozzłoszczony"]
}"frustration": {
"type": "score",
"score": 1.05,
"legend": { "0": "Spokojny", "1": "Sfrustrowany", "2": "Bardzo rozzłoszczony" },
"probabilities": { "0": 0.0, "1": 0.95, "2": 0.05 },
"confidence": 0.92
}Odpowiedź
- modelstring
Która wersja modelu odpowiedziała. Alias jev-latest z czasem przechodzi na nowe wersje: jeśli dobrałeś progi
confidencedla konkretnej wersji, obserwuj to pole. - answersobject
Po jednej odpowiedzi na każde pytanie, pod tymi samymi kluczami. Każda odpowiedź ma
type, a w przypadku choice i score — takżeconfidence. - usageobject
input_tokensioutput_tokens. Opłata jest pobierana tylko za tokeny wejściowe.
Kilka pytań w jednym żądaniu
Zadaj wszystkie pytania dotyczące jednego state w jednym żądaniu: są oceniane równolegle, a state jest przekazywany raz. Według TypeSafe w ich przykładzie z 13 pytaniami jedno wspólne żądanie było 12,2 razy tańsze i 10 razy szybsze niż 13 osobnych żądań wysyłanych kolejno, przy tych samych odpowiedziach.
Złożony osąd lepiej rozbić na proste pytania i połączyć odpowiedzi w kodzie: na przykład zamiast „oceń wniosek” — osobne oceny rynku, wykonalności i różnic wobec konkurencji. Wagi zmieniają się wtedy w kodzie, a nie w treści pytania.
{
"model": "jev-latest",
"state": "Pomocy! Od 3 dni moje wypłaty kończą się niepowodzeniem.",
"questions": {
"department": {
"type": "choice",
"instructions": "Który zespół powinien się tym zająć?",
"criteria": {
"billing": "Płatności, fakturowanie, zwroty",
"technical": "Błędy, awarie, integracje",
"sales": "Ceny, przejście na wyższy plan, nowi klienci"
}
},
"frustration": {
"type": "score",
"instructions": "Jak bardzo sfrustrowany jest klient?",
"criteria": ["Spokojny", "Sfrustrowany", "Bardzo rozzłoszczony"]
},
"is_urgent": {
"type": "noul",
"instructions": "Czy ta wiadomość wskazuje na pilną sprawę?"
}
}
}Kiedy się sprawdza
- Routing. Przekazać zgłoszenie do właściwego działu, a żądanie do właściwego wykonawcy: prostego kodu, dużego modelu lub człowieka.
- Sortowanie i priorytet. Pilność, ton wypowiedzi, ryzyko — na skali, z progami w kodzie.
- Moderacja i kontrole. Czy wiadomość narusza zasady, czy źródło potwierdza cytat, czy w dokumencie znajduje się odpowiedź na pytanie — zanim tekst zostanie przekazany dalej.
- Scoring i ranking. Oceń dokumenty, kandydatów lub znalezione fragmenty według własnych kryteriów oceniania i zdecyduj w kodzie, co będzie przetwarzane dalej.
- Zamiast kruchego „zwróć JSON”. Wywołanie, które z założenia zwraca typowane wartości, a nie tekst wymagający parsowania.
Kiedy się nie sprawdza
- Czat, odpowiedzi użytkownikowi, generowanie tekstu lub kodu. Jev nie generuje tekstu — do tego służą modele tekstowe.
- Model dla Claude Code, Cursor i innych agentów. Nie da się podstawić jev-latest zamiast modelu agenta: agent potrzebuje modelu, który generuje tekst i wywołuje narzędzia. Jev można wywoływać z kodu, który agent napisze dla Ciebie.
- Arytmetyka, liczenie, porównywanie dat. Według TypeSafe takie operacje pewniej wykonywać w kodzie, a model pytać tylko o część znaczeniową — na przykład wydobyć części daty przez choice.
- Obrazy, audio i wideo. Model przyjmuje tylko tekst — wcześniej przekształć takie dane w tekst.
Cena
Opłata jest pobierana tylko za tokeny wejściowe — pole usage.input_tokens odpowiedzi: $0.084 za 1 mln. Tokeny wyjściowe są bezpłatne.
Żądanie z przykładu na tej stronie (296 tokenów wejściowych) kosztuje mniej niż $0.0001.
Przed żądaniem Ailoot rezerwuje kwotę na saldzie, a po odpowiedzi obciąża je raz według faktycznego zużycia — jak to działa.
Limity
| Co | Limit |
|---|---|
| Całe żądanie: state i wszystkie pytania | 64K tokenów |
| state wraz z najdłuższym pytaniem | 32K tokenów |
| Wariantów w jednym choice | do 255 |
| Poziomów w jednym score | od 2 do 10 |
| Wejście | tylko tekst: ciąg znaków, obiekt JSON lub tablica tekstów |
Limity modelu — według TypeSafe. Ograniczenia Twojego klucza i salda obowiązują tak samo jak dla dowolnego modelu Ailoot: Błędy i limity.
Błędy
Błędy przychodzą w ogólnym formacie Ailoot API: kod, czytelny opis i Request ID. W tej metodzie najczęściej występują:
| Kod | Kiedy | Co zrobić |
|---|---|---|
400 invalid_request | Treść żądania nie przeszła walidacji: brak state, model lub questions, nieznany type, więcej niż 255 wariantów w choice albo więcej niż 10 poziomów w score | Popraw żądanie zgodnie z treścią błędu: bez poprawki znów nie przejdzie walidacji |
400 context_length_exceeded | state i pytania łącznie przekraczają limit modelu | Odfiltruj state w kodzie, pozostaw dane potrzebne pytaniom |
401 invalid_api_key | Brak klucza lub klucz jest nieprawidłowy | Przekaż klucz w nagłówku Authorization |
402 insufficient_balance | Brakuje wolnych środków na saldzie na rezerwację | Doładuj saldo |
404 model_not_found, unsupported_endpoint | Błędny ID lub model wywołano niewłaściwą metodą, na przykład przez /v1/chat/completions | Wywołuj jev-latest tylko przez POST /v1/systemone |
429 rate_limit_exceeded | Zbyt wiele żądań | Poczekaj tyle sekund, ile podano w nagłówku Retry-After, i ponów żądanie |
503 model_overloaded, model_unavailable | Model jest chwilowo przeciążony lub niedostępny | Jeśli X-Should-Retry: true — ponów po Retry-After sekundach; jeśli false — najpierw sprawdź Request ID w historii |
504 model_timeout | Model nie odpowiedział na czas | Nie wysyłaj żądania ponownie, dopóki nie sprawdzisz Request ID w historii |
Pełna lista kodów — na stronie Błędy i limity.