OpenAI-compatible LLM gateway with API key management, budget enforcement, and usage tracking.
gateway sits between your applications and LLM providers so you can control access, cost, and observability in one place.
- OpenAI-compatible endpoints (
/v1/chat/completions,/v1/embeddings,/v1/models) - Virtual API key management (
/v1/keys) for safe client access - User and budget controls (
/v1/users,/v1/budgets) - Usage and pricing tracking (
/v1/messages,/v1/pricing) - Health and metrics endpoints (
/health, optional/metrics)
uv venv
source .venv/bin/activate
uv sync --devcp config.example.yml config.ymlEdit config.yml and set at least:
master_key- one provider credential in
providers(for exampleopenai.api_key)
uv run gateway serve --config config.ymlOpen API docs at http://localhost:8000/docs.
Platform mode is enabled automatically when ANY_LLM_PLATFORM_TOKEN is set.
- Export platform env vars:
export ANY_LLM_PLATFORM_TOKEN=gw_xxx
export PLATFORM_BASE_URL=https://your-platform.example/api/v1- Start the gateway:
uv run gateway serve --config config.ymlNotes:
GATEWAY_MODEis optional; effective mode is derived fromANY_LLM_PLATFORM_TOKEN.- If you explicitly set
GATEWAY_MODE=platform, startup fails unlessANY_LLM_PLATFORM_TOKENis also set. - In platform mode, local
providersconfiguration is not used.
On startup, the gateway can bootstrap an API key in logs. Export it as GATEWAY_API_KEY, then call the gateway as an OpenAI-compatible server:
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["GATEWAY_API_KEY"],
base_url="http://localhost:8000/v1",
)
response = client.chat.completions.create(
model="openai:gpt-4o",
messages=[{"role": "user", "content": "Hello from gateway"}],
)
print(response.choices[0].message.content)Run with hot reload and .env:
cp .env.example .env
make devmake test
make lint
make typecheckRun a single test file:
uv run pytest tests/unit/test_gateway_cli.py -vThe gateway image is published on Docker Hub.
cp config.example.yml config.yml
docker compose up -ddocker run --rm \
-p 8000:8000 \
-v "$(pwd)/config.yml:/app/config.yml:ro" \
mzdotai/gateway:latest \
gateway serve --config /app/config.ymlGateway will be available at http://localhost:8000.
GET /healthPOST /v1/chat/completionsPOST /v1/embeddingsGET /v1/modelsPOST/GET /v1/keysPOST/GET /v1/usersPOST/GET /v1/budgetsGET /v1/messagesGET /v1/pricing
Full schema: docs/public/openapi.json
uv run gateway init-db --config config.yml
uv run gateway migrate --config config.yml
uv run gateway migrate --config config.yml --revision <rev>
uv run python scripts/generate_openapi.py --checkApache 2.0. See LICENSE.