Skip to content
sxivansxPublic

About

Jev-powered model router for AI coding agents (omp + Claude Code): small jobs go to smaller, cheaper models.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Repository files navigation

sizeup

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)

How it works

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]
Loading

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)

Design decisions

  • 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.

Benchmark

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.

Install

You need a TypeSafe API key for Jev: console.typesafe.ai. sizeup installs OFF.

omp

omp plugin install github:sxivansx/sizeup

In 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.

Claude Code

/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.

CLI

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

Status and controls

/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.

Privacy

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.

Limitations

  • 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.

Repository layout

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)

Development

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 omp

Credits

Sizing by Jev from TypeSafe. Built on the extension systems of omp and Claude Code.

License

MIT © Shivansh Pandey

About

Jev-powered model router for AI coding agents (omp + Claude Code): small jobs go to smaller, cheaper models.

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages