Skip to main content

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

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

OpenThai-SystemOne architecture

  • 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 confidence mean high accuracy.

Numbers

On Bespoke Labs' 13-subset public benchmark (the same one used to compare against Jev), macro average:

ModelSizeAverage
OpenThai-SystemOne0.8B61.9
Bespoke-Nimble-9B9B74.8
Jev (TypeSafe AI, closed)76.0
Raw Qwen3.5-0.8B0.8B45.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.

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.