Skip to main content

OpenThai-SystemOne — an open Thai and English System One model you can run on a laptop

· 7 min read
Kobkrit Viriyayudhakorn
CEO @ iApp Technology

OpenThai-SystemOne, an open Thai and English System One decision model, released 20 September 2026

Tonight we are releasing OpenThai-SystemOne, an open-source Thai and English System One decision model: 0.8B parameters, Apache 2.0, weights and training recipe on Hugging Face and GitHub, and a free hosted API on api.iapp.co.th.

It does not write. It decides. Send it a state and typed questions; it returns a calibrated probability for every option of every question in one forward pass, with zero output tokens.

Model page: iapp.co.th/openmodels/openthai-systemone · Weights: huggingface.co/iapp/OpenThai-SystemOne · Code: github.com/iapp-technology/openthai-systemone · Try it: API playground

Why a model that does not generate text​

Thai businesses route support tickets, moderate comments, pick the next button for an agent to press and check whether an answer is grounded, millions of times a day. Each of those is a decision among options you already know. Calling a large language model for each one is slow, costs tokens, and can answer with something that was never on the list.

A System One model answers the structured question directly. TypeSafe AI introduced the category with Jev on 15 September 2026. Five days later, here is an open one for Thai and English, with the part TypeSafe kept closed, the architecture, in the open.

What it does​

You give it a state (any text or JSON) and one or more questions of three types:

TypeYou giveYou get
choiceinstructions and up to 255 named optionsbest option, a probability per option, confidence, abstain
scoreinstructions and 2 to 10 ordered levelsa probability-weighted score and per-level probabilities
noula yes/no questionP(yes)

All questions are answered in the same forward pass. Here is a Thai support ticket with three questions, and the model's measured output:

{"state": {"ticket": "โดนหักเงินซ้ำสองครั้งเมื่อวานนี้ ขอเงินคืนด่วนนะครับ โทรไปสามรอบแล้วไม่มีใครรับ"},
"questions": {
"department": {"type": "choice", "instructions": "ทีมใดควรรับผิดชอบ",
"criteria": {"billing": "การเงิน/คืนเงิน", "technical": "ระบบใช้งานไม่ได้", "sales": null}},
"frustration": {"type": "score", "instructions": "ลูกค้าหงุดหงิดแค่ไหน",
"criteria": ["ใจเย็น", "หงุดหงิดแต่สุภาพ", "โกรธมาก"]},
"refund": {"type": "noul", "instructions": "ลูกค้าขอเงินคืนอย่างชัดเจนหรือไม่"}}}
QuestionAnswerConfidence
departmentbilling (96.3%), technical 1.1%, sales 2.6%0.83
frustration1.95 of 2 (very angry 95.7%)0.82
refundP(yes) = 0.946

166 input tokens, 0 output tokens, 0.23 s round trip through our gateway.

How it works​

We took the text tower of Qwen3.5-0.8B, continued pretraining on about 5B Thai tokens, and replaced the 248K-token language-model head with a 256-way decision head. Options are introduced by control tokens. Every answer position is projected onto 256 logits; slots beyond the number of options are masked, and slot 255 means "none of the above". choice takes the argmax, score is the probability-weighted level index, noul is the probability of yes. Option order is shuffled during training, so there is no position bias. The model was trained on public classification, NLI, QA and agent datasets plus synthetic Thai and English decision tasks, then calibrated.

The result runs on a laptop GPU: 154 ms per request on a MacBook M3 Max, 40 to 70 ms on an H100.

Limits, so nobody has to find them for us​

  • This is version 0.1 and a 0.8B model. It is not a reasoning model.
  • It cannot emit an option you did not offer, but it can still choose the wrong one. Every answer carries a confidence; route the low ones to a larger model or a person.
  • Text only.
  • At most 255 options per choice, 2 to 10 levels per score, 64K tokens per request.

The numbers​

Updated 22 September 2026: v0.3

