Zo roep je Jev aan op AiHubMix: een gestructureerde classificatiehandleiding

AIHubMix5 min leestijd
Zo roep je Jev aan op AiHubMix: een gestructureerde classificatiehandleiding

Kort antwoord: jev-1.13 genereert geen tekst. Je stuurt een stuk tekst en een reeks benoemde vragen via POST naar https://aihubmix.com/v1/systemone, en je krijgt getypte antwoorden terug, gesleuteld op je eigen vraagnamen: een categorie, een score of een kans. Er is niets om te parsen. Hieronder staan een werkend verzoek, het volledige antwoordformaat en de ontwerpfout die stilletjes je nauwkeurigheid kost.

Waarvoor Jev is bedoeld

Gebruik het wanneer je een oordeel nodig hebt, geen alinea: een supportticket routeren, ernst beoordelen, urgentie markeren, content filteren. De modelpagina zegt het duidelijk: "Geen tekstgeneratie, niets om te parsen."

Gebruik in plaats daarvan een normaal chatmodel wanneer je uitleg, samenvattingen of vrije uitvoer nodig hebt. jev kan die niet produceren.

Voordat je begint

  • [ ] Python 3 geïnstalleerd (de standaardbibliotheek is voldoende)
  • [ ] Een AiHubMix-account en API-sleutel
  • [ ] Sleutel geëxporteerd als AIHUBMIX_API_KEY, nooit hardcoded in de broncode

Je hebt geen OpenAI-SDK, LangChain of het requests -pakket nodig.

Stap 1 — Ken het endpoint

POST https://aihubmix.com/v1/systemone
Authorization: Bearer YOUR_KEY
Content-Type: application/json

Dit is een modelspecifieke route, geen /v1/chat/completions. OpenAI-compatibele clients kunnen hem niet aanroepen. Gebruik gewone HTTP.

Stap 2 — Kies je vraagtypen

Er zijn er drie, en je kunt ze vrij combineren in één verzoek:

TypeGebruik voorJij levert
choiceEén categorie kiezencriteria als dict: label → definitie
scoreBeoordeling op een geordende schaalcriteria als lijst, laagste eerst
noulEen ja/nee-oordeelniets meer dan instructions

Stap 3 — Bouw het verzoek

state is de tekst die beoordeeld moet worden. questions -sleutels zijn namen die jij verzint; het antwoord gebruikt dezelfde namen.

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",
        },
    },
}

Stap 4 — Verstuur het met de standaardbibliotheek

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]}")

Houd de opbouw van het verzoek binnen een functie. Als je op modulniveau bouwt en verstuurt, roept het importeren van het bestand de aanroep opnieuw aan en verbruikt het tokens.

Stap 5 — Lees de antwoorden

Elk antwoord slaat zijn waarde op onder een sleutel die overeenkomt met zijn type, dus één accessor dekt alle drie:

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"))

Geverifieerde uitvoer:

department   choice  billing   0.51
frustration  score   1         1
is_urgent    noul    1         None
usage: {'input_tokens': 424, 'output_tokens': 73}

Stap 6 — Begrijp de volledige envelop

De printlus verbergt nuttige velden. De ruwe JSON voor een score -antwoord:

{
  "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
}
  • legend koppelt de index terug aan je eigen formulering; het gehele getal is zelfbeschrijvend, dus je hebt in je code geen opzoektabel nodig.
  • probabilities geeft de volledige verdeling, handig om een bijna-gelijkspel te herkennen.
  • noul heeft geen confidence -veld. De kans is het signaal.

Het bovenste niveau geeft ook usage, id, provider (TypeSafe) en de opgeloste backendversie typesafe/jev-1.13-20260917 terug.

De fout die je nauwkeurigheid kost

In het bovenstaande verzoek gaf department het label billing terug met een zekerheid van 0.51. Hetzelfde verzoek nogmaals gaf hetzelfde label terug met 0.38 — het antwoord was stabiel, de opgegeven zekerheid niet.

De oorzaak zit in de criteria, niet in het model. billing is "Betalings- of abonnementsproblemen" en technical is "Bugs of integratieproblemen." Een Stripe-integratie die blijft mislukken past echt bij beide. Het model meldde een ambiguïteit die in het schema was ingebouwd.

Twee regels voor productie:

  1. Schrijf choice -criteria die elkaar uitsluiten. Als een mens zou aarzelen tussen twee labels, doet het model dat ook.
  2. Stel een betrouwbaarheidsdrempel in en stuur resultaten met lage zekerheid naar een menselijke wachtrij in plaats van ze als beslissingen te accepteren. Een model dat onzekerheid toegeeft is waardevoller dan een model dat die verbergt.

Checklist vóór lancering

  • [ ] Sleutel geladen uit de omgeving of een bestand met 600-modus dat je VCS negeert
  • [ ] choice -criteria gecontroleerd op overlap
  • [ ] Betrouwbaarheidsdrempel bepaald, met een terugvalpad eronder
  • [ ] noul -antwoorden apart afgehandeld — die hebben geen confidence
  • [ ] Ongebruikte vragen verwijderd (3 vragen kosten 424 invoertokens; 2 kosten 355)
  • [ ] Niet-2xx-antwoorden gelogd met de ruwe body

Veelgestelde vragen

Kan ik de OpenAI-SDK gebruiken? Nee. /v1/systemone is geen OpenAI-compatibele route.

Kan jev een zin of samenvatting teruggeven? Nee. Het beantwoordt alleen de getypte vragen die jij definieert.

Hoeveel vragen per verzoek? De geverifieerde tests gebruikten er twee en drie. Elke vraag voegt invoer- en uitvoertokens toe, dus neem alleen op wat je daadwerkelijk gaat gebruiken.

Is er een versie-alias? De modelpagina vermeldt een jev-latest -alias naast jev-1.13. Zet de expliciete versie vast als reproduceerbaarheid belangrijk is.

Wat kost het? De modelpagina publiceert $0.0462 / M invoertokens en $0 / M uitvoertokens. Dit zijn cijfers van de leverancier — controleer de actuele prijzen voordat je een budget opstelt.

Hoe groot is het contextvenster? De modelpagina is inconsistent: 64K in de kop, 32K in de providertabel. Verifieer dit aan de hand van je langste invoer voordat je op een van beide vertrouwt.

Reikwijdte van deze gids

Alles hierboven is geverifieerd met drie live-aanroepen op één invoer. Het behandelt geen latentie, batching, doorvoer of gedrag bij invoer die afwijkt van het voorbeeld. De verschuiving in zekerheid is een gereproduceerde observatie, geen gemeten foutpercentage — herhaal dit met je eigen data voordat je een drempel instelt.

Aan de slag op AiHubMix

jev-1.13 is beschikbaar via AiHubMix, en de modelpagina bevat alles waarnaar deze handleiding verwijst: het endpoint /v1/systemone, de drie vraagtypen met hun criteria-formaten, de volledige antwoordvelden en de gepubliceerde prijzen van $0.0462 / M invoertokens en $0 / M uitvoertokens. De jev-latest -alias verwijst naar de nieuwste release, dus die blijft actueel naarmate versies veranderen.

Begin hier: https://aihubmix.com/model/jev-latest

Volgende stappen:

  1. Maak een AiHubMix-account aan en genereer een API-sleutel
  2. Kopieer het verzoek uit Stap 3 en de ask() -functie uit Stap 4
  3. Vervang state door een echt record uit je eigen wachtrij
  4. Vergelijk het resultaat met hoe je dat record nu classificeert

Als deze gids nuttig was, abonneer je dan op toekomstige posts over gestructureerde-uitvoermodellen en classificatiepijplijnen.

Eén gateway naar meerdere AI-aanbieders. Gebouwd voor productie.

Bezoek AIHubMix