One key to a hundred models is a good idea. Leaving that key in the app is not. You still need something on your network that caps spend, tokenizes PII, keeps the audit, and keeps embeddings and repeats off that invoice. That's this box: Smartflow in front of OpenRouter, plus a GPU for the cheap work.
OPENROUTER_API_KEY
Local GPU intercept
Same proxy compliance
Not Halo · not air-gap
openrouter/auto. We pass their provider / plugins / transforms through. We do not pretend we are the catalogue.
http://127.0.0.1:7775/v1. Models can be OpenRouter ids (anthropic/claude-sonnet-4.5, openrouter/auto) or a local name (ollama/llama3).
curl -fsSL https://docs.aperion.ai/openrouter/install.sh | sh cd ~/smartflow-openrouter # put OPENROUTER_API_KEY in .env docker compose up -d ./smoke.sh
docker compose --profile local up -d # then pull an embed model: # docker compose exec ollama ollama pull nomic-embed-text
langsmartai/smartflow-enterprise:openrouter-v0.1.0 # air-gap, no Hub: export SMARTFLOW_IMAGE_TAR=/path/to/image.tar.gz
~/smartflow-openrouter. No Smartflow source is downloaded. The image is langsmartai/smartflow-enterprise:openrouter-v0.1.0 — same runtime as cluster1, edition tag. Air-gap gets a docker save tarball. Host Ollama at host.docker.internal:11434 if you don't want the sidecar. Health comes up without an OpenRouter key; cloud calls wait until it's in .env.
| Env | Default | Meaning |
|---|---|---|
SMARTFLOW_OPENROUTER_EDITION | off unless allowlist is edition-shaped | Force the profile on |
OPENROUTER_API_KEY | required | The one cloud secret |
OPENROUTER_INTERCEPT_EMBED | true | Embeddings stay local |
OPENROUTER_INTERCEPT_CODE | false | Code-shaped models stay local |
OPENROUTER_INTERCEPT_PROVIDER | ollama | Where intercepts go |
OPENROUTER_LOCAL_FALLBACK | true | Local fail → OpenRouter once |