OrcaRouter Lite
May 5, 2026 · View on GitHub
Selbst gehosteter LLM-Router mit verwaltetem Sicherheitsnetz.
OpenAI-kompatibel. BYOK. Einzelner Workspace. Streaming. model="auto".

Sprachen
OrcaRouter Lite ist die Open-Source-Edition für einen einzelnen Workspace von OrcaRouter. Führen Sie es auf Ihrem Laptop aus, liefern Sie es in Ihrem Produkt aus oder nutzen Sie das gehostete api.orcarouter.ai direkt für die Long-Tail-Modelle, deren Schlüssel Sie nicht selbst verwalten möchten.
Warum wir? LiteLLM ist eine Bibliothek; OpenRouter ist Closed-Source und gehostet; Ollama ist nur lokal. Wir sind der selbst gehostete Server mit verwaltetem Fallback — ein Satz, den keiner der anderen sagen kann.
60-Sekunden-Schnellstart
Zwei Möglichkeiten, OrcaRouter zu nutzen:
Pfad A — Selbst gehostet (BYOK)
Führen Sie Lite auf Ihrem eigenen Rechner aus; bringen Sie Ihre eigenen Provider-Schlüssel mit.
git clone https://github.com/Continuum-AI-Corp/OrcaRouter-Lite.git
cd OrcaRouter-Lite
cp .env.example .env
# mindestens einen hinzufügen: OPENAI_API_KEY=sk-... (oder ORCAROUTER_API_KEY=...)
docker compose up
# logs: ✓ orcarouter-lite ready. API key: sk-orca-abc123...
Basis-URL: http://localhost:8000/v1. Verwenden Sie den beim Start ausgegebenen sk-orca-*-Schlüssel.
Pfad B — Gehostet (Konto erforderlich)
Kein Klonen, kein Docker. Registrieren, Schlüssel holen, jedes OpenAI-SDK auf den Hosted-Endpunkt zeigen.
# 1. Registrieren auf https://www.orcarouter.ai und sk-orca-* Schlüssel kopieren
# 2. https://api.orcarouter.ai/v1 als Basis-URL verwenden
Konto erforderlich. Hosted übernimmt Routing, Abrechnung und den Long Tail an Providern — pro Token über Ihr OrcaRouter-Konto abgerechnet. Siehe docs.orcarouter.ai/introduction.
Dann von einem beliebigen OpenAI-SDK aufrufen
Die folgenden Beispiele verwenden die localhost-Basis-URL aus Pfad A — tauschen Sie sie gegen https://api.orcarouter.ai/v1, wenn Sie Pfad B nutzen.
Python
from openai import OpenAI
client = OpenAI(
base_url="http://localhost:8000/v1",
api_key="sk-orca-abc123...",
)
r = client.chat.completions.create(
model="auto", # oder "gpt-4o-mini", "claude-3-5-sonnet-latest", ...
messages=[{"role": "user", "content": "Hello!"}],
)
print(r.choices[0].message.content)
Node.js
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "http://localhost:8000/v1",
apiKey: "sk-orca-abc123...",
});
const r = await client.chat.completions.create({
model: "auto",
messages: [{ role: "user", content: "Hello!" }],
});
console.log(r.choices[0].message.content);
curl
curl http://localhost:8000/v1/chat/completions \
-H "Authorization: Bearer sk-orca-abc123..." \
-H "Content-Type: application/json" \
-d '{"model":"auto","messages":[{"role":"user","content":"Hello!"}]}'
Öffnen Sie http://localhost:8000/ für das Dashboard — Provider, Routing, Analytics, Schlüssel (nur Pfad A).
Warum?
| OrcaRouter Lite | LiteLLM-Bibliothek | OpenRouter | Ollama | |
|---|---|---|---|---|
| Selbst gehosteter Server | ✓ | als Bibliothek | ✗ | ✓ |
| OpenAI-kompatibel | ✓ | ✓ | ✓ | ✓ |
| Multi-Provider (OpenAI/Anthropic/Google/…) | ✓ | ✓ | ✓ | ✗ |
| Eingebautes Dashboard | ✓ | ✗ | ✓ | ✗ |
model="auto" (günstigstes geeignetes) | ✓ | ✗ | ✗ | n/a |
| Streaming | ✓ | ✓ | ✓ | ✓ |
| BYOK | ✓ | ✓ | ✗ | n/a |
| Hosted als Fallback | ✓ | ✗ | n/a | ✗ |
| Kein Postgres / kein Redis erforderlich | ✓ | n/a | n/a | ✓ |
model="auto" — das Hauptmerkmal
Senden Sie model="auto", und OrcaRouter wählt das günstigste Modell aus Ihren konfigurierten Providern, das die Anforderungsfähigkeiten der Anfrage erfüllt (Tools, Vision, JSON-Modus). Keine manuellen Routing-Regeln; keine Rate-Limit-Akrobatik; keine if x: ...-Kostenoptimierung in Ihrem Code.
client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": [
{"type": "text", "text": "What's in this image?"},
{"type": "image_url", "image_url": {"url": "data:..."}},
]}],
)
# → leitet an das günstigste VISION-fähige Modell, das Ihre Schlüssel abdecken
Das aufgelöste Modell wird dem Aufrufer über den Antwort-Header x-orca-resolved-model zurückgegeben, sodass Sie protokollieren/anzeigen können, was tatsächlich verwendet wurde.
Hosted als Upstream (Lite + Hosted)
Lite läuft schon? Setzen Sie ORCAROUTER_API_KEY auf Ihren sk-orca-* von www.orcarouter.ai, und Hosted wird zu einem weiteren Provider in der Routing-Kette — und deckt Modelle ab, die Ihre lokalen Schlüssel nicht haben:
# .env
ORCAROUTER_API_KEY=sk-orca-hosted-abc...
Anwendungsfälle:
- Vor dem Kauf testen — keine lokalen Provider-Schlüssel nötig
- Lokales Logging — Hosted erledigt Routing, Lite speichert RequestLog-Zeilen für das Dashboard
- Failover — lokale Provider fallen aus, Hosted ist das Sicherheitsnetz
Streaming
OpenAI-kompatibles SSE-Format mit dem üblichen data: ... \n\n-Framing und einem abschließenden [DONE]-Sentinel — Drop-in für jedes SDK, das bereits von OpenAI streamt.
for chunk in client.chat.completions.create(
model="auto",
messages=[{"role": "user", "content": "Tell me a story"}],
stream=True,
):
print(chunk.choices[0].delta.content or "", end="", flush=True)
Modellkatalog
Beim Start werden über 100 Chat-Modelle aus LiteLLMs von der Community gepflegter Preisdatenbank geladen — keine Modellliste, die manuell gepflegt werden muss. Jeder Eintrag enthält:
id(z. B.gpt-4o,claude-3-5-sonnet-latest)provider(auf Ihre konfigurierten Schlüssel abgebildet)- Capability-Flags:
supports_tools,supports_vision,supports_json_mode - Kosten pro Token für Input/Output (treibt das Einsparungs-Widget +
model="auto"an)
GET /v1/models liefert den Katalog im OpenAI-Format zurück.
Anderswo deployen
| Plattform | One-Click |
|---|---|
| Railway | |
| Fly.io | fly launch --dockerfile Dockerfile |
| Render | Repo verbinden, Root-Verzeichnis = . |
| Bare Docker | docker run -p 8000:8000 -e OPENAI_API_KEY=... ghcr.io/... (Image folgt) |
Was ist enthalten
POST /v1/chat/completions— Proxy + Streaming +model="auto"+ provider-übergreifender Prompt-CacheGET /v1/models— auffindbarer Modellkatalog (100+ Modelle auslitellm.model_cost)GET/PUT/DELETE /v1/providers/{provider}— verschlüsselte Provider-Schlüssel setzen / auflisten / widerrufenGET/PUT /v1/routing— Strategie ändern (balanced/cheapest/fastest/quality)GET /v1/analytics/{recent,spend,latency,savings,unreachable}— lokale Analytics, keine Telemetrie verlässt die BoxGET /v1/hosted— Status des Hosted-Fallbacks (treibt die "Get $5 free credit"-Karte des Dashboards an)GET/POST/DELETE /v1/keys/...— API-Schlüssel auflisten / rotieren / widerrufen- Single-Page-Dashboard unter
/ - Standardmäßig SQLite; Postgres optional via
DATABASE_URL; Redis optional
Provider-übergreifender Prompt-Cache
Deterministische Anfragen (temperature=0 oder fest gepinnter seed) werden bei Wiederholung aus dem Cache bedient — funktioniert bei jedem Provider, nicht nur bei Anthropic. Backend ist Redis, wenn REDIS_URL gesetzt ist, ansonsten ein In-Process-LRU. Cache-Treffer kommen sofort mit x-orca-cache: HIT zurück und kosten 0 $.
$ curl ... -d '{"model":"auto","messages":[...], "temperature": 0}' -i
HTTP/1.1 200 OK
x-orca-cache: MISS
x-orca-resolved-model: gpt-4o-mini
$ curl ... # gleicher Payload erneut
HTTP/1.1 200 OK
x-orca-cache: HIT ← aus dem Cache, kein Upstream-Aufruf
Einsparungs-Widget
GET /v1/analytics/savings?baseline=gpt-4o&days=7 zeigt, was Ihr Traffic mit immer-GPT-4 gekostet hätte gegenüber dem, was er tatsächlich gekostet hat. Das Dashboard zeigt das als Kachel an.
Integrationen
Drop-in-Konfigurationen für Continue.dev, Aider, Cursor, LangChain, LlamaIndex, Vercel AI SDK und jedes Tool, das das OpenAI-Chat-Completions-Protokoll spricht. Siehe integrations/.
Was bewusst nicht enthalten ist
Dies ist die Single-Workspace-Edition. Per Design ohne:
- Mandantenfähigkeit, RBAC, SSO
- Abrechnung, Wallets, Punkte, Partnerprogramm
- Admin-Konsole, Audit-Logs, Trust & Safety
- Multi-Pod-Deployment / Kubernetes
- E-Mail / Slack / Webhooks für Alerts
Dafür siehe das gehostete Produkt oder die (kommende) Teams-Edition.
Testen
Test-First entwickelt. Jedes hier ausgelieferte Verhalten hatte zuerst einen fehlschlagenden Test.
pip install -e ".[dev]"
PYTHONPATH=. pytest -v
# 127 passed
| Slice | Tests | Was |
|---|---|---|
| 1. Config | 5 | env-Loading, Defaults, env_provider_keys() |
| 2. Seed | 3 | Bootstrap-Workspace + API-Schlüssel + RoutingConfig, idempotent |
| 3. Auth-Middleware | 4 | Bearer-Token-Validierung, 401 bei fehlend/ungültig |
| 4. App-Factory | 3 | /health, Error-Envelope, /v1/*-Gating |
| 5. Provider-Schlüssel CRUD | 5 | im Speicher verschlüsselt, Klartext geht nie hin und zurück |
| 6. Router-Cache | 13 | env+DB+hosted Deployment-Assembly mit Präzedenz |
| 7. Chat Completion | 5 | OpenAI-Format, RequestLog, Validierung |
| 8. Analytics | 4 | recent / spend / latency p50/p99 |
| 9. /v1/{models,keys,routing} | 8 | list/create/revoke + Strategie-Update |
| 10. Streaming | 4 | SSE-Format, [DONE]-Sentinel, Log-Writeback |
| 11. Katalog | 7 | 100+ Modelle, Capability-Flags, Pricing |
12. model="auto" | 21 | Capability-Erkennung, günstigstes-mit-passenden-Anforderungen (Unit + Integration) |
| 13. Kosteneinsparungen | 9 | Einsparungen vs. Always-GPT-4-Baseline + Hosted-Auto-Vergleich |
| 14. Prompt-Cache | 15 | provider-übergreifender Exact-Match-Cache + Chat-Integration |
| 15. Benchmark | 4 | summarize() + render_markdown()-Aggregation |
| 16. Hosted-Status | 7 | /v1/hosted Config-Source + Signup-URL-Surface |
| 17. Hosted-Auto-Einsparungen | 3 | _hosted_auto_savings-Edge-Cases auf synthetischen Katalogen |
| 18. Unerreichbare Modelle | 7 | "Modelle, die du nicht erreichen kannst"-Kachel verschwindet, wenn Hosted aktiv ist |
| Gesamt | 127 |
Architektur
app/
├── main.py FastAPI factory + lifespan + SPA mount
├── config.py Settings (~15 fields)
├── deps.py DI helpers
├── seed.py First-run bootstrap
├── auto_routing.py model="auto" capability + cost scoring
├── router_cache.py Single-workspace router
├── prompt_cache.py Cross-provider exact-match cache (Redis or in-memory LRU)
├── schemas.py OpenAI-compatible request schema
├── middleware/auth.py sk-orca-* validation
└── routes/
├── chat.py /v1/chat/completions (blocking + streaming)
├── models.py /v1/models
├── providers.py BYOK CRUD
├── routing.py strategy config
├── analytics.py recent / spend / latency / savings / unreachable
├── keys.py list / rotate / revoke API keys
├── hosted.py /v1/hosted — hosted-fallback status for the dashboard
└── health.py
packages/
├── litellm_adapter/ Router wrapper + 100+ model catalog
├── auth/ hashing + AES-256-GCM
└── db/ models + engine + session
Roadmap
- OpenAI-kompatible Chat-Completions
- Streaming (SSE)
-
model="auto"günstigstes-geeignetes Routing - Hosted-als-Upstream
- Verschlüsseltes BYOK im Speicher
- Lokales Analytics-Dashboard
- CI (GitHub Actions)
- Provider-übergreifendes Prompt-Caching
- Continue.dev / Aider / LangChain / Cursor / Vercel-AI-SDK-Integrationen
- Öffentlicher Benchmark + Einsparungs-Behauptung
- Embeddings + Image-Gen-Proxy
Siehe DEMO.md für die Failover-Demo.
Lizenz
MIT. Siehe LICENSE.