Kimi K3.1 Pro: tańszy od K3 i blisko OpusaCzytaj →
Poradnik

Jev w praktyce: 8 zastosowań w polskiej firmie

Osiem zastosowań Jev z szablonami: maile w sklepie, pisma z urzędu, leady, moderacja opinii i bramka dla agenta. Progi, n8n, Arkusze Google i koszty.

Poziomy wykres słupkowy kosztu tysiąca klasyfikacji: najkrótszy limonkowy słupek Jev, dłuższe grafitowe słupki tanich modeli językowych i najdłuższy Gemini 3.8 Flash

Jev od TypeSafe przydaje się w polskiej firmie wszędzie tam, gdzie ktoś codziennie sortuje setki podobnych wiadomości: przydziela maile klientów do działów, wyłapuje pisma z urzędu, odsiewa spam, moderuje opinie albo sprawdza, czy chatbot nie zmyśla. Zaczniesz bez konta w TypeSafe. Wystarczy klucz OpenRoutera i jedno zapytanie HTTP wysłane z terminala, z n8n albo z Arkuszy Google. Poniżej znajdziesz osiem szablonów pytań po polsku, podpowiedzi progów pewności i sposób na podłączenie ich do narzędzi bez pisania kodu od zera.

Czym jest Jev, opisaliśmy w poprzednim poradniku. Jedno zastrzeżenie dotyczy każdego szablonu: głównym językiem treningu Jev jest angielski, więc przed wdrożeniem sprawdź szablon na próbce od 100 do 200 własnych przykładów.

Jak zacząć w 10 minut

TypeSafe od 22 września nie przyjmuje nowych kont, ale OpenRouter udostępnia Jev każdemu z kluczem API, bez listy oczekujących. Jev jest też w Vercel AI Gateway, Cloudflare Workers AI i Netlify AI Gateway, gdzie opłata schodzi z kredytów Netlify.

  1. Załóż konto i wygeneruj klucz w OpenRouterze. Jak to zrobić, pokazujemy w poradniku o OpenRouterze. Doładuj konto kilkoma dolarami: przy płatności kartą OpenRouter dolicza 5,5 procent, najmniej 0,80 USD.
  2. Zapisz szablon do pliku, na przykład ten dla sklepu jako sklep.json.
  3. Wyślij zapytanie z terminala:
export OPENROUTER_API_KEY=sk-or-...
curl https://openrouter.ai/api/alpha/decisions \
  -H "Authorization: Bearer $OPENROUTER_API_KEY" \
  -H "Content-Type: application/json" \
  -d @sklep.json

Jev nie działa przez zwykły czat OpenRoutera, tylko przez osobny adres Decisions API, oznaczony jako funkcja w fazie alfa. Wpisuj konkretną wersję typesafe/jev-1.13, a nie alias ~typesafe/jev-latest, który może przeskoczyć na nowe wydanie bez Twojej wiedzy i rozstroić progi.

Jak czytać odpowiedź

Tak wygląda przykład z samouczka OpenRoutera, w którym jedno zapytanie zadaje trzy pytania o zgłoszenie klienta: czy to błąd, który zespół ma się nim zająć i jak pilna jest sprawa.

{
  "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?",
      "criteria": {
        "true": "The customer describes broken or unexpected product behavior.",
        "false": "The customer is asking a question or requesting a feature."
      }
    },
    "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"
      ]
    }
  }
}

A to odpowiedź, którą OpenRouter pokazuje w samouczku (skrócona o pola techniczne):

{
  "model": "typesafe/jev-1.13-20260917",
  "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 }
    }
  },
  "usage": { "input_tokens": 476, "output_tokens": 70, "cost": 0.000019992 }
}

Schemat zapytania i odpowiedzi Jev: u góry treść zgłoszenia, po lewej trzy pytania is_bug, team i urgency z typami noul, choice i score, po prawej odpowiedzi: tak 0,96, payments 0,78 przy frontend 0,22 i account 0, score 1,99 na skali od 0 do 2

Ten sam przykład na schemacie: każde pytanie ma swój typ, a każda odpowiedź przychodzi z liczbą, na której możesz oprzeć próg.

Pole noul to prawdopodobieństwo odpowiedzi „tak”, a okolice 0,5 znaczą, że model nie wie. W pytaniu choice confidence opisuje skupienie całego rozkładu, dlatego wynosi 0,67 przy 0,78 dla zwycięskiej opcji. Wynik score to pozycja na skali liczonej od zera, więc 1,99 to trzeci poziom. Pole usage.cost podaje koszt w dolarach: 476 tokenów kosztowało 0,00002 USD.

Trzy zasady pisania szablonów:

  • Każde pytanie potrzebuje instructions, a jeśli w pytaniu noul podajesz criteria, muszą mieć oba klucze, true i false. Inaczej API odrzuci zapytanie.
  • Nazwy opcji trafiają do modelu, nazwy pytań nie. Nazwa opcji platnosci_faktury razem z polskim opisem przekazuje modelowi znaczenie, a klucz dzial jest tylko etykietą dla kodu. Klucze pisz bez polskich znaków, opisy normalnie, po polsku.
  • Wszystkie pytania o jedną wiadomość w jednym zapytaniu. Za treść płacisz raz.

