Skip to main content

OpenThai-SystemOne NEW

FREE preview
Now: 0 IC with any iApp API key (registration free), 1,000 decisions per day per keyLater: per-decision pricing published in October 2026

OpenThai-SystemOne is an open-source (Apache 2.0) Thai and English System One decision model from iApp Technology and OpenThai. It does not generate text. You send a state (any text or JSON: a support ticket, a comment, a document, a UI accessibility tree) plus one or more typed questions, and it returns a calibrated probability for every option of every question in one forward pass. The HTTP contract mirrors the POST /v1/systemone shape used by TypeSafe AI's Jev, so SDK code written for that API can point at this endpoint unchanged.

Question typeYou giveYou get
choiceinstructions and up to 255 named options (optional descriptions)best option, a probability per option, confidence, abstain
scoreinstructions and 2 to 10 ordered levelsa probability-weighted score (can be fractional) and per-level probabilities
noula yes/no questionnoul = P(yes)

Getting Started

  1. Prerequisites

    • A free iApp API key: register, then API Keys, then Create New API Key
    • A state to decide about, and the questions you want answered
  2. Endpoint

    EndpointPOST https://api.iapp.co.th/v3/store/openthai/systemone
    Authapikey: <key> header
    BodyJSON: state (string or any JSON) and questions (map of typed questions)
    Limits100 requests per minute and 1,000 decisions per day per key during the free preview; 255 options per choice, 2 to 10 levels per score, 64K tokens per request
    OutputJSON with one answer per question, usage.output_tokens is always 0
How to get API Key?

Please visit API Key Management page to view your existing API key or request a new one.

Try Demo

Four presets: Thai ticket triage, Thai comment moderation, choosing a UI element for an agent, and an English RAG relevance judge. Edit the state or the questions, then press Ask. Sign in and your API key is filled in automatically.

OpenThai-SystemOne playground
One request, every question answered with a probability. No text is generated.
Free preview
Types: choice (up to 255 options), score (2 to 10 ordered levels), noul (yes/no).
Version 0.1. A 0.8B model cannot emit an option you did not offer, but it can still choose wrongly. Route low-confidence answers to a larger model or a person.

Code Examples

The same request in every language: a Thai support ticket, three questions, one call.

curl -s https://api.iapp.co.th/v3/store/openthai/systemone \
-H "apikey: YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"state": {"ticket": "โดนหักเงินซ้ำสองครั้งเมื่อวานนี้ ขอเงินคืนด่วนนะครับ โทรไปสามรอบแล้วไม่มีใครรับ"},
"questions": {
"department": {"type": "choice", "instructions": "ทีมใดควรรับผิดชอบ",
"criteria": {"billing": "การเงิน/คืนเงิน", "technical": "ระบบใช้งานไม่ได้", "sales": null}},
"frustration": {"type": "score", "instructions": "ลูกค้าหงุดหงิดแค่ไหน",
"criteria": ["ใจเย็น", "หงุดหงิดแต่สุภาพ", "โกรธมาก"]},
"refund": {"type": "noul", "instructions": "ลูกค้าขอเงินคืนอย่างชัดเจนหรือไม่"}
}
}'

Response

Measured output of the request above (166 input tokens, 0 output tokens, one forward pass):

{
"model": "openthai-systemone",
"answers": {
"department": {"type": "choice", "choice": "billing",
"probabilities": {"billing": 0.963, "technical": 0.011, "sales": 0.026},
"confidence": 0.83, "abstain": 0.085},
"frustration": {"type": "score", "score": 1.95,
"legend": {"0": "ใจเย็น", "1": "หงุดหงิดแต่สุภาพ", "2": "โกรธมาก"},
"probabilities": {"0": 0.012, "1": 0.031, "2": 0.957}, "confidence": 0.82},
"refund": {"type": "noul", "noul": 0.946}
},
"usage": {"input_tokens": 166, "output_tokens": 0}
}

Reading the answers

  • choice: choice is the best option, probabilities sum to 1 over the options you offered, confidence is 1 minus the normalised entropy, and abstain is the probability that none of the offered options fits (an iApp extension).
  • score: score is the probability-weighted level index (fractional), probabilities is per level, legend maps index to label.
  • noul: noul is P(yes).
  • Route low-confidence answers to a larger model or a person. The model cannot emit an option you did not offer, but it can still be wrong.

Use Cases

Ticket routing, comment moderation, checking whether an LLM answer is grounded, choosing which UI element an agent should act on, document and field classification, review scoring. Each is one request that answers every question at once, in tens of milliseconds on a server GPU.

Performance

SettingMeasured
Gateway round trip, 3-question Thai ticket (this page's example, 20 Sep 2026)0.23 s
Server GPU (H100), batch 1, 3 questions40 to 70 ms
Laptop GPU (MacBook M3 Max, MPS)154 ms
Output tokens0, every request

Benchmarks

Zero-shot on Bespoke Labs' public 13-subset System One benchmark, same subsets, splits, instructions and sampler. Nimble-9B and Jev figures are as published by Bespoke Labs on 18 Sep 2026; ours are measured with the released evaluation script. choice and noul report accuracy, score reports exact-level match. Bold marks where the 0.8B model is ahead of the 9B.

SubsetTypenOpenThai-SystemOne 0.8BNimble-9BJev 1.13.0
aegis2noul25058.081.280.4
boolqnoul30063.786.089.7
civil_commentsnoul30078.070.381.0
helpsteer2score25042.839.034.1
massive-de-DEchoice35064.683.486.9
massive-en-USchoice35075.786.987.4
multinlichoice29985.685.382.9
pawsnoul25067.282.889.2
pubmedqachoice25053.675.677.2
squad2noul29950.280.682.9
summeval-consistencyscore14484.075.781.2
summeval-relevancescore24013.849.235.0
vitaminc-devchoice59967.176.680.1
Macro average61.974.876.0

Raw Qwen3.5-0.8B prompted with letter log-probs scores 45.4 on the same benchmark. Honest reading: the 0.8B model is ahead of the 9B on 4 of 13 subsets (NLI, summary consistency, helpfulness scoring, toxicity) and clearly behind on reading-comprehension yes/no tasks (squad2 at chance, boolq, pubmedqa) and on summary relevance scoring, where its score head is miscalibrated (ECE 0.79).

Thai held-out sets, never used in training. ECE is the expected calibration error, lower is better:

SetTypenAccuracyECE
MASSIVE-th intent (60-way)choice5,00786.40.048
Prachathai67k topicschoice3,50197.70.005
XNLI-thchoice2,49076.50.028
SIB-200 Thai topic (7-way), whole dataset held outchoice20477.50.074
Wongnai review stars (1 to 5)score6,20363.30.010
xLAM tool selection (English)choice88499.40.007
Wisesight sentiment (4-class), whole dataset held outchoice2,67138.70.341
banking77 intent (77-way, English), whole dataset held outchoice3,07632.70.165

Confidence is reliable on the Thai sets and on NLI and topic tasks (ECE at or below 0.05 after calibration). On the English public benchmark the median ECE is 0.15, so route low-confidence English yes/no decisions to a larger model. Full tables, Brier scores and the before/after calibration comparison are in the model card.

Limits

  • Version 0.1. A 0.8B model, not a reasoning model.
  • Answers only the options you offer, and can still be wrong. Use confidence to route uncertain cases.
  • Known weak spots in v0.1, numbers above: Thai social-media sentiment (Wisesight 38.7), fine-grained 77-way English intents (banking77 32.7), extractive-QA style yes/no (squad2 at chance) and summary relevance scoring. v0.2 targets the first.
  • Text only. No images.
  • At most 255 options per choice, 2 to 10 levels per score, 64K tokens per request.

Run it locally

The weights are open. Three lines get you the same answers on your own machine:

pip install "git+https://github.com/iapp-technology/openthai-systemone"
OPENTHAI_SYSTEMONE_MODEL=iapp/OpenThai-SystemOne uvicorn openthai_systemone.server:app --port 8000
curl -s http://localhost:8000/v1/systemone -H "Content-Type: application/json" -d '{"state": "...", "questions": {...}}'

Technical Reference

Request

POST https://api.iapp.co.th/v3/store/openthai/systemone, header apikey, body application/json:

FieldTypeDescription
statestring or JSONWhat the decision is about. Any JSON is accepted and serialised for the model.
questionsobjectA map of question name to question. Every question is answered in the same forward pass.
questions.<name>.typechoice, score or noulQuestion type.
questions.<name>.instructionsstringWhat to decide, in Thai or English.
questions.<name>.criteriaobject or arraychoice: object of option name to optional description (null for none), up to 255. score: array of 2 to 10 level labels in order. Not used by noul.

Response

FieldDescription
modelModel identifier.
answers.<name>One object per question, type matching the request. See Reading the answers.
usage.input_tokensPrompt tokens consumed.
usage.output_tokensAlways 0.

Errors

StatusMeaning
401Missing or invalid apikey.
422Malformed request, for example a score with fewer than 2 levels or a choice with more than 255 options.
429Rate limit: 100 requests per minute or 1,000 decisions per day per key during the free preview.

Architecture

The model is the text tower of Qwen3.5-0.8B, continued-pretrained on about 5B Thai tokens, with the language-model head replaced by a 256-way slot head. Options are introduced by control tokens; every answer position is projected to 256 logits, slots beyond the option count are masked, and a softmax gives the distribution. Slot 255 is "none of the above". Option order is shuffled in training, so there is no position bias.

Changelog

DateVersionChange
20 Sep 2026v0.1-20260920Public launch. Hosted API on api.iapp.co.th, free preview capped at 1,000 decisions per day per key. Open weights and training recipe released under Apache 2.0.