Two updates since launch. v0.2 (21 September) added a 22k-record synthetic Thai sentiment set: macro 61.9 to 63.2, Wisesight 38.7 to 51.5. v0.3 (22 September) continued for 5,000 steps with real train splits and five targeted synthetic sets for the weak spots: macro 63.2 to 74.3, within 0.5 of Bespoke-Nimble-9B (74.8), SQuAD2 50.2 to 89.3, PAWS 68.0 to 94.0, Aegis2 61.6 to 83.2, with one regression (SummEval consistency 84.0 to 75.0). An order-invariant mode removes the sensitivity to option order that single-pass models share with Jev. The hosted API and the weights on Hugging Face are v0.3; the tables below are updated to it.

On Bespoke Labs' public 13-subset System One benchmark, same subsets, splits, instructions and sampler as their published comparison, the 0.8B model scores 74.3 macro average (v0.3). Bespoke-Nimble-9B scores 74.8 and Jev 1.13.0 scores 76.0. Bold marks where the 0.8B model is ahead of the 9B.

SubsetTypenOpenThai-SystemOne 0.8BNimble-9BJev 1.13.0
aegis2noul25083.281.280.4
boolqnoul30079.786.089.7
civil_commentsnoul30079.070.381.0
helpsteer2score25041.639.034.1
massive-de-DEchoice35088.383.486.9
massive-en-USchoice35088.386.987.4
multinlichoice29989.085.382.9
pawsnoul25094.082.889.2
pubmedqachoice25064.075.677.2
squad2noul29989.380.682.9
summeval-consistencyscore14475.075.781.2
summeval-relevancescore24021.749.235.0
vitaminc-devchoice59972.576.680.1
Macro average74.374.876.0

We would rather you read the per-subset row than the average. v0.3 is ahead of the 9B on 8 of 13 subsets (paraphrase, safety, NLI, both MASSIVE intent sets, toxicity, helpfulness scoring, extractive yes/no) and behind on PubMedQA, VitaminC and the two summary-rating tasks, where relevance scoring stays the weakest. Since v0.3 the train splits of SQuAD2, BoolQ, PubMedQA, PAWS, Aegis2 and MASSIVE-de are in the training mix; the benchmark uses only their validation and test splits. On Thai held-out sets that were never in training it scores 90.0 on 60-way MASSIVE-th intents, 98.1 on Prachathai topics, 77.1 on XNLI-th and 77.9 on SIB-200 Thai, with calibration error at or below 0.05 on most of them, and its two weakest sets are Wisesight sentiment (51.6) and 77-way banking77 intents (45.4). Every table, with ECE and Brier score per dataset and the before/after calibration comparison, is in the model card.

Get started​

Hosted, free preview. The endpoint POST https://api.iapp.co.th/v3/store/openthai/systemone is free with any iApp API key (registration is free), capped at 1,000 decisions per day per key. Per-decision pricing will be published in October 2026. The API page has a playground with four presets, code in cURL, Python and JavaScript, and the full request and response reference. The request shape mirrors POST /v1/systemone, so code written for that API works unchanged.

Local.

pip install "git+https://github.com/iapp-technology/openthai-systemone"
OPENTHAI_SYSTEMONE_MODEL=iapp/OpenThai-SystemOne uvicorn openthai_systemone.server:app --port 8000

Everything is open under Apache 2.0: weights, training scripts, configs and the synthetic data. We would like help with GGUF and MLX conversions (the head is a plain linear layer) and with Thai and English evaluation sets we missed. Issues and pull requests on GitHub are welcome.

OpenThai-SystemOne joins OpenThai 2.0 and OpenThai 2.0 Legal in the OpenThai 2.0 family.

Thank you, Siam AI​

Siam AI Corporation

Training, evaluation and the free hosted API run on NVIDIA H100 GPUs generously provided by Siam AI Corporation. Thank you for backing open Thai AI.