An AI gateway you own and run.
Route one endpoint to 40+ providers, issue virtual keys, enforce budgets, and track usage.
Docs · otari.ai · Launch blog · Discord
English · 简体中文
Note
Developers Wilding, our AI hackathon at MozFest, runs until November 11. Build something with Otari and open-weight models for a chance at the $1,000 prize (plus runner-up prizes) and dedicated time with our AI engineers. Details and submissions.
Otari sits between your applications and model providers. It authenticates requests, resolves provider credentials, enforces budgets before dispatch, and records usage afterwards. Provider calls go through any-llm.
Run Otari with your own database and provider keys.
- One OpenAI and Anthropic-compatible endpoint for many providers
- Provider credentials stay behind the gateway
- Revocable API keys with user, workspace, and model scope
- Budget checks before spend and usage records after settlement
- Local routing policies for failover, conditional selection, traffic splitting, and spill-over past a rate limit
- Optional code execution, web search, MCP, inference guardrails, and file understanding
Run Otari with Docker. It needs no configuration:
docker run -v otari:/data -p 127.0.0.1:8000:8000 mzdotai/otari:latestOn its first start, Otari prints a setup link once, and little else:
Otari 1.0.0 is running at http://localhost:8000
Open this link to choose your password and finish setup:
http://localhost:8000/#/setup?key=otari-mk-...
It is shown only once and carries your master key, so treat it like one.
Open it and choose the email and password you will sign in with. Then add a provider on the dashboard's Hosted providers page and enable default pricing there. The key in the link is the gateway's master key, so keep the link private.
Create an API key in the dashboard, from the setup guide on the Overview or on the API keys page, and send a request with it:
curl http://localhost:8000/api/v1/chat/completions \
-H "Authorization: Bearer tk-..." \
-H "Content-Type: application/json" \
-d '{
"model": "openai:gpt-4o-mini",
"messages": [{"role": "user", "content": "Say hello."}]
}'OpenAI clients work by setting base_url to
http://localhost:8000/api/v1.
The otari volume holds the SQLite database and, beside it, the generated key
that encrypts stored provider credentials, so a new container started with the
same -v otari:/data keeps its data. Without -v, Docker gives each container
a fresh anonymous volume. Use the Compose setup below to run on PostgreSQL.
The command a developer runs next to a coding agent (otari hook,
otari import claude-code) installs on its own, without the server:
brew install mozilla-ai/tap/otariSee Agent Guardrails and Claude Code.
git clone https://github.com/mozilla-ai/otari
cd otari
cp config.example.yml config.yml
# Set a master key, provider credentials, and pricing in config.yml.
# Provider copies of attached files are off until they have a pepper of their own. Compose reads .env.
grep -qs OTARI_PROVIDER_ACCOUNT_PEPPER .env || echo "OTARI_PROVIDER_ACCOUNT_PEPPER=$(openssl rand -base64 32)" >> .env
docker compose pull
docker compose up -dCompose runs Otari with PostgreSQL. Optional profiles add the code sandbox and web search services:
docker compose --profile code-exec --profile web-search up -dThe dashboard is served at http://localhost:8000/. To store provider keys
through the dashboard on PostgreSQL, set OTARI_SECRET_KEY to a Fernet key
generated by otari gen-secret-key.
A one-click deployment template is available for Railway.
The core completion routes are:
POST /api/v1/chat/completionsPOST /api/v1/messagesPOST /api/v1/responses
Otari also serves the broader OpenAI-compatible and management APIs. The
running server publishes Swagger UI at /api/v1/docs and OpenAPI at
/api/v1/openapi.json. See API reference.
The dashboard manages providers, models, routing, tools, keys, members, budgets, settings, activity, and usage. Its navigation adapts to the signed-in person's authority. See Run the dashboard.
git clone https://github.com/mozilla-ai/otari
cd otari
uv sync --dev
cp config.example.yml config.yml
uv run otari serve --config config.ymlFor local development without PostgreSQL, change database_url to
sqlite+aiosqlite:///./otari.db.
Common checks:
make test
make lint
make typecheckSee CONTRIBUTING.md before opening a pull request.
- Quickstart
- Deployment
- Configuration
- Models
- Routing
- Access control
- Built-in tools
- Agent Guardrails
- SDK and agent integrations
- Architecture
Apache 2.0. See LICENSE.
