Kurze Antwort: jev-1.13 generiert keinen Text. Sie POSTen ein Stück Text plus eine Reihe benannter Fragen an https://aihubmix.com/v1/systemone, und Sie erhalten typisierte Antworten, die nach Ihren Fragenamen zugeordnet sind — eine Kategorie, eine Punktzahl oder eine Wahrscheinlichkeit. Nichts zu parsen. Im Folgenden finden Sie eine funktionierende Anfrage, das vollständige Antwortformat und den einen Designfehler, der Ihnen stillschweigend Genauigkeit kosten wird.
Wofür Jev gedacht ist
Verwenden Sie es, wenn Sie ein Urteil benötigen, nicht einen Absatz: Routing eines Support-Tickets, Bewertung der Schwere, Kennzeichnung der Dringlichkeit, Zugang zu Inhalten. Die Modellseite sagt es klar — "Keine Textgenerierung, nichts zu parsen."
Verwenden Sie stattdessen ein normales Chat-Modell, wenn Sie Erklärungen, Zusammenfassungen oder beliebige freie Ausgaben benötigen. Jev kann diese nicht erzeugen.
Bevor Sie beginnen
- [ ] Python 3 installiert (die Standardbibliothek reicht aus)
- [ ] Ein AiHubMix-Konto und API-Schlüssel
- [ ] Schlüssel als
AIHUBMIX_API_KEYexportiert, niemals im Quellcode fest codiert
Sie benötigen kein OpenAI SDK, LangChain oder das requests Paket.
Schritt 1 — Endpoint kennen
POST https://aihubmix.com/v1/systemone
Authorization: Bearer YOUR_KEY
Content-Type: application/json
Dies ist eine modell-spezifische Route, nicht /v1/chat/completions. OpenAI-kompatible Clients können sie nicht aufrufen. Verwenden Sie einfaches HTTP.
Schritt 2 — Wählen Sie Ihre Fragetypen
Es gibt drei, und Sie können sie in einer Anfrage frei mischen:
| Typ | Verwenden Sie es für | Sie liefern |
|---|---|---|
choice | Auswahl einer Kategorie | criteria als dict: label → definition |
score | Bewertung auf einer geordneten Skala | criteria als Liste, niedrigste zuerst |
noul | Ein Ja/Nein-Urteil | nichts darüber hinaus instructions |
Schritt 3 — Anfrage erstellen
state ist der zu bewertende Text. questions Schlüssel sind Namen, die Sie erfinden; die Antwort verwendet dieselben Namen.
payload = {
"model": "jev-1.13",
"state": "Hallo, ich habe versucht, mein Stripe-Konto seit 3 Tagen zu verbinden "
"und es schlägt ständig fehl. Ich verliere Verkäufe. Bitte helfen Sie ASAP.",
"questions": {
"department": {
"type": "choice",
"instructions": "Welches Team sollte sich darum kümmern",
"criteria": {
"billing": "Zahlungs- oder Abonnementprobleme",
"technical": "Fehler oder Integrationsprobleme",
"sales": "Preise oder Kontofragen",
},
},
"frustration": {
"type": "score",
"instructions": "Wie frustriert der Kunde erscheint",
"criteria": [
"Ruhig, nur Fakten darstellend",
"Frustriert, aber zivilisiert",
"Sehr wütend, starke Sprache",
],
},
"is_urgent": {
"type": "noul",
"instructions": "Die Nachricht vermittelt Dringlichkeit oder Zeitempfindlichkeit",
},
},
}
Schritt 4 — Senden Sie es mit der Standardbibliothek
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]}")
Halten Sie die Anfrageerstellung innerhalb einer Funktion. Wenn Sie auf Modulebene erstellen und senden, wird der Aufruf beim Importieren der Datei erneut ausgelöst und verbraucht Tokens.
Schritt 5 — Antworten lesen
Jede Antwort speichert ihren Wert unter einem Schlüssel, der ihrem type entspricht, sodass ein Zugriff auf alle drei abgedeckt ist:
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"))
Überprüfte Ausgabe:
department choice billing 0.51
frustration score 1 1
is_urgent noul 1 None
usage: {'input_tokens': 424, 'output_tokens': 73}
Schritt 6 — Verstehen Sie das vollständige Envelope
Die Druckschleife verbirgt nützliche Felder. Das rohe JSON für eine score Antwort:
{
"type": "score",
"score": 1,
"legend": {"0": "Ruhig, nur Fakten darstellend", "1": "Frustriert, aber zivilisiert", "2": "Sehr wütend, starke Sprache"},
"probabilities": {"0": 0, "1": 1, "2": 0},
"confidence": 1
}
legendordnet den Index zurück zu Ihrer eigenen Formulierung — die Ganzzahl ist selbsterklärend, sodass Sie keine Nachschlagetabelle in Ihrem Code benötigen.probabilitiesgibt die vollständige Verteilung an, nützlich zur Erkennung eines nahezu Gleichstands.noulhat keinconfidenceFeld. Seine Wahrscheinlichkeit ist das Signal.
Die oberste Ebene gibt auch usage, id, provider (TypeSafe) und die aufgelöste Backend-Version typesafe/jev-1.13-20260917 zurück.
Der Fehler, der Ihnen Genauigkeit kostet
In der obigen Anfrage gab department mit einer Zuversicht von 0.51 zurück. Eine identische Anfrage ergab dasselbe Label mit 0.38 — die Antwort war stabil, die angegebene Sicherheit jedoch nicht.
Die Ursache liegt in den Kriterien, nicht im Modell. billing ist "Zahlungs- oder Abonnementprobleme" und technical ist "Fehler oder Integrationsprobleme." Eine Stripe Integration die ständig fehlschlägt passt wirklich zu beiden. Das Modell berichtete von einer Mehrdeutigkeit, die in das Schema geschrieben wurde.
Zwei Regeln vor der Produktion:
- Schreiben Sie
choiceKriterien, die sich gegenseitig ausschließen. Wenn ein Mensch zwischen zwei Labels zögern würde, wird das Modell dies auch tun. - Setzen Sie einen Zuversichtsschwellenwert und leiten Sie Ergebnisse mit niedriger Zuversicht in eine menschliche Warteschlange weiter, anstatt sie als Entscheidungen zu akzeptieren. Ein Modell, das Unsicherheit zulässt, ist wertvoller als eines, das sie verbirgt.
Checkliste vor dem Start
- [ ] Schlüssel aus der Umgebung oder einer
600-Modus-Datei geladen, die Ihr VCS ignoriert - [ ]
choiceKriterien auf Überlappung überprüft - [ ] Zuversichtsschwellenwert definiert, mit einem Fallback-Pfad darunter
- [ ]
noulAntworten separat behandelt — sie tragen keineconfidence - [ ] Unbenutzte Fragen entfernt (3 Fragen kosten 424 Eingabetokens; 2 kosten 355)
- [ ] Nicht-2xx-Antworten mit dem rohen Body protokolliert
FAQ
Kann ich das OpenAI SDK verwenden? Nein. /v1/systemone ist keine OpenAI-kompatible Route.
Kann jev einen Satz oder eine Zusammenfassung zurückgeben? Nein. Es beantwortet nur die von Ihnen definierten typisierten Fragen.
Wie viele Fragen pro Anfrage? Die verifizierten Tests verwendeten zwei und drei. Jede Frage fügt Eingabe- und Ausgabetokens hinzu, also schließen Sie nur das ein, was Sie bearbeiten werden.
Gibt es ein Versionsalias? Die Modellseite listet ein jev-latest Alias neben jev-1.13. Fixieren Sie die explizite Version, wenn Reproduzierbarkeit wichtig ist.
Was kostet es? Die Modellseite veröffentlicht $0.0462 / M Eingabetokens und $0 / M Ausgabetokens. Dies sind Anbieterzahlen — bestätigen Sie die aktuellen Preise, bevor Sie budgetieren.
Was ist das Kontextfenster? Die Modellseite ist inkonsistent: 64K in ihrer Kopfzeile, 32K in der Anbietertabelle. Überprüfen Sie gegen Ihre eigene längste Eingabe, bevor Sie sich auf eine der beiden verlassen.
Umfang dieses Leitfadens
Alles oben wurde mit drei Live-Anrufen gegen eine einzige Eingabe verifiziert. Es behandelt nicht Latenz, Batchverarbeitung, Durchsatz oder Verhalten bei Eingaben, die von dem Beispiel abweichen. Der Zuversichtsdrift ist eine reproduzierte Beobachtung, kein gemessener Fehlerquote — wiederholen Sie es mit Ihren eigenen Daten, bevor Sie einen Schwellenwert festlegen.
Beginnen Sie mit AiHubMix
jev-1.13 ist über AiHubMix verfügbar, und die Modellseite enthält alles, auf das dieses Tutorial verwiesen hat: den /v1/systemone Endpoint, die drei Fragetypen mit ihren criteria Formaten, die vollständigen Antwortfelder und die veröffentlichten Preise von $0.0462 / M Eingabetokens mit $0 / M Ausgabetokens. Das jev-latest Alias verweist auf die neueste Version, sodass es aktuell bleibt, während sich die Versionen ändern.
Starten Sie hier: https://aihubmix.com/model/jev-latest
Nächste Schritte:
- Erstellen Sie ein AiHubMix-Konto und generieren Sie einen API-Schlüssel
- Kopieren Sie die Anfrage aus Schritt 3 und die
ask()Funktion aus Schritt 4 - Ersetzen Sie
statedurch einen echten Datensatz aus Ihrer eigenen Warteschlange - Vergleichen Sie das Ergebnis mit dem, wie Sie diesen Datensatz heute klassifizieren
Wenn dieser Leitfaden nützlich war, abonnieren Sie zukünftige Beiträge zu strukturierten Ausgabemodellen und Klassifikationspipelines.



