System One (typade beslut)

Senast uppdaterad:

På denna sida
text
POST https://api.staik.se/v1/systemone

För de många små besluten i en agent eller ett arbetsflöde behövs ingen genererad text: är mejlet nätfiske, vilken kö ska ärendet till, räcker underlaget för att svara? Du skickar ett state (text eller JSON) och en eller flera typade frågor. Du får tillbaka en sannolikhet per alternativ, aldrig fritext. Svaret följer alltid ditt schema, så det finns inget att parsa eller validera.

Formatet är kompatibelt med TypeSafes Jev-API. En befintlig Jev-klient fungerar genom att sätta base_url till https://api.staik.se och använda din staik-nyckel. Datan lämnar aldrig Sverige.

bash
curl https://api.staik.se/v1/systemone \
  -H "Content-Type: application/json" \
  -H "Authorization: Bearer sk-st-your-key" \
  -d '{
    "state": {
      "subject": "Ditt konto har spärrats",
      "body": "Logga in via länken och bekräfta dina BankID-uppgifter inom 24 timmar."
    },
    "questions": {
      "category": {
        "type": "choice",
        "instructions": "Vilken sorts e-post är detta?",
        "criteria": {
          "support": "Kundtjänst, ärende, klagomål",
          "billing": "Faktura, betalning, kvitto",
          "threat": "Nätfiske, bedrägeri, social manipulation"
        }
      },
      "phishing": {
        "type": "noul",
        "instructions": "Försöker avsändaren komma åt inloggningsuppgifter eller pengar?"
      },
      "urgency": {
        "type": "score",
        "instructions": "Hur brådskande är detta för mottagaren?",
        "criteria": ["Inte alls", "Låg", "Hög", "Kritisk"]
      }
    }
  }'

Frågetyper

TypcriteriaSvar
choiceObjekt {namn: beskrivning}, 2–20 alternativchoice (valt namn), probabilities per namn, confidence
noulValfritt {"true": ..., "false": ...}noul = sannolikheten för ja (0–1)
scoreLista med ordnade nivåer, 2–20 stscore = väntevärdet över nivåindex, probabilities, legend, confidence

instructions är frågan i klartext. Både state och instructions kan vara text eller JSON: fältnamn behålls som etiketter i det modellen läser.

Svar

json
{
  "request_id": "7f3c…",
  "model": "gemma4:31b",
  "answers": {
    "category": {
      "type": "choice",
      "choice": "threat",
      "confidence": 0.94,
      "probabilities": { "support": 0.02, "billing": 0.02, "threat": 0.96 }
    },
    "phishing": { "type": "noul", "noul": 0.97 },
    "urgency": {
      "type": "score",
      "score": 2.1,
      "legend": { "0": "Inte alls", "1": "Låg", "2": "Hög", "3": "Kritisk" },
      "probabilities": { "0": 0.03, "1": 0.12, "2": 0.57, "3": 0.28 },
      "confidence": 0.61
    }
  },
  "usage": { "input_tokens": 212, "output_tokens": 0 },
  "latency_ms": 184
}

confidence är 0 vid en jämn fördelning och 1 när all sannolikhet ligger på ett alternativ. request_id finns också i headern x-typesafe-request-id.

Modeller

modelStyrka
gemma4:31b (standard)Högst träffsäkerhet och snabbast när flera frågor ställs på samma state
qwen3.6:35b-a3bBäst på att signalera osäkerhet i faktafrågor; välj den om du automatiserar "acceptera om säker, annars eskalera" på kunskapsfrågor
qwen3.5:9bMinst, något lägre träffsäkerhet

Utan model, eller med ett namn vi inte känner igen (till exempel Jev-klientens jev-latest), används gemma4:31b. Övriga modeller svarar 422.

Kalibrering

Sannolikheterna läses direkt ur modellens nästa-token-fördelning och skalas med en temperatur per modell som anpassats på publika testdata. På ett separat testset (Kevs transfer-v4, 764 frågor) är kalibreringsfelet (ECE) lågt för alla tre modellerna. När modellen säger 80 % har den alltså rätt ungefär 80 % av gångerna.

ModellECE, transfer-v4 (764)Träffsäkerhet, JevBench (231)Träffsäkerhet, svenska (50)
gemma4:31b0,0380,8661,000
qwen3.6:35b-a3b0,0320,8270,960
qwen3.5:9b0,0340,8010,940

Lätta frågor får något för låg konfidens. Temperaturen är anpassad på en blandning av lätta och svåra frågor. På frågor som modellen alltid klarar, särskilt med många alternativ, blir sannolikheten därför lite för försiktig: gemma4:31b har rätt på alla 50 frågor i vårt svenska testset men säger i snitt 89 % (JevBench easy: alla rätt, i snitt 94 %). Felet går åt det säkra hållet, men en tröskel som 0,95 släpper igenom färre beslut än nödvändigt. Sätt trösklar utifrån egna exempel.

Vi har också provat en temperatur per frågetyp och en korrigering för etikettbias ("contextual calibration"). Ingen av dem gav bättre kalibrering på testseten, så de används inte. Kalibreringen är gemensam för alla kunder och kontrolleras varje månad samt efter varje byte av modellversion. Mät gärna mot egna exempel innan du automatiserar beslut som kostar mycket när de blir fel.

Kostnad och gränser

  • Debiteras mot samma tokenkvot som chat. State räknas en gång per anrop, oavsett hur många frågor du ställer. Output debiteras inte.
  • Högst 20 alternativ per fråga och 32 frågor per anrop.
  • Anropet tar en plats i samma kö som dina chat-anrop.

Ställ flera frågor på samma state

Frågorna körs parallellt och delar den inlästa staten, så tre frågor i ett anrop är både snabbare och billigare än tre separata anrop.

Fel

StatusOrsak
400Ogiltig JSON, eller staten ryms inte i modellens kontextfönster
401Saknad eller ogiltig API-nyckel
422Ogiltig fråga (okänd typ, för många alternativ, saknat state) eller modell som inte stöds
429Kvoten är slut eller kön är full (se Retry-After)
502 / 503Tillfälligt fel i modellbackenden, försök igen med backoff