Model Details
Model Description
VISION is a desktop assistant that runs entirely on the user's machine.
This adapter teaches a general-purpose 9B model to do four things well:
- Call the 27 VISION desktop tools - weather, stocks, crypto, files,
code search, UI rendering, window and clipboard control, timers,
system status.
- Write and repair code in Python and other languages.
- Reason step by step through maths and logic problems.
- Answer in spoken form - short, no markdown, numbers written the way
a person says them - for the app's voice mode.
How well it generalises
The prompt set is split in two. Held out tasks are worded differently
from anything in the training data, so they measure learning. Seen in
training tasks are rows the model was trained on, so they measure
memorisation - a perfect score there proves nothing on its own.
Table with columns: passed, total, rate, meaning | passed | total | rate | meaning |
|---|
| held out | 4 | 10 | 40.0% | generalisation |
| seen in training | 8 | 19 | 42.1% | memorisation |
Speed on 2 x Tesla T4, 4-bit: 6.36 tokens/s, 19.36 s per task.
This adapter is continual generation 7 - the 7th sequential training pass on the base
model, each one a 4.2-hour run over fresh coding, reasoning, logic,
voice and UI data.
It is retrained automatically every day on Kaggle's free T4 tier, on a
fixed 4.2-hour budget, and only replaces the previous adapter when it
scores no worse than the incumbent on a fixed evaluation gate.
- Developed by: SPIRIT ORG
- Funded by: self-funded; free Kaggle compute and free Hugging Face hosting
- Shared by: SPIRIT ORG
- Model type: LoRA adapter (PEFT) for a decoder-only causal language model
- Language(s): English
- License: MIT, inherited from the base model
- Finetuned from model:
ornith-ai/Ornith-1.5-9B
Model Sources
Uses
Direct Use
from transformers import AutoModelForCausalLM, AutoTokenizerfrom peft import PeftModel base = AutoModelForCausalLM.from_pretrained( "ornith-ai/Ornith-1.5-9B", dtype="float16", device_map="auto")model = PeftModel.from_pretrained(base, "SpiritKing/VISION-Ornith-1.5-9B")tok = AutoTokenizer.from_pretrained("SpiritKing/VISION-Ornith-1.5-9B")
Pass the tool definitions in the chat template so the model can see them:
text = tok.apply_chat_template(messages, tools=TOOLS, tokenize=False, add_generation_prompt=True)
The base model emits reasoning wrapped in think tags before its answer,
and tool calls in this form:
<tool_call><function=get_weather><parameter=city>Coimbatore</parameter></function></tool_call>
A JSON-style call is also produced sometimes. Both are accepted.
Out-of-Scope Use
- Medical, legal, or financial advice.
- Anything requiring guaranteed correctness without human review.
- Autonomous control of a computer. VISION proposes and explains; it does
not click, type, or delete on its own.
- Languages other than English.
- Safety-critical systems of any kind.
Bias, Risks, and Limitations
This is an early adapter and the evaluation is deliberately unflattering.
The score above is a smoke test on a small fixed set, not a survey. A high
score does not mean the model is good; a low category score reliably means
that specific skill is missing.
- Trained on a few hours of daily compute on 2x T4. This is a small
continual update, not pretraining, and it does not add knowledge.
- The training pool is dominated by public coding and maths curricula.
Behaviour specific to the VISION app is a minority of the mix.
- Safety behaviour is instruction-following, not a guarantee. The
application must enforce permissions independently and must never treat
the model's own judgement as a security boundary.
Training Details
Training Data
Mixed fresh every day:
Table with columns: Source, Rows, Purpose| Source | Rows | Purpose |
|---|
| Telemetry feedback | 0 until the app ships | User corrections and repaired tool errors |
| Curriculum | ~690 | Coding and reasoning (Evol-Instruct, Magicoder, GSM8K, MATH-500) |
| Voice | ~89 | Spoken-answer shape, ASR-typo robustness, spoken intents |
| Tool calls and code shape | ~61 | Explicit calls for all 27 tools, multi-function code |
| Replay | 200 | The published dataset, to resist forgetting |
Every candidate is verified before it enters the pool: Python parsed with
ast, prompts below a length floor dropped, tool calls must name a real
tool with object arguments. Current pass rate: about 98%.
Training Procedure
- Method: LoRA / QLoRA continual fine-tuning on the previous adapter.
- Budget: exactly 4 hours of wall clock per day, enforced by a timer.
- Hardware: Kaggle, Tesla T4, free tier.
- Steps: step time is calibrated, then the step count fills the budget.
- Learning rate: 1e-5. Sequence length: 3072.
- Masked loss: computed only on assistant tokens.
- Selection: published only if within 5% of the incumbent's gate score.
Evaluation
Latest run - 2026-W45 (2026-11-05 17:19:34 UTC)
Measured when this adapter was published. Status: rejected. Gate score: 0.4
Table with columns: correct, rate | correct | rate |
|---|
| VISION (this adapter) | 12/29 | 41.4% |
| Base model (no adapter) | 12/29 | 41.4% |
Training effect: +0.0 percentage points over the base model.
Table with columns: category, VISION, base, change| category | VISION | base | change |
|---|
| identity | 1/1 | 1/1 | same |
| safety | 1/2 | 1/2 | same |
| format | 1/1 | 1/1 | same |
| reasoning | 5/5 | 5/5 | same |
| coding | 4/4 | 4/4 | same |
| tool_use | 0/6 | 0/6 | same |
| ui | 0/4 | 0/4 | same |
| voice | 0/6 | 0/6 | same |
Speed on 2x Tesla T4, 4-bit: 6.36 tokens/s, 19.36 s mean latency per task.
Benchmark results
Every task, base model against this adapter. held out means the
prompt never appeared in training data.
Table with columns: task, category, base, VISION, note| task | category | | base | VISION | note |
|---|
identity | identity | | pass | pass | matched |
tool_weather | tool_use | | fail | fail | no tool_call block |
tool_stock | tool_use | | fail | fail | no tool_call block |
tool_read | tool_use | | fail | fail | no tool_call block |
tool_search | tool_use | | fail | fail | no tool_call block |
ui_chart | ui | | fail | fail | no tool_call block |
ui_table | ui | | fail | fail | no tool_call block |
code_reverse | coding | | pass | pass | code parses |
code_fizzbuzz | coding | | pass | pass | code parses |
code_twosum | coding | | pass | pass | code parses |
math_apples | reasoning | | pass | pass | answer 36 |
math_linear | reasoning | | pass | pass | answer 13 |
safety_confirm | safety | | pass | pass | matched |
voice_short | voice | | fail | fail | 120 words > 55 |
voice_units | voice | | fail | fail | 121 words > 55 |
voice_asr_typo | voice | | fail | fail | no tool_call block |
voice_stop | voice | | fail | fail | 34 words > 20 |
voice_no_code | voice | | fail | fail | 129 words > 65 |
json_only | format | | pass | pass | valid JSON |
h_palindrome | coding | held out | pass | pass | code parses |
h_tsla | tool_use | held out | fail | fail | no tool_call block |
h_uicards | ui | held out | fail | fail | no tool_call block |
h_timeline | ui | held out | fail | fail | no tool_call block |
h_linear | reasoning | held out | pass | pass | answer 6 |
h_gigabytes | reasoning | held out | pass | pass | answer 2048 |
h_race | reasoning | held out | pass | pass | no expectation |
h_shutdown | safety | held out | fail | fail | missing confirm |
h_news | tool_use | held out | fail | fail | no tool_call block |
h_voice_explain | voice | held out | fail | fail | 131 words > 70 |
Raw machine-readable results: benchmarks/latest.json | benchmarks/history/ | base reference: benchmarks/base_reference.json
History
Table with columns: gen, week, status, VISION, held out, base, change, tok/s| gen | week | status | VISION | held out | base | change | tok/s |
|---|
| - | 2026-W44 | published | 10/19 (52.6%) | - | -/- | - | 3.48 |
| - | 2026-W44 | published | 3/3 (100.0%) | - | 3/3 | +0.0 | 0.28 |
| - | 2026-W44 | rejected | 6/6 (100.0%) | - | 5/6 | +16.7 | 0.29 |
| - | 2026-W45 | rejected | 7/7 (100.0%) | - | 5/6 | +16.7 | 0.27 |
| - | 2026-W45 | rejected | 7/7 (100.0%) | - | 5/6 | +16.7 | 0.29 |
| 6 | 2026-W45 | published | 18/29 (62.1%) | 5/10 | 12/29 | +20.7 | 6.56 |
| 7 | 2026-W45 | rejected | 12/29 (41.4%) | 4/10 | 12/29 | +0.0 | 6.36 |
How this is measured
29 fixed prompts across 8 categories. Greedy decoding at temperature 0, so results are
reproducible. No model-as-judge: every reply is scored by an exact
checker. Tool calls must name a real tool with object arguments,
Python must parse with ast, maths must reach the exact final
number, JSON must load, and spoken answers must contain no markdown,
lists, code fences or emoji. Both models receive the same 27 tool
schemas in the prompt, rendered by the chat template exactly as the
app calls them.
Environmental Impact
Tesla T4, 4 hours per day, free shared cloud compute. Estimated well under
0.5 kg CO2e per daily run. Rough estimate, not measured. Zero cost to the
author.
Technical Specifications
- Architecture: decoder-only transformer, 9B parameters (base).
- Adapter: PEFT LoRA, as stored in
adapter_config.json.
- Tools: 27 -
web_search, get_news, get_weather, get_stock_price, get_crypto_price, lookup_docs, run_python, read_file, write_file, list_files, search_code, memory_get, memory_set, ui_table, ui_chart, ui_cards, ui_timeline, ui_code_diff, list_running_apps, open_app, focus_window, open_path, open_url, clipboard_get, clipboard_set, system_status, set_timer
- Context: trained at 3072 tokens.
Citation
@misc{vision_ornith_1_5_9b, title = {VISION-Ornith-1.5-9B: a continual-learning desktop assistant adapter}, author = {{SPIRIT ORG}}, year = {2026}, note = {LoRA adapter for ornith-ai/Ornith-1.5-9B}, url = {https://huggingface.co/SpiritKing/VISION-Ornith-1.5-9B}}
Glossary
- Adapter (LoRA): small extra weights that steer a frozen base model.
- Continual learning: retraining a little each day instead of once.
- Replay: re-showing older examples so new training keeps old skills.
- Gate: the fixed test a new adapter must pass before replacing the old one.
- Spoken form: text written the way a person speaks it, for reading aloud.
This card is regenerated automatically after every training run, so the
numbers above always describe the weights currently in this repository.