Jevlet / README.md
NAME0x0's picture
Card corrections from the v7 audit (weights unchanged)
0d8a6ee verified
|
Raw History Blame Contribute Delete
13.1 kB
---
language: en
license: mit
library_name: pytorch
base_model: BAAI/bge-small-en-v1.5
pipeline_tag: text-classification
datasets:
- WillHeld/top_v2
- mteb/amazon_massive_intent
- clinc/clinc_oos
- mteb/banking77
- google/boolq
- nyu-mll/multi_nli
tags:
- jevlet
- decision-model
- calibration
- system-one
- intent-classification
- slot-filling
- desktop-assistant
- windows
- bge-small
- typed-questions
---
# Jevlet v6
Jevlet is a small **System-One decision model**: it reads a state (a typed command plus what is on
screen) and a set of typed questions, and returns **calibrated probabilities over the options it
is given**. It never generates text. It is a research replication of the idea behind TypeSafe's Jev,
built to drive an always-on Windows command palette where every action is chosen, not written.
- **Code, data pipeline, and training notebook:** [https://github.com/NAME0x0/Jevlet](https://github.com/NAME0x0/Jevlet) (commit `9d62c46989e9`)
- **Base encoder:** [BAAI/bge-small-en-v1.5](https://huggingface.co/BAAI/bge-small-en-v1.5), 33,508,992 parameters in total
- **Skills:** 50 (`shared/skills.json`), each with typed argument questions answered from live options
## How it decides
One packed forward pass answers several questions about the same state at once:
| Question | Kind | Options come from |
|---|---|---|
| Which action does the command ask for? | Choice | the 50 skill names |
| Is it risky to run without asking? | Noul (yes/no) | fixed |
| Which app / window / file / reminder …? | Choice | the live environment (installed apps, open windows, stores) |
| Which part of the command is the text to use? | Choice | spans copied verbatim from the command (`shared/text_rules.json`) |
Branches restart their positions after the shared state (`block_bidir` topology), so questions do not
see each other. A pointer head scores each option at its boundary token. Per-kind temperatures
(`temperatures` in the checkpoint) calibrate choices and yes/no answers separately. The app runs an
action on one keypress only when P(safe) ≥ 0.9 and every answer's confidence ≥ 0.75; otherwise it asks.
## Results
> **Reporting corrections (2026-09-26).** This card was corrected after release, during the v7 audit
> (`research/v7-audit.md` in the GitHub repository). The model weights are unchanged; the `v6` tag
> keeps the original card. What changed:
> - grounding is reported per question: the original single figure (78.6%) averaged the control
> question with a near-trivial risk question;
> - training time and loss-log coverage are clarified, with measured and estimated portions
> distinguished;
> - the checkpoint table is labelled as a training progression, not a scaling curve.
### Held-out human commands (never used for training or for tuning the span rules)
Test splits of TOPv2, MASSIVE, and CLINC150 mapped to Jevlet's skills
(23,279 commands).
| Question type | Questions | Accuracy | ECE | ECE (calibrated) |
|---|---|---|---|---|
| Skill | 23,279 | 98.0% | 0.010 | 0.001 |
| Risk (Noul) | 23,279 | 99.8% | 0.030 | 0.032 |
| Arguments | 14,475 | 97.1% | 0.012 | 0.004 |
The risk question is trained on soft targets (a risk value per command, for example 0.04 for a
benign command). Hard-label ECE scores its confidence against right/wrong, so it penalises a model
that reproduces its targets; that is why it rises slightly after calibration. Scored against the
soft targets, risk calibration error is 0.0027 before and 0.0013 after temperature scaling, and the
mean distance between predicted and target distributions is 0.0064 → 0.0060 (these 23,279
commands, `jevlet.metrics.target_calibration_error`).
### Mixture dev split (all sources)
The calibration temperatures were fitted on the command and real-command dev splits, which are
part of this set, so calibrated ECE here is in-sample. The held-out human commands above are not.
| Question type | Questions | Accuracy | ECE | ECE (calibrated) |
|---|---|---|---|---|
| All questions | 113,616 | 97.7% | 0.012 | n/a |
| Commands: skill | 32,682 | 99.1% | 0.005 | 0.001 |
| Commands: arguments | 29,141 | 99.2% | 0.003 | 0.001 |
| Grounding | see the per-question breakdown below | | | |
### Grounding: which on-screen control (reported per question)
Grounding examples come from two apps held out from the grounding training split (Microsoft Teams
and Spotify). Each example asks two questions, reported separately below:
- **which control** to use, where the answer is "None of these controls" when the task belongs to
another app (a *foreign* task);
- **the risk yes/no**.
The control question is further split by whether the target control is on screen. Accuracy is the
argmax against the gold option; ECE (calibrated) uses the checkpoint's per-kind temperature.
**Evaluation A**: the 3,000 grounding examples in the mixture dev split (the table above).
| Question | Slice | Questions | Accuracy | ECE | ECE (calibrated) |
|---|---|---|---|---|---|
| Which control | all | 3,000 | 57.3% | 0.352 | 0.321 |
| Which control | target on screen | 2,556 | 50.1% | 0.412 | 0.376 |
| Which control | foreign task (answer: none) | 444 | 98.6% | 0.010 | 0.009 |
| Risk yes/no | all | 3,000 | 100.0% | 0.001 | 0.001 |
**Evaluation B**: the full grounding dev set that Evaluation A samples (30,000 examples; the same
file, sha256 `95acbcaa923c268d27707b8ca8c324a4c0063ad72cb22a272afbdcac5ceb7aa5`).
| Question | Slice | Questions | Accuracy | ECE | ECE (calibrated) |
|---|---|---|---|---|---|
| Which control | all | 30,000 | 56.3% | 0.362 | 0.332 |
| Which control | target on screen | 25,418 | 48.7% | 0.426 | 0.390 |
| Which control | foreign task (answer: none) | 4,582 | 98.5% | 0.011 | 0.009 |
| Risk yes/no | all | 30,000 | 99.96% | <0.001 | <0.001 |
**How to read this:**
- The overall control accuracy includes foreign tasks, where answering "None of these" is correct
and easy (98.5%).
- When the target control *is* on screen, accuracy is 48.7% (Evaluation B), and the model answers
"None of these controls" on 48.6% of those examples (12,341 of 25,418).
- Every one of those answers is wrong, because the target is present. So **94.6% of its errors on
target-on-screen examples are false abstentions** (12,341 of 13,042 errors), not wrong controls.
Evaluation A gives 95.6% (1,220 of 1,276).
- On these held-out apps the model abstains instead of choosing, and does so with high
confidence.
- This is v6's weakest capability. Grounding decisions should be confirmed by the user.
Reproduce with `python -m scripts.eval_grounding jevlet-v6.pt grounding_v6/dev.jsonl` from the
GitHub repository (add `--only-ids-in mixture_v6/dev.jsonl` for Evaluation A). The outputs are in
`corrections/grounding_eval_A_3k.json` and `corrections/grounding_eval_B_30k.json`.
### Training progression on the held-out human commands (one run; not a scaling curve)
![v6 training progression](figures/training_progression.png)
These are checkpoints of **one** cosine-scheduled run, so examples seen and learning-rate annealing
are confounded: the final point also benefits from the learning rate decaying to 5%. They show how
this run progressed; they do not show how accuracy scales with data. ECE is uncalibrated.
| Step | Examples seen | LR factor | Skill accuracy | Skill ECE | Argument accuracy | Risk accuracy |
|---|---|---|---|---|---|---|
| 2,500 | 160,000 | 0.98 | 94.9% | 0.034 | 92.3% | 99.1% |
| 6,250 | 400,000 | 0.88 | 96.8% | 0.019 | 94.9% | 99.5% |
| 12,500 | 800,000 | 0.54 | 97.2% | 0.015 | 96.0% | 99.8% |
| 25,000 (final, exported fp16) | 1,600,000 | 0.05 | 98.0% | 0.010 | 97.1% | 99.8% |
Calibration temperatures: `{'choice': 1.4180543422698975, 'default': 1.1358089447021484, 'noul': 1.0306620597839355}`.
The hand-written laptop benchmark (`jevlet/assistant/benchmark_v2.py`, 98 commands, 6 dangerous)
runs against the live Windows environment and is reported in the GitHub repository.
## Training data
1,350,835 training rows. Nothing personal: the Colab build excludes the author's installed-app
list and UI captures. Every row is dropped if it comes within 0.8 token Jaccard (digits collapsed) of a
held-out benchmark command.
| Source in the mixture | Train rows |
|---|---|
| commands | 600,000 |
| daily | 240,000 |
| grounding | 150,000 |
| intents | 19,647 |
| public | 96,222 |
| real | 182,674 |
| synthetic | 60,000 |
| teacher | 2,292 |
Public data used:
| Dataset | Use | License (as reported by the source) |
|---|---|---|
| [WillHeld/top_v2](https://huggingface.co/datasets/WillHeld/top_v2) | TOPv2 (Facebook): human assistant commands, mapped to skills | CC BY-SA 4.0 |
| [mteb/amazon_massive_intent](https://huggingface.co/datasets/mteb/amazon_massive_intent) | MASSIVE (Amazon), English: intents and mapped commands | CC BY 4.0 |
| [clinc/clinc_oos](https://huggingface.co/datasets/clinc/clinc_oos) | CLINC150: intents and mapped commands | CC BY 3.0 |
| [mteb/banking77](https://huggingface.co/datasets/mteb/banking77) | BANKING77: fine-grained intent choice | CC BY 4.0 |
| [google/boolq](https://huggingface.co/datasets/google/boolq) | BoolQ: yes/no reading questions (Noul) | CC BY-SA 3.0 |
| [nyu-mll/multi_nli](https://huggingface.co/datasets/nyu-mll/multi_nli) | MultiNLI: entailment as typed questions | mixed; see the dataset card |
Synthetic sources are generated by the repository: composed commands with surface variation (typos,
text-speak, casing, courtesy words), grounding (which on-screen control), daily decisions, and
System-One families (contradiction, missing information, calibration, rules).
## Training procedure
| Setting | Value |
|---|---|
| Steps | 25,000 at effective batch 64 |
| Learning rate | head 0.002, encoder 0.0001, cosine, warmup 500 |
| Loss | ce_brier (cross-entropy plus Brier, a proper scoring rule) |
| Precision | bf16 mixed precision |
| Hardware | NVIDIA A100-SXM4-80GB (Google Colab) |
| Training time | ≈5 h total A100 training (estimated): 3.33 h measured for steps 8,550–25,000 after a resume; first-session duration not recorded. |
| Throughput | 25,960 tokens/s (measured over steps 8,550–25,000) |
| Peak VRAM | 10.2 GB |
![v6 training loss after resume](figures/training_loss_after_resume.png)
Logged steps 8,550–25,000. The first training session's progress log was not preserved during the
original resume; missing values have not been reconstructed. The resume-logging issue has since been
fixed.
`progress.jsonl` contains the loss curve for steps 8,550–25,000; the first session's log was lost on
resume. `run_config.json` holds the exact configuration and every session's GPU. `results.json` holds
the original evaluation. The corrections above come from `scripts/eval_grounding.py`
(`corrections/*.json`) and `scripts/plot_training.py` (`figures/training_figures.json`).
## Files
| File | What |
|---|---|
| `jevlet-v6.pt` | fp16 checkpoint with per-kind temperatures (loaded by `jevlet.system_one.SystemOne`) |
| `model.safetensors`, `config.json` | the same weights without pickle, plus model config and temperatures |
| `shared/skills.json`, `shared/text_rules.json` | the skill catalogue and span rules the model was trained against |
| `results.json`, `progress.jsonl`, `run_config.json` | evaluation, training curve (steps 8,550–25,000), configuration |
| `figures/`, `corrections/` | card figures with their data, and the per-question grounding evaluation (added 2026-09-26) |
## Use
```python
from huggingface_hub import hf_hub_download
from jevlet.benchmarks import RISK_QUESTION, daily_state
from jevlet.system_one import ChoiceQuestion, NoulQuestion, SystemOne
engine = SystemOne(hf_hub_download("NAME0x0/Jevlet", "jevlet-v6.pt"))
answers = engine.evaluate(
daily_state("remind me to call the bank at 5", "OUTLOOK: Inbox - Outlook"),
{
"skill": ChoiceQuestion("Which action does the command ask for?", ["Set a reminder", "Set an alarm clock", "Search the web"]),
"risk": NoulQuestion(RISK_QUESTION),
},
)
print(answers["skill"].selected, answers["skill"].confidence, answers["risk"].probability_true)
```
The planner in `jevlet/assistant/planner.py` builds the full question set from the live environment.
## Limitations
- English only; tuned for a Windows laptop's apps, windows, and settings pages.
- It chooses among the options it is given. If the right app, file, or span is not offered it cannot
answer correctly, and should pick "Not applicable" or ask.
- Free-text arguments are spans of the command. On held-out human commands, span extraction offers the
right span for about 85% of reminders, directions, music, and weather requests.
- Arithmetic, dates, and times are parsed by code, not predicted.
- The risk question is a safety net, not a guarantee: destructive actions also have fixed risk floors.