DEV Community

Cover image for I found the model Flash Onyx 3 was missing. It doesn't generate a single word.
Nathan C.
Nathan C.

Posted on

I found the model Flash Onyx 3 was missing. It doesn't generate a single word.

Sorry for the quiet stretch. Ten days between posts isn't how this series usually runs, and it wasn't because nothing was happening. It's because the post I kept trying to write was wrong.

Ten days ago I said Flash Onyx 3 was stuck. Cloudbase users run on weights I don't own, there's no hook to attach a fine-tune to a hosted base, and shipping two different models under one name was never a real option. My conclusion was blunt: better prompts, same weights, one model everywhere, until Ollama gives me a door I don't currently have.

I still believe every word of that post. I also had the wrong picture of what Onyx 3 needed to be.

The bottleneck was never the weights

Go back through this whole series and a pattern shows up that has nothing to do with fine-tuning. 2.1 spent 400 tokens reasoning about its own tone and returned an empty string. 2.3 opened every reply with its own name because nobody had told it not to. The post that got the most attention out of any of these was about the model reporting a task done without having checked.

None of that is a generation problem. It's a judgment problem wearing a generation model's costume. Every one of those failures is Onyx being asked did this actually work, is this safe to run, should I stop here, and answering with the same machinery it uses to write a commit message. A 31B model, thinking in tokens, guessing the shape of a yes before it has earned one.

I patched what I could in the system prompt. Quoted evidence required on every DONE line. "Are you sure" treated as an instruction to check again, never to fold. Five versions of a Modelfile, each one closing a judgment gap with more English. It worked, mostly. It also meant the fix for is this actually true was always more prose.

Then I found a model that refuses to write

TypeSafe AI shipped something on September 15 that I almost scrolled past because the pitch read like marketing copy. A model that does not generate text. You hand it a block of state and a set of typed questions, yes or no with a probability, a pick from a fixed list, a score against a scale, and it answers all of them in one pass. No string to parse. No token spent deciding how confident it should sound. It's called Jev, named after Jevons paradox, and it comes from Diogo Almeida, who co-invented RLHF. That detail is what changed how I read the announcement. This is someone who spent years teaching models to sound right, now building one that gets scored on being right.

The number that stopped me was not accuracy. On TypeSafe's own four-workflow benchmark, Jev lands around 68 percent, close to a mid-tier LLM doing the same call. What stopped me was their demo answering in 0.114 seconds against 8.566 seconds for GPT-5.6 Terra on a comparable judgment. Forty to two hundred times faster, and priced like a rounding error: four cents per million input tokens, output free, because there is no output to generate. It's trained with something they call RLCD, reinforcement learning for calibrated decisions. The confidence number is the actual product. Not a figure I'm extracting from a token distribution and hoping means what I think it means.

It would be useless for anything I currently ask Onyx to do. Hand it a diff and ask for an explanation and you get nothing back. That's not a flaw, it's the boundary of the job it was built for. It was never trying to replace the 31B model. It was built for the other half of the loop, the half I'd been outsourcing to a language model because a language model was the only tool I owned.

What Onyx 3 actually is

Not a fine-tune. Two models doing two jobs that were never the same job.

Onyx keeps writing. Plans, diffs, commit messages, the reasoning a person actually reads. Jev sits at every checkpoint that used to be a guess wearing a sentence's clothing.

state = last_tool_output
questions = {
    "outside_scope": Choice(["yes", "no"]),
    "task_complete": Score(0, 1),
}
jev.ask(state, questions)
# 0.1s, fraction of a cent, no prose to grade
Enter fullscreen mode Exit fullscreen mode

That checkpoint used to cost a full generation and a hope. Now it costs a fraction of a cent and comes back before the terminal has finished scrolling the command it's checking.

The part I have not solved

Flash's whole pitch is local first, nothing leaves the machine. Jev is early access and hosted. The second I call it, that sentence earns an asterisk, even though the only thing crossing the wire is a state string and a typed question, never a file, never a key, never more of your code than you already put in the prompt yourself.

I don't have a clean answer yet. Current plan: Jev is opt in, off by default, and every call it makes gets logged in plaintext in the same terminal you're already reading. If that's not good enough for someone's threat model, the fully local path stays exactly as it is today. I would rather ship a tradeoff I can explain than one I'm hoping nobody asks about.

Where this goes

I'm on the waitlist. Until access clears, this is a design doc and a Modelfile that isn't finished being argued with. Same as every post before this one: I will tell you what breaks.


Flash: flashproject.dev
Source, MIT license: github.com/Natuworkguy/Flash
Jev's docs, if you want to check my read of it yourself: docs.typesafe.ai

Has anyone put a hosted judgment model next to a local agent yet? I want to know what your threat model looked like before you called that solved.

Top comments (0)