A Thai Jev is here! An open-source model by the OpenThai team, named OpenThai-SystemOne

A Thai Jev is here! An open-source model by the OpenThai team, named OpenThai-SystemOne.
Five days after TypeSafe launched Jev (a "System One model" that generates no text but answers decisions with probabilities in one pass), the OpenThai team has released an open-source version for Thai + English.
- 0.8B parameters, runs on a laptop
- Qwen3.5-0.8B base, continued-pretrained on ~5B Thai tokens, with the 248k-word LM head replaced by a "256-slot decision head"
- Feed it a state (text/JSON) + choice / score / yes-no questions → every question answered with confidence in one forward pass
- On the same 13-subset public benchmark as Bespoke-Nimble-9B: ours 61.9 / Nimble-9B 74.8 / Jev 76.0 / raw Qwen3.5-0.8B 45.4 (ahead of the 9B on 4 of 13 subsets). Thai tasks: intent 86.4%, news topic 97.7%, XNLI-th 76.5%
- Use it for: Text Classification, Sentiment Analysis, Agentic Computer Use (picking the action for an AI agent)
- Apache-2.0, all of it open: weights, training scripts, configs and synthetic data
Download and docs: huggingface.co/iapp/OpenThai-SystemOne Try it in your browser: iapp.co.th/docs/llm/openthai-systemone Code: github.com/iapp-technology/openthai-systemone Full details: the OpenThai-SystemOne model page
A real answer
A Thai ticket reading "charged twice, refund urgently please", asked which team should own it and whether the customer wants a refund. Both answered in one forward pass, zero output tokens.
{"answers": {"department": {"choice": "billing", "probabilities": {"billing": 0.972, "technical": 0.009, "sales": 0.018}, "confidence": 0.87},
"refund": {"noul": 0.954}}, "usage": {"input_tokens": 91, "output_tokens": 0}}
Businesses make decisions like this millions of times a day. An LLM call each time is too slow and too expensive. System One models are the right shape for that work, and none existed for Thai.
How it works
- The base is the text tower of Qwen3.5-0.8B (vision encoder dropped), continued-pretrained on ~5B Thai tokens.
- The 248k-token LM head is replaced by a 256-way decision head. Each option is introduced by a control token
<|ts_opt_i|>; the hidden state at<|ts_answer|>is projected to 256 logits, slots beyond the option count are masked, then softmax. Slot 255 is abstain. - Option order is shuffled in training, so there is no position bias. This is an architecture, not a trick of reading logprobs over letters.
- A calibration stage (Brier loss + per-type temperature) makes a high
confidencemean high accuracy.
Numbers
On Bespoke Labs' 13-subset public benchmark (the same one used to compare against Jev), macro average:
| Model | Size | Average |
|---|---|---|
| OpenThai-SystemOne | 0.8B | 61.9 |
| Bespoke-Nimble-9B | 9B | 74.8 |
| Jev (TypeSafe AI, closed) | – | 76.0 |
| Raw Qwen3.5-0.8B | 0.8B | 45.4 |
The 0.8B model is ahead of Nimble-9B on 4 of 13 subsets (MultiNLI, SummEval-consistency, HelpSteer2, Civil Comments) and clearly behind on English reading-comprehension style yes/no tasks.
Thai held-out sets (full eval sets): Prachathai 97.7, MASSIVE-th 86.4, XNLI-th 76.5 (yes/no 84.3), SIB-200 Thai 77.5, Wongnai 63.3 exact (MAE 0.44), xLAM tool selection 99.4, and Wisesight 38.7, a known weak spot being fixed in v0.2. ECE on the Thai sets is 0.05 or below, so the confidence field can be trusted there.
Latency: a 3-question request takes about 40 ms on an H100 and 154 ms on a MacBook M3 Max.
Limits, stated up front
This is v0.1. A 0.8B model is not a reasoner. It cannot emit an invalid option, but it can pick the wrong one, so use the confidence field and route low-confidence cases to a bigger model or a human. Text only, up to 255 options per question, and pure CPU is still slow, so use a GPU or Apple MPS.
Try it
pip install "git+https://github.com/iapp-technology/openthai-systemone"
from openthai_systemone import SystemOneClient, Choice, Noul
c = SystemOneClient("iapp/OpenThai-SystemOne")
r = c.system_one("โดนหักเงินซ้ำสองครั้ง ขอเงินคืนด่วน",
{"dept": Choice(instructions="ทีมใดควรรับผิดชอบ", criteria={"billing": None, "technical": None}),
"refund": Noul(instructions="ลูกค้าขอเงินคืนหรือไม่")})
print(r.answers["dept"].probabilities, r.answers["refund"].noul)
The contract mirrors TypeSafe's POST /v1/systemone, so existing SDK code can point at this model unchanged.
- Model and model card: huggingface.co/iapp/OpenThai-SystemOne
- Try it in your browser: iapp.co.th/docs/llm/openthai-systemone
- Code and the full training recipe: github.com/iapp-technology/openthai-systemone
- Full details, the recipe and how to contribute: the OpenThai-SystemOne model page
Tell us what you find on Discord or in the Facebook group. We would love more Thai test sets, especially tasks with many options and UI/agent tasks.
