Model router for coding agents

Every prompt, routed to the right model.

One endpoint and one model name, jev-auto, for Claude Code, Codex and Cursor. Renames go to a fast model; race conditions go to a frontier one.

$npm install -g jevrouter
$jev serve && jev setup
0 dependencies~30 ms startup9 providersMIT licence
POST /v1/messages
Task
hard_debugging
Tier
frontier
Model
anthropic/claude-opus-5-5
x-jev-route: anthropic/claude-opus-5-5; task=hard_debugging; tier=3

Runs natively on Anthropic's own API, so the stream passes straight through.

How a request moves

Your agent talks to JEV. JEV picks the model.

JEV routes with a few rules that run in microseconds, with no extra LLM call. When the model speaks the client's protocol, bytes stream through untouched. When it doesn't, JEV translates both ways, including tool calls.

Claude CodeAnthropic Messages
CodexOpenAI Responses
CursorOpenAI Chat

jev-auto

  1. ConstraintsKey present, context fits, supports tools and vision
  2. ClassifyRename, debug, refactor, review… sets the tier
  3. RankClosest tier, native protocol first, then price
  4. StickTool loops stay on one model, which keeps caches warm
  5. Recover429 or 5xx falls back; repeated tool errors move up a tier
Anthropic
OpenAI
Gemini
DeepSeek
Groq
Cerebras
OpenRouter
Mistral
Ollamalocal models, no data leaves your machine
Setup

Two commands, then use your tools as usual.

jev setup finds your clients, backs up their config and points them at JEV. jev uninstall-config restores every file exactly.

  1. Install and add a key

    Any provider works. Gemini and Groq have free tiers.

  2. Start JEV

    jev serve listens on 127.0.0.1:4000.

  3. Run jev setup

    This writes six env entries into ~/.claude/settings.json. Then run claude as normal.

~/.claude/settings.json
{
  "env": {
    "ANTHROPIC_BASE_URL": "http://127.0.0.1:4000",
    "ANTHROPIC_AUTH_TOKEN": "<your JEV key>",
    "ANTHROPIC_MODEL": "jev-auto",
    "ANTHROPIC_DEFAULT_SONNET_MODEL": "jev-auto",
    "ANTHROPIC_DEFAULT_OPUS_MODEL": "jev-smart",
    "ANTHROPIC_DEFAULT_HAIKU_MODEL": "jev-fast"
  }
}
Model names

Five names that work in every client.

Set it once. Change behaviour by changing the name, not the provider.

NameWhat it doesUse it for
jev-autoClassifies each prompt and picks the tierEverything (the default)
jev-fastFast tier onlyTitles, small edits, quick answers
jev-smartFrontier tier onlyHard bugs, architecture, security work
jev-cheapLowest-priced available modelBulk or background jobs
jev-freeFree-tier and local providers onlyZero spend; with Ollama alone, fully offline
Compatibility

What works today.

FeatureClaude CodeCodexCursor
Routing through JEVYesYesChat and Agent
Automatic setupYesYesPaste 3 values
Streaming and tool callsYesYesYes
Fallback and escalationYesYesYes
Works with local jev serveYesYesNeeds a public URL
Tab completionn/an/aHandled by Cursor
MCP toolkit

Turn an API into tools your agent can use.

Start from a template or an OpenAPI spec. Generated servers are one file with no dependencies, and they run free on Cloudflare Workers.

  1. jev mcp import openapi.json

    Each operation becomes a tool. DELETE, admin and internal endpoints are skipped unless you pass --all.

  2. jev mcp test .

    Runs the handshake, checks schemas and calls every read-only tool, all without starting a server.

  3. jev mcp lint .

    Scores names and descriptions, marks tools read-only, write or destructive, and blocks committed secrets.

  4. jev mcp deploy

    Gives you a free public URL on workers.dev.

  5. jev mcp install pets <url>

    Adds the server to every client it finds and prints a one-click Cursor link.

    Claude CodeCodexCursor
jev mcp import petstore.jsonreal output
$ jev mcp import petstore.json

  4 endpoints → 2 tools
  [x] get_pet_by_id         GET /pet/{petId}
  [x] find_pets_by_status   GET /pet/findByStatus
  [ ] DELETE /pet/{petId}   skipped: destructive
  [ ] POST /admin/flush     skipped: internal

$ jev mcp test pet-store-mcp

  ✓ initialize → pet-store-mcp 0.1.0
  ✓ tools/list → 2 tools
  ✓ get_pet_by_id: schema valid
  ✓ get_pet_by_id({"petId":1}) → 1423 ms
  ⚠ find_pets_by_status({}) → 400 missing `status`

  8 passed, 1 warnings, 0 failed

$ jev mcp lint pet-store-mcp

  MCP tool quality: 82/100
  ⚠ get_pet_by_id   READ_ONLY   parameters without description: petId
Free cloud

Run it in the cloud for $0.

The same code runs on Cloudflare Workers' free plan, which allows 100,000 requests a day with no cold starts. JEV refuses every request until you set a key, so it never runs as an open proxy.

Deploy
npx wrangler login
jev deploy                                   # prints your JEV key
npx wrangler secret put GEMINI_API_KEY       # once per provider key
jev setup --url https://jev.<you>.workers.dev --key <your JEV key>
FreeHosting

Cloudflare Workers is the main target. Deno Deploy and Vercel Edge run the same file.

Free tiersModels

Gemini, Groq, Cerebras and OpenRouter :free models. Use jev-free to stay on them.

Always freeA VM for local models

Oracle Cloud's ARM VM can run small Ollama models on its CPU.

No good optionGPUs

There's no reliable free GPU for serving models. Colab and Kaggle forbid it, so use the free APIs instead.

Stop choosing models by hand.

Install JEV, run jev setup, and keep working.