Pusula. The right decision, in Turkish.
Doğru karar, doğru yön.
Pusula is an open-source AI decision model for Turkish, developed by Erenext’s AI Lab. Decision models answer typed questions about a text and return a probability for every option instead of generated text. Examples: which team should handle a request, how urgent it is, whether a human should take over, and whether it contains fraud, insults, personal data or a prompt injection. Pusula is Decision 3.0 (vllm-sr/d3) adapted to Turkish.
What it decides
- Three question types:
choice(one option),noul(yes or no),score(ordered levels). Options are defined in each request. - Routing with a built-in Turkish taxonomy: 20 domains, 103 subdomains, 333 intents, or an institution’s own topic list.
- 20 ready-made templates: topic and intent, 14 checks for messages (for example urgency, emotion, missing information, action required, human handoff, personal data, security, insults, fraud, life and safety, legal risk, churn risk and sales opportunity) and 4 for AI agents (action risk, data leaving the institution, source grounding and task completion).
- Informal writing, typos, missing Turkish characters and mixed Turkish and English text are covered.
- Long texts up to 200,000 characters are checked part by part (
/v1/scan). - Drop-in d3 replacement: the same request and answer format as d3’s
/v1/systemone.
Two versions: same requests, different tradeoffs
Pusula
- Model
- Turkish Decision 3.0: LoRA adapter (rank 32) and code readout on
vllm-sr/d3 - Size
- 26B; adapter download about 0.9 GB, plus base d3 weights of about 52 GB
- Runs on
- GPU: at least 64 GB in BF16, at least 24 GB in 4-bit
- Turkish Decision Benchmark / gold test set
- 92.0 / 92.1
- Real customer messages (500 held-out, licensed)
- 90.6
- Best for
- Highest accuracy, built-in and custom questions
- Weights
- Hugging Face
- Install
pip install "pusula[serve,d3] @ git+https://github.com/erenextlabs/pusula"- Load
D3Engine.load("~/d3", adapter="~/pusula")
Pusula Nano
- Model
- TabiBERT cross-encoder (
boun-tabilab/TabiBERT) and option scorer - Size
- 149M parameters, about 0.6 GB, no base weights needed
- Runs on
- CPU or any GPU
- Turkish Decision Benchmark / gold test set
- 83.2 / 91.3
- Real customer messages (500 held-out, licensed)
- 89.9
- Best for
- High volume and low latency on the built-in questions
- Weights
- Hugging Face
- Install
pip install "pusula[serve] @ git+https://github.com/erenextlabs/pusula"- Load
DecisionEngine.load("~/pusula-nano")
Both versions accept identical requests. For tasks that differ from the built-in questions or have many options, use Pusula (MASSIVE 60-way intent: 85.2 vs 32.7).
Results for v2.0
Accuracy in percent, from the public model cards.
| Evaluation | Decision 3.0 (base) | Pusula 2.0 | Pusula Nano 2.0 |
|---|---|---|---|
| Real customer messages (500 held-out, licensed) | 84.0 | 90.6 | 89.9 |
| Long customer complaints (500 held-out, licensed) | 81.5 | 88.3 | 84.6 |
| Turkish Decision Benchmark (2,194 messages) | 88.5 | 92.0 | 83.2 |
| Gold test set (757 held-out messages) | 86.3 | 92.1 | 91.3 |
| Custom questions in unseen sectors | 92.8 | 93.5 | 55.5 |
| Source grounding of agent answers | 93.0 | 98.0 | 38.0 |
| Personal data in emails | 95.3 | 100.0 | 93.3 |
| Hidden instructions in documents | 100.0 | 100.0 | 78.2 |
MASSIVE tr-TR, 60-way intent, zero-shot (human-written) | 85.3 | 85.2 | 32.7 |
| OffensEval 2020 Turkish (real tweets) | 88.4 | 88.3 | 81.8 |
Labels were assigned blind and independently by two AI annotators, with adjudication, under the published labeling policy. The real customer messages were labeled blind by an AI annotator under the same policy. See the model cards for the full 17-row table. On the benchmark, Pusula 2.0 (92.0) is slightly below Pusula 1.0 (92.6); improvements are planned for v2.1. Most training data is synthetic; evaluate on your own data before deployment.
Full results and per-question tableHow to use it
Python API (engine.decide, decide_many, route, scan) and HTTP API (POST /v1/systemone, /v1/systemone/batch, /v1/scan, /v1/route; GET /v1/taxonomy, /health, /ready). By default the server listens on 127.0.0.1 only; remote access requires an API key. The training pipeline is included in the repo, so d3 can be fine-tuned for other domains.
pip install "pusula[serve] @ git+https://github.com/erenextlabs/pusula"
hf download erenextlabs/pusula-nano --local-dir ~/pusula-nano # small model, no base weights
PUSULA_MODEL_DIR=~/pusula-nano pusula-serve --port 8080Releases
- v2.0 31 October 2026 Current. 20 templates, routing through an institution’s own list, Nano trained with licensed real messages.
- v1.0 18 October 2026
- v1.0-onizleme 17 October 2026 Preview.
Each release is tagged in GitHub and both Hugging Face repos. Roadmap: v2.1, with improvements in domain, human handoff and missing information.
Open source and credits
Apache-2.0, for both versions. Pusula is built on vllm-sr/d3 (itself built on Qwen3.8-27B); its training data was written with Gemma-4-31B-it and labeled with Qwen3.8-27B, and TabiBERT was used for data curation. Pusula Nano is built on TabiBERT. All are Apache-2.0.
Contributors: Hasan Şahin (project lead), Ahmet Sayman (contributor).