Router chooses 1 model for each API action
Weave Router sits between an agent and its model providers, making 1 choice for each upstream API request. One agent turn can contain several of these actions. It accepts Anthropic Messages, OpenAI Chat Completions, and Gemini calls, then forwards the request to the selected provider. Clients keep one endpoint while the model can change underneath them.
The default policy uses an in-process ONNX embedder and cluster scorer. An optional HMM policy runs as a sidecar, and users can pin a model or exclude providers. That is more judgment than a normal retrying gateway makes. It takes a real evaluation set to determine whether the selected model is good enough for your own coding, support, or extraction work.
Self-hosting starts Postgres and the router on port 8080
The hosted npm installer supports Claude Code, Codex, opencode, and pi at user or project scope. Node 18 or newer is required, and some client paths need jq. Cursor support is labeled early beta.
Local hosting asks for an upstream provider credential and ROUTER_ADMIN_PASSWORD, then starts Postgres and the router through the provided setup target. The API and dashboard use port 8080. Clients receive a separate rk_ router key, while provider keys stay behind the service. The optional HMM path adds a sidecar on port 8093 and a Google API key. A multi-replica deployment also needs Pub/Sub so configuration caches are invalidated across processes.
What happened when we ran it
Our sandbox installed 335 packages in 70 seconds and built commit 76a9bbb in 124 seconds. We used an unprivileged Debian container with 3 CPUs, 8 GB of RAM, no secrets, and the golang:1.24-bookworm base image. The checkout was 30.2 MB and held 2,097 files with about 292,642 source lines. Nothing failed during installation or compilation.
The Go test command finished in 107 seconds with 134 passed and 0 failed out of 134. Our scan found 10 CI workflow files, a Dockerfile, a Compose file, and no tests directory. The module itself declares Go 1.25 with toolchain 1.25.9. These results establish that the measured commit builds and its available tests pass in our measurement setup. They do not establish model quality, routing latency, or savings.
Passing 134 tests does not validate a routing policy
A model router can return a valid HTTP response and still make a poor choice. We did not send live prompts to Anthropic, OpenAI, Gemini, or OpenRouter, and we did not compare routed answers with a fixed-model control. That work needs tasks drawn from the jobs your users perform, a quality rubric, provider errors, cost records, and enough repeated runs to catch unstable choices. The README's savings and speed claims were outside our sandbox run.
The protocol surface is useful regardless of the policy result. Router exposes Anthropic, OpenAI, and Gemini routes, health and readiness checks, route inspection, session costs, and analytics exports. OTLP spans can go to an operator's own collector. Still, every extra translation path can mishandle a tool call, streaming event, usage field, or cache rule. A pilot should replay the exact request types your agents use, including vision and forced-model paths.
BYOK secrets are plaintext when 1 encryption setting is absent
The configuration guide is direct: if EXTERNAL_KEY_ENCRYPTION_KEY is unset, customer-supplied provider keys are stored unencrypted in Postgres and the process emits a warning. A malformed keyset stops startup, while a missing one permits the plaintext path. The documented setting expects a Tink AES-256-GCM keyset. Any deployment holding real provider credentials should make that setting mandatory in configuration checks rather than relying on someone noticing a warning.
Two open reports add operational checks. Issue 867 says 1-hour Anthropic cache writes are priced internally with the 5-minute multiplier, producing a 37.5% undercharge in the reporter's reproduction. Issue 789 describes semantic cache reuse across changed preferred-model settings, where the returned body can come from a different model than the response headers name. Both reports were still open, so invoice reconciliation and cache-isolation tests belong in the rollout plan.
Elastic License 2.0 blocks a hosted-router resale
The code is visible and modifiable under Elastic License 2.0, but the license does not permit every use associated with open-source software. Its clearest restriction forbids giving third parties a hosted or managed service that exposes a substantial set of Router's features. It also requires recipients to receive the terms and modified copies to carry prominent modification notices. Internal use can fit the license, while a gateway vendor needs legal review before building a service on it.
This distinction changes the alternative set. Portkey's gateway uses the MIT license, while RouteLLM uses Apache 2.0 and focuses more narrowly on routing research and evaluation. LiteLLM offers a much broader gateway surface. Product fit still comes first, but a team that requires an OSI-approved permissive license can eliminate Weave Router before comparing scorers, dashboards, or its 124-second build.
September 18 activity includes 33 issues and 96 pull requests
GitHub recorded 4,448 stars, 33 open issues, 96 open pull requests, and a last push on September 18, 2026. The latest-release endpoint returned no GitHub Release. Recent issues cover the installer altering a Claude setting and provider environment variables not reaching the self-hosted container. That mix shows active development and a large review queue; it does not say that 129 bugs are open because the combined count includes pull requests.
The clean 134-of-134 result makes Router easier to trial than many young gateways. Production approval should depend on a second set of evidence: route quality on your tasks, exact cost agreement with provider invoices, cache isolation, encrypted credentials, and a permitted license use. If one provider and one model already handle the workload, the 2,097-file gateway is extra machinery. If model choice changes task by task, the trial has a concrete question to answer.

