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

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