agentleFS
gacabartoszgacabartosz/claude-smart-router/SKILL.md

smart-router

Skill0 starsChanged 8 months agoMITView on GitHub

FusionRoute-inspired intelligent model router for Claude Code. Automatically classifies task complexity and routes to the cheapest capable model (Haiku/Sonnet/Opus) via subagents, saving tokens and money. Use when the user wants to run a task cost-efficiently, or invoke with /route. Trigger on: "/route", "route this", "smart route", "model router", "cheap mode", "save tokens", "cost efficient", "route task".

3 other projects use a version of this.

Adopted by

Most recently taken up by

  • Other versions3 projects use a version of this.

    Word for word · 0

    None found.

    Edited · 0

    None found.

    Wrote their own version · 3

    1. databricks/unity-gateway★ 121same name
    2. Jonassuhard/claude-code-soul★ 1same name
    3. c0nSpIc0uS7uRk3r/smart-router★ 0same name

    How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.

The file

Show its rules and text

We split this skill into the rules it gives an agent

15 rules. About 0 are common, 14 are distinctive, and 1 is very specific to this project.

  • ≈0

    Common · estimate

    Many files like this have a rule of this kind.

  • ≈14

    Distinctive · estimate

    This author's own choices. Worth a look.

  • 1

    Very specific

    Tied to their project's names, files or tools. Probably skip.

  • Common
  • Distinctive
  • Very specific
  1. Distinctive:

    Every task has a minimum model capability threshold.

    line 27
  2. Distinctive:

    Before scoring, check these instant-match patterns:

    line 74
  3. Distinctive:

    No file creation mentioned

    line 78
  4. Distinctive:

    No words: "all files", "across", "everywhere", "every"

    line 79
  5. Distinctive:

    The TRIM insight: only critical steps (those likely to derail the solution) need expensive models.

    line 124
  6. Distinctive:

    If a lower-tier model produces an inadequate result, escalate automatically.

    line 216
  7. Distinctive:

    Agent asks for clarification: instead of answering → escalate

    line 221
  8. Very specific:

    Only escalate if: cost_of_retry < cost_of_having_used_higher_tier_from_start

    line 236
  9. Distinctive:

    Don't escalate more than once per step.

    line 239
  10. Distinctive:

    If the user's message is a follow-up to a previous routed task:

    line 246
  11. Distinctive:

    When spawning agents for follow-up work, include:

    line 253
  12. Distinctive:

    When subtasks are independent, launch multiple agents simultaneously in a SINGLE message (Claude Code runs them in parallel):

    line 262
  13. Distinctive:

    After every routed task, display:

    line 303
  14. Distinctive:

    When spawning any subagent, the prompt MUST include:

    line 344
  15. Distinctive:

    Do not modify any other functions in the file."`

    line 356

≈ “Common” is an estimate: at least 1 in 5 of the 350,495 skill files we read have a rule of the same kind, not the same words. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.

Keep what fits and drop the rest. Your version, ready for your agents.
Files
SKILL.md

Smart Router for Claude Code

Multi-paper synthesis: FusionRoute (Meta AI, 2026), RouteLLM (LMSYS, ICLR 2025), TRIM (step-level routing, 2025), xRouter (RL cost-aware, 2025), LLMRouter (UIUC, 16+ strategies, 2025)

Task-level model routing for Claude Code: classifies task complexity and delegates to the cheapest capable model via the Agent tool's model parameter.

Core Principle

Don't use Opus to grep a file. Don't use Haiku to architect a system.

Every task has a minimum model capability threshold. Routing to that threshold saves 30–75% of token costs without sacrificing quality.


Architecture

User Task
    │
    ▼
┌──────────────────────────────┐
│  STAGE 1: FAST RULES (~0ms)  │  ← Pattern matching, zero cost
│  Keyword + scope analysis     │
└──────────┬───────────────────┘
           │ match?
     ┌─────┴─────┐
     │ YES       │ NO
     ▼           ▼
  Route      ┌──────────────────────────────┐
  directly   │  STAGE 2: SCORING (in-agent)  │  ← Multi-dimensional scoring
             │  Intent + Scope + Ambiguity   │
             │  + Creation + Stakes + Context │
             └──────────┬───────────────────┘
                        │
                   ┌────┴────┐
                   ▼         ▼         ▼
               ┌───────┐ ┌───────┐ ┌───────┐
               │ HAIKU │ │SONNET │ │ OPUS  │
               │  ⚡    │ │  ⚖️    │ │  🧠   │
               └───┬───┘ └───┬───┘ └───┬───┘
                   │         │         │
                   └────┬────┘─────────┘
                        ▼
                  ┌───────────────┐
                  │ STAGE 3:      │
                  │ ESCALATION    │  ← If result is inadequate,
                  │ (if needed)   │     auto-retry on next tier
                  └───────────────┘

Two-Stage Classification (inspired by claude-router + RouteLLM)

Stage 1: Fast Rules (zero-cost pattern matching)

Before scoring, check these instant-match patterns:

→ HAIKU instantly if ALL true:

  • Task verb is: read, find, grep, search, list, show, count, what is, where is, explain, format, convert
  • No file creation mentioned
  • No words: "all files", "across", "everywhere", "every"
  • Single target (one file, one function, one concept)

→ OPUS instantly if ANY true:

  • Task contains: design, architect, plan, migrate, security audit, vulnerability
  • Task is explicitly vague: "make it better", "improve", "optimize" (without specific target)
  • Task mentions: "production", "deploy", "breaking change"
  • Task scope: "entire codebase", "all services", "whole system"

→ SONNET instantly if ALL true:

  • Task verb is: fix, add, edit, update, refactor, test, write test, implement
  • Specific file(s) or function(s) named
  • Single concern

If no instant match → proceed to Stage 2 scoring.

Stage 2: Multi-Dimensional Scoring

Score each dimension 0–2, then sum:

Dimension0 (Low)1 (Medium)2 (High)
Intentread, find, list, explainfix, add, edit, test, refactordesign, build, migrate, audit
Scope1 file, named target2–5 files, named module5+ files, unknown, "everywhere"
AmbiguityExact: "line 42", "function X"Bounded: "the auth module"Vague: "make it better"
CreationNo new codeModify existing codeNew files, new module
StakesDev, local, reversibleShared code, tests existProd, security, data, irreversible
Context needsSelf-contained, no historySome prior conversationNeeds full conversation history

Routing thresholds:

score 0–3  → HAIKU
score 4–6  → SONNET
score 7–12 → OPUS

Tie-break rule (from RouteLLM): when score is exactly on a boundary (3 or 7), prefer one tier UP. Cost of failure > cost of upgrading.


Step-Level Routing (from TRIM)

For multi-step tasks, don't route the entire task — route EACH STEP independently.

The TRIM insight: only critical steps (those likely to derail the solution) need expensive models. Routine continuation steps can use cheaper models.

Decomposition Pattern

User: "Build a user preferences feature with API, UI, and tests"

Step 1: EXPLORE (what exists?)
  → [⚡ HAIKU] Read existing user model, API patterns, test structure
  → Output: context summary for next steps

Step 2: DESIGN (how should it work?)
  → [🧠 OPUS] Design schema, API contract, UI structure
  → Output: concrete plan with file paths and interfaces

Step 3: IMPLEMENT API (follow the plan)
  → [⚖️ SONNET] Implement endpoints per Opus's plan
  → Output: working API code

Step 4: IMPLEMENT UI (follow the plan)
  → [⚖️ SONNET] Build React component per Opus's plan
  → Output: working UI code

Step 5: WRITE TESTS (pattern-follow)
  → [⚖️ SONNET] Write tests following existing test patterns
  → Output: test files

Step 6: VERIFY (mechanical check)
  → [⚡ HAIKU] Run tests, check lint, verify build
  → Output: pass/fail status

Critical Step Detection (from TRIM)

A step is critical (route to higher tier) if:

  • It involves irreversible decisions (schema design, API contract)
  • Errors cascade downstream (wrong architecture → all implementation wrong)
  • It requires novel reasoning (no existing pattern to follow)
  • It involves trade-offs (performance vs. readability, security vs. convenience)

