Risposta breve: jev-1.13 non genera testo. Invii un testo insieme a un insieme di domande con nome a https://aihubmix.com/v1/systemone e ricevi risposte tipizzate, indicizzate con i nomi delle tue domande: una categoria, un punteggio o una probabilità. Non c'è nulla da analizzare. Di seguito trovi una richiesta funzionante, il formato completo della risposta e l'errore di progettazione che compromette silenziosamente l'accuratezza.
A cosa serve Jev
Usalo quando ti serve un giudizio, non un paragrafo: instradare un ticket di supporto, valutare la gravità, segnalare l'urgenza, filtrare i contenuti. La pagina del modello lo dichiara chiaramente: "Nessuna generazione di testo, nulla da analizzare".
Usa invece un normale modello di chat quando ti servono spiegazioni, riassunti o qualsiasi output in forma libera. jev non può produrli.
Prima di iniziare
- [ ] Python 3 installato (la libreria standard è sufficiente)
- [ ] Un account AiHubMix e una chiave API
- [ ] Chiave esportata come
AIHUBMIX_API_KEY, mai inserita direttamente nel codice sorgente
Non ti serve nessun SDK di OpenAI, LangChain o il pacchetto requests.
Passo 1 — Conosci l'endpoint
POST https://aihubmix.com/v1/systemone
Authorization: Bearer YOUR_KEY
Content-Type: application/json
Questa è una rotta specifica del modello, non /v1/chat/completions. I client compatibili con OpenAI non possono chiamarla. Usa HTTP semplice.
Passo 2 — Scegli i tipi di domanda
Ce ne sono tre, e puoi combinarli liberamente in un'unica richiesta:
| Tipo | Usalo per | Cosa fornisci |
|---|---|---|
choice | Scegliere una categoria | criteria come dizionario: etichetta → definizione |
score | Valutazione su una scala ordinata | criteria come lista, dal valore più basso |
noul | Un giudizio sì/no | nient'altro oltre a instructions |
Passo 3 — Costruisci la richiesta
state è il testo da giudicare. Le chiavi di questions sono nomi che inventi tu; la risposta usa gli stessi nomi.
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",
},
},
}
Passo 4 — Inviala con la libreria standard
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]}")
Mantieni la costruzione della richiesta all'interno di una funzione. Se costruisci e invii a livello di modulo, importare il file rilancia la chiamata e consuma token.
Passo 5 — Leggi le risposte
Ogni risposta memorizza il proprio valore sotto una chiave corrispondente al suo type, quindi un solo accessor copre tutti e tre i casi:
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"))
Output verificato:
department choice billing 0.51
frustration score 1 1
is_urgent noul 1 None
usage: {'input_tokens': 424, 'output_tokens': 73}
Passo 6 — Comprendi l'envelope completo
Il ciclo di stampa nasconde campi utili. Il JSON grezzo per una risposta di tipo 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
}
legendassocia l'indice alla tua formulazione originale: l'intero è autoesplicativo, quindi non ti serve una tabella di consultazione nel codice.probabilitiesfornisce la distribuzione completa, utile per rilevare un pareggio quasi perfetto.noulnon ha un campoconfidence. Il segnale è la sua probabilità.
Il livello superiore restituisce anche usage, id, provider (TypeSafe) e la versione del backend risolta typesafe/jev-1.13-20260917.
L'errore che compromette l'accuratezza
Nella richiesta sopra, department ha restituito billing con una confidenza di 0,51. Ripetendo la stessa identica richiesta, è stata restituita la stessa etichetta con 0,38: la risposta era stabile, la certezza dichiarata no.
La causa sta nei criteri, non nel modello. billing è "Problemi di pagamento o abbonamento" e technical è "Bug o problemi di integrazione". Un'integrazione Stripe che continua a fallire corrisponde davvero a entrambi. Il modello stava segnalando un'ambiguità scritta nello schema.
Due regole prima della produzione:
- Scrivi criteri
choiceche si escludano a vicenda. Se un essere umano esiterebbe tra due etichette, lo farà anche il modello. - Imposta una soglia di confidenza e instrada i risultati a bassa confidenza verso una coda gestita da un essere umano, invece di accettarli come decisioni. Un modello che ammette l'incertezza è più prezioso di uno che la nasconde.
Checklist pre-lancio
- [ ] Chiave caricata dall'ambiente o da un file in modalità
600che il VCS ignora - [ ] Criteri
choiceverificati per sovrapposizioni - [ ] Soglia di confidenza definita, con un percorso di ripiego al di sotto di essa
- [ ] Risposte
noulgestite separatamente: non hannoconfidence - [ ] Domande inutilizzate rimosse (3 domande costano 424 token di input; 2 costano 355)
- [ ] Risposte non 2xx registrate con il corpo grezzo
FAQ
Posso usare l'SDK di OpenAI? No. /v1/systemone non è una rotta compatibile con OpenAI.
jev può restituire una frase o un riassunto? No. Risponde solo alle domande tipizzate che definisci.
Quante domande per richiesta? I test verificati ne hanno usate due e tre. Ogni domanda aggiunge token di input e di output, quindi includi solo ciò su cui agirai.
Esiste un alias di versione? La pagina del modello elenca un alias jev-latest accanto a jev-1.13. Fissa la versione esplicita se la riproducibilità è importante.
Quanto costa? La pagina del modello pubblica $0.0462 / M di token di input e $0 / M di token di output. Sono cifre del fornitore: verifica il prezzo attuale prima di fare il budget.
Qual è la finestra di contesto? La pagina del modello è incoerente: 64K nell'intestazione, 32K nella tabella dei fornitori. Verifica con il tuo input più lungo prima di fare affidamento su uno dei due valori.
Ambito di questa guida
Tutto quanto sopra è stato verificato con tre chiamate live su un singolo input. Non copre latenza, batching, throughput o il comportamento su input diversi dall'esempio. La deriva della confidenza è un'osservazione riprodotta, non un tasso di errore misurato: ripetila sui tuoi dati prima di impostare una soglia.
Inizia con AiHubMix
jev-1.13 è disponibile tramite AiHubMix, e la pagina del modello contiene tutto ciò a cui questo tutorial fa riferimento: l'endpoint /v1/systemone, i tre tipi di domanda con i relativi formati di criteria, i campi completi della risposta e il prezzo pubblicato di $0.0462 / M di token di input con $0 / M di token di output. L'alias jev-latest risolve alla release più recente, quindi resta aggiornato al variare delle versioni.
Inizia qui: https://aihubmix.com/model/jev-latest
Prossimi passi:
- Crea un account AiHubMix e genera una chiave API
- Copia la richiesta del Passo 3 e la funzione
ask()del Passo 4 - Sostituisci
statecon un record reale della tua coda - Confronta il risultato con il metodo che usi oggi per classificare quel record
Se questa guida ti è stata utile, iscriviti per i prossimi articoli su modelli con output strutturato e pipeline di classificazione.



