weave-os/router

▲ 3,412 stars today★ 4,336⑂ 117

Model router for agentic systems. Routes every prompt to the right model in <50ms. Cut costs 40-70% with just an endpoint change.

4,336Star
117Fork
0Watch
0Issue
GoLanguage
-License
Created · last push · repository size 0 KB · default branch -

README

https://github.com/weave-os/router/blob/HEAD/Group 1(1)

One endpoint. Every model. Always the right one.

A drop-in proxy for Anthropic, OpenAI, and Gemini that picks the best model for every request: using a tiny on-box embedder, not a vibes-based prompt.

Weave Badge Go Tests License: ELv2 Managed deployment

*Built by Weave: The #1 engineering intelligence platform, loved by Robinhood, PostHog, Reducto, and hundreds of others.*

---

What it does

Point Claude Code, Codex, Cursor, or your own app at localhost:8080. The router:

Avengers-Pro [^1] picks the right model from your enabled providers, for every upstream API request. (See docs/SEMANTICS.md for the canonical terminology: the router routes per action, not per turn.) Gemini native. Streaming, tools, vision, the works. OpenRouter (or any OpenAI-compatible endpoint). Grafana, whatever.

30-second quickstart

The fastest way: point Claude Code, Codex, opencode, or pi at the hosted Weave Router with one command. No clone, no Docker, no Postgres.

npx @weave-os/router

That's it. The installer asks which tool (Claude Code, Codex, opencode, or pi), walks you through scope (user vs. project), grabs a router key, and wires the right config file. Other flavors:

npx @weave-os/router --claude              # skip the picker, Claude Code
npx @weave-os/router --codex               # skip the picker, OpenAI Codex CLI
npx @weave-os/router --opencode            # skip the picker, opencode
npx @weave-os/router --pi                  # skip the picker, pi + Loom UI
npx @weave-os/router --scope project       # per-repo, commits settings.json (or .codex/ / opencode.json)
npx @weave-os/router --local               # self-hosted localhost:8080
npx @weave-os/router --base-url https://router.acme.internal
npx @weave-os/[email protected]                 # pin a version

Requires Node ≥ 18 (Claude Code, opencode, and pi paths also need jq). Full flag reference: install/npm/README.md.

The npm package is published as @weave-os/router. The former @workweave/router package remains available as a compatibility alias and continues to receive the same releases.

Or: self-host the whole stack

If you want the router (and dashboard) running on your own box:

# 1. Drop a provider key in. OpenRouter is the recommended baseline.
echo "OPENROUTER_API_KEY=sk-or-v1-..." >> .env.local

2. Set a dashboard password. Without one, inference still runs but

dashboard administration is disabled.

echo "ROUTER_ADMIN_PASSWORD=replace-with-a-strong-password" >> .env.local

3. Boot Postgres + router on :8080 and seed an rk_ key.

make full-setup

The router is up at , the dashboard at , and your rk_... key prints in the logs.

# Call it like Anthropic
curl -sS http://localhost:8080/v1/messages \
  -H "Authorization: Bearer rk_..." \
  -d '{"model":"claude-sonnet-4-5","max_tokens":256,
       "messages":[{"role":"user","content":"hi"}]}'

...or like OpenAI

curl -sS http://localhost:8080/v1/chat/completions \ -H "Authorization: Bearer rk_..." \ -d '{"model":"gpt-4o-mini", "messages":[{"role":"user","content":"hi"}]}'

Peek at the routing decision without proxying

curl -sS http://localhost:8080/v1/route -H "Authorization: Bearer rk_..." -d '...'

What that stack looks like

Only the grey boxes are off your machine. The router, the scorer, Postgres, and your provider keys all stay local; prompts go from the router straight to the provider you configured, never to Weave.

flowchart LR
    client["Claude Code, Codex, opencode,
pi, Cursor, your own app"] router["Router :8080
/v1/messages · /v1/chat/completions
/v1beta/models · /v1/route"] scorer["Cluster scorer
in-process ONNX embedder"] hmm["HMM policy sidecar :8093
optional, make up-hmm"] pg[("Postgres
installations, rk_ keys,
encrypted BYOK keys, usage")] ui["Dashboard /ui
selfhosted mode only"] providers["Anthropic · OpenAI · Gemini
OpenRouter and any
OpenAI-compatible endpoint"] otel["Your OTLP collector
Honeycomb, Datadog, Grafana"]

client -->|"rk_… bearer token,
streamed response back"| router router -->|"embed and score the action"| scorer router -.->|"ROUTER_DEFAULT_STRATEGY=hmm"| hmm router -->|"auth, config, usage"| pg pg --> ui router -->|"provider key from env or BYOK"| providers router -.->|"spans and usage logs"| otel

classDef external fill:#f4f4f5,stroke:#a1a1aa,color:#3f3f46 class providers,otel external

Multi-replica deployments also need Pub/Sub (PUBSUB_*) for cache invalidation; docker compose runs the emulator for you.

Optional: self-host the frozen HMM policy

The default stack uses the in-process cluster scorer. To run the frozen HMM policy as a companion container, add a Google API key and use the opt-in target:

echo 'GOOGLE_API_KEY=...' >> .env.local
make up-hmm

This does not change the default strategy. See sidecars/hmm/README.md for artifact verification, embedding compatibility, and explicit HMM selection.

Wire it into your tools

Claude Code. Run make install-cc to wire Claude Code at the local self-hosted router (it's also invoked automatically at the end of make full-setup). For the hosted router, use npx @weave-os/router above.

Codex (OpenAI CLI). npx @weave-os/router --codex patches ~/.codex/config.toml (or /.codex/config.toml with --scope project) with a managed [model_providers.weave] block and sets model_provider = "weave". The provider preserves Codex's existing ChatGPT OAuth login while the router key rides in an X-Weave-Router-Key HTTP header and the installer selects the HMM strategy for the public hosted endpoint. --codex --local and custom self-hosted URLs keep their router's configured default because the HMM sidecar is optional. HMM and forced selections in the native Codex family (gpt-5.6-sol, gpt-5.6-terra, gpt-5.6-luna) use that OAuth credential; every other selected model uses its WorkWeave deployment or BYOK credential, matching the Claude Code plugin's model-to-credential dispatch. Codex does not load third-party slash-command files, so the installer ships the router directives as native Codex skills: $force-model (alias $fm ), $unforce-model (alias $ufm), and `$router-feedback

More Today's Trending projects

1

debpalash / VoiceStudio

Python★ 29,840⑂ 3,606▲ 2,776 stars
2

JustVugg / colibri

C★ 32,609⑂ 3,430▲ 2,173 stars
3

bilawalsidhu / gods-eye-view

JavaScript★ 33,945⑂ 6,772▲ 1,831 stars
4

alibaba / open-code-review

Go★ 26,516⑂ 1,906▲ 1,571 stars
5

ever-co / ever-gauzy

TypeScript★ 6,164⑂ 994▲ 1,130 stars
6

pacifio / atlas

Rust★ 4,440⑂ 274▲ 1,091 stars