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.
/v1/chat/completions, /v1/embeddings, /v1/models)/v1/keys) for safe client access/v1/users, /v1/budgets)/v1/messages, /v1/pricing)/health, optional /metrics)uv venv
source .venv/bin/activate
uv sync --dev
cp config.example.yml config.yml
Edit config.yml and set at least:
master_keyproviders (for example openai.api_key)uv run gateway serve --config config.yml
Open API docs at http://localhost:8000/docs.
Platform mode is enabled automatically when OTARI_PLATFORM_TOKEN is set.
export OTARI_PLATFORM_TOKEN=gw_xxx
export PLATFORM_BASE_URL=https://your-platform.example/api/v1
uv run gateway serve --config config.yml
Notes:
GATEWAY_MODE is optional; effective mode is derived from OTARI_PLATFORM_TOKEN.GATEWAY_MODE=platform, startup fails unless OTARI_PLATFORM_TOKEN is also set.providers configuration 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 dev
make test
make lint
make typecheck
Run a single test file:
uv run pytest tests/unit/test_gateway_cli.py -v
The gateway image is published on Docker Hub.
cp config.example.yml config.yml
docker compose up -d
docker run --rm \
-p 8000:8000 \
-v "$(pwd)/config.yml:/app/config.yml:ro" \
mzdotai/gateway:latest \
gateway serve --config /app/config.yml
Gateway 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/pricingFull 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 --check
Apache 2.0. See LICENSE.
Content type
Image
Digest
sha256:bd328bf92…
Size
115.5 MB
Last updated
5 months ago
docker pull mzdotai/gateway