41 Downloads Updated 1 month ago
ollama run Natuworkguy/flash-onyx-2.1:12b
Updated 1 month ago
1 month ago
4ba92a8a9ced · 7.6GB
The flagship model of Flash. A local-first engineering agent that closes problems in the fewest moves, running entirely on your hardware.
Onyx 2 finishes the job. Onyx 2.1 finishes it in a fraction of the words and starts answering sooner. Every standard from Onyx 2 is still here, unchanged: the ledger, the refusal to invent a flag it has not seen, the git rules, the pages that look designed. What changed is that it stopped padding, it stopped spending half your context window reading its own instructions before it says anything to you, and it finally knows when a job wants a one-liner instead of a program.
The change you feel first. One sentence where Onyx 2 wrote five. The answer goes in the opening words and the reasoning follows only if it still earns its place. No restating your question back at you, no preview of what it is about to say, no recap of what you just watched it do.
Across seven side by side tests, 2.1’s answers came to 70% of Onyx 2’s length, and it was shorter on every single one. Asked for a Slack message about a slipped deploy, Onyx 2 wrote 146 characters and 2.1 wrote 86, and both of them sound like a person.
The rule that keeps this honest is that compression is words, never substance. Dropping a step, a caveat that changes the answer, a trade worth offering, or the manners a message needs is not brevity. It is a worse answer that happens to be short.
The system prompt went from roughly 27,000 tokens to 14,200. On a 12B running on consumer hardware, that cut the cold prefill from about 290 seconds to about 152. Your machine will differ, but the ratio will not: it is half the reading before the first token.
That work is cached per model load rather than repeated per message, so the cost lands once when the model warms up and not on every turn.
Onyx 2’s instructions ate about 27K of a 32K window before you typed anything, and a long reply could take most of what was left. 2.1 uses roughly 14K, so a long conversation has somewhere to go instead of quietly falling off the back.
New in 2.1, and the gap it was missing. Some code is a one-off: rename 200 files, pull a number out of a log, reshape a CSV once. It runs, you read the output, you delete it.
Onyx 2 brought the full apparatus to those, and so did the first draft of 2.1. Now, when you say “quick”, “one-off”, or “don’t overthink it”, you get the one-liner:
mv ./dumps/report_2024-03-*.csv ./march/
No argparse, no logging, no main(), no docstring on a script with a
lifespan of one run. Paths hardcoded at the top where you can see them, and it
says so. Ugly is fine.
What does not relax: it still will not invent a flag, it prints the list before it moves anything in bulk, and it hands you the command rather than claiming to have run it. A one-off that moved the wrong 200 files is not a small mistake because the script was small.
Ask either model why a ring rotating around a sphere never passes behind it.
Onyx 2 reaches for transform-style: preserve-3d and a translateZ nudge, which
does not work, because CSS has no depth buffer and cannot hide part of one element
behind another at all.
2.1 says that outright, then gives the fix that exists: split the ring into a
front arc and a back arc stacked either side of the solid, or move to WebGL where
the depth buffer does the work. It also knows z-index is the standard wrong
answer here.
Everything else from Onyx 2’s motion and 3D work is intact: compositor-only animation, frame-rate independence, springs for anything interruptible, draw call budgets, never blocking first paint, GPU memory freed on teardown.
The risk in a model this terse is that it turns into a status dump. A message to people keeps its manners however short it is, so a note to your team still opens like someone talking rather than like a log line.
Told a secret was just pushed to main, 2.1 leads with rotating the key, because
that is the only step that actually invalidates it, and treats history scrubbing
as the follow-up it is. Where it does not know the exact invocation for your
situation, it says so and offers to work it out rather than handing you a
plausible command aimed at the wrong file.
A small thing that says something larger about instruction-following under compression. Across the same seven tests, 2.1 emitted no em-dashes anywhere. Onyx 2 emitted one, in prose, in violation of its own prompt.
Seven prompts, one per area: explaining a Python closure bug, a rent negotiation, a Slack message, a leaked-key git incident, a small CSV function, a CSS 3D occlusion problem, and a throwaway file-moving script.
Both models, same prompts, same sampling settings, fixed seed, reasoning
disabled, 12b on the same machine. 2.1 won six, tied one, and lost none.
Read that for what it is. It is seven short prompts and a single run each,
graded by hand against the standards in the prompt itself, not a benchmark suite
and not a claim about your workload. The one tie was the negotiation, where 2.1
gets the recommendation, the words to say, and the trade into half the length,
while Onyx 2 spends its extra room listing the landlord’s turnover costs. Both
answers are usable. Only the 12b was tested.
**Gemma 4 has a separate thinking channel, and it is worth knowing how it behaves here. With thinking enabled and a bounded reply budget, the model can spend the entire budget reasoning and return an empty response. Turning it off produced a complete, correct answer in 24 seconds where the same question with thinking on produced nothing in 43.
If your client exposes it, pass think: false. This is a request-level flag, not
something the Modelfile sets, so it belongs in whatever drives the model. Raising
num_predict does not fix it. At about 9 tokens per second on a 12B, the existing
8,192 budget is already a 14 minute worst case, and a larger one only buys longer
silences.
* About how it readsOnyx 2’s output was run through an AI-text detector and scored very low. 2.1 inherits that section of the prompt intact and has not been re-tested against any detector.
Results move with the prompt, the detector, the version of each, and the subject being written about, and detectors are unreliable in both directions. Nothing here guarantees any particular score on any particular output, and no result is promised or warranted.
Prose that reads as human is a claim about writing quality, not a tool for passing AI-generated work off as your own. Where disclosure of AI assistance is required, by a school, an employer, a client, a publisher, or the law, that obligation is yours and nothing here changes it.
** What this needs from the program running itOnyx 2.1 is a model, not an app. It has no hands of its own, so running a command, writing a file, or looking at a page happens only where the program driving it provides those tools.
Flash provides them: shell, read and
write, grep and glob, screenshot, web_search, memory and more. Point any
other Ollama client at Onyx 2.1 and it reasons, writes, and answers exactly the
same. It just cannot reach your machine unless that client provides tools.
Images work the same way. The model reads any image it is handed, but the client is what hands it one, so attaching a screenshot needs a client that sends images.
| Onyx 2 | Onyx 2.1 | |
|---|---|---|
| Base | gemma4 |
gemma4 |
| Sizes | 12b, 31b |
12b, 31b |
| Context | 32K | 32K |
| Input | text + images | text + images |
| Longest reply | 8,192 tokens | 8,192 tokens |
| System prompt | 903 lines | 516 lines |
| System prompt cost | ~27,000 tokens | ~14,200 tokens |
| Context left for you | ~5K | ~18K |
Cold prefill, 12b * |
~290s | ~152s |
| Answer length, 7 tests | 6,896 chars | 4,818 chars |
* One machine, one run. Yours will differ.
| Tag | For |
|---|---|
flash-onyx-2.1:12b |
Consumer hardware. The everyday driver. |
flash-onyx-2.1:31b |
The flagship. Wants a bigger GPU and pays you back for it. |
Clone FLASH’s GitHub repository and run the build script
python3 models/build.py models/flash-onyx-2.1.Modelfile # every size
python3 models/build.py models/flash-onyx-2.1.Modelfile --size 31b # just one
Then run:
/model flash-onyx-2.1:31b
flash-onyx-2:12b
for flash-onyx-2.1:12b and carry on.python3 models/build.py models/flash-onyx-2.Modelfile