{"slug": "jev-based-effort-router-picks-claude-code-s-reasoning-effort-for-each-prompt", "title": "JEV based Effort-router picks Claude Code's reasoning effort for each prompt", "summary": "A Claude Code plugin called effort-router, installed via the command `claude plugin install effort-router@effort-router`, selects reasoning effort per turn from low, medium, high, and xhigh using the Jev classifier hosted on TypeSafe's API. The plugin requires Claude Code 2.1.283 or later, starts in shadow mode that logs recommendations without applying them, and switches to enforce mode via `/effort-router enforce`; its default classifier timeout is five seconds and the Mods API is early access. The classifier receives limited excerpts of prompts, recent answers, repository summaries, and Read/Grep/Glob results, which hosted Jev sends to TypeSafe, so users with data-residency requirements must point the plugin at their own endpoint implementing `POST /v1/systemone`.", "body_md": "effort-router is a Claude Code plugin that chooses reasoning effort for each turn. It uses your prompt, recent conversation, and inspected code to estimate how much reasoning the task needs. The spinner shows the effort sent with each request.\n\nIt starts in **shadow mode**, which logs recommendations without changing effort. **Enforce mode** applies them. The default classifier is [Jev](https://learnjev.com/reference) on TypeSafe's API; you can use a compatible System One service instead.\n\nRequires Claude Code 2.1.283 or later and a model that supports effort. The Mods API is early access and may change between releases.\n\nMerge this into `~/.claude/settings.json`:\n\n```\n{\n  \"env\": {\n    \"CLAUDE_CODE_ENABLE_FUNCTION_HOOKS\": \"1\",\n    \"TYPESAFE_API_KEY\": \"<your key>\"\n  }\n}\n```\n\nThen install:\n\n```\nclaude plugin marketplace add totally-tim/effort-router\nclaude plugin install effort-router@effort-router\n```\n\nStart a new Claude session. Check the recommendations with `/effort-router`, then run `/effort-router enforce` to apply them for that session. Set `mode` to `enforce` under the plugin in `/config` to keep that setting.\n\nTo update, run these commands and start a new session:\n\n```\nclaude plugin marketplace update effort-router\nclaude plugin update effort-router@effort-router\n```\n\n| Command | What it does | \n|---|---|\n| `/effort-router` | Shows mode, classifier health, last decision, cache counts, and log path | \n| `/effort-router why` | Shows the last completed turn's full record | \n| `/effort-router shadow` | Logs recommendations without applying them | \n| `/effort-router enforce` | Applies recommendations | \n| `/effort-router off` | Disables routing | \n| `/effort-router wrong <level>` | Labels the last turn with the effort you expected | \n\nThe spinner and completed-turn line show the effort the router sent. Claude's built-in effort display still shows the session setting.\n\n`router: needs context` means the classifier answered, but lacks evidence to justify lowering effort. A timeout or service error keeps at least the session effort. The router retries on later requests and pauses briefly after repeated failures; recovery does not require a restart.\n\nThe router chooses from `low`, `medium`, `high`, and `xhigh`. Missing context prevents it from lowering effort below the session's starting level. An ambiguous prompt such as \"how does this work?\" needs evidence about the code it refers to.\n\nReading code can resolve that uncertainty and allow a lower level before work begins. Once work begins, the router can only raise effort. Task continuations retain the prior task's effort floor. Messages you send during a turn and repeated tool failures can also raise effort.\n\nManual effort overrides take precedence; `max` stays manual. The router leaves subagents alone. Routing for `claude -p` and SDK sessions is off unless you enable `headless`.\n\nSet plugin options in `/config` or `pluginConfigs` in Claude settings. Explicit options override environment variables.\n\n| Option | Environment variable | Default | \n|---|---|---|\n| `baseUrl` | `TYPESAFE_BASE_URL` | `https://api.typesafe.ai` | \n| `model` | `TYPESAFE_DEFAULT_MODEL` | `jev-latest` | \n| `keyFile` ,`keyName` | `TYPESAFE_API_KEY` | No key | \n\nA key file can contain a plain token or a JSON object with the field named by `keyName`. Compatible classifiers must implement `POST /v1/systemone`.\n\nThe default range is `low` through `xhigh`, with a five-second classifier timeout. See the [plugin manifest](https://github.com/totally-tim/effort-router/blob/main/.claude-plugin/plugin.json) for all options and defaults.\n\nThe classifier receives limited excerpts of prompts, recent answers, repository summaries, and Read/Grep/Glob results. Hosted Jev sends these to TypeSafe. Use your own endpoint if that data must stay on your infrastructure.\n\nThe router filters credential paths and common token patterns, but cannot guarantee secret removal. It does not collect shell or MCP results directly; assistant answers can still repeat them.\n\nDecision logs and resume checkpoints stay in `~/.local/state/effort-router`. They contain prompt and answer excerpts. Checkpoints omit tool output. Files accumulate without automatic deletion.\n\n```\nexport CLAUDE_CODE_ENABLE_FUNCTION_HOOKS=1\nclaude plugin validate .claude-plugin/plugin.json\nclaude plugin test .\nbun eval/replay-check.ts\nbun e2e/e2e.ts\n```\n\nThe E2E suite uses real Claude sessions and quota. Live classifier scenarios need `TYPESAFE_API_KEY`; the runner lists them as skipped when the key is absent.\n\nSee the [evaluation guide](https://github.com/totally-tim/effort-router/blob/main/eval/README.md) for replay and labeling, and the [implementation report](https://github.com/totally-tim/effort-router/blob/main/eval/results/2026-09-28-implementation.md) for results and remaining limits. Label agreement does not establish task success or cost savings; hosted Jev has not been evaluated.\n\nTwo known Claude cache failures remain. `/effort-router` reports observed misses, but a miss after an effort change does not prove the change caused it. The E2E runner exits `3` when only known cache failures occur, `1` for other failures, and `0` when all executed scenarios pass.", "url": "https://wpnews.pro/news/jev-based-effort-router-picks-claude-code-s-reasoning-effort-for-each-prompt", "canonical_source": "https://github.com/totally-tim/effort-router", "published_at": "2026-09-28 15:56:46+00:00", "updated_at": "2026-09-28 16:20:53.279892+00:00", "lang": "en", "topics": ["ai-agents", "ai-tools", "developer-tools", "large-language-models"], "entities": ["effort-router", "Claude Code", "Jev", "TypeSafe", "System One", "totally-tim"], "also_reported_by": [], "alternates": {"html": "https://wpnews.pro/news/jev-based-effort-router-picks-claude-code-s-reasoning-effort-for-each-prompt", "markdown": "https://wpnews.pro/news/jev-based-effort-router-picks-claude-code-s-reasoning-effort-for-each-prompt.md", "text": "https://wpnews.pro/news/jev-based-effort-router-picks-claude-code-s-reasoning-effort-for-each-prompt.txt", "jsonld": "https://wpnews.pro/news/jev-based-effort-router-picks-claude-code-s-reasoning-effort-for-each-prompt.jsonld"}}