A working gateway in under five minutes
One container, one provider, one request. No account, no signup, no phone-home. If you have Docker, you can be through this page before your coffee lands.
Start the gateway
Embedded mode needs nothing external: state is held in memory, so nothing survives a restart, and there is no Postgres or Redis to stand up yet. The console comes up on the same port, served by the same Rust binary.
$ docker run -p 4000:4000 <registry>/waeg-gateway:<version>Not a working pull: the images are not public yet. Design partners receive the registry details privately.
Registry and version are placeholders — design partners receive them privately. Console at http://localhost:4000/ui/: sign in with the seeded admin account and change its password.
Add a provider
Give it one upstream and one alias, then restart with the file mounted as the comment shows. Aliases are what your application code references, so you can repoint them later without touching the application.
# waeg.yaml
providers:
openai:
provider: openai
api_key_env: OPENAI_API_KEY # or api_key_ref: a vault reference
models:
- name: chat # what your code sends as "model"
deployments:
- provider: openai
model_id: gpt-4o
# Restart with it mounted:
# docker run -p 4000:4000 -e OPENAI_API_KEY \
# -v "$PWD/waeg.yaml:/etc/waeg/waeg.yaml" \
# <registry>/waeg-gateway:<version> serve --config /etc/waeg/waeg.yamlPoint your SDK at it
Wäg serves the OpenAI-compatible surface, so the only thing that changes is the base URL. Your SDK, request shapes, streaming behaviour and tool calling are unchanged.
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:4000/v1", # the only change
api_key="<your-waeg-virtual-key>", # created in the console
)
resp = client.chat.completions.create(
model="chat",
messages=[{"role": "user", "content": "Hello"}],
)Check the response headers. This is the first visible sign that something decided something, rather than merely forwarding it:
| Header | What it tells you |
|---|---|
x-waeg-routed-model | Which deployment actually served the request. |
x-waeg-route-reason | Why the router chose it — for intelligent routing and session affinity. |
x-waeg-cache | On a cache hit, which of the four tiers answered. |
See it in the console
Open the console and the request is already there: traffic, latency, tokens, the routing decision and any policy verdicts. Cost appears once the bundled price pack is loaded under Usage & cost → Pricing. Nothing else was configured — it is what passing through the request path produces.
Where to go from here
Migrating from LiteLLM
Import your existing config with one command, run both in parallel, and cut over when the numbers agree.
Deploying for real
The Wäg operator runs the gateway from one custom resource — scaling, rollouts, checks on its dependencies — and a Helm chart is there too. Bring Postgres, OpenFGA, Redis and an object store.
Adding governance
Hierarchical budgets, the policy chain, agent and MCP control, audit records.
Wäg is in private preview, so the image address above is a placeholder. Design partners receive the built, signed images and the registry details privately, with hands-on onboarding.