Pusula Nano
The fast, CPU-friendly member of the Pusula family. Pusula Nano is a 149M-parameter TabiBERT cross-encoder. The same typed questions as Pusula (request routing, urgency, human handoff, prompt injection, or custom questions) are answered with a probability for every option. The model runs on a CPU or any GPU.
| Version | v2.0 (31 October 2026); earlier weights remain available as revisions v1.0 and v1.0-onizleme |
| Base model | boun-tabilab/TabiBERT (Apache-2.0) |
| This repository | Encoder + option scorer, 149M parameters, ~0.6 GB |
| Language | Turkish |
| Training data | Specially curated Turkish data: synthetic messages generated for this project and human-written customer messages licensed from a commercial partner |
| Interface | Same request and answer format as d3's /v1/systemone |
Results
Accuracy (%). Evaluation labels were assigned blind and independently by two annotators (Claude Opus 5.5 and Claude Sonnet 5.5) with adjudication, under the published labeling policy; the real customer messages were labeled blind by Claude under the same policy. Evaluation labels are used exclusively for evaluation. In v2.0, the evaluation sets were extended to the 20 templates; the 1.0 models and Decision 3.0 were therefore evaluated again on the same sets, and their scores differ from those published with v1.0.
| Evaluation | Questions | Pusula Nano 1.0 | Pusula Nano 2.0 | Pusula 2.0 |
|---|---|---|---|---|
| Real customer messages (500 held-out, licensed) | 7,500 | 64.0 | 89.9 | 90.6 |
| Long customer complaints (500 held-out, licensed) | 4,500 | 84.6 | 84.6 | 88.3 |
| Turkish Decision Benchmark (2,194 messages) | 19,861 | 82.7 | 83.2 | 92.0 |
| Gold test set (757 held-out messages) | 11,355 | 62.8 | 91.3 | 92.1 |
| Custom questions in unseen sectors | 400 | 50.5 | 55.5 | 93.5 |
Missing information (eksik_bilgi) |
99 | 58.6 | 53.5 | 98.0 |
Sales opportunity (satis_firsati) |
100 | 51.0 | 95.0 | 97.0 |
Life and safety (can_guvenligi) |
120 | 81.7 | 89.2 | 100.0 |
Insults and hate speech (hakaret) |
114 | 43.9 | 71.0 | 95.6 |
Fraud (dolandiricilik) |
97 | 51.5 | 69.1 | 100.0 |
Source grounding of agent answers (kaynaga_dayanma) |
100 | 30.0 | 38.0 | 98.0 |
| AI agent questions (templates 17-20) | 300 | 51.2 | 68.2 | 97.8 |
| Personal data in e-mails | 150 | 71.3 | 93.3 | 100.0 |
| Hidden instructions in documents | 400 | 73.8 | 78.2 | 100.0 |
| Long documents (about 12,000 characters) | 120 | 46.7 | 50.8 | 100.0 |
| MASSIVE tr-TR, 60-way intent, zero-shot (human-written) | 2,974 | 36.4 | 32.7 | 85.2 |
| OffensEval 2020 Turkish, offensive language (real tweets) | 3,528 | 30.6 | 81.8 | 88.3 |
Pusula Nano 2.0 scores above Nano 1.0 on 14 of the 17 evaluations, equal on long customer complaints and below it on missing information 53.5 (Nano 1.0: 58.6) and MASSIVE 32.7 (Nano 1.0: 36.4). Nano 1.0 was trained before the 20 templates were introduced, which explains its lower scores on the sets that contain them.
Intended use: high-volume, low-latency processing of the built-in Turkish questions (routing over 20 domains and the 20 templates, such as urgency, human handoff, action required, security risk and personal data) on a CPU or a small GPU. For other tasks, Pusula is recommended.
Usage
pip install "pusula[serve] @ git+https://github.com/hsnsahinhsn/pusula"
hf download hsnsahinhsn/pusula-nano --local-dir pusula-nano
from pusula.inference import DecisionEngine
engine = DecisionEngine.load("pusula-nano") # device="cpu" or "cuda"
route = engine.route("Faturama iki kez ücret yansımış, iade istiyorum.")
HTTP server: PUSULA_MODEL_DIR=pusula-nano pusula-serve --port 8080 (see the
Pusula repository).
The model can be tried on Google Colab without installation:
Training
- Data: the 35,635 synthetic Turkish training messages of Pusula 2.0 (19,399 new messages written by Gemma-4-31B-it across NACE Rev. 2.1 sectors and ESCO occupations, and 16,236 earlier synthetic messages), labeled by Qwen3.8-27B under the written labeling policy; 7,419 real messages licensed from a commercial partner and anonymized prior to use (customer messages and long customer complaints), labeled by Qwen3.8-27B under the same policy. The 201 messages labeled as missing information were repeated eight times for this question only. Messages of the evaluation sets are excluded from training.
- Method: TabiBERT was fine-tuned for two epochs as a cross-encoder that scores each (message, question, option) pair; the temperatures of the three question types were then fitted on a held-out validation set.
Limitations
- Accuracy on tasks that differ from the training questions is limited (MASSIVE 60-way intent 32.7; Pusula: 85.2); Pusula is recommended for such tasks.
- Most of the training data is synthetic; evaluation on application-specific data is recommended before deployment.
Contributors and citation
Pusula is developed by the following contributors:
| Name | Role | GitHub | Hugging Face |
|---|---|---|---|
| Hasan Şahin | Project lead | hsnsahinhsn | hsnsahinhsn |
| Ahmet Sayman | Contributor | asayman | asaymantr |
Source code: github.com/hsnsahinhsn/pusula.
@software{pusula2026,
title = {Pusula: The First Full-Featured Turkish Decision Model},
author = {Şahin, Hasan and Sayman, Ahmet},
year = {2026},
version = {2.0},
url = {https://github.com/hsnsahinhsn/pusula},
license = {Apache-2.0}
}
License and attribution
Released under Apache-2.0. Pusula Nano is built on boun-tabilab/TabiBERT (Apache-2.0) and was trained on data labeled
with Qwen3.8-27B; the synthetic messages of v2.0 were written with Gemma-4-31B-it (Google, Apache-2.0), with sectors and
occupations sampled from NACE Rev. 2.1 (Source: Eurostat) and ESCO (© European Union).
External evaluations: Amazon MASSIVE (CC BY 4.0) and OffensEval 2020 Turkish (Çöltekin, 2020; CC BY). See NOTICE.
Model tree for hsnsahinhsn/pusula-nano
Base model
boun-tabilab/TabiBERT