Jedna reguła do wszystkich scenariuszy

Jev ocenia, a decyduje Twój kod albo automatyzacja: pewne przypadki idą automatycznie, niepewne do człowieka. Dokumentacja TypeSafe podaje dla pytań tak lub nie przykładowe progi 0,8 i 0,2, a wyniki pomiędzy nimi kieruje do człowieka. Gdy kosztowne jest działanie na podstawie błędnego „tak” (zwrot pieniędzy), podnosisz próg, a gdy kosztowne jest przeoczenie (wezwanie z urzędu), obniżasz.

W przepisie OpenRoutera na klasyfikację 150 tweetów po angielsku odpowiedzi z pewnością co najmniej 0,8 zgadzały się z oceną człowieka w 114 ze 122 przypadków, a te poniżej progu tylko w 13 z 28. Taki podział chcesz odtworzyć na własnych danych.

Koszty przy szablonach to nasz szacunek: 0,042 USD za milion tokenów wejścia razy typowa długość zapytania. Prawdziwy koszt pokaże usage.cost. Zanim oddasz Jev decyzje, uruchom go na tydzień lub dwa w trybie cienia: niech zapisuje odpowiedzi obok decyzji ludzi, a progi dobierz na podstawie tych danych.

Osiem scenariuszy z gotowymi szablonami

1. Sklep internetowy: który dział ma odpisać

Najtrudniejsza jest granica między reklamacją a zwrotem: inny rozmiar, niż klient zamówił, to reklamacja, a dobry rozmiar i zmiana zdania to zwrot. Jev odpowiada na to, co napisałeś, więc granicę zapisz w opisach opcji, najlepiej jako obiekt z polami what, not_for i examples, jak proponuje dokumentacja TypeSafe.

{
  "model": "typesafe/jev-1.13",
  "state": {
    "temat": "Zamówienie 48213, zły rozmiar",
    "tresc": "Dzień dobry, buty przyszły w rozmiarze 42 zamiast 43. Czy mogę je wymienić? Piszę już drugi raz."
  },
  "questions": {
    "dzial": {
      "type": "choice",
      "instructions": "Który dział sklepu powinien zająć się tą wiadomością klienta?",
      "criteria": {
        "reklamacja": {
          "what": "Towar wadliwy, uszkodzony albo niezgodny z zamówieniem; klient chce naprawy, wymiany lub obniżenia ceny",
          "not_for": "Rezygnacja z zakupu, gdy towar nie ma wady",
          "examples": ["Przyszedł inny rozmiar, niż zamówiłem", "Po tygodniu odkleiła się podeszwa"]
        },
        "zwrot": {
          "what": "Klient rezygnuje z zakupu bez podania wady i chce odesłać towar oraz odzyskać pieniądze",
          "not_for": "Towar wadliwy albo niezgodny z zamówieniem",
          "examples": ["Rozmiar się zgadza, ale buty mi się nie podobają", "Chcę odstąpić od umowy"]
        },
        "dostawa": "Status przesyłki, opóźnienie, zagubiona paczka, zmiana adresu lub punktu odbioru",
        "platnosci_faktury": "Płatność nie przeszła, podwójne obciążenie, faktura, dane do faktury, korekta",
        "pytanie_o_produkt": "Pytanie przed zakupem: rozmiar, dostępność, parametry",
        "inne": "Wszystko inne, w tym oferty współpracy i spam"
      }
    },
    "chce_czlowieka": {
      "type": "noul",
      "instructions": "Czy klient prosi o telefon albo o rozmowę z konsultantem?"
    },
    "ponowny_kontakt": {
      "type": "noul",
      "instructions": "Czy klient pisze, że kontaktował się już w tej sprawie?",
      "criteria": {
        "true": "Wspomina wcześniejszą wiadomość, telefon albo zgłoszenie",
        "false": "Brak śladu wcześniejszego kontaktu"
      }
    },
    "frustracja": {
      "type": "score",
      "instructions": "Jak bardzo zdenerwowany jest klient?",
      "criteria": ["Spokojny, rzeczowy", "Zirytowany, ale uprzejmy", "Bardzo zły, grozi rezygnacją, złą opinią albo sprawą"]
    }
  }
}

Progi: dzial z pewnością od 0,8 idzie prosto do działu, niżej do wspólnej skrzynki. ponowny_kontakt lub chce_czlowieka powyżej 0,8 albo frustracja powyżej 1,5 podnosi priorytet. Nie usuwaj opcji inne, bo Jev zawsze coś wybiera. Koszt: około 800 tokenów, czyli 3 do 4 centów za 1000 maili.

2. Biuro rachunkowe: pisma z urzędu i kategorie kosztów

Od 1 kwietnia 2026 obowiązek wystawiania faktur w KSeF objął pozostałe firmy (największe od 1 lutego), z ułatwieniami dla najmniejszych do końca 2026 roku, więc KSeF ma w szablonie osobną kategorię. Najważniejsze jest jednak pytanie o pismo z urzędu.

{
  "model": "typesafe/jev-1.13",
  "state": "Pani Ewo, przesyłam faktury za wrzesień. Przyszło też jakieś pismo z urzędu skarbowego, zdjęcie w załączniku.",
  "questions": {
    "sprawa": {
      "type": "choice",
      "instructions": "Czego dotyczy wiadomość klienta biura rachunkowego?",
      "criteria": {
        "dokumenty": "Klient przesyła faktury, paragony, wyciągi lub inne dokumenty do zaksięgowania",
        "pytanie_podatkowe": "Pytanie o VAT, PIT, CIT, koszty uzyskania przychodu, ulgi",
        "kadry_zus": "Umowy, wynagrodzenia, składki ZUS, zwolnienia lekarskie, urlopy pracowników",
        "ksef": "Problem z wystawieniem, odbiorem lub uprawnieniami w KSeF",
        "rozliczenie_z_biurem": "Faktura za usługi biura, cennik, zmiana zakresu usług",
        "inne": "Wszystko inne"
      }
    },
    "pismo_z_urzedu": {
      "type": "noul",
      "instructions": "Czy klient wspomina o piśmie, wezwaniu, kontroli lub karze z urzędu skarbowego albo ZUS?"
    }
  }
}

Progi: pismo_z_urzedu od 0,3 trafia od razu do księgowej, bo przeoczone wezwanie kosztuje więcej niż fałszywy alarm. Przy wiadomości o dwóch sprawach naraz pewność w pytaniu sprawa może być niska i wtedy czyta ją człowiek. Koszt: około 600 tokenów, czyli 2,5 centa za 1000 maili.

Drugi pomysł to podpowiedź kategorii kosztu dla pozycji z faktury. Jev wstępnie uzupełnia kategorię, a księgowa zawsze ją zatwierdza. Nie pytaj go, czy wydatek jest kosztem uzyskania przychodu: to ocena prawna, nie etykieta.

{
  "model": "typesafe/jev-1.13",
  "state": { "sprzedawca": "Orlen S.A.", "pozycja": "Olej napędowy Verva ON" },
  "questions": {
    "kategoria": {
      "type": "choice",
      "instructions": "Do której kategorii kosztów najlepiej pasuje `pozycja` kupiona u `sprzedawca`?",
      "criteria": {
        "paliwo": "Paliwo, ładowanie auta elektrycznego, AdBlue",
        "eksploatacja_auta": "Serwis, części, opony, myjnia, parking, autostrada",
        "oprogramowanie": "Licencje, subskrypcje SaaS, hosting, domeny",
        "telekomunikacja": "Telefon, internet, abonamenty operatorów",
        "materialy_biurowe": "Papier, tusze, drobne akcesoria biurowe",
        "sprzet": "Komputery, telefony, meble, urządzenia",
        "reprezentacja": "Restauracje, catering, prezenty dla kontrahentów",
        "uslugi_obce": "Usługi firm zewnętrznych: prawne, marketingowe, podwykonawcy",
        "inne": "Nie pasuje do żadnej kategorii albo brak danych"
      }
    },
    "moze_byc_prywatny": {
      "type": "noul",
      "instructions": "Czy `pozycja` wygląda na wydatek prywatny, niezwiązany z działalnością firmy?"
    }
  }
}

Nazwy w odwrotnych apostrofach, jak pozycja, wskazują pola ze state. Koszt: około 400 tokenów, czyli 1,7 centa za 1000 pozycji.

3. Agencja marketingowa: które zapytanie jest warte telefonu

Jev rozpozna usługę, oceni gotowość do zakupu i odsieje spam oraz oferty sprzedaży skierowane do samej agencji.

{
  "model": "typesafe/jev-1.13",
  "state": {
    "firma": "Kwiaciarnia Stokrotka",
    "wiadomosc": "Potrzebujemy sklepu internetowego z dostawą kwiatów w Krakowie. Chcemy ruszyć przed Walentynkami, prosimy o wycenę."
  },
  "questions": {
    "usluga": {
      "type": "choice",
      "instructions": "Jakiej usługi agencji dotyczy zapytanie?",
      "criteria": {
        "strona_www": "Strona firmowa lub landing page",
        "sklep_internetowy": "Sklep internetowy, integracja płatności i dostaw",
        "kampanie_reklamowe": "Kampanie Google Ads, Meta Ads",
        "social_media": "Prowadzenie profili w mediach społecznościowych",
        "seo": "Pozycjonowanie w wyszukiwarce",
        "inne": "Inna usługa albo nie wiadomo"
      }
    },
    "gotowosc": {
      "type": "score",
      "instructions": "Jak blisko decyzji o zakupie jest autor wiadomości?",
      "criteria": ["Zbiera informacje, brak konkretnej potrzeby", "Ma konkretną potrzebę, bez terminu", "Ma potrzebę i termin startu", "Prosi o ofertę lub spotkanie i chce zacząć szybko"]
    },
    "spam": {
      "type": "noul",
      "instructions": "Czy wiadomość jest spamem albo ofertą sprzedaży skierowaną do agencji, a nie zapytaniem o usługę?"
    }
  }
}

Progi: najpierw sprawdź spam: powyżej 0,8 do archiwum, od 0,2 do 0,8 do przejrzenia. Dopiero wśród pozostałych zapytań gotowosc od 2 oznacza telefon jeszcze tego dnia. Oceny budżetu nie zlecaj Jev, bo model słabo radzi sobie z liczbami: kwotę weź z pola formularza albo wyciągnij wyrażeniem regularnym i porównaj w kodzie. Koszt: około 700 tokenów, czyli 3 centy za 1000 zapytań.

4. Obsługa klienta: czy chatbot nie zmyśla

Jeśli na stronie odpowiada chatbot oparty na modelu językowym, Jev sprawdzi każdą odpowiedź, zanim trafi do klienta: czy ma oparcie we fragmentach bazy wiedzy, czy bot coś zmyślił, czyli uległ halucynacji.

{
  "model": "typesafe/jev-1.13",
  "state": {
    "pytanie_klienta": "Czy mogę zwrócić buty kupione w promocji?",
    "odpowiedz_bota": "Tak, towar z promocji możesz zwrócić w ciągu 14 dni od odbioru.",
    "fragmenty_bazy_wiedzy": [
      "Zwrot jest możliwy w ciągu 14 dni od odbioru przesyłki.",
      "Zasady zwrotu dotyczą także produktów przecenionych."
    ]
  },
  "questions": {
    "werdykt": {
      "type": "choice",
      "instructions": "Czy `odpowiedz_bota` jest poparta przez `fragmenty_bazy_wiedzy` i odpowiada na `pytanie_klienta`?",
      "criteria": {
        "poparta": "Odpowiada na pytanie i każda podana informacja wynika z fragmentów bazy wiedzy",
        "niepoparta": "Zawiera informację, której nie ma we fragmentach, albo nie odpowiada na pytanie",
        "odmowa": "Uczciwie mówi, że nie zna odpowiedzi, i proponuje kontakt z człowiekiem"
      }
    },
    "obietnica_bez_pokrycia": {
      "type": "noul",
      "instructions": "Czy `odpowiedz_bota` obiecuje klientowi rabat, zwrot pieniędzy lub termin, których nie ma we `fragmenty_bazy_wiedzy`?"
    }
  }
}

Progi: odpowiedź idzie do klienta tylko przy werdykcie poparta z pewnością od 0,8, inaczej przejmuje ją mocniejszy model albo człowiek. obietnica_bez_pokrycia powyżej 0,3 blokuje wysyłkę. W podobnej kaskadzie z przepisu OpenRoutera (Luna od OpenAI pisze, Jev sprawdza, a gdy odpowiedź nie ma oparcia, odpowiada droższa Astra) na zestawie 50 pytań kaskada w obu opisanych przebiegach nie przepuściła żadnej błędnej odpowiedzi, a przebieg z pełnym podsumowaniem kosztował 0,012 USD. Sama Luna w tym przebiegu też się nie pomyliła i kosztowała 0,004 USD, ale we wcześniejszym przepuściła dwie błędne odpowiedzi. To mała próba, więc wynik trzeba sprawdzić na własnych danych. Koszt: z fragmentami bazy wiedzy około 1500 tokenów, czyli 6 centów za 1000 sprawdzeń.

5. Moderacja opinii: krytyka to nie obelga

Filtr ma wycinać wyzwiska, cudze dane i reklamę konkurencji, ale przepuszczać ostrą, uczciwą krytykę. Kluczowy jest opis false w pytaniu o obelgi.

{
  "model": "typesafe/jev-1.13",
  "state": "Obsługa fatalna, pani Kasia z infolinii to nieudacznica, dzwońcie do niej: 600 100 200. Lepiej kupcie w sklepie XYZ.pl",
  "questions": {
    "obelgi": {
      "type": "noul",
      "instructions": "Czy opinia obraża konkretną osobę albo zawiera wulgaryzmy?",
      "criteria": {
        "true": "Wyzwiska, wulgaryzmy albo poniżanie konkretnej osoby",
        "false": "Krytyka produktu, sklepu lub obsługi, nawet ostra i emocjonalna, bez wyzwisk"
      }
    },
    "dane_osobowe": {
      "type": "noul",
      "instructions": "Czy opinia ujawnia dane osobowe, na przykład imię pracownika, numer telefonu lub adres?"
    },
    "reklama": {
      "type": "noul",
      "instructions": "Czy opinia reklamuje inny sklep, produkt lub stronę internetową?"
    },
    "grozby": {
      "type": "noul",
      "instructions": "Czy opinia zawiera groźby wobec ludzi?"
    }
  }
}

Progi: w przepisie TypeSafe na filtry treści wynik od 0,35 kieruje wiadomość do przeglądu, a od 0,70 uruchamia działanie, tu wstrzymanie publikacji (łagodniejszy wariant: 0,85). Opinię z niskimi wynikami we wszystkich pytaniach publikujesz automatycznie. Koszt: około 500 tokenów, czyli 2 centy za 1000 opinii.

