System One (typade beslut)
Senast uppdaterad:
POST https://api.staik.se/v1/systemoneFö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.
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
| Typ | criteria | Svar |
|---|---|---|
choice | Objekt {namn: beskrivning}, 2–20 alternativ | choice (valt namn), probabilities per namn, confidence |
noul | Valfritt {"true": ..., "false": ...} | noul = sannolikheten för ja (0–1) |
score | Lista med ordnade nivåer, 2–20 st | score = 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
{
"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
model | Styrka |
|---|---|
gemma4:31b (standard) | Högst träffsäkerhet och snabbast när flera frågor ställs på samma state |
qwen3.6:35b-a3b | Bä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:9b | Minst, 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) 0,03–0,04 för alla tre modellerna. När modellen säger 80 % har den alltså rätt ungefär 80 % av gångerna. Kalibreringen är gemensam för alla kunder. 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
| Status | Orsak |
|---|---|
400 | Ogiltig JSON, eller staten ryms inte i modellens kontextfönster |
401 | Saknad eller ogiltig API-nyckel |
422 | Ogiltig fråga (okänd typ, för många alternativ, saknat state) eller modell som inte stöds |
429 | Kvoten är slut eller kön är full (se Retry-After) |
502 / 503 | Tillfälligt fel i modellbackenden, försök igen med backoff |