OpenThai-SystemOne
An open Thai and English System One model you can run on a laptop. It does not write; it decides.
iapp/OpenThai-SystemOne · 0.8B parameters · Apache 2.0
Give it a state (any text or JSON: a support ticket, a comment, a document, a UI accessibility tree) and one or more typed questions. It returns a calibrated probability for every option of every question in one forward pass, with zero output tokens. Three question types: choice (up to 255 named options), score (2 to 10 ordered levels) and noul (yes or no).
Built by iApp Technology with the OpenThai community. Base model: the text tower of Qwen3.5-0.8B (Apache 2.0), continued-pretrained on about 5B Thai tokens. Training data, scripts and configs are published with the weights.
What a System One model is
A language model answers by generating text, one token at a time, and can say anything, including an option you never offered. A System One model answers a structured question directly: the language-model head is replaced by a 256-way decision head, every answer position is projected onto the options you gave, and a softmax gives the distribution. It cannot emit an invalid option. It can still be wrong, which is why every answer carries a confidence you can route on.
The category was introduced by TypeSafe AI with Jev on 15 September 2026. OpenThai-SystemOne is an open re-implementation for Thai and English, released five days later, with the architecture, the recipe and the data in the open. The HTTP contract mirrors POST /v1/systemone, so SDK code written for that API points at this model unchanged.
One request, three decisions
A Thai support ticket, three questions, one call. Measured output from the released checkpoint:
| Question | Type | Answer | Confidence |
|---|---|---|---|
| Which team should handle this? | choice (billing, technical, sales) | billing, 96.3% | 0.83 |
| How frustrated is the customer? | score (calm, annoyed but polite, very angry) | 1.95 of 2 | 0.82 |
| Is a refund explicitly requested? | noul | P(yes) = 0.946 |
166 input tokens, 0 output tokens, 0.23 s round trip through the gateway. The full request and response are on the API page.
Use cases
- Route support tickets to the right team and score urgency at the same time.
- Moderate comments: toxicity as a yes or no, sentiment as a choice.
- Judge whether an LLM answer is grounded in the retrieved passage.
- Choose which UI element an agent should act on next, and how, from an accessibility tree.
- Classify documents and fields with up to 255 categories in one question.
- Score reviews on an ordered scale and get a fractional average, not just a label.
Each of these is one request in tens of milliseconds on a server GPU. Thai businesses make these decisions millions of times a day and cannot afford a full LLM call for each one.
Performance
| Setting | Measured |
|---|---|
| Server GPU (H100), batch 1, 3 questions | 40 to 70 ms |
| Laptop GPU (MacBook M3 Max, MPS) | 154 ms |
| Gateway round trip, the ticket example above | 0.23 s |
| Output tokens | 0 |
Benchmarks
61.9 macro average on Bespoke Labs' public 13-subset System One benchmark, against 74.8 for Bespoke-Nimble-9B, 76.0 for Jev 1.13.0 and 45.4 for the raw Qwen3.5-0.8B base. Same subsets, splits, instructions and sampler as Bespoke's published benchmark; their numbers as published on 18 Sep 2026, ours from the released evaluation script. Bold marks where the 0.8B model is ahead of the 9B.
| Subset | Type | n | OpenThai-SystemOne 0.8B | Nimble-9B | Jev 1.13.0 |
|---|---|---|---|---|---|
| aegis2 | noul | 250 | 58.0 | 81.2 | 80.4 |
| boolq | noul | 300 | 63.7 | 86.0 | 89.7 |
| civil_comments | noul | 300 | 78.0 | 70.3 | 81.0 |
| helpsteer2 | score | 250 | 42.8 | 39.0 | 34.1 |
| massive-de-DE | choice | 350 | 64.6 | 83.4 | 86.9 |
| massive-en-US | choice | 350 | 75.7 | 86.9 | 87.4 |
| multinli | choice | 299 | 85.6 | 85.3 | 82.9 |
| paws | noul | 250 | 67.2 | 82.8 | 89.2 |
| pubmedqa | choice | 250 | 53.6 | 75.6 | 77.2 |
| squad2 | noul | 299 | 50.2 | 80.6 | 82.9 |
| summeval-consistency | score | 144 | 84.0 | 75.7 | 81.2 |
| summeval-relevance | score | 240 | 13.8 | 49.2 | 35.0 |
| vitaminc-dev | choice | 599 | 67.1 | 76.6 | 80.1 |
| Macro average | 61.9 | 74.8 | 76.0 |
Honest reading: ahead of the 9B on 4 of 13 subsets (NLI, summary consistency, helpfulness scoring, toxicity), clearly behind on reading-comprehension yes/no tasks (squad2 at chance, boolq, pubmedqa) and on summary relevance scoring, where the score head is miscalibrated (ECE 0.79).
Thai held-out sets, never used in training (ECE = expected calibration error, lower is better):
| Set | Type | n | Accuracy | ECE |
|---|---|---|---|---|
| MASSIVE-th intent (60-way) | choice | 5,007 | 86.4 | 0.048 |
| Prachathai67k topics | choice | 3,501 | 97.7 | 0.005 |
| XNLI-th | choice | 2,490 | 76.5 | 0.028 |
| SIB-200 Thai topic (7-way), whole dataset held out | choice | 204 | 77.5 | 0.074 |
| Wongnai review stars (1 to 5) | score | 6,203 | 63.3 | 0.010 |
| xLAM tool selection (English) | choice | 884 | 99.4 | 0.007 |
| Wisesight sentiment (4-class), whole dataset held out | choice | 2,671 | 38.7 | 0.341 |
| banking77 intent (77-way, English), whole dataset held out | choice | 3,076 | 32.7 | 0.165 |
After calibration, confidence is reliable on the Thai sets and on NLI and topic tasks (ECE at or below 0.05). English calibration is weaker (median ECE 0.15 on the public bench) because the training mix is Thai-heavy by design. Batch-1 latency for one question with 255 options on a shared H100: 44 ms. Full tables, Brier scores and the before/after calibration comparison are in the model card.
Free hosted API
The endpoint on api.iapp.co.th is free during the preview with any iApp API key (registration free), capped at 1,000 decisions per day per key. Per-decision pricing will be published in October 2026.
| Endpoint | POST https://api.iapp.co.th/v3/store/openthai/systemone |
| Auth | apikey header |
| Body | {"state": ..., "questions": {...}} |
| Docs and playground | /docs/llm/openthai-systemone |
Run it yourself
pip install "git+https://github.com/iapp-technology/openthai-systemone"
OPENTHAI_SYSTEMONE_MODEL=iapp/OpenThai-SystemOne uvicorn openthai_systemone.server:app --port 8000
Then POST http://localhost:8000/v1/systemone with the same body as the hosted API.
Architecture
Text tower of Qwen3.5-0.8B (vision encoder dropped), continued-pretrained on about 5B Thai tokens. The 248K-token language-model head is replaced by a linear 1024 to 256 slot head. Options are introduced by control tokens; each answer position is read out into 256 logits, slots beyond the option count are masked, and slot 255 is "none of the above" (abstain). choice takes the argmax, score is the probability-weighted level index, noul is P(yes). Option order is shuffled in training, so there is no position bias. Trained on public classification, NLI, QA and agent datasets plus synthetic Thai and English decision tasks, then calibrated.
Limits, stated up front
- Version 0.1. A 0.8B model, not a reasoning model.
- It cannot emit an invalid option, but it can still choose wrongly. Route low-
confidenceanswers to a larger model or a person. - Text only.
- At most 255 options per
choice, 2 to 10 levels perscore, 64K tokens per request. - Known weak spots in v0.1: 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 adds a synthetic Thai sentiment set and a second training round and targets the first of these.
- "System One" is the category term; this is not a TypeSafe AI product.
Sponsor
Training, evaluation and the free hosted API for this model run on NVIDIA H100 GPUs generously provided by Siam AI Corporation. Thank you for backing open Thai AI.
Links
- Weights and model card: huggingface.co/iapp/OpenThai-SystemOne
- Code, training recipe and server: github.com/iapp-technology/openthai-systemone
- API documentation and playground: /docs/llm/openthai-systemone
- The rest of the family: OpenThai 2.0, OpenThai 2.0 Legal