A model router for AI coding agents. Before your main model reads a message, Jev (TypeSafe's calibrated judge model) answers one question: what's the smallest model that can do this job well? When Jev is sure, the job goes to a helper running that smaller model. When it isn't, or anything goes wrong, your message goes through exactly as if sizeup weren't installed.
It runs in omp and Claude Code from one shared core, and ships a CLI for sizing messages and running the benchmark.
you: What's the capital of Japan?
sizeup: tiny 100% → Claude Haiku 4.5
Tokyo is the capital of Japan.
Done by Claude Haiku 4.5 (sizeup: tiny)
flowchart LR
U[Your message] --> G{Short reply that needs<br/>the conversation?}
G -- yes --> M[Main model answers]
G -- no --> J[Jev: tiny / everyday / large / hardest<br/>with a probability for each]
J -- "< 60% sure, slow (>1.5 s), error, no key" --> M
J -- "sure, and size ≠ main model" --> N[Hidden note: delegate to<br/>the helper for that size]
J -- "sure, but size = main model" --> M
N --> H[Helper on the smaller model<br/>does the job]
H --> R[Main model relays the answer<br/>+ "Done by …" line]
The four sizes Jev chooses from:
| Size | Jobs | Default model (omp example) | Default (Claude Code) |
|---|---|---|---|
| tiny | a lookup, a rename, a one-line answer | Claude Haiku 4.5 | haiku |
| everyday | a normal email, post or short document | Claude Sonnet 5 | sonnet |
| large | a multi-step build, research, a full report | Claude Opus 5.5 | opus (your main model, so answered directly) |
| hardest | strategy, or anything where a wrong call is expensive | Claude Fable 5.1 | opus (folded into large) |
- Delegate, don't switch the session model. Switching models per message throws away the prompt cache, so every switch pays to re-read the whole conversation. sizeup never touches the session model: the main model hands the job to a helper with a fresh, small context. The cost is one short relay turn on the main model.
- Fail open, always. Router off, no key, Jev slower than 1.5 s, an HTTP error, a malformed answer: each one returns "no decision" and the message proceeds untouched. The Jev call starts the moment you hit enter, in parallel with everything else.
- Act only on calibrated confidence. Jev returns a probability for every option, not just a label. Below 60% for its pick, the main model answers. Routing a hard job down is the expensive mistake; answering a small job on the big model only costs money.
- Guard against context-dependent replies. Jev sees one message in isolation, so it rates "yes do that but make it shorter" as tiny with 78–97% confidence. A helper that can't see the conversation can't answer it, so short replies that lean on the conversation never reach Jev.
- No pointless hops. If a size maps to the model already answering, the main model just answers.
- Fewer models, fewer sizes. An unassigned size, or two neighbouring sizes on the same model, fold into one rung, so Jev only chooses between genuinely different models.
- Harness-agnostic core.
core/imports nothing from any harness. Each adapter only supplies the key, the ladder, the conversation state and a way to inject a hidden note.
sizeup eval runs real Jev calls over eval/samples.json: eight jobs from tiny to hardest, plus two context-dependent replies. Every sample is scored as if mid-conversation, where the reply guard is live. Latest run (eval/results.md):
| Message | Expected | Jev picked | How sure | What happens |
|---|---|---|---|---|
| What's the capital of Australia? | tiny | tiny | 100% | → tiny helper |
| Rename getUserData to fetchUserProfile in src/api.ts | tiny | tiny | 100% | → tiny helper |
| Short email to my landlord about the leaking tap | everyday | everyday | 97% | → everyday helper |
| LinkedIn post: we just shipped dark mode | everyday | everyday | 98% | → everyday helper |
| TypeScript CLI: watch, resize, upload to S3, tests | large | large | 99% | → large helper |
| Research report on 5 open-source vector databases | large | large | 100% | → large helper |
| Raise a $3M seed now or wait for $50k MRR? | hardest | hardest | 92% | → hardest helper |
| Postgres or DynamoDB for a payments ledger | hardest | hardest | 88% | → hardest helper |
| "yes do that but make it shorter" | reply | tiny | 83% | main model (follow-up) |
| "ok go with the second option" | reply | tiny | 96% | main model (follow-up) |
- Sizing accuracy: 8/8. Context-dependent replies kept by the main model: 2/2.
- Jev latency: p50 356 ms, p95 560 ms.
- Jev cost: about $0.000017 per message.
Ten samples show the pipeline works end to end; they are not a statistically meaningful accuracy estimate. Add your own messages to eval/samples.json and re-run.
You need a TypeSafe API key for Jev: console.typesafe.ai. sizeup installs OFF.
omp plugin install github:sxivansx/sizeupIn omp:
/login typesafe paste your key (or set TYPESAFE_API_KEY)
/sizeup setup pick a model for each size (skip any you don't have)
/sizeup on
Or set the ladder in one line: /sizeup setup tiny=anthropic/claude-haiku-4-5 everyday=anthropic/claude-sonnet-5 large=anthropic/claude-opus-5-5.
The footer shows each decision (sizeup: everyday 97% → Claude Sonnet 5 or sizeup: kept here (unsure · tiny 55%)). Helpers are the sizeup-<size> agents; sizeup pins each one to its size's model when it spawns.
/plugin marketplace add sxivansx/sizeup
/plugin install sizeup@sizeup
Set your key in /plugin → sizeup → configure (stored in your system keychain), or export TYPESAFE_API_KEY. Then:
/sizeup:on /sizeup:off /sizeup:status
Each prompt shows the decision (sizeup: tiny 97% → Claude Haiku).
Per-size models (haiku, sonnet, opus or off) and your main model are options in /config. Helpers are the sizeup:<size> subagents.
Node 18+ or Bun:
npx github:sxivansx/sizeup classify "Rename foo to bar in utils.ts"
# tiny 100% → route to tiny helper
# tiny 100% · everyday 0% · large 0% · hardest 0%
# 500 ms · $0.0000160 · jev-1.13.0
npx github:sxivansx/sizeup eval --out results.md # runs the bundled samples/sizeup status in omp, /sizeup:status in Claude Code:
sizeup: ON · Jev key: TypeSafe
Size Jev picked Sent to helper Helper
tiny 1 1 Claude Haiku 4.5
everyday 0 0 Claude Sonnet 5
large 0 0 Claude Opus 5.5
hardest 0 0 Claude Fable 5.1
Sent to helpers: 1 · Kept by main session: 0
Jev cost so far: $0.000016 over 1 calls (avg 494 ms)
"Sent to helper" counts messages sizeup told the main model to delegate. The main model can still decline when delegating would clearly be wrong.
While sizeup is on, the text of every message you type is sent to TypeSafe (the company behind Jev) to be sized. Only the first 8,000 characters are sent, and nothing else from your session. Turn it off (/sizeup off in omp, /sizeup:off in Claude Code) for private work.
- One-liners get slower, not cheaper. A routed tiny question took 6–11 s end to end against about 3 s answered directly, and it still costs a short relay turn on the main model. The savings are on longer everyday jobs that move from a frontier model to a mid-size one.
- It can't make the session itself cheaper per message. Neither harness lets an extension swap the model for a single turn without losing the prompt cache; delegation is the closest thing that works.
- Jev judges the message, not the codebase. "Fix the bug" can be tiny or hardest depending on the repo. The confidence threshold absorbs some of this; the main model's right to decline absorbs the rest.
- The reply guard is a word heuristic. It errs toward keeping messages with the main model, which is the safe direction.
core/ Jev client, ladder, routing policy, state (no harness imports)
adapters/omp/ omp extension: input + before_agent_start + before_subagent_spawn hooks
agents/ omp helper agents (sizeup-tiny … sizeup-hardest)
adapters/claude-code/ Claude Code hook + /sizeup command, bundled into the plugin
plugins/claude-code/ Claude Code plugin: manifest, hook config, subagents, command, dist/
cli/ sizeup classify / eval
eval/ benchmark samples and latest results
test/ bun test suite (policy, ladder, pipeline, hook, state)
bun install
bun run check # typecheck, tests, rebuild bundles, fail if committed bundles are stale
TYPESAFE_API_KEY=... bun run eval
omp plugin link . # run your checkout in ompSizing by Jev from TypeSafe. Built on the extension systems of omp and Claude Code.
MIT © Shivansh Pandey