Skip to content
mozilla-aiPublic

About

Open-source AI gateway you run yourself. One endpoint for 40+ providers, with virtual keys, budgets, and usage tracking.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

930 stars

Watchers

8 watching

Forks

Latest commit

 

History

2,438 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Otari logo

An AI gateway you own and run.

Route one endpoint to 40+ providers, issue virtual keys, enforce budgets, and track usage.

Tests Lint Typecheck Docker Python 3.13+

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 dashboard tour: spend overview, usage by model, a request rescued by a routing fallback, two models compared in the Playground, the model catalog, routing policies, API keys, members, budgets, and providers

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.

Why Otari

  • 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

Quickstart

Run Otari with Docker. It needs no configuration:

docker run -v otari:/data -p 127.0.0.1:8000:8000 mzdotai/otari:latest

On 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/otari

See Agent Guardrails and Claude Code.

Run the full stack

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 -d

Compose runs Otari with PostgreSQL. Optional profiles add the code sandbox and web search services:

docker compose --profile code-exec --profile web-search up -d

The 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.

API and dashboard

The core completion routes are:

  • POST /api/v1/chat/completions
  • POST /api/v1/messages
  • POST /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.

Development

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.yml

For local development without PostgreSQL, change database_url to sqlite+aiosqlite:///./otari.db.

Common checks:

make test
make lint
make typecheck

See CONTRIBUTING.md before opening a pull request.

Documentation

License

Apache 2.0. See LICENSE.

About

Open-source AI gateway you run yourself. One endpoint for 40+ providers, with virtual keys, budgets, and usage tracking.

Topics

Resources

Code of conduct

Contributing

Security policy

Stars

930 stars

Watchers

8 watching

Forks

Releases

Used by

Contributors

Languages