Natuworkguy/ flash-onyx-2.2:31b-cloudbase

44 3 weeks ago

The flagship model of Flash. A local-first engineering agent that closes problems in the fewest moves, now with twice the context and new ground in law, argument, markets, and game feel, plus a cloud version (use :31b-cloudbase).

vision tools thinking cloud 12b 31b
ollama run Natuworkguy/flash-onyx-2.2:31b-cloudbase

Details

3 weeks ago

6563b790407b · 91kB

You are Flash Onyx 2.2, the flagship model of FLASH (Fast Local Agent SHell). A fast, local-first en
The Modelfile and system prompt behind this model are covered by this license: MIT License Copyright
{ "min_p": 0.05, "num_ctx": 65536, "num_predict": 8192, "repeat_last_n": 256, "r

Readme

FLASH ONYX 2.2

The flagship model of Flash. A local-first engineering agent that closes problems in the fewest moves, running entirely on your hardware.

base sizes context input local

Onyx 2.1 finishes the job in a fraction of the words. Onyx 2.2 knows more of the work, and holds a standard on what it hands back. Twice the context, a sampler tuned against the prompt instead of guessed at, and nine new sections: READING THE ASK, NAMING AND STACK, THE BAR, THE NEXT MOVE, LAW, CONTRACTS AND DOCUMENTS, WINNING ARGUMENTS, STOCK TRENDS, GAMES, with REVIEWING CODE rewritten at roughly twice the length.

What it is better at

  • It reads the request first. A question about work is not an instruction to do it: “how would you handle rate limiting on /login” gets an answer and a one line offer, where the build before this wrote the middleware. It answers at the altitude you asked at, keeps your nouns, treats what you already tried as a constraint, and checks the reply against your words before sending.
  • It names the file. A browser Minecraft clone arrives as minecraft_clone.html, not output.html and not an unnamed block, whether or not the client gave it somewhere to write.
  • It picks the stack. A quick web game is one .html file with canvas and no build step; real state and routing earn React on Vite; a game you mean to sell starts in Godot, because pygame is a toy on your own machine; a data one-off is the standard library until the shapes are real. What the project already uses beats what the model would have picked.
  • It holds a standard. The cheap last ten percent: a --help that says what the tool does, an error naming the fix, a page that survives 320px, a script that prints what it changed. Edges over the demo path, nothing half wired, one design end to end, defaults treated as the product, and the part that falls short named rather than shipped quietly.
  • It tells you what comes next. One line at the end, only where it can name the move exactly: packaging for a module, the regression test for a fix, the other two hundred files for a script proved on one. Publishing, pushing, and deploying are offered and never taken.
  • Law and contracts. Jurisdiction first, deadlines before analysis, and never a case name or section number it has not read this session. For documents: whole thing before one clause, read from a side, findings ranked deal killer to noise, and silence treated as a term.
  • Winning arguments. The other side at its strongest in their words, what is true conceded out loud, then the one point that decides it. The line and the date, never the vibe, and it stops when the point lands.
  • Market structure, without a fabricated price. Higher highs and higher lows, not a slope through two points. Volume confirms or it does not, the higher timeframe is in charge, and it will not call a top or name a price. No market data tool in the client and it says it has no live feed, labelling the last figure it knows as stale.
  • Game feel. Fixed timestep with a clamped accumulator, input polled rather than handled, 100ms of coyote time, 150ms of jump buffering, a hitbox tighter than the player and looser than the pickup, and nothing allocating in the loop.
  • Twice the room. 32K to 64K. The prompt asks about 19,400 tokens against 2.1’s 14,200 and still leaves you around 46K, where 2.1 left about 18K.
  • A tuned sampler. Temperature 0.7 to 0.6 and min_p 0 to 0.05, scored against the prompt’s own rules. At 0.7 it wrote a shell one liner then explained du for 43 words, which its throwaway rule forbids; at 0.5 it reached for a GNU flag macOS does not ship; 0.6 held both.

How this was measured

Six prompts, two seeds, the build before these sections against the build with them, then six rounds of fixing what that found. 145 generations, all on the 12b, thinking off, sampler untouched. Five seeds per case at the end:

case before after
Names the file it just built 0 of 4 5 of 5
Starts a game for sale in an engine 0 of 2 5 of 5
One off with no main() and no if __name__ 0 of 2 3 of 5
Ends on one specific offer not tested 4 of 5
“How would you handle rate limiting” 6 code lines, 163 words 0 code lines, 96 words
Em-dashes and filler phrases 0 of 12 0 of 12

Read that for what it is: short prompts scored against the prompt’s own rules, not a benchmark, not a claim about your workload, and only the 12b was tested.

Two findings are worth passing on. The naming rule did nothing until it moved 200 lines earlier, next to the rule about fenced code blocks, beside the moment it applies. And the one-off rule kept losing to a Python rule 18 lines below it that put work behind if __name__ == "__main__": with nothing scoping it to importable code, which is the kind of contradiction rereading does not catch. One more sentence, added to a rule already passing 4 of 5, scored 16 of 20 against 19 of 20 and made two unrelated cases noisier, so it was reverted. On a prompt this size another sentence is not free.

Running it

Gemma 4 has a separate thinking channel, and with a bounded reply budget it can spend the whole budget reasoning and return nothing. Pass think: false if your client exposes it. That is a request level flag rather than something the Modelfile sets, and raising num_predict does not fix it.

Onyx 2.2 is a model, not an app, 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. Any other Ollama client gets the same reasoning and writing, it just cannot reach your machine. Two of 2.2’s rules only exist inside a tool loop: an artifact goes to a path and the reply names it instead of pasting the file back into your context, and the next move is worked out from the state of what it just wrote.

The numbers

Onyx 2.1 Onyx 2.2
Base gemma4 gemma4
Sizes 12b, 31b 12b, 31b
Context 32K 64K
Input text + images text + images
Longest reply 8,192 tokens 8,192 tokens
System prompt 516 lines, 51 sections 635 lines, 60 sections
System prompt cost ~14,200 tokens ~19,400 tokens
Context left for you ~18K ~46K
Cold prefill, 12b ~152s ~213s
Temperature, min_p 0.7, 0.0 0.6, 0.05

Pick a size

  • flash-onyx-2.2:12b: consumer hardware, the everyday driver.
  • flash-onyx-2.2:31b: the flagship, wants a bigger GPU and pays you back for it.

Build it

# clone FLASH's repository, build, then /model flash-onyx-2.2:31b
python3 models/build.py models/flash-onyx-2.2.Modelfile             # every size
python3 models/build.py models/flash-onyx-2.2.Modelfile --size 31b  # just one

Coming from Onyx 2.1

  • Nothing about the interface changed. Same base, sizes, 8,192 token ceiling, and tag shape: swap flash-onyx-2.1:12b for flash-onyx-2.2:12b and carry on.
  • The window doubled, so set num_ctx to 65536 if you set it yourself, and expect about a minute more before the first token on a cold load, once per load rather than per message.
  • Expect a question about the next step, one line, at the end, waiting for your go before anything outward facing.
  • Onyx 2.1 is still here and still builds: python3 models/build.py models/flash-onyx-2.1.Modelfile