Hoe je Jev kunt aanroepen op AiHubMix: Een gestructureerde classificatietutorial

AIHubMix5 min leestijd
Hoe je Jev kunt aanroepen op AiHubMix: Een gestructureerde classificatietutorial

Korte antwoord: jev-1.13 genereert geen tekst. Je POST een stuk tekst plus een set benoemde vragen naar https://aihubmix.com/v1/systemone, en je krijgt getypte antwoorden terug die zijn gekoppeld aan je vraagnamen — een categorie, een score of een waarschijnlijkheid. Niets om te parseren. Hieronder staat een werkende aanvraag, het volledige antwoordformaat en de ene ontwerpfout die je stilletjes nauwkeurigheid zal kosten.

Waar Jev voor is

Gebruik het wanneer je een oordeel nodig hebt, geen alinea: het routeren van een supportticket, het scoren van ernst, het markeren van urgentie, het afsluiten van inhoud. De modelpagina stelt het duidelijk — "Geen tekstgeneratie, niets om te parseren."

Gebruik in plaats daarvan een normaal chatmodel wanneer je uitleg, samenvattingen of enige vrije tekstoutput 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 bron

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

Stap 1 — Ken de endpoint

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

Dit is een model-specifieke route, niet /v1/chat/completions. OpenAI-compatibele clients kunnen het niet aanroepen. Gebruik gewone HTTP.

Stap 2 — Kies je vraagtypes

Er zijn er drie, en je kunt ze vrij mengen in één aanvraag:

TypeGebruik het voorJij levert
keuzeEen categorie kiezencriteria als een dict: label → definitie
scoreBeoordeling op een geordende schaalcriteria als een lijst, laagste eerst
noulEen ja/nee oordeelniets verder dan instructies

Stap 3 — Bouw de aanvraag

state is de tekst die beoordeeld moet worden. questions sleutels zijn namen die je uitvindt; het antwoord gebruikt dezelfde namen.

payload = {
    "model": "jev-1.13",
    "state": "Hallo, ik probeer mijn Stripe-account al 3 dagen te verbinden "
             "en het blijft falen. Ik verlies verkopen. Help alsjeblieft ASAP.",
    "questions": {
        "department": {
            "type": "choice",
            "instructions": "Welke team moet dit behandelen",
            "criteria": {
                "billing":   "Betalings- of abonnementsproblemen",
                "technical": "Fouten of integratieproblemen",
                "sales":     "Prijs- of accountvragen",
            },
        },
        "frustration": {
            "type": "score",
            "instructions": "Hoe gefrustreerd de klant lijkt",
            "criteria": [
                "Kalm, gewoon feiten stating",
                "Gefrustreerd maar beleefd",
                "Zeer boos, sterke taal",
            ],
        },
        "is_urgent": {
            "type": "noul",
            "instructions": "De boodschap geeft urgentie of tijdsgevoeligheid aan",
        },
    },
}

Stap 4 — Stuur 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 aanvraagconstructie binnen een functie. Als je op module-niveau bouwt en verzendt, wordt de oproep opnieuw uitgevoerd bij het importeren van het bestand en worden tokens verbruikt.

Stap 5 — Lees de antwoorden

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

data = ask(payload)
for name, ans in data["answers"].items():
    kind = ans["type"]
    print(name, kind, ans[kind], ans.get("confidence"))
print("gebruik:", data.get("usage"))

Geverifieerde output:

department   choice  billing   0.51
frustration  score   1         1
is_urgent    noul    1         None
gebruik: {'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": "Kalm, gewoon feiten stating", "1": "Gefrustreerd maar beleefd", "2": "Zeer boos, sterke taal"},
  "probabilities": {"0": 0, "1": 1, "2": 0},
  "confidence": 1
}
  • legend koppelt de index terug naar jouw eigen bewoording — het geheel is zelfbeschrijvend, dus je hebt geen opzoektafel in je code nodig.
  • probabilities geeft de volledige verdeling, nuttig voor het detecteren van een bijna gelijke stand.
  • noul heeft geen confidence veld. De waarschijnlijkheid is het signaal.

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

De fout die je nauwkeurigheid kost

In de bovenstaande aanvraag heeft department billing teruggegeven met een zekerheid van 0.51. Het herhalen van dezelfde aanvraag gaf hetzelfde label terug bij 0.38 — het antwoord was stabiel, de aangegeven zekerheid niet.

De oorzaak ligt in de criteria, niet in het model. billing is "Betalings- of abonnementsproblemen" en technical is "Fouten of integratieproblemen." Een Stripe integratie die blijft falen komt echt overeen met beide. Het model rapporteerde een ambiguïteit die in het schema was geschreven.

Twee regels voor productie:

  1. Schrijf choice criteria die onderling exclusief zijn. Als een mens zou aarzelen tussen twee labels, zal het model dat ook doen.
  2. Stel een vertrouwensdrempel in en routeer laagvertrouwensresultaten naar een menselijke wachtrij in plaats van ze als beslissingen te accepteren. Een model dat onzekerheid toestaat, is waardevoller dan een die het verbergt.

Pre-launch checklist

  • [ ] Sleutel geladen vanuit de omgeving of een 600-modusbestand dat je VCS negeert
  • [ ] choice criteria gecontroleerd op overlap
  • [ ] Vertrouwensdrempel gedefinieerd, met een fallback-pad eronder
  • [ ] noul antwoorden apart behandeld — ze dragen geen confidence
  • [ ] Ongebruikte vragen verwijderd (3 vragen kosten 424 inputtokens; 2 kosten 355)
  • [ ] Niet-2xx-antwoorden gelogd met de ruwe body

FAQ

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 je definieert.

Hoeveel vragen per aanvraag? De geverifieerde tests gebruikten twee en drie. Elke vraag voegt input- en outputtokens toe, dus neem alleen op wat je gaat gebruiken.

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

Wat kost het? De modelpagina publiceert $0.0462 / M inputtokens en $0 / M outputtokens. Dit zijn leverancierscijfers — bevestig de huidige prijzen voordat je budgetteert.

Wat is de contextvenster? De modelpagina is inconsistent: 64K in de header, 32K in de provider tabel. Verifieer tegen je eigen langste input voordat je op een van beide vertrouwt.

Reikwijdte van deze gids

Alles hierboven is geverifieerd met drie live oproepen tegen één enkele input. Het dekt geen latentie, batching, doorvoer of gedrag op inputs die anders zijn dan het voorbeeld. De vertrouwensafwijking is een gereproduceerde observatie, geen gemeten foutpercentage — herhaal het op je eigen gegevens voordat je een drempel instelt.

Begin met AiHubMix

jev-1.13 is beschikbaar via AiHubMix, en de modelpagina bevat alles waar deze tutorial naar verwees: de /v1/systemone endpoint, de drie vraagtypes met hun criteria formaten, de volledige antwoordvelden en de gepubliceerde prijs van $0.0462 / M inputtokens met $0 / M outputtokens. De jev-latest alias verwijst naar de nieuwste release, zodat het actueel blijft 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 de aanvraag van Stap 3 en de ask() functie van Stap 4
  3. Vervang state door een echt record uit je eigen wachtrij
  4. Vergelijk het resultaat met hoe je dat record vandaag classificeert

Als deze gids nuttig was, abonneer je dan voor toekomstige berichten over gestructureerde-outputmodellen en classificatiepijplijnen.