A step is routine (safe for lower tier) if:

  • It follows a plan already made by a higher tier
  • It follows existing patterns in the codebase
  • It's mechanical (run tests, check lint, format code)
  • The output is easily verifiable (tests pass or they don't)

Orchestration Mode (inspired by claude-router + opusplan)

For complex tasks, use Opus as strategist + Sonnet/Haiku as executors:

┌─────────────────────┐
│  🧠 OPUS (planner)   │ ← Thinks about WHAT to do
│  Designs the approach │
│  Splits into subtasks │
└──────────┬──────────┘
           │ plan
    ┌──────┴──────┐
    ▼             ▼
┌─────────┐  ┌─────────┐
│⚖️ SONNET │  │⚡ HAIKU  │ ← Does the work
│implement │  │search   │
│test      │  │verify   │
└─────────┘  └─────────┘

Invoke with: /route orchestrate: <complex task>

The Agent tool call for planning:

Agent(
  model: "opus",
  subagent_type: "Plan",
  prompt: "Analyze this task and create a step-by-step execution plan.
           For each step, specify:
           1. What to do (concrete, actionable)
           2. Which tier: haiku/sonnet/opus
           3. What context/files are needed
           4. What output to return
           Task: <user's task>"
)

Then execute each step with the tier Opus specified.


Confidence-Based Escalation (from TRIM + xRouter)

If a lower-tier model produces an inadequate result, escalate automatically.

When to escalate:

  1. Agent returns "I'm not sure" or "I can't determine" → escalate
  2. Result is suspiciously short (< 2 lines for a code task) → escalate
  3. Agent asks for clarification instead of answering → escalate
  4. Code has obvious issues (syntax errors, missing imports) → escalate
  5. Task took multiple retries at the same tier → escalate

Escalation protocol:

Attempt 1: [⚡ HAIKU] → inadequate result
Attempt 2: [⚖️ SONNET] → include: "Previous attempt by a smaller model was insufficient.
            Here was its output: <haiku_output>. Please provide a better solution."
Attempt 3: [🧠 OPUS] → same pattern, include both prior outputs

Show the user: [⚡→⚖️ ESCALATED] Haiku couldn't handle this, routed to Sonnet.

Cost guard (from xRouter):

Only escalate if: cost_of_retry < cost_of_having_used_higher_tier_from_start

In practice: always escalate (retry cost is ~50% of total, but success rate increases dramatically). Don't escalate more than once per step.


Multi-Turn Context Awareness

Follow-up detection:

If the user's message is a follow-up to a previous routed task:

  • Same topic, minor change → use SAME tier as before
  • "Also..." / "And..." → keep current tier
  • "Actually, redesign..." → re-classify (might need higher tier)
  • "Looks good, now test it" → likely lower tier (mechanical)

Context passing:

When spawning agents for follow-up work, include:

  • Previous step's output/result
  • Relevant file paths discovered earlier
  • Decisions made in prior steps

Parallel Routing

When subtasks are independent, launch multiple agents simultaneously in a SINGLE message (Claude Code runs them in parallel):

// All in one message — runs concurrently:
Agent(model: "haiku",  subagent_type: "Explore",
      prompt: "Find all API route definitions in /src")
Agent(model: "haiku",  subagent_type: "Explore",
      prompt: "Read the database schema in /prisma/schema.prisma")
Agent(model: "sonnet", subagent_type: "general-purpose",
      prompt: "Review /src/middleware/auth.ts for security issues")

Parallelization rules:

  • Independent reads → parallelize on Haiku
  • Independent edits to different files → parallelize on Sonnet
  • Dependent steps → sequential (wait for prior result)
  • Max parallel agents: 4–5 (more causes context confusion)

Subagent Type Mapping

Match the task to the best specialist subagent:

Task CategorySubagent TypeTypical Tier
File search, codebase explorationExplore⚡ Haiku
General research, Q&Ageneral-purpose⚡ Haiku
Frontend code (React, CSS, UI)Frontend Developer⚖️ Sonnet
Backend code (API, DB, server)Backend Architect⚖️ Sonnet
Full-stack implementationSenior Developer⚖️ Sonnet
DevOps, CI/CD, infraDevOps Automator⚖️ Sonnet
Architecture, system designPlan🧠 Opus
Security auditgeneral-purpose🧠 Opus
Code review (quality)general-purpose⚖️ Sonnet

Cost Badges

After every routed task, display:

BadgeMeaning
[⚡ HAIKU]Cheapest route
[⚖️ SONNET]Balanced route
[🧠 OPUS]Full power
[⚡→⚖️ ESCALATED]Auto-escalated from Haiku to Sonnet
[⚡→🧠 ESCALATED]Auto-escalated to Opus
[🧠→⚖️→⚡ ORCHESTRATED]Opus planned, others executed
[MIXED ⚡×3 ⚖️×2 🧠×1]Decomposed across tiers

Override Commands

CommandEffect
/route <task>Auto-classify and route
/route haiku: <task>Force Haiku
/route sonnet: <task>Force Sonnet
/route opus: <task>Force Opus
/route orchestrate: <task>Opus plans, others execute
"full power" / "use opus"Override to Opus
"cheap" / "fast" / "save tokens"Override to Haiku

Anti-Patterns

  1. Don't route one-liner questions — just answer directly, agent overhead isn't worth it
  2. Don't route tasks needing full conversation history — subagents start fresh
  3. Don't downgrade security-critical tasks — always Opus for security
  4. Don't chain 5+ sequential agents — overhead exceeds savings; use one Sonnet
  5. Don't forget full context in prompts — subagents have NO prior conversation
  6. Don't parallelize dependent steps — wait for outputs before starting next

Context Handoff Checklist

When spawning any subagent, the prompt MUST include:

  • Working directory or absolute file paths
  • Clear instruction — what to do, specifically
  • Expected output — what to return (code, file paths, summary, pass/fail)
  • Constraints — what NOT to touch, style requirements
  • Prior context — if this is a follow-up, include relevant prior outputs
  • File contents — if the agent needs to see code, include it or tell it which files to read

Bad: "fix the bug" → Agent has no context. Good: "In /src/auth/login.ts, the validateToken function at line 42 throws TypeError when token is expired instead of returning null. Fix it to return null for expired tokens. Do not modify any other functions in the file."


Pricing Reference (Claude, March 2026)

ModelInput $/MTokOutput $/MTokRelative Cost
Haiku 4.5$0.80$4.001×
Sonnet 4.6$3.00$15.003.75×
Opus 4.6$15.00$75.0018.75×

Savings Estimates

Workload ProfileAlways OpusSmart RoutedSavings
Explorer (70% search, 20% edit, 10% complex)100%~25%~75%
Developer (40% search, 40% edit, 20% complex)100%~45%~55%
Architect (20% search, 30% edit, 50% complex)100%~65%~35%

Examples

Example 1: Instant Haiku match

/route find all TODO comments

Stage 1 match: verb=find, single target, no creation → HAIKU
→ Agent(model: "haiku", subagent_type: "Explore", ...)
→ [⚡ HAIKU] Found 23 TODOs across 8 files.

Example 2: Scored to Sonnet

/route fix pagination — page 2 shows same results as page 1

Stage 1: verb=fix, specific bug → SONNET instant match
→ Agent(model: "sonnet", subagent_type: "Senior Developer", ...)
→ [⚖️ SONNET] Fixed offset calculation in src/api/list.ts:28

Example 3: Orchestration

/route orchestrate: add user preferences with API, UI, tests

Step 1: [🧠 OPUS Plan]    → Design schema, API, and component structure
Step 2: [⚡ HAIKU Explore] → Read existing patterns (parallel)
Step 3: [⚖️ SONNET impl]   → Implement API endpoints
Step 4: [⚖️ SONNET impl]   → Build preferences React panel
Step 5: [⚖️ SONNET test]   → Write integration tests
Step 6: [⚡ HAIKU verify]  → Run tests & lint
→ [🧠→⚖️→⚡ ORCHESTRATED] Feature complete. ~45% saved vs all-Opus.

Example 4: Escalation

/route explain the caching invalidation strategy in this codebase

Try: [⚡ HAIKU] → "I found cache.ts but I'm not sure how invalidation works across services"
Escalate: [⚖️ SONNET] → "The caching uses event-driven invalidation via Redis pub/sub.
  When a record changes in UserService, it publishes to 'user:changed' channel.
  CacheService subscribes and invalidates matching keys. See src/cache/subscriber.ts:15."
→ [⚡→⚖️ ESCALATED] Done.

Research References

Paper / ToolKey Insight Applied
FusionRoute (Meta, 2026)Expert selection + complementary correction at each step
RouteLLM (LMSYS, ICLR 2025)Threshold-based routing with win rate prediction, 2× savings
TRIM (2025)Step-level routing: only critical steps need expensive models, 5× efficiency
xRouter (2025)RL cost-aware routing, Pareto frontier, 80% cost reduction
LLMRouter (UIUC, 2025)16+ routing strategies (KNN, SVM, Graph, Agentic)
RouterBench (2024)Benchmark for multi-LLM routing, 405k inference outcomes
claude-router (2026)Two-tier rules+LLM classification, orchestration mode
Claude Code opusplanNative Opus→Sonnet plan/execute split

Download now (ZIP)

Does it work?

Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.

No reviews yet

People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.

  • It worked
  • Partly
  • It didn't
What did you use it for? e.g. Reviewing pull requests in a Rails app

Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.

Your trail

Files you open will collect here, so you can find them again.

Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.

Now do this for your own.

Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.