Krótka odpowiedź: jev-1.13 nie generuje tekstu. Wysyłasz POST z fragmentem tekstu oraz zestawem nazwanych pytań na adres https://aihubmix.com/v1/systemone, a w odpowiedzi otrzymujesz typowane odpowiedzi kluczowane nazwami Twoich pytań — kategorię, ocenę lub prawdopodobieństwo. Nic nie trzeba parsować. Poniżej znajduje się działające żądanie, pełny format odpowiedzi oraz jeden błąd projektowy, który po cichu obniży dokładność.
Do czego służy Jev
Używaj go, gdy potrzebujesz oceny, a nie akapitu: kierowania zgłoszeń do wsparcia, oceny wagi problemu, oznaczania pilności, moderowania treści. Strona modelu mówi to wprost: „Brak generowania tekstu, nic do parsowania”.
Zamiast tego użyj zwykłego modelu czatu, gdy potrzebujesz wyjaśnień, podsumowań lub jakiegokolwiek wyniku w dowolnej formie. Jev takich wyników nie wygeneruje.
Zanim zaczniesz
- [ ] Zainstalowany Python 3 (wystarczy biblioteka standardowa)
- [ ] Konto AiHubMix i klucz API
- [ ] Klucz wyeksportowany jako
AIHUBMIX_API_KEY, nigdy wpisany na sztywno w kodzie źródłowym
Nie potrzebujesz żadnego SDK OpenAI, LangChain ani pakietu requests.
Krok 1 — Poznaj endpoint
POST https://aihubmix.com/v1/systemone
Authorization: Bearer YOUR_KEY
Content-Type: application/json
To trasa dedykowana konkretnemu modelowi, nie /v1/chat/completions. Klienty zgodne z OpenAI nie mogą jej wywołać. Użyj zwykłego HTTP.
Krok 2 — Wybierz typy pytań
Są trzy typy, które możesz swobodnie łączyć w jednym żądaniu:
| Typ | Zastosowanie | Co podajesz |
|---|---|---|
choice | Wybór jednej kategorii | criteria jako słownik: etykieta → definicja |
score | Ocena na uporządkowanej skali | criteria jako lista, od najniższej |
noul | Ocena typu tak/nie | nic poza instructions |
Krok 3 — Zbuduj żądanie
state to tekst, który ma zostać oceniony. questions to klucze, które sam nazywasz; odpowiedź używa tych samych nazw.
payload = {
"model": "jev-1.13",
"state": "Hi, I have been trying to connect my Stripe account for 3 days "
"and it keeps failing. I am losing sales. Please help ASAP.",
"questions": {
"department": {
"type": "choice",
"instructions": "Which team should handle this",
"criteria": {
"billing": "Payment or subscription issues",
"technical": "Bugs or integration problems",
"sales": "Pricing or account questions",
},
},
"frustration": {
"type": "score",
"instructions": "How frustrated the customer appears",
"criteria": [
"Calm, just stating facts",
"Frustrated but civil",
"Very angry, strong language",
],
},
"is_urgent": {
"type": "noul",
"instructions": "The message conveys urgency or time-sensitivity",
},
},
}
Krok 4 — Wyślij żądanie za pomocą biblioteki standardowej
import json, os, urllib.error, urllib.request
def ask(payload):
req = urllib.request.Request(
"https://aihubmix.com/v1/systemone",
data=json.dumps(payload).encode(),
headers={"Authorization": "Bearer " + os.environ["AIHUBMIX_API_KEY"],
"Content-Type": "application/json"},
method="POST",
)
try:
with urllib.request.urlopen(req, timeout=60) as r:
return json.loads(r.read())
except urllib.error.HTTPError as e:
raise SystemExit(f"HTTP {e.code}: {e.read().decode(errors='replace')[:500]}")
Zamknij budowanie żądania w funkcji. Jeśli budujesz i wysyłasz je na poziomie modułu, samo zaimportowanie pliku ponownie uruchomi wywołanie i zużyje tokeny.
Krok 5 — Odczytaj odpowiedzi
Każda odpowiedź zapisuje wartość pod kluczem odpowiadającym jej type, więc jeden accessor obsługuje wszystkie trzy typy:
data = ask(payload)
for name, ans in data["answers"].items():
kind = ans["type"]
print(name, kind, ans[kind], ans.get("confidence"))
print("usage:", data.get("usage"))
Zweryfikowany wynik:
department choice billing 0.51
frustration score 1 1
is_urgent noul 1 None
usage: {'input_tokens': 424, 'output_tokens': 73}
Krok 6 — Zrozum pełną strukturę odpowiedzi
Pętla wypisująca wyniki ukrywa przydatne pola. Surowy JSON dla odpowiedzi typu score:
{
"type": "score",
"score": 1,
"legend": {"0": "Calm, just stating facts", "1": "Frustrated but civil", "2": "Very angry, strong language"},
"probabilities": {"0": 0, "1": 1, "2": 0},
"confidence": 1
}
legendmapuje indeks z powrotem na Twoje własne sformułowania — liczba całkowita jest samoopisowa, więc w kodzie nie potrzebujesz żadnej tabeli odnośników.probabilitiespodaje pełny rozkład, co pomaga wykryć bliski remis.noulnie ma polaconfidence. Sygnałem jest jego prawdopodobieństwo.
Na najwyższym poziomie odpowiedź zawiera także usage, id, provider (TypeSafe) oraz rozwiązaną wersję backendu typesafe/jev-1.13-20260917.
Błąd, który obniża dokładność
W powyższym żądaniu department zwrócił billing z pewnością 0,51. Powtórzenie identycznego żądania zwróciło tę samą etykietę z wynikiem 0,38 — odpowiedź była stabilna, ale deklarowana pewność już nie.
Przyczyna leży w kryteriach, a nie w modelu. billing to „Problemy z płatnościami lub subskrypcjami”, a technical to „Błędy lub problemy z integracją”. Integracja Stripe, która ciągle nie działa i jest związana z płatnościami, rzeczywiście pasuje do obu. Model zgłaszał niejednoznaczność, która była zapisana w schemacie.
Dwie zasady przed wdrożeniem produkcyjnym:
- Pisz kryteria
choicetak, aby się wzajemnie wykluczały. Jeśli człowiek wahałby się między dwiema etykietami, model też będzie się wahał. - Ustal próg pewności i kieruj wyniki o niskiej pewności do kolejki ręcznej, zamiast przyjmować je jako ostateczne decyzje. Model, który przyznaje się do niepewności, jest cenniejszy niż ten, który ją ukrywa.
Lista kontrolna przed uruchomieniem
- [ ] Klucz wczytany ze zmiennych środowiskowych lub z pliku
600, który system kontroli wersji ignoruje - [ ] Kryteria
choicesprawdzone pod kątem nakładania się - [ ] Próg pewności zdefiniowany, wraz ze ścieżką awaryjną poniżej niego
- [ ] Odpowiedzi
noulobsługiwane osobno — nie zawierająconfidence - [ ] Nieużywane pytania usunięte (3 pytania kosztowały 424 tokeny wejściowe; 2 kosztowały 355)
- [ ] Odpowiedzi inne niż 2xx zapisywane w logach wraz z surowym ciałem
Najczęstsze pytania
Czy mogę użyć SDK OpenAI? Nie. /v1/systemone nie jest trasą zgodną z OpenAI.
Czy Jev może zwrócić zdanie lub podsumowanie? Nie. Odpowiada wyłącznie na zdefiniowane przez Ciebie pytania o określonych typach.
Ile pytań można zadać w jednym żądaniu? Zweryfikowane testy używały dwóch i trzech pytań. Każde pytanie zwiększa liczbę tokenów wejściowych i wyjściowych, więc uwzględniaj tylko te, na podstawie których będziesz działać.
Czy istnieje alias wersji? Strona modelu wymienia alias jev-latest obok jev-1.13. Jeśli zależy Ci na powtarzalności, przypnij konkretną wersję.
Ile to kosztuje? Strona modelu podaje $0.0462 / M tokenów wejściowych oraz $0 / M tokenów wyjściowych. Są to dane dostawcy — przed planowaniem budżetu sprawdź aktualny cennik.
Jakie jest okno kontekstu? Strona modelu jest niespójna: w nagłówku podaje 64K, a w tabeli dostawcy 32K. Zweryfikuj na własnym, najdłuższym wejściu, zanim oprzesz się na którejkolwiek z tych wartości.
Zakres tego przewodnika
Wszystko powyżej zweryfikowano za pomocą trzech wywołań na żywo dla jednego wejścia. Nie obejmuje to opóźnień, grupowania żądań, przepustowości ani zachowania na danych innych niż przykład. Dryf pewności to udokumentowana obserwacja, a nie zmierzony wskaźnik błędów — przed ustawieniem progu powtórz ją na własnych danych.
Zacznij korzystać z AiHubMix
jev-1.13 jest dostępny przez AiHubMix, a strona modelu zawiera wszystko, do czego odnosi się ten przewodnik: endpoint /v1/systemone, trzy typy pytań z formatami criteria, pełne pola odpowiedzi oraz opublikowany cennik: $0.0462 / M tokenów wejściowych i $0 / M tokenów wyjściowych. Alias jev-latest wskazuje na najnowsze wydanie, więc pozostaje aktualny wraz ze zmianami wersji.
Zacznij tutaj: https://aihubmix.com/model/jev-latest
Kolejne kroki:
- Utwórz konto AiHubMix i wygeneruj klucz API
- Skopiuj żądanie z Kroku 3 oraz funkcję
ask()z Kroku 4 - Zastąp
stateprawdziwym rekordem z własnej kolejki - Porównaj wynik z tym, jak klasyfikujesz ten rekord obecnie
Jeśli ten przewodnik był przydatny, zasubskrybuj, aby otrzymywać kolejne wpisy o modelach ze strukturalnym wyjściem i potokach klasyfikacji.