6. Filtr danych osobowych przed przekazaniem treści dalej

PESEL, NIP i numer konta mają stały format, więc wyłapie je lokalnie zwykłe wyrażenie regularne. Dokumentacja TypeSafe też radzi zostawiać sztywne reguły kodowi.

const PESEL = /\b\d{11}\b/;
const NIP = /\b\d{3}-?\d{3}-?\d{2}-?\d{2}\b|\b\d{3}-?\d{2}-?\d{2}-?\d{3}\b/;
const KONTO = /\b(?:PL)?\d{2}(?: ?\d{4}){6}\b/;

const maNumery = (tekst) => [PESEL, NIP, KONTO].some((wzor) => wzor.test(tekst));

Jev złapie to, czego wyrażenie nie widzi, na przykład informacje o zdrowiu. Tu jest paradoks: żeby to sprawdzić, wysyłasz wiadomość do USA. Ma to sens tylko wtedy, gdy treść i tak trafi dalej do amerykańskiego modelu językowego. Dodaj wtedy pole provider jak niżej, a OpenRouter skieruje zapytanie tylko do endpointów bez przechowywania danych. Endpoint TypeSafe do nich należy.

{
  "model": "typesafe/jev-1.13",
  "provider": { "zdr": true },
  "state": "Dzień dobry, mąż jest po operacji kręgosłupa i nie może odebrać paczki, proszę o przesunięcie dostawy.",
  "questions": {
    "zdrowie": {
      "type": "noul",
      "instructions": "Czy wiadomość zawiera informacje o zdrowiu, chorobie lub leczeniu konkretnej osoby?"
    },
    "osoba_prywatna": {
      "type": "noul",
      "instructions": "Czy wiadomość zawiera imię i nazwisko albo adres osoby prywatnej?"
    },
    "dane_finansowe": {
      "type": "noul",
      "instructions": "Czy wiadomość zawiera dane karty płatniczej, numer konta albo dane logowania?"
    }
  }
}

Progi: liczy się każde przeoczenie, więc wszystko od 0,3 idzie do anonimizacji albo do człowieka. Jeśli dane nie mogą opuścić firmy, zostaje wyrażenie regularne i model lokalny opisany niżej. Koszt: około 400 tokenów, czyli 1,7 centa za 1000 wiadomości.

7. Helpdesk IT w małej firmie

Jev nada zgłoszeniu kategorię, oceni pilność i osobno wyłapie wszystko, co pachnie wyłudzeniem albo wyciekiem.

{
  "model": "typesafe/jev-1.13",
  "state": "Od rana nie działa drukarka w księgowości, a o 14:00 mamy podpisanie umów z klientem.",
  "questions": {
    "kategoria": {
      "type": "choice",
      "instructions": "Czego dotyczy zgłoszenie do helpdesku?",
      "criteria": {
        "konto_haslo": "Logowanie, hasło, blokada konta, uprawnienia",
        "sprzet": "Komputer, monitor, drukarka, telefon służbowy",
        "poczta": "Poczta e-mail, kalendarz",
        "program_ksiegowy": "Program księgowy lub kadrowy",
        "siec": "Internet, Wi-Fi, VPN",
        "zakup": "Prośba o zakup sprzętu lub licencji",
        "inne": "Wszystko inne"
      }
    },
    "priorytet": {
      "type": "score",
      "instructions": "Jak mocno problem utrudnia pracę?",
      "criteria": ["Może poczekać", "Utrudnia pracę jednej osobie", "Blokuje pracę jednej osoby", "Blokuje pracę wielu osób albo obsługę klientów"]
    },
    "bezpieczenstwo": {
      "type": "noul",
      "instructions": "Czy zgłoszenie dotyczy podejrzanej wiadomości, prośby o hasło, wirusa albo możliwego wycieku danych?"
    }
  }
}

Progi: bezpieczenstwo od 0,3 wysyła powiadomienie od razu, priorytet od 2,5 oznacza „rzuć wszystko”. Jev nie porówna godziny 14:00 z bieżącym czasem, więc termin sprawdza kod. Koszt: około 600 tokenów, czyli 2,5 centa za 1000 zgłoszeń.

8. Bramka dla agenta w Claude Code

Claude Code pyta o zgodę przed wykonaniem w terminalu poleceń spoza listy dozwolonych, co przy pracy z agentem AI daje dziesiątki kliknięć. W przepisie OpenRoutera hook PermissionRequest pyta Jev, czy skutki polecenia da się cofnąć i czy pomaga ono wykonać zadanie. Zatwierdza je sam tylko wtedy, gdy oba wyniki wynoszą co najmniej 0,9, a resztę zostawia w zwykłym oknie zgody. Pytania po polsku:

{
  "model": "typesafe/jev-1.13",
  "state": {
    "zadanie": "Uporządkuj folder z fakturami za wrzesień według kontrahentów.",
    "katalog_projektu": "/dane/faktury/2026-09",
    "polecenie": "mv /dane/faktury/2026-09/*.pdf /dane/faktury/2026-09/archiwum/"
  },
  "questions": {
    "odwracalne": {
      "type": "noul",
      "instructions": "Czy skutki `polecenie` można łatwo cofnąć bez utraty danych?"
    },
    "sluzy_zadaniu": {
      "type": "noul",
      "instructions": "Czy `polecenie` bezpośrednio służy wykonaniu `zadanie`?"
    }
  }
}

Pierwszą zaporą nie jest próg, tylko stała lista ryzykownych poleceń w kodzie (usuwanie rekurencyjne, git push, wdrożenia, pliki .env), sprawdzana przed Jev. Ale i lista nie wyłapie wszystkiego, bo ten sam skutek da się osiągnąć skryptem, więc automatyczne zgody ogranicz do prostych, powtarzalnych operacji. Jev widzi tylko tekst polecenia, więc nie wie, że plik zawiera hasło. Wyniki powtórzonego zapytania różnią się też o kilka setnych, więc polecenie tuż przy progu raz przejdzie, a raz nie. Koszt: 400 tokenów kosztowało w przepisie 0,0000168 USD, czyli 1,7 centa za 1000 sprawdzeń.

Jak podłączyć Jev do swoich narzędzi

n8n

n8n nie ma oficjalnego węzła dla Jev (na forum są węzły stworzone przez społeczność), więc użyj wbudowanego HTTP Request, który pozwala też zaimportować polecenie curl:

  1. Method: POST, URL: https://openrouter.ai/api/alpha/decisions.
  2. Authentication: Generic Credential Type, potem Header Auth z nazwą Authorization i wartością Bearer z Twoim kluczem.
  3. Send Body: JSON, Specify Body: Using JSON. Wklej szablon, a treść w state zamień na wyrażenie:
"state": {
  "temat": {{ JSON.stringify($json.subject) }},
  "tresc": {{ JSON.stringify($json.text) }}
},

JSON.stringify chroni przed cudzysłowami i nowymi liniami, które psują JSON. Pola subject i text zamień na te, w których Twój wyzwalacz trzyma temat i treść.

  1. Switch w trybie reguł. Pierwsza: {{ $json.answers.dzial.confidence }} mniejsze niż 0,8, wyjście „do sprawdzenia”. Kolejne: {{ $json.answers.dzial.choice }} równe reklamacja, zwrot i tak dalej. Przy wyłączonej opcji „Send data to all matching outputs” element trafia tylko do pierwszego pasującego wyjścia.

Make i Zapier

W Make użyj modułu HTTP Make a request: metoda POST, uwierzytelnianie typu API key w nagłówku Authorization (z przedrostkiem Bearer ), treść application/json i Parse response na Yes. Dalej router z filtrami na confidence i choice.

W Zapierze odpowiednikiem jest Webhooks by Zapier z akcją Custom Request i surowym JSON-em. Nie działa w darmowym planie, potrzebny jest co najmniej Professional. Uważaj na cudzysłowy w treści maila, bo zepsują zapytanie.

Arkusze Google

W pierwszym wierszu wpisz nagłówki, treści wiadomości wklej do kolumny A od drugiego wiersza i otwórz Rozszerzenia, Apps Script. Klucz zapisz w Ustawieniach projektu jako właściwość skryptu OPENROUTER_API_KEY, nie w kodzie.

const PROG = 0.8;
const PYTANIA = {
  dzial: {
    type: 'choice',
    instructions: 'Który dział sklepu powinien zająć się tą wiadomością klienta?',
    criteria: {
      reklamacja: 'Towar wadliwy, uszkodzony albo niezgodny z zamówieniem',
      zwrot: 'Klient rezygnuje z zakupu bez podania wady i chce odzyskać pieniądze',
      dostawa: 'Status przesyłki, opóźnienie, zagubiona paczka',
      platnosci_faktury: 'Płatność, faktura, dane do faktury, korekta',
      pytanie_o_produkt: 'Pytanie przed zakupem',
      inne: 'Wszystko inne'
    }
  }
};

function onOpen() {
  SpreadsheetApp.getUi().createMenu('Jev')
    .addItem('Sklasyfikuj nowe wiersze', 'klasyfikuj')
    .addToUi();
}

function klasyfikuj() {
  const klucz = PropertiesService.getScriptProperties().getProperty('OPENROUTER_API_KEY');
  const arkusz = SpreadsheetApp.getActiveSheet();
  const wiersze = arkusz.getDataRange().getValues();
  let zrobione = 0;
  for (let i = 1; i < wiersze.length && zrobione < 200; i++) {
    const tresc = wiersze[i][0];
    if (!tresc || wiersze[i][1]) continue; // pusty wiersz albo już sklasyfikowany
    const odp = UrlFetchApp.fetch('https://openrouter.ai/api/alpha/decisions', {
      method: 'post',
      contentType: 'application/json',
      headers: { Authorization: 'Bearer ' + klucz },
      payload: JSON.stringify({ model: 'typesafe/jev-1.13', state: String(tresc), questions: PYTANIA }),
      muteHttpExceptions: true
    });
    zrobione++;
    if (odp.getResponseCode() !== 200) {
      arkusz.getRange(i + 1, 4).setValue('BŁĄD ' + odp.getResponseCode());
      continue;
    }
    const d = JSON.parse(odp.getContentText()).answers.dzial;
    const pewnosc = d.confidence || 0;
    arkusz.getRange(i + 1, 2, 1, 3).setValues([[d.choice, pewnosc, pewnosc >= PROG ? 'OK' : 'DO_SPRAWDZENIA']]);
  }
}

Po odświeżeniu arkusza pojawi się menu Jev. Do kolumn B, C i D trafiają dział, pewność i status, a wiersze DO_SPRAWDZENIA przegląda człowiek. Skrypt z menu ma 6 minut na wykonanie, dlatego przetwarza najwyżej 200 wierszy naraz, a przy wolnych odpowiedziach API może skończyć wcześniej. Funkcja wpisana w komórkę miałaby tylko 30 sekund, a arkusz mógłby ją wywoływać ponownie, za każdym razem na Twój koszt.

Ile to kosztuje w porównaniu z tanimi modelami językowymi

Założenia: dla modelu językowego mail z opisem kategorii to 500 tokenów wejścia i 40 wyjścia. Dla Jev przyjmujemy 700 tokenów, bo zapytania do niego zawierają więcej tokenów (krótkie zgłoszenie z samouczka to 476 tokenów, test na tweetach dał średnio 610). Ceny z naszej bazy modeli.

Model 1000 maili (USD)
Jev 0,029
GPT-6 Luna, tryb wsadowy (do 24 godzin) 0,035
GPT-6 Luna 0,070
Qwen3.8 Flash Next (Singapur) 0,094
GLM-5.3 Flash 0,095
DeepSeek V4.1 Flash, poza szczytem i w szczycie 0,099 i 0,198
Gemini 3.8 Flash (cena promocyjna do końca 2026) 0,525

Jev jest kilkukrotnie tańszy od większości tanich modeli językowych, ale różnica to grosze. Przy 100 tysiącach maili miesięcznie Jev kosztuje około 2,94 USD, a GPT-6 Luna 7 USD. Wsadowa Luna jest prawie tak tania jak Jev, tylko odpowiada w ciągu doby. Na Jev przechodzi się więc dla czegoś innego: prawdopodobieństwa przy każdej odpowiedzi, na którym opierasz progi, i czasu odpowiedzi zwykle poniżej sekundy.

Laya: otwarta alternatywa, która działa w firmie

Jeśli dane nie mogą wyjechać do USA, zostaje Laya od Convai Innovations: otwarty model na licencji Apache 2.0, opublikowany na Hugging Face 18 września. Serwer laya-serve przyjmuje ten sam format pod tym samym adresem /v1/systemone co Jev, więc kod pisany pod bezpośrednie API TypeSafe przełączysz zmianą adresu bazowego. Przykłady z tego poradnika, wysyłane na Decisions API OpenRoutera, trzeba skierować na ten adres i sprawdzić. Według autora odpowiedź zajmuje od 193 do 464 ms na procesorze i około 33 ms na karcie Tesla T4.

Wbudowany router kieruje angielski tekst do wersji laya (421 mln parametrów), a polski do laya-multilingual (322 mln parametrów, ponad 100 języków).

pip install "laya[serve]"
LAYA_API_KEY=wymysl-dlugi-klucz LAYA_PRELOAD=1 laya-serve

Nie pomijaj LAYA_API_KEY: bez niej serwer przyjmuje zapytania od każdego w sieci. Laya ma tydzień i w tym czasie dostała na PyPI 28 wydań, więc przypnij wersję (na przykład laya==0.3.20) i sprawdź ją na kopii danych, zanim postawisz ją obok danych klientów.

Wykresy z repozytorium Laya: trafność po angielsku i w innych językach oraz czas odpowiedzi na karcie T4

To pomiary autora Laya: po lewej spadek trafności poza angielskim (słupki kreskowane), po prawej czas odpowiedzi. Linię Jev autor wziął z pomiarów innych osób.

W rozpoznawaniu intencji po polsku (zbiór MASSIVE, 20 opcji, 100 przykładów, losowe zgadywanie daje 5 procent) wersja angielska trafia w 24 procentach, a wielojęzyczna w 51, podczas gdy po angielsku wersja angielska osiąga 78 procent. Przy kilkudziesięciu opcjach (banking77) Laya odpowiada poprawnie w 42,5 procenta przypadków, a Jev według opublikowanych wyników w 87 procentach, dlatego autor radzi nie przekraczać około 20 opcji. Layę można rozważyć do prostych pytań tak lub nie na danych, których nie chcesz wysyłać za ocean, ale jej skuteczność po polsku trzeba sprawdzić osobno, bo przy 20 opcjach trafia mniej więcej co drugi raz. Bez własnego testu jej nie wdrażaj.

Czego nie robić z Jev

  • Rekrutacja, ocena pracowników i zdolność kredytowa. AI Act zalicza do wysokiego ryzyka systemy filtrujące podania o pracę, oceniające kandydatów i pracowników (załącznik III, pkt 4) oraz oceniające zdolność kredytową osób fizycznych (pkt 5 lit. b), przy czym systemy z tej listy, które profilują osoby fizyczne, zawsze uznaje się za systemy wysokiego ryzyka (art. 6 ust. 3). Obowiązki dla nich rozporządzenie 2026/1744 przesunęło na 2 grudnia 2027, ale sortownik CV na tanim klasyfikatorze to zły pomysł już dziś. Więcej o AI Act w naszym poradniku.
  • Decyzje o ludziach bez człowieka. Art. 22 RODO daje prawo, by nie podlegać decyzji opartej wyłącznie na zautomatyzowanym przetwarzaniu, która wywołuje skutki prawne albo w podobny sposób istotnie wpływa na człowieka. Decyzję o odrzuceniu reklamacji czy zablokowaniu konta niech podejmuje człowiek, a Jev najwyżej przygotuje podpowiedź.
  • Dane o zdrowiu i inne dane wrażliwe. W umowie powierzenia TypeSafe rubryka o danych wrażliwych ma wpis „N/A”, czyli ich przekazywania nie przewiduje. Szablon z punktu 6 to ostatnia zapora, nie zgoda na wysyłanie takich danych.
  • Liczby i daty. TypeSafe pisze wprost, że Jev nie jest kalkulatorem i czyta daty jak tekst. Kwoty, terminy i porównania budżetów zostaw kodowi.

Jev najlepiej sprawdza się jako tani i szybki filtr, który obsługuje oczywiste przypadki i mówi, kiedy nie wie. Zacznij od jednego szablonu: tego, który dotyczy pracy zabierającej dziś w firmie najwięcej czasu. Przetestuj go, zanim oddasz mu choć jedną decyzję.

Najczęstsze pytania

Czy do korzystania z Jev potrzebuję konta w TypeSafe?

Nie. TypeSafe od 22 września 2026 nie przyjmuje nowych kont, ale OpenRouter udostępnia Jev każdemu, kto ma klucz API OpenRoutera, bez listy oczekujących. Model nazywa się tam typesafe/jev-1.13, a zapytania wysyłasz na adres Decisions API. Jev jest też w Vercel AI Gateway, Netlify AI Gateway i Cloudflare Workers AI.

Jaki próg pewności ustawić na start?

Dla pytań tak lub nie dokumentacja TypeSafe podaje przykładowe progi 0,8 i 0,2: powyżej pierwszego traktujesz odpowiedź jako tak, poniżej drugiego jako nie, a środek przekazujesz człowiekowi. Dla wyboru z listy dobrym startem jest pewność 0,8. Potem przesuń progi na podstawie od 100 do 200 własnych przykładów z poprawnymi odpowiedziami, zależnie od tego, która pomyłka jest dla Ciebie droższa.

Czy mogę podłączyć Jev do n8n, Make albo Arkuszy Google bez programowania?

Tak. n8n nie ma oficjalnego węzła dla Jev, ale wystarczy węzeł HTTP Request z nagłówkiem Authorization i treścią zapytania w JSON-ie. W Make służy do tego moduł HTTP Make a request, a w Zapierze Webhooks by Zapier, który nie działa w darmowym planie. W Arkuszach Google wystarczy krótki skrypt Apps Script uruchamiany z menu.

Ile kosztuje sklasyfikowanie 1000 maili przez Jev?

Przy założeniu 700 tokenów na mail razem z pytaniami około 0,029 USD. GPT-6 Luna przy 500 tokenach na wejściu i 40 na wyjściu kosztuje 0,07 USD, a w trybie wsadowym 0,035 USD. Różnica jest kilkukrotna, ale to ułamki centa na wiadomość, więc Jev wybiera się raczej dla pewności przy każdej odpowiedzi i szybkości niż dla oszczędności.

Czy Jev nadaje się do oceny CV albo zdolności kredytowej klientów?

Nie polecamy. AI Act zalicza systemy do filtrowania podań o pracę, oceny kandydatów i pracowników oraz oceny zdolności kredytowej osób fizycznych do systemów wysokiego ryzyka, z obowiązkami od 2 grudnia 2027. Do tego art. 22 RODO daje prawo, by nie podlegać decyzji opartej wyłącznie na zautomatyzowanym przetwarzaniu, która istotnie wpływa na człowieka.

Czy jest darmowa alternatywa dla Jev, która działa lokalnie?

Jest Laya od Convai Innovations, otwarty model na licencji Apache 2.0, który przyjmuje ten sam format zapytań. Działa na zwykłym komputerze, więc dane nie opuszczają firmy. Słabo rozpoznaje jednak intencje po polsku: w teście autora z wyborem spośród 20 opcji wersja wielojęzyczna trafiała w 51 procentach przypadków, dlatego bez własnego testu nie warto jej wdrażać.

Newsletter

Opanuj AI‑coding w 5 minut. W każdy poniedziałek.

Konkretne premiery, analizy cen i jeden trik, który przyspieszy Twoją pracę. Po polsku, bez żargonu, prosto na maila.

Zero spamu · wypisujesz się jednym kliknięciem.