One gateway.
Every LLM dialect.
Inja sits between your agents and providers. Clients keep talking OpenAI, Anthropic, or Gemini — you route, translate, and meter without rewriting every integration.
- Single static binary
- yaml.v3 only at runtime
- No vendor SDK lock-in
- AGPL-3.0
# multi-provider edge
providers:
openai:
kind: openai
base_url: https://api.openai.com/v1
anthropic:
kind: anthropic
base_url: https://api.anthropic.com/v1
deepseek:
kind: openai_compat
base_url: https://api.deepseek.com
defaults:
openai_dialect: openai
anthropic_dialect: anthropic
aliases:
fast: deepseek/deepseek-chat
hooks:
jsonl:
output: stdoutRequest path
Clients stay native. Upstreams stay flexible.
A thin edge process — YAML config, no database, no vendor SDKs at runtime. Same-family traffic never pays a translation tax.
Ingress
- POST /v1/chat/completions
- POST /v1/messages
- …/models/*:generateContent
- /v1/responses · files · batches
Gateway
- 01Resolve alias / provider / model
- 02Auth edge keys + upstream api_key_env / ADC
- 03PT or IR passthrough vs translate
- 04Hooks usage JSONL / webhook
Egress kinds
openaifirst-partyopenai_compatany hostanthropicMessagesgoogleGemini native
How it works
Four moves on every request
- 01
Keep your client dialect
OpenAI Chat Completions, Anthropic Messages, or native Gemini — same edge, same auth story.
- 02
Route by model id
Bare models hit defaults. provider/model prefixes and aliases pick the upstream — DeepSeek, xAI, Groq, OpenRouter, vLLM, …
- 03
Passthrough or translate
Same-family traffic is byte-faithful. Cross-family rebuilds through a canonical IR and fails closed on unsupported shapes.
- 04
Meter every request
One usage event per call (JSONL / webhook): model, provider, tokens, cache, latency, status.
Built for agents
Production surfaces, not demos
Fidelity policies, platform API proxies, and operator hooks — documented and hermetically tested.
Claude Code, Claude app, Codex, Cursor
ChatGPT, Claude, and SuperGrok via OAuth — same gateway from Claude Code, the Claude desktop app, Codex, or Cursor.
Read more →Prompt cache policy
Preserve cache_control and prompt_cache_* within family. Opt-in auto breakpoints for OpenAI/Google → Anthropic.
Read more →Platform proxies
Files, Batches, Assistants, Skills, tuned models, File Search, cachedContents — thin upstream-owned surfaces.
Read more →Operator hooks
Prometheus /metrics, optional provider health, edge auth, body limits, and observe_dropped_fields.
Read more →Quick start
Ship in minutes
Grab a release binary or run Docker. Drop a YAML file. Point your SDK at the edge.
# compose up with your keys
docker compose up -d
# or grab the release binary
curl -sL https://github.com/inja-online/llm-gateway/releases/latest
# health check
curl -s localhost:8080/healthzMulti-provider without multi-SDK pain
Install once. Put OpenAI-, Anthropic-, or Gemini-shaped clients behind one edge — and swap backends with config, not code.