1,104 mirrors rewritten over five passes of run-translation on the 22-source core set: the 14 sources edited since their translation, the 322 mirrors that were still English copies, and the frontmatter the old extractor leaked into the newer locales' bodies. The pipeline now caches per-`## `-section hashes and retranslates only changed sections, never reuses a section that is still English, rebuilds English-copy / leaked mirrors even when the source is unchanged, merges the state on save (parallel runs), and the drift gate (scoped to the core set) is blocking. Final audit: 0 stale, 0 English copies, 0 leaked frontmatter across 1,430 core mirrors. ⚠️ base-red inherited: #12732
129 KiB
API Reference (Deutsch)
🌐 Languages: 🇺🇸 English · 🇪🇹 am · 🇸🇦 ar · 🇦🇿 az · 🇧🇬 bg · 🇧🇩 bn · 🇨🇿 cs · 🇩🇰 da · 🇬🇷 el · 🇪🇸 es · 🇪🇪 et · 🇮🇷 fa · 🇫🇮 fi · 🇫🇷 fr · 🇮🇪 ga · 🇮🇳 gu · 🇳🇬 ha · 🇮🇱 he · 🇮🇳 hi · 🇭🇷 hr · 🇭🇺 hu · 🇦🇲 hy · 🇮🇩 id · 🇳🇬 ig · 🇮🇹 it · 🇯🇵 ja · 🇬🇪 ka · 🇰🇭 km · 🇮🇳 kn · 🇰🇷 ko · 🇱🇹 lt · 🇱🇻 lv · 🇮🇳 ml · 🇮🇳 mr · 🇲🇾 ms · 🇲🇹 mt · 🇲🇲 my · 🇳🇵 ne · 🇳🇱 nl · 🇳🇴 no · 🇮🇳 or · 🇮🇳 pa · 🇵🇭 phi · 🇵🇱 pl · 🇵🇹 pt · 🇧🇷 pt-BR · 🇷🇴 ro · 🇷🇺 ru · 🇱🇰 si · 🇸🇰 sk · 🇸🇮 sl · 🇷🇸 sr · 🇸🇪 sv · 🇰🇪 sw · 🇮🇳 ta · 🇮🇳 te · 🇹🇭 th · 🇹🇷 tr · 🇺🇦 uk-UA · 🇵🇰 ur · 🇺🇿 uz · 🇻🇳 vi · 🇳🇬 yo · 🇨🇳 zh-CN · 🇹🇼 zh-TW
🌐 Sprachen: 🇺🇸 English | 🇪🇹 አማርኛ | 🇸🇦 العربية | 🇦🇿 Azərbaycan dili | 🇧🇬 Български | 🇧🇩 বাংলা | 🇨🇿 Čeština | 🇩🇰 Dansk | 🇩🇪 Deutsch | 🇬🇷 Ελληνικά | 🇪🇸 Español | 🇪🇪 Eesti | 🇮🇷 فارسی | 🇫🇮 Suomi | 🇫🇷 Français | 🇮🇪 Gaeilge | 🇮🇳 ગુજરાતી | 🇳🇬 Hausa | 🇮🇱 עברית | 🇮🇳 हिन्दी | 🇭🇷 Hrvatski | 🇭🇺 Magyar | 🇦🇲 Հայերեն | 🇮🇩 Bahasa Indonesia | 🇳🇬 Igbo | 🇮🇹 Italiano | 🇯🇵 日本語 | 🇬🇪 ქართული | 🇰🇭 ខ្មែរ | 🇮🇳 ಕನ್ನಡ | 🇰🇷 한국어 | 🇱🇹 Lietuvių | 🇱🇻 Latviešu | 🇮🇳 മലയാളം | 🇮🇳 मराठी | 🇲🇾 Bahasa Melayu | 🇲🇹 Malti | 🇲🇲 မြန်မာ | 🇳🇵 नेपाली | 🇳🇱 Nederlands | 🇳🇴 Norsk | 🇮🇳 ଓଡ଼ିଆ | 🇮🇳 ਪੰਜਾਬੀ | 🇵🇭 Filipino | 🇵🇱 Polski | 🇵🇹 Português (Portugal) | 🇧🇷 Português (Brasil) | 🇷🇴 Română | 🇷🇺 Русский | 🇱🇰 සිංහල | 🇸🇰 Slovenčina | 🇸🇮 Slovenščina | 🇷🇸 Српски | 🇸🇪 Svenska | 🇰🇪 Kiswahili | 🇮🇳 தமிழ் | 🇮🇳 తెలుగు | 🇹🇭 ไทย | 🇹🇷 Türkçe | 🇺🇦 Українська | 🇵🇰 اردو | 🇺🇿 Oʻzbekcha | 🇻🇳 Tiếng Việt | 🇳🇬 Yorùbá | 🇨🇳 中文 (简体) | 🇹🇼 中文 (繁體)
Zentrale Referenz für die OmniRoute-API. Sie beschreibt die öffentliche /v1-Schnittstelle und die am häufigsten verwendeten Verwaltungsendpunkte; die maschinenlesbare Datei docs/openapi.yaml und der Routenbaum unter src/app/api/ sind die vollständigen Quellen.
Inhaltsverzeichnis
- Chat-Vervollständigungen
- Exklusive verwaltete Sitzungspachtverträge
- Einbettungen
- Bilderzeugung
- Dokument-OCR
- Modelle auflisten
- Manifest für Anbieter-Plugins
- Kompatibilitätsendpunkte
- Dateien-API
- Batches-API
- Such-API
- WebSocket-Streaming
- Kontingente und Problemberichte
- Semantischer Cache
- Dashboard und Verwaltung
- Kombinationsverwaltung
- Webhooks
- Registrierte Schlüssel (automatische Verwaltung)
- Agentenprotokoll
- Verwaltungs-Proxys
- Ausfallsicherheit (erweitert)
- Fähigkeiten
- Speicher
- MCP-Server
- A2A-Server
- Cloud, Evaluierungen und Assess
- Anfrageverarbeitung
- Authentifizierung
Chat-Vervollständigungen
POST /v1/chat/completions
Authorization: Bearer your-api-key
Content-Type: application/json
{
"model": "cc/claude-opus-4-6",
"messages": [
{"role": "user", "content": "Write a function to..."}
],
"stream": true
}
Benutzerdefinierte Header
| Header | Richtung | Beschreibung |
|---|---|---|
X-OmniRoute-No-Cache |
Anfrage | Auf true setzen, um den Cache zu umgehen |
x-omniroute-no-memory |
Anfrage | Auf true setzen, um die Einspeisung von Speicher + Fähigkeiten für diese Anfrage zu überspringen (entspricht no-cache; vermeidet den Token-/Kostenaufwand pro Aufruf) |
X-OmniRoute-Progress |
Anfrage | Für Fortschrittsereignisse auf true setzen |
X-Session-Id |
Anfrage | Persistenter Sitzungsschlüssel für externe Sitzungsaffinität |
x_session_id |
Anfrage | Variante mit Unterstrichen wird ebenfalls akzeptiert (direktes HTTP) |
X-OmniRoute-Session-Id |
Anfrage | Vom Aufrufer bereitgestelltes Sitzungs-/Konversations-Tag (wird auch dem Speicher zugeführt). Wenn vorhanden, wird es unverändert in call_logs.session_tag zur sitzungsbezogenen Kostenzuordnung (#8249) gespeichert — bei Fehlen wird es niemals erzeugt |
Idempotency-Key |
Anfrage | Deduplizierungsschlüssel (5-Sekunden-Fenster) |
X-Request-Id |
Anfrage | Alternativer Deduplizierungsschlüssel |
X-OmniRoute-Cache |
Antwort | HIT oder MISS (ohne Streaming) |
X-OmniRoute-Idempotent |
Antwort | true, wenn dedupliziert |
X-OmniRoute-Progress |
Antwort | enabled, wenn die Fortschrittsverfolgung aktiviert ist |
X-OmniRoute-Session-Id |
Antwort | Von OmniRoute verwendete effektive Sitzungs-ID |
X-OmniRoute-Request-Id |
Antwort | Korrelations-ID der Anfrage (sofern bekannt) |
X-OmniRoute-Version |
Antwort | OmniRoute-Build-Version (immer vorhanden) |
X-OmniRoute-Cost-Saved |
Antwort | Durch den Cache bei einem HIT vermiedene Kosten in USD (nur Cache-Treffer) |
X-OmniRoute-Decision |
Antwort | Routing-Ablauf: strategy=<name>; provider=<alias>; latency_ms=<n> (<name> ist die Kombinationsstrategie oder single für eine Anfrage ohne Kombination) — bei Abschlussantworten immer vorhanden |
Nginx-Hinweis: Wenn Sie Header mit Unterstrichen verwenden (zum Beispiel
x_session_id), aktivieren Sieunderscores_in_headers on;.
Header zur Kostentelemetrie: Nicht-streamende erfolgreiche Antworten enthalten ebenfalls den Kostentelemetrie-Satz
X-OmniRoute-*—X-OmniRoute-Response-Cost(USD, fest auf 10 Dezimalstellen;0.0000000000für kostenlose/nicht bepreiste Anfragen),X-OmniRoute-Tokens-In/X-OmniRoute-Tokens-Out,X-OmniRoute-Model,X-OmniRoute-Provider,X-OmniRoute-Latency-Ms,X-OmniRoute-Cache-HitundX-OmniRoute-Fallback-Attempts(nur wenn > 0) sowieX-OmniRoute-Request-IdundX-OmniRoute-Version. Diese werden von Chat Completions,/v1/responses,/v1/messagesund den Medienendpunkten ausgegeben —/v1/embeddings,/v1/images/generations,/v1/audio/speech,/v1/audio/transcriptions,/v1/rerank,/v1/videos/generations,/v1/music/generationsund/v1/moderations(Kosten stets0). Die Medienkosten werden, sofern Preisinformationen verfügbar sind, je nach Modalität pro Bild, pro Sekunde, pro Zeichen oder pro Sucheinheit berechnet, andernfalls0(Fail-Open).
Kostenberechnung bei Cache-Treffern: Bei einem TREFFER im semantischen Cache (
X-OmniRoute-Cache-Hit: true) erfolgt kein Upstream-Aufruf, daher beträgtX-OmniRoute-Response-Cost0.0000000000(die inkrementellen Kosten für die Bereitstellung des Treffers). Die ursprünglichen beziehungsweise andernfalls angefallenen Kosten werden separat inX-OmniRoute-Cost-Savedausgewiesen. Abrechnungssysteme solltenX-OmniRoute-Response-Costsummieren (Treffer verursachen keine Kosten); für Cache-Analysen kannX-OmniRoute-Cost-Savedaggregiert werden.
Exklusive verwaltete Sitzungslizenzen
Die exklusive Vergabe verwalteter Sitzungslizenzen ist ein optionaler, clientneutraler Routing-Vertrag: Ein aktiver Besitzer hält eine geeignete OmniRoute-Verbindung. Dabei wird weder ein Modell reserviert noch OAuth vorausgesetzt, ein bestimmter Client identifiziert oder ein bestimmter Anbieter verlangt.
Der zur Authentifizierung verwendete API-Schlüssel muss den Geltungsbereich lease:exclusive und eine explizite, nicht leere
Liste allowedConnections besitzen. Die Mutationsgrenze der Datenbank erzwingt beide Felder gemeinsam bei der
Schlüsselerstellung und bei partiellen Aktualisierungen.
POST /api/v1/session-leases
Authorization: Bearer <managed-api-key>
Content-Type: application/json
X-OmniRoute-Lease-Owner: vlo_<43-base64url-characters>
{"action":"acquire","model":"glm/glm-4.6"}
Erfolgreiche Antworten auf Erwerb, Verlängerung und Freigabe enthalten Zeitstempel, state und die exakte positive
generation, jedoch niemals die ausgewählte Verbindung oder Anmeldedaten. Bei Verlängerung und Freigabe wird die
Generation im JSON-Text angegeben:
{ "action": "renew", "generation": 1 }
{ "action": "release", "generation": 1, "reason": "OWNER_EXIT" }
Der Besitzer einer aktiven Lizenz kann explizit datenschutzfreundliche Anzeigemetadaten für seine aktuelle Bindung anfordern:
{ "action": "status", "generation": 1 }
{
"state": "ACTIVE",
"generation": 1,
"acquiredAt": "2026-08-28T12:00:00.000Z",
"renewedAt": "2026-08-28T12:00:30.000Z",
"expiresAt": "2026-08-28T12:02:30.000Z",
"connection": {
"displayName": "Primary Codex",
"provider": "codex"
}
}
Diese optionale Statusaktion wird innerhalb einer einzigen Datenbanktransaktion durch den nicht transparenten Besitzer, den authentifizierten verwalteten API-Schlüssel und die exakte
aktive Generation abgesichert. displayName ist ausschließlich der bereinigte konfigurierte
Verbindungsname; wenn kein sicherer konfigurierter Name vorhanden ist, lautet der Wert null. OmniRoute ersetzt ihn niemals durch eine
E-Mail-Adresse oder eine generierte Kontoidentität. Der Anbieterwert ist eine nicht vertrauliche Anzeigebezeichnung und niemals
eine generierte Kennung eines kompatiblen Anbieters. Anmeldedaten, Tokens, Cookies, unverarbeitete Verbindungs- oder
API-Schlüssel-IDs, Besitzer-Hashes, Fencing-Geheimnisse und interne Routing-Daten werden ausgeschlossen.
Abfragen mit falschem Schlüssel, falschem Besitzer, veralteter Generation sowie Abfragen fehlender, abgelaufener, freigegebener oder ungültig gemachter Lizenzen
geben alle denselben Fehler 409 LEASE_FENCE_STALE ohne Verbindungsmetadaten zurück. Ein Client, der die Antwort zum Warten auf Kapazität erhalten hat, besitzt keine aktive Bindung, die geprüft werden könnte. Wenn das Routing eine aktive Lizenz auf eine andere Verbindung umstellt,
bleibt dieselbe Generation gültig, und der Status gibt atomar die neue Bindung zurück, niemals die alte.
Bestehende Clients bleiben unverändert, da die Antworten für Erwerb, Verlängerung, Freigabe und Wartezustände
ihre bisherigen Strukturen beibehalten.
Dieser Serververtrag ändert den standardmäßigen OpenAI-Codex-Endpunkt /status nicht. Standard-Codex meldet derzeit seinen
Modellanbieter und den integrierten Authentifizierungs-/Kontostatus, stellt jedoch keine beliebigen benutzerdefinierten
Anbieter-Kontometadaten dar; eine spätere Clientintegration muss diese Aktion aufrufen und entscheiden, wie
connection.displayName angezeigt werden soll.
Jede verwaltete Inferenzanfrage übermittelt anschließend beide Steuerungsheader:
X-OmniRoute-Lease-Owner: vlo_<43-base64url-characters>
X-OmniRoute-Lease-Generation: 1
Der exakte Besitzer, die Generation, die aktive Verbindung und der authentifizierte API-Schlüssel werden unmittelbar vor jedem unterstützten Upstream-Versuch abgesichert. Die Wiederverwendung von Besitzer und Generation mit einem anderen Schlüssel schlägt selbst dann fehl, wenn dieser Schlüssel dieselbe Verbindung zulässt. Unverarbeitete Besitzerwerte werden weder persistiert noch protokolliert, im Anfrage-Snapshot beibehalten oder an den Upstream weitergeleitet.
Vorübergehende Ressourcenkonkurrenz gibt HTTP 429 mit Retry-After und Folgendem zurück:
{
"state": "WAITING_FOR_CAPACITY",
"error": { "type": "lease_error", "code": "LEASE_CAPACITY_UNAVAILABLE" },
"reason": "NO_FREE_ELIGIBLE_CONNECTION",
"retryAfter": 30
}
Diese Antwort bedeutet lediglich, dass die reguläre Menge geeigneter Verbindungen nicht leer war und jeder freie Kandidat durch eine fremde aktive Lizenz belegt war. Nicht unterstützte Modelle/Anbieter, Richtlinienabweichungen, Abklingzeiten, Kontingente, Integritätszustände und andere reguläre Eignungsfehler behalten ihre bestehenden OmniRoute-Antworten bei.
x-omniroute-compression
Anfragebezogene Überschreibung des Komprimierungsplans. Höchste Priorität — hat Vorrang vor der Routing-Kombinationsüberschreibung, dem aktiven Profil, der automatischen Auslösung und der Standardeinstellung des Panels. Werte:
| Wert | Wirkung |
|---|---|
off |
Keine Komprimierung für diese Anfrage. |
default |
Das vom Panel abgeleitete Standardprofil (ignoriert das aktive Profil). |
engine:<id> |
Eine einzelne Engine, sofern aktiviert, z. B. engine:rtk. |
<combo> |
Eine benannte Kombination, die zuerst anhand des Namens (ohne Beachtung der Groß-/Kleinschreibung) und dann anhand der ID abgeglichen wird. |
Hinweise:
- Unbekannte Werte werden ignoriert (die Anfrage wird niemals abgelehnt); die Auflösung greift auf die normale Operatorrangfolge zurück.
- Wenn mehrere Kombinationen denselben Namen verwenden, geben Sie für eine deterministische Übereinstimmung die id der Kombination an.
- Eine Kombination mit dem Namen
offoderdefaultkann nicht anhand ihres Namens ausgewählt werden (diese Schlüsselwörter werden zuerst interpretiert); referenzieren Sie eine solche Kombination anhand ihrer ID. - Der Hauptschalter für die Komprimierung ist eine feste Sperre: Wenn die Komprimierung global deaktiviert ist, kann sie durch diesen Header nicht aktiviert werden.
Der angewendete Plan wird im Antwortheader zurückgegeben:
X-OmniRoute-Compression: <mode>; source=<source>
Dabei ist <source> einer der Werte request-header, routing-override, active-profile, auto-trigger, default oder off.
Embeddings
POST /v1/embeddings
Authorization: Bearer your-api-key
Content-Type: application/json
{
"model": "nebius/Qwen/Qwen3-Embedding-8B",
"input": "The food was delicious"
}
Verfügbare Anbieter: Nebius, OpenAI, Mistral, Together AI, Fireworks, NVIDIA, OpenRouter, Jina AI.
Katalog-IDs haben das Format provider/model (Beispiel: jina-ai/jina-embeddings-v5-omni-small). Reine Jina-Modell-IDs, die in der Registry aufgeführt sind (zum Beispiel jina-embeddings-v5-text-small, jina-reranker-v3.5), werden ebenfalls aufgelöst. Jina-Operationen zum Einbetten, Reranking, Klassifizieren und Segmentieren verwenden zuerst die jina-ai-Anmeldedaten aus dem Dashboard; JINA_AI_API_KEY dient nur als Fallback, wenn kein Dashboard-Schlüssel vorhanden ist. Die Karte jina-reader ist ausschließlich für Reader / r.jina.ai (POST /v1/web/fetch) bestimmt und stellt niemals Embeddings oder Reranking bereit.
Registry-Modelle, die multimodale Unterstützung angeben, akzeptieren außerdem bis zu 32 anbieterneutrale strukturierte
Elemente. Die Medienelementtypen sind text, image, audio, video und document. Ihre Medien-source
ist entweder {"type":"url","url":"https://..."} oder
{"type":"base64","data":"...","media_type":"..."}.
Jina v5 Omni (jina-ai/jina-embeddings-v5-omni-small, jina-ai/jina-embeddings-v5-omni-nano
und der Familienalias jina-ai/jina-embeddings-v5-omni → omni-small) akzeptiert außerdem die nativen
EmbeddingsV5Request-Dokumente von Jina und leitet sie unverändert an https://api.jina.ai/v1/embeddings weiter:
{
"model": "jina-ai/jina-embeddings-v5-omni-small",
"task": "retrieval.query",
"normalized": true,
"input": [
{ "text": "a red bicycle" },
{ "image": "https://example.com/bike.png" },
{
"content": [{ "text": "caption" }, { "image": "data:image/png;base64,..." }]
}
]
}
Native { image | audio | video | pdf }-Werte können eine öffentliche HTTPS-URL, eine data:-URI oder rohe
Base64-Daten sein. OmniRoute wandelt diese Objekte nicht in Strings um und ruft native Bild-URLs nicht ab — Jina ruft
öffentliche Medien selbst ab. Zusätzliche Jina-Felder (task, normalized, truncate, embedding_type) werden
weitergeleitet. Jina-SKUs, die ausschließlich Text unterstützen, lehnen weiterhin Dokumente ab, die nicht aus Text bestehen.
Sicherheits- und Transportbeschränkungen:
- Remote-Medien-URLs müssen öffentliches HTTPS verwenden. Kanonische
{type,source:url}-Elemente werden serverseitig abgerufen (erneute Validierung von Weiterleitungen, Zeitüberschreitung, Größenbeschränkungen, öffentliches DNS, Verbindungs-Pinning) und vor dem Anbieteraufruf eingebettet. Jina-native{image:"https://..."}-Elemente werden nach derselben Prüfung auf öffentliches HTTPS unverändert weitergeleitet; Jina ruft die URL ab. - Inline-Base64-Medien sind auf 8 MiB dekodiert pro Element und 16 MiB dekodiert für die gesamte Anfrage begrenzt.
Anbieterübersetzung (kanonische Elemente werden niemals unverändert weitergeleitet):
- Multimodale Jina-Modelle: Jedes Element der obersten Ebene wird zu einem Objekt mit einem Modalitätsschlüssel
(
text/image/audio/video/pdf), wobei für Inline-Medien Daten-URIs verwendet werden; ein Vektor pro Element der obersten Ebene. - Gemini Embedding 2-Familie: Ein Array der obersten Ebene wird zu einer einzelnen nativen
models/{model}:embedContent-Anfrage mitcontent.parts(textoderinline_data). - Unbekannte/dynamische Modelle ohne explizite Modalitätsmetadaten lehnen strukturierte Eingaben mit HTTP 400 ab.
{
"model": "jina-ai/jina-embeddings-v5-omni-small",
"input": [
{ "type": "text", "text": "A red bicycle" },
{
"type": "image",
"source": { "type": "url", "url": "https://example.com/bicycle.png" }
}
],
"dimensions": 512,
"encoding_format": "float"
}
Nicht unterstützte Modell-/Modalitätskombinationen geben HTTP 400 zurück, anstatt das Element zu konvertieren. Erweiterungsfelder, die nicht zur Eingabe gehören, werden bei älteren String-/Token-Anfragen weiterhin unverändert durchgereicht.
# Alle Embedding-Modelle auflisten
GET /v1/embeddings
Bildgenerierung
POST /v1/images/generations
Authorization: Bearer your-api-key
Content-Type: application/json
{
"model": "openai/gpt-image-2",
"prompt": "Ein wunderschöner Sonnenuntergang über Bergen",
"size": "1024x1024"
}
Verfügbare Anbieter: OpenAI (GPT Image 2), xAI (Grok Image), Together AI (FLUX), Fireworks AI, Nebius (FLUX), Hyperbolic, NanoBanana, OpenRouter, SD WebUI (lokal), ComfyUI (lokal).
# Alle Bildmodelle auflisten
GET /v1/images/generations
Dokument-OCR
POST /v1/ocr
Authorization: Bearer your-api-key
Content-Type: application/json
{
"model": "mistral/mistral-ocr-latest",
"document": {
"type": "document_url",
"document_url": "https://example.com/invoice.pdf"
}
}
model wählt den OCR-Anbieter über das Präfix provider/model aus; eine reine Modell-ID (z. B.
mistral-ocr-latest) wird dem registrierten Anbieter zugeordnet, und wenn model weggelassen wird, wird standardmäßig
Mistral (mistral-ocr-latest) verwendet. Registrierte Anbieter (open-sse/config/ocrRegistry.ts):
| Anbieter-ID | Modell-ID | model-Wert |
Hinweise |
|---|---|---|---|
mistral |
mistral-ocr-latest |
mistral/mistral-ocr-latest (oder nur mistral-ocr-latest) |
Synchron — die Antwort wird direkt vom einzelnen Upstream-Aufruf zurückgegeben. |
azure-document-intelligence |
prebuilt-read |
azure-document-intelligence/prebuilt-read |
Asynchroner Upstream (analyze + Polling) — siehe unten. |
vertex-deepseek-ocr |
deepseek-ocr-maas |
vertex-deepseek-ocr/deepseek-ocr-maas |
Synchron, über den Partner-Endpunkt openapi/chat/completions von Vertex AI — Authentifizierung/URL siehe unten. |
Alle drei Anbieter antworten mit demselben an Mistral angelehnten Body:
{
"pages": [{ "index": 0, "markdown": "# Extrahierter Text ..." }],
"model": "mistral-ocr-latest",
"usage_info": { "pages_processed": 1 }
}
Polling-Ablauf von Azure Document Intelligence
Die analyze-API von Azure Document Intelligence ist asynchron: Die ursprüngliche Anfrage gibt statt eines Bodys einen
Operation-Location-Header zurück, und das Ergebnis muss durch Polling abgefragt werden. Der Handler
(open-sse/handlers/ocr.ts) fragt diese URL bis zu 30-mal im Sekundentakt ab, bricht bei einer Polling-Antwort, die nicht ok ist, oder einem Status "failed" sofort mit einem Fehler ab (ohne
das Polling fortzusetzen) und gibt 504 zurück, wenn der Vorgang nach Ausschöpfung der maximalen Versuche
noch immer läuft. Die endgültige Azure-Antwort wird vor der Rückgabe an den
Aufrufer in dieselbe von Mistral verwendete pages-/markdown-Struktur normalisiert,
sodass der Clientcode den Anbieter nicht gesondert behandeln muss.
Authentifizierung und Endpunktauflösung für Vertex AI DeepSeek OCR
vertex-deepseek-ocr verwendet dieselbe Vertex-AI-Authentifizierung wieder, die OmniRoute bereits für
Chat-/Bilddatenverkehr unterstützt (open-sse/executors/vertex.ts): Der API-Schlüssel der Verbindung ist entweder eine
Service-Account-JSON-Anmeldeinformation (die über den JWT-Bearer-Ablauf gegen ein kurzlebiges OAuth-Zugriffstoken
ausgetauscht wird) oder ein bereits ausgestelltes OAuth-Zugriffstoken, das unverändert verwendet wird. Die URL des Upstream-Endpunkts ist der
generische Partner-Endpunkt openapi/chat/completions von Vertex und wird aus dem Projekt und der
Region der Verbindung erstellt — explizite Werte für providerSpecificData.project/providerSpecificData.region haben immer Vorrang;
andernfalls wird das Projekt aus project_id im Service-Account-JSON abgeleitet, und für die Region wird
standardmäßig us-central1 verwendet. Beide Auflösungen erfolgen in open-sse/handlers/ocr.ts
(resolveVertexOcrAccessToken, resolveVertexOcrBaseUrl) und werden von
src/app/api/v1/ocr/route.ts verwendet, bevor die Anfrage an handleOcr weitergeleitet wird.
Modelle auflisten
GET /v1/models
Authorization: Bearer your-api-key
→ Gibt alle Chat-, Embedding- und Bildmodelle sowie Kombinationen im OpenAI-Format zurück
Modell-ID-Präfixe (?prefix=)
Die meisten Modelle werden unter einem Anbieterpräfix angeboten. Welches Präfix verwendet wird, wird durch das Feature-Flag MODELS_CATALOG_PREFIX_MODE gesteuert und kann pro Anfrage mit einem Abfrageparameter überschrieben werden — nützlich für einen Client, der eine übersichtliche Liste erhalten möchte, ohne die serverweite Einstellung für alle anderen zu ändern:
GET /v1/models?prefix=alias # eine ID pro Modell — das kurze Aliaspräfix
GET /v1/models?prefix=dual # beide Formen (Serverstandard)
GET /v1/models?prefix=canonical # nur das vollständige Anbieter-ID-Präfix
| Modus | Gibt aus | Hinweise |
|---|---|---|
dual |
cc/claude-sonnet-4-6 und claude/claude-sonnet-4-6 |
Standard. Beide IDs werden an dasselbe Modell weitergeleitet; dies bleibt so bestehen, damit Client-Konfigurationen, in denen eine der beiden Formen fest codiert ist, weiterhin funktionieren. Verdoppelt den Katalog ungefähr. |
alias |
cc/claude-sonnet-4-6 |
Ein Eintrag pro Modell. Anbieter ohne eindeutigen Alias geben ihren Eintrag weiterhin aus, sodass nichts verloren geht. |
canonical |
claude/claude-sonnet-4-6 |
Ein Eintrag pro Modell unter dem vollständigen Anbieter-ID-Präfix. Anbieter ohne eindeutigen Alias (z. B. antigravity/…, agy/…) geben auch hier ihre einzelne ID aus, sodass nichts verloren geht. |
Eine Spiegel-ID im dual-Modus kann auch ohne den Abfrageparameter erkannt werden: Sie enthält ein parent-Feld, das auf die primäre ID verweist.
Clients, die eine Modellauswahl darstellen, sollten ?prefix=alias anfordern — so verfährt auch die OmniCopilot-VS-Code-Erweiterung.
Modellvarianten ohne Denkmodus
Für denkfähige Claude-Modelle bietet /v1/models außerdem eine No-Thinking-Variante an, deren ID das Präfix claude-3-omniroute-no-thinking/ trägt:
claude-3-omniroute-no-thinking/<provider>/<model>
Bei Auswahl dieser ID (z. B. in einer Claude-Code-Konfiguration, die immer einen thinking-Block anhängt) wird sie wieder zum tatsächlichen <provider>/<model> aufgelöst, wobei das Reasoning unterdrückt wird — durch thinking:{type:"disabled"} für den Pfad /v1/messages oder durch Entfernen der Felder reasoning/reasoning_effort für den Pfad /v1/chat/completions. Die Variante wird nur für Modelle der Claude-Familie aufgeführt, die den Denkmodus unterstützen und disabled berücksichtigen (d. h. beispielsweise Modelle, die nur den adaptiven Modus unterstützen und disabled ablehnen, sind ausgeschlossen). Betreiber können die Variante über ModelSpec.noThinkingAlias für jedes Modell erzwingen oder deaktivieren.
Anbieter-Plugin-Manifest
GET /api/v1/provider-plugin-manifest
Gibt das JSON-sichere Anbieter-Plugin-Manifest zurück, das von Bifrost, CLIProxyAPI und zukünftigen Sidecar-Routern verwendet wird. Die Antwort wird aus der TypeScript-Anbieterregistrierung generiert und schließt OAuth-Client-Geheimnisse, die Auflösung der Laufzeitumgebung, Executor-Funktionen, Anfrage-Header und Kontodaten absichtlich aus.
Verwenden Sie diesen Endpunkt, wenn ein Sidecar außerhalb des Prozesses ausgeführt wird und open-sse/config/providerPluginManifestRegistry.ts nicht direkt importieren kann.
Kompatibilitätsendpunkte
| Methode | Pfad | Format |
|---|---|---|
| POST | /v1/chat/completions |
OpenAI |
| POST | /v1/messages |
Anthropic |
| POST | /v1/responses |
OpenAI Responses |
| POST | /v1/embeddings |
OpenAI |
| POST | /v1/images/generations |
OpenAI Images |
| POST | /v1/images/edits |
OpenAI Images (Bearbeiten/Inpainting) |
| POST | /v1/videos/generations |
Videoerzeugung im OpenAI-Stil |
| POST | /v1/music/generations |
Musikerzeugung im OpenAI-Stil |
| POST | /v1/audio/transcriptions |
OpenAI Audio (STT) |
| POST | /v1/audio/speech |
OpenAI TTS (gibt Audiodaten zurück) |
| POST | /v1/rerank |
Neusortierung im Cohere-/Voyage-Stil |
| POST | /v1/classify |
Jina-Klassifizierung (api.jina.ai) |
| POST | /v1/segment |
Jina-Segmentierer (segment.jina.ai) |
| POST | /v1/moderations |
OpenAI Moderations |
| GET | /v1/models |
OpenAI |
| POST | /v1/messages/count_tokens |
Anthropic |
| GET | /v1beta/models |
Gemini |
| POST | /v1beta/models/{...path} |
Gemini generateContent |
| POST | /v1/api/chat |
Ollama |
| GET | /api/v1/vscode/{token}/ |
OpenAI-Katalogalias |
| GET | /api/v1/vscode/{token}/models |
OpenAI-Modellalias |
| POST | /api/v1/vscode/{token}/chat/completions |
Tokenisierter OpenAI-Alias |
| POST | /api/v1/vscode/{token}/responses |
Tokenisierter OpenAI-Responses-Alias |
| POST | /api/v1/vscode/{token}/api/chat |
Tokenisierter Ollama-Alias |
| GET | /api/v1/vscode/{token}/api/tags |
Tokenisierter Ollama-Tags-Alias |
Alle POST-Routen folgen demselben Schema: Bearer your-api-key + ein durch Zod validierter JSON-Body (v1RerankSchema, v1ModerationSchema, v1AudioSpeechSchema usw.; siehe src/shared/validation/schemas.ts). Bei einem Schemafehler wird ein 4xx-Statuscode zurückgegeben.
Für Clients, die Authorization: Bearer ... nicht anhängen können, akzeptiert OmniRoute API-Schlüssel auch in der URL, entweder über kompatible Abfrageparameter (?token=..., ?apiKey=..., ?api_key=..., ?key=...) oder über die unten dokumentierten dedizierten /api/v1/vscode/{token}/...-Endpunkte.
# Neusortierung
POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] }
# Jina-Klassifizierung (Foundation-API-Anmeldedaten)
POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] }
# Jina-Segmentierer
POST /v1/segment { "content": "...", "return_chunks": true }
# Jina-Suche (s.jina.ai; Anbieter-Aliasse: jina-search, jina-ai, jina)
POST /v1/search { "query": "...", "provider": "jina-search" }
# Moderation
POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." }
# TTS — gibt einen audio/mpeg-Body (oder das angeforderte Format) zurück
POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" }
# Bildbearbeitung (Multipart)
POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png
# Video-/Musikerzeugung (Modell-ID mit Anbieterpräfix)
POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." }
POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." }
Dedizierte Anbieterrouten
POST /v1/providers/{provider}/chat/completions
POST /v1/providers/{provider}/embeddings
POST /v1/providers/{provider}/images/generations
Das Anbieterpräfix wird automatisch hinzugefügt, wenn es fehlt. Nicht übereinstimmende Modelle geben 400 zurück.
Files API
OpenAI-kompatibler Datei-Endpunkt für Batch-Ein-/Ausgaben und Uploads mit Dateiverwendungszweck.
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /v1/files |
Datei hochladen (Multipart: file, purpose, expires_after[anchor], expires_after[seconds]) — max. 512 MiB |
| GET | /v1/files |
Dateien für den authentifizierten API-Schlüssel auflisten |
| GET | /v1/files/[id] |
Metadaten einer Datei abrufen |
| DELETE | /v1/files/[id] |
Datei löschen |
| GET | /v1/files/[id]/content |
Unveränderten Dateiinhalt als Stream zurückgeben |
Authentifizierung: Bearer-API-Schlüssel — Dateien werden über getApiKeyRequestScope nach API-Schlüssel getrennt. Ein Schlüssel
kann nur seine eigenen Dateien anzeigen, herunterladen und löschen; eine Dashboard-Sitzung ohne Schlüssel kann die
gesamte Instanz lesen; der Zugriff auf eine Datei ohne Besitzer (anonymer Upload oder Upload über eine Dashboard-Sitzung) wird jedem
Aufrufer ohne Sitzung verweigert. GET /v1/files weist einen anonymen Aufrufer — sowie einen angegebenen Schlüssel, der
nicht aufgelöst werden kann — selbst dann mit 401 zurück, wenn REQUIRE_API_KEY=false gilt, anstatt die Dateien
aller Mandanten aufzulisten (GHSA-m3hp-hq9g-fpmv, GHSA-2jm2-mpx8-6523).
Batches API
OpenAI-kompatible Batch-Verarbeitung.
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /v1/batches |
Batch erstellen — Anfragetext wird durch v1BatchCreateSchema validiert (input_file_id, endpoint, completion_window) |
| GET | /v1/batches |
Batches auflisten |
| GET | /v1/batches/[id] |
Batch-Status und request_counts abrufen |
| DELETE | /v1/batches/[id] |
Abgeschlossenen/fehlgeschlagenen Batch löschen |
| POST | /v1/batches/[id]/cancel |
Laufenden Batch abbrechen |
Authentifizierung: Bearer-API-Schlüssel. Batches werden nach API-Schlüssel gemäß derselben Drei-Wege-Regel wie
Dateien getrennt: nur eigener Schlüssel, Dashboard-Sitzung instanzweit, Datensätze ohne Besitzer werden jedem
Aufrufer ohne Sitzung verweigert (Abrufen, Löschen, Abbrechen sowie die Prüfung von input_file_id beim Erstellen).
GET /v1/batches weist einen anonymen Aufrufer selbst dann mit 401 zurück, wenn REQUIRE_API_KEY=false gilt.
Search-API
Abstraktion für Web-/Suchanbieter (Tavily, Brave, Exa, Serper usw.).
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /v1/search |
Konfigurierte Suchanbieter und Funktionen auflisten |
| POST | /v1/search |
Eine Suchanfrage ausführen — Body wird durch v1SearchSchema validiert, unterstützt Caching/Koaleszierung |
| GET | /v1/search/analytics |
Treffer-/Latenz-/Cache-Statistiken pro Anbieter |
Authentifizierung: Bearer-API-Schlüssel (extractApiKey + isValidApiKey). Die Suchrichtlinie wird über enforceApiKeyPolicy durchgesetzt.
Web-Fetch-API
Inhalte über einen konfigurierten Web-Fetch-Anbieter (Firecrawl, Jina Reader, Tavily Extract, TinyFish Fetch, Nimble Extract) aus einer URL extrahieren.
| Methode | Pfad | Beschreibung |
|---|---|---|
| POST | /v1/web/fetch |
Eine URL abrufen/scrapen — Body wird durch v1WebFetchSchema validiert |
Authentifizierung: Bearer-API-Schlüssel (extractApiKey + isValidApiKey). Die Richtlinie wird über enforceApiKeyPolicy durchgesetzt.
Kontingentabhängiger Fallback (#8297): Wenn kein expliziter provider angegeben ist, wird der Pool
(firecrawl → jina-reader → tavily-search → tinyfish → nimble-search) in
fester Prioritätsreihenfolge durchlaufen (Fill-first) — ein ratenbegrenzter, aber
konfigurierter Anbieter wird übersprungen, anstatt die Anfrage sofort
abzubrechen, und ein wiederholbarer Kontingentfehler des Upstreams
(HTTP 429 immer; 402/403 bei kontingentbedingten kostenlosen Tarifen von Firecrawl/Tavily/TinyFish —
nicht bei Jina Reader und niemals bei einer einfachen fehlerhaften 400-Anfrage) führt zur
Laufzeit der Anfrage zum nächsten noch nicht versuchten Anbieter mit hinterlegten
Zugangsdaten. Wenn alle Anbieter im Pool ausgeschöpft sind, gibt der Endpunkt
statt des bisherigen generischen 400 einen einzelnen 429-Fehler (mit einem
Retry-After-Header) zurück. Wenn ein expliziter provider angefordert wird,
gibt es keinen stillen Fallback — ein ratenbegrenzter oder fehlschlagender
expliziter Anbieter gibt seinen eigenen Fehler zurück (429 bei Ratenbegrenzung,
andernfalls den Upstream-Status).
WebSocket-Streaming
GET /v1/ws?handshake=1
Validiert einen WebSocket-Upgrade-Handshake und gibt Beispielnachrichten des Wire-Protokolls (request, cancel) zurück. Die eigentlichen WS-Frames werden vom gebündelten WS-Server außerhalb der Next.js-Routentabelle verarbeitet.
Authentifizierung: Bearer-API-Schlüssel während des Handshakes.
Responses-API über WebSocket (nur codex)
# Derselbe Host und Port wie bei der HTTP-API (standardmäßig 20128); Verbindung aktualisieren:
wscat -c "ws://localhost:20128/v1/responses?api_key=<OMNIROUTE_API_KEY>"
# (oder: -H "Authorization: Bearer <OMNIROUTE_API_KEY>")
# Der erste Frame MUSS response.create sein:
{ "type": "response.create", "model": "gpt-5.5", "input": [ { "role": "user", "content": "hi" } ] }
Ein Responses-API-over-WebSocket-Proxy ist ausschließlich mit codex (ChatGPT-
Backend) verbunden. Er lauscht am selben Port wie die API/das Dashboard unter den
Pfaden /v1/responses, /responses und /api/v1/responses. Beim ersten
response.create-Frame authentifiziert und initialisiert er die Verbindung über
die interne codex-responses-ws-Bridge, wählt eine codex-OAuth-Verbindung aus und
tunnelt über den wreq-js-Transport zu
wss://chatgpt.com/backend-api/codex/responses. Nicht-codex-Modelle werden
abgelehnt (codex_ws_provider_required). Verwenden Sie für kontingentanteiliges
Routing model: "qtSd/<group>/codex/<model>". Implementiert in
app/server-ws.mjs + scripts/dev/responses-ws-proxy.mjs + src/app/api/internal/codex-responses-ws/route.ts.
Authentifizierung: Bearer-API-Schlüssel während des Handshakes. Der gebündelte HTTP-Server (server-ws.mjs)
muss der aktive Einstiegspunkt sein (was standardmäßig der Fall ist, wenn app/server-ws.mjs vorhanden ist).
Modell-ID: die reine ChatGPT-ID verwenden (ohne Präfix codex/)
Die OpenAI Codex CLI validiert den Modellnamen clientseitig, wenn
supports_websockets = true gilt, und lehnt Anbieterpräfix-IDs wie
codex/gpt-5.5 ab (The 'codex/gpt-5.5' model is not supported when using Codex with a ChatGPT account). Senden Sie die reine ID (z. B. gpt-5.5). Die Bridge von
OmniRoute unterstützt ausschließlich codex und löst daher eine reine ID vor dem
Tunneln zum Upstream erneut als codex-Modell auf (resolveCodexWsModelInfo) —
obwohl ein reines gpt-5.5 über HTTP andernfalls an einen anderen Anbieter
weitergeleitet würde.
Konfigurieren der OpenAI Codex CLI
Richten Sie die Codex CLI auf OmniRoute aus, indem Sie unter
~/.codex/config.toml einen benutzerdefinierten Anbieter mit WebSocket-
Unterstützung hinzufügen (verwenden Sie ein separates CODEX_HOME, um eine
bestehende Konfiguration nicht zu verändern):
model = "gpt-5.5" # reine ID — NICHT "codex/gpt-5.5"
model_provider = "omniroute"
[model_providers.omniroute]
name = "OmniRoute (WS)"
base_url = "http://localhost:20128/v1" # kein abschließender Schrägstrich; die WS-URL wird daraus abgeleitet (in der Produktion https/wss verwenden)
wire_api = "responses" # seit Feb. 2026 der einzige unterstützte Wert
supports_websockets = true # aktiviert den Responses-over-WS-Transport
env_key = "OMNIROUTE_API_KEY" # enthält den OmniRoute-API-Schlüssel (Bearer)
export OMNIROUTE_API_KEY=sk-... # ein OmniRoute-API-Schlüssel (beliebiger Schlüssel, wenn REQUIRE_API_KEY=false)
codex exec "Responda apenas: PONG"
Die CLI aktualisiert base_url + /responses zu einem WebSocket, und OmniRoute
tunnelt ihn zur ausgewählten codex-OAuth-Verbindung. Ende-zu-Ende gegen den
lokalen Server validiert: ChatGPT gibt codex.rate_limits +
response.created zurück und streamt die Vervollständigung.
Kontingente und Problemberichte
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /v1/quotas/check |
Vorabprüfung des Kontingents für einen provider und eine accountId, bevor ein registrierter Schlüssel ausgestellt wird |
| POST | /v1/issues/report |
Meldet einen Fehler bei der Kontingent-/Schlüsselausstellung an GitHub (erfordert GITHUB_ISSUES_REPO und Token) |
Authentifizierung: Bearer-API-Schlüssel (isAuthenticated).
Self-Service-Nutzung (/api/usage/om-usage)
Jeder API-Schlüssel kann seine eigene Nutzung und seine Kontingente abrufen — ohne Verwaltungsauthentifizierung. Dies ist der Endpunkt, über den ein Client (CLI, das OmniCopilot-Panel) einem Schlüsselinhaber seine Ausgaben anzeigt.
# Textformat (der bisherige Vertrag — Klartext für ein Terminal)
curl -H "Authorization: Bearer <your-api-key>" \
http://localhost:20128/api/usage/om-usage
# Strukturiertes Format — für die Nutzung durch eine Benutzeroberfläche
curl -H "Authorization: Bearer <your-api-key>" \
"http://localhost:20128/api/usage/om-usage?format=json"
Für den Schlüssel muss allowUsageCommand aktiviert sein (standardmäßig deaktiviert — der API-Schlüsselmanager des Dashboards schaltet dies für jeden Schlüssel einzeln um). Andernfalls antwortet der Endpunkt mit 403.
?format=json gibt eine diskriminierte Struktur zurück, sodass ein Aufrufer niemals ein Datenfeld aus einer Ablehnungsantwort liest. Bei Erfolg:
{
"allowed": true,
// nur vorhanden, wenn für den Schlüssel schlüsselspezifische Nutzungslimits aktiviert wurden (täglich/wöchentlich in USD):
"personal": {
"dailySpentUsd": 1.25,
"dailyLimitUsd": 5,
"dailyResetAtIso": "…",
"weeklySpentUsd": 8,
"weeklyLimitUsd": 20,
"weeklyResetAtIso": "…" /* … */,
},
// die ausgewählte Momentaufnahme des Anbieterkontingents oder null, wenn noch nichts zwischengespeichert wurde:
"provider": {
"connectionId": "…",
"provider": "claude",
"plan": "…",
"quotas": {/* … */},
},
// die Momentaufnahme jeder Verbindung, damit eine Benutzeroberfläche mehrere Anbieter nebeneinander darstellen kann:
"providers": [
{ "connectionId": "…", "provider": "claude" /* … */ },
{ "provider": "codex" /* … */ },
],
}
Bei Ablehnung (401 ungültiger Schlüssel / 403 nicht erlaubt) gibt dieselbe Route { "allowed": false, "error": { "message": "…" } } zurück — ein vorhandenes, aber leeres personal/provider (Schlüssel zulässig, bisher keine Daten ermittelt) ist ein anderer Zustand als eine Ablehnung, und nur das JSON-Format unterscheidet diese Fälle.
Authentifizierung: Der eigene Bearer-API-Schlüssel des Aufrufers, validiert mit isValidApiKey — dies ist nicht die Verwaltungsoberfläche (/api/keys/…), die weiterhin durch requireManagementAuth geschützt ist.
Semantischer Cache
# Cache-Statistiken abrufen
GET /api/cache/stats
# Alle Caches leeren
DELETE /api/cache/stats
Beispielantwort:
{
"semanticCache": {
"memorySize": 42,
"memoryMaxSize": 500,
"dbSize": 128,
"hitRate": 0.65
},
"idempotency": {
"activeKeys": 3,
"windowMs": 5000
}
}
Auswirkungen auf die Latenz
Bei einem Treffer im semantischen Cache wird die Antwort ohne Upstream-Aufruf aus dem Cache bereitgestellt, sodass die gemeldete X-OmniRoute-Response-Latency nahezu null beträgt (unabhängig von der ursprünglichen Upstream-Latenz). Latenzempfindliche Clients (Benchmarking, p50-/p99-Monitoring) sollten den Antwort-Header X-OmniRoute-Cache-Latency prüfen:
| Wert | Bedeutung |
|---|---|
synthetic |
Antwort aus dem Cache bereitgestellt; die Latenz ist keine echte Upstream-Zeit |
| (fehlend) | Antwort aus einem echten Upstream-Aufruf |
Cache-Umgehung pro Schlüssel
API-Schlüssel können Cache-Lesevorgänge des semantischen Caches über cacheDefaultMode deaktivieren:
| Wert | Verhalten |
|---|---|
legacy |
Normales Cache-Verhalten (Standard) |
bypass |
Cache-Suche vollständig überspringen; immer den Upstream aufrufen |
Bei der Schlüsselerstellung (POST /api/keys) festlegen oder per Aktualisierung (PATCH /api/keys/[id]) ändern:
{ "cacheDefaultMode": "bypass" }
Umgehung pro Anfrage
Jede Anfrage kann den Cache unabhängig von den Schlüsseleinstellungen umgehen:
X-OmniRoute-No-Cache: true
Dashboard & Verwaltung
Verwaltungsrouten (/api/* außer öffentlicher Authentifizierung/Anmeldung) werden nicht durch
gewöhnliche Inferenz-API-Schlüssel autorisiert. Anmeldeinformationstypen, Berechtigungsbereiche und curl-Beispiele:
Verwaltungsauthentifizierung.
Authentifizierung
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/auth/login |
POST | Anmelden |
/api/auth/logout |
POST | Abmelden |
/api/settings/require-login |
GET/PUT | Anmeldepflicht ein-/ausschalten |
Anbieterverwaltung
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/providers |
GET/POST | Anbieter auflisten/erstellen |
/api/providers/[id] |
GET/PUT/DELETE | Einen Anbieter verwalten |
/api/providers/[id]/test |
POST | Anbieterverbindung testen |
/api/providers/[id]/models |
GET | Anbietermodelle auflisten |
/api/providers/validate |
POST | Anbieterkonfiguration validieren |
/api/providers/bulk |
POST | API-Schlüssel für EINEN Anbieter gesammelt hinzufügen |
/api/providers/import |
POST | Eine heterogene Anbieter-LISTE aus einer geparsten CSV-/JSON-Datei importieren (#6836); Teilergebnisse bei Fehlern pro Zeile |
/api/provider-nodes* |
Verschiedene | Verwaltung von Anbieterknoten |
/api/provider-models |
GET/POST/PATCH/DELETE | Benutzerdefinierte Modelle (hinzufügen, aktualisieren, ausblenden/einblenden, löschen) |
OAuth-Abläufe
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/oauth/[provider]/[action] |
Verschiedene | Anbieterspezifisches OAuth |
Routing & Konfiguration
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/models/alias |
GET/POST | Modellaliase |
/api/models/catalog |
GET | Alle Modelle nach Anbieter und Typ |
/api/combos* |
Verschiedene | Combo-Verwaltung |
/api/keys* |
Verschiedene | API-Schlüsselverwaltung |
/api/pricing |
GET | Modellpreise |
Nutzung & Analysen
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/usage/history |
GET | Nutzungsverlauf |
/api/usage/logs |
GET | Nutzungsprotokolle |
/api/usage/request-logs |
GET | Protokolle auf Anfrageebene |
/api/usage/[connectionId] |
GET | Nutzung pro Verbindung |
/api/usage/token-limits |
GET/POST/DELETE | Tokenlimit-Budgets pro API-Schlüssel |
/api/usage/model-latency-stats |
GET | Rollierendes Latenzaggregat pro Anbieter/Modell (Durchschnitt/p50/p95/p99, Erfolgsquote); Filter: windowHours/minSamples/maxRows/provider/model (#6873) |
/api/usage/cache-health |
GET | Zusammenfassung des Prompt-Cache-Zustands über call_logs — Schreib-/Leseverhältnis, p50/p90/p99-Verteilung der Schreibgröße, Konzentration schreibintensiver Vorgänge, Aufschlüsselung pro Modell und eine Bewertung als healthy/degraded/thrash/no-data; Abfrageparameter range (1h|24h|7d|30d, Standardwert 24h) und optional model (#8827) |
Einstellungen
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/settings |
GET/PUT/PATCH | Allgemeine Einstellungen |
/api/settings/proxy |
GET/PUT | Netzwerk-Proxy-Konfiguration |
/api/settings/proxy/test |
POST | Proxy-Verbindung testen |
/api/settings/ip-filter |
GET/PUT | IP-Zulassungs-/Sperrliste |
/api/settings/thinking-budget |
GET/PUT | Umschreibmodus für Anfragen mit Denk-/Reasoning-Budget (Durchleitung / automatisches Entfernen / benutzerdefiniert / adaptiv). Unabhängig von der Komprimierung. Siehe THINKING_BUDGET.md. |
/api/settings/system-prompt |
GET/PUT | Globaler System-Prompt |
/api/settings/compression |
GET/PUT | Globale Komprimierungskonfiguration |
/api/settings/purge-request-history |
POST | Anfrageprotokollzeilen und lokale Aufrufprotokoll-Artefakte löschen |
Kontext & Komprimierung
| Endpoint | Methode | Beschreibung |
|---|---|---|
/api/compression/preview |
POST | Vorschau der Komprimierung off/lite/standard/aggressive/ultra/RTK/stacked |
/api/compression/language-packs |
GET | Verfügbare Caveman-Sprachpakete auflisten |
/api/compression/rules |
GET | Metadaten der Caveman-Regeln auflisten |
/api/context/caveman/config |
GET/PUT | Alias für Caveman-spezifische Einstellungen |
/api/context/rtk/config |
GET/PUT | RTK-spezifische Einstellungen einschließlich benutzerdefinierter Filter und Aufbewahrung der Rohausgabe |
/api/context/rtk/filters |
GET | RTK-Filterkatalog und Diagnoseinformationen für benutzerdefinierte Filter |
/api/context/rtk/test |
POST | RTK-Vorschau/-Test mit einer Textnutzlast ausführen |
/api/context/rtk/raw-output/[id] |
GET | Aufbewahrte, bereinigte Rohausgabe anhand der Zeiger-ID lesen |
/api/context/combos |
GET/POST | Komprimierungskombinationen auflisten/erstellen |
/api/context/combos/[id] |
GET/PUT/DELETE | Details einer Komprimierungskombination abrufen/aktualisieren/löschen |
/api/context/combos/[id]/assignments |
GET/PUT | Komprimierungskombinationen Routing-Kombinationen zuweisen |
/api/context/analytics |
GET | Alias für Komprimierungsanalysen |
Überwachung
| Endpoint | Methode | Beschreibung |
|---|---|---|
/api/sessions |
GET | Nachverfolgung aktiver Sitzungen |
/api/rate-limits |
GET | Ratenbegrenzungen pro Konto |
/api/monitoring/health |
GET | Integritätsprüfung und Anbieterübersicht (catalogCount, configuredCount, activeCount, monitoredCount). Die Verwaltungsansicht enthält credentialHealth: Skalare aus dem Prüfungs-Cache, failedConnections, wenn failed>0, und staleDbNonOkCount (persistenter SQLite-test_status, nicht die Messgröße). Siehe MONITORING_GUIDE.md. |
/api/cache/stats |
GET/DELETE | Cache-Statistiken abrufen / Cache leeren |
/api/modality-bridge/stats |
GET | Im Arbeitsspeicher vorgehaltene attempts, Erfolge/bridged, Fehler, Cache-Treffer, totalLatencyMs, latencySamples, das auf Stichproben basierende averageLatencyMs und Zeitpunkt der letzten Nutzung (wird bei einem Neustart zurückgesetzt; Verwaltungsauthentifizierung) |
/api/modality-bridge/video/runtime |
GET | Strikte Prüfung auf vertrauenswürdiges Loopback vor Verwaltungsauthentifizierung/-prüfung; bereinigte Angaben zur Verfügbarkeit und zu den Versionen von FFmpeg/ffprobe (no-store) |
/api/modality-bridge/video/extract |
POST | Interner, authentifizierter Byte-Broker über vertrauenswürdiges Loopback; 50 MiB Eingabe, begrenzte Warteschlange/32 MiB Ausgabe, 503 bei Kapazitätsüberschreitung, 499 bei Verbindungsabbruch, 504 bei Fristüberschreitung; keine öffentliche Upload-API |
Sicherung und Export/Import
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/db-backups |
GET | Verfügbare Sicherungen auflisten |
/api/db-backups |
PUT | Eine manuelle Sicherung erstellen |
/api/db-backups |
POST | Aus einer bestimmten Sicherung wiederherstellen |
/api/db-backups/export |
GET | Datenbank als .sqlite-Datei herunterladen |
/api/db-backups/import |
POST | .sqlite-Datei hochladen, um die Datenbank zu ersetzen |
/api/db-backups/exportAll |
GET | Vollständige Sicherung als .tar.gz-Archiv herunterladen |
Cloud-Synchronisierung
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/sync/cloud |
Verschiedene | Cloud-Synchronisierungsvorgänge |
/api/sync/initialize |
POST | Synchronisierung initialisieren |
/api/cloud/* |
Verschiedene | Cloud-Verwaltung |
Tunnel
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/tunnels/cloudflared |
GET | Installations-/Laufzeitstatus des Cloudflare Quick Tunnel für das Dashboard abrufen |
/api/tunnels/cloudflared |
POST | Cloudflare Quick Tunnel aktivieren oder deaktivieren (action=enable/disable) |
/api/tunnels/ngrok |
GET | Laufzeitstatus des ngrok Tunnel für das Dashboard abrufen |
/api/tunnels/ngrok |
POST | ngrok Tunnel aktivieren oder deaktivieren (action=enable/disable) |
CLI-Tools
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/cli-tools/claude-settings |
GET | Claude-CLI-Status |
/api/cli-tools/codex-settings |
GET | Codex-CLI-Status |
/api/cli-tools/droid-settings |
GET | Droid-CLI-Status |
/api/cli-tools/openclaw-settings |
GET | OpenClaw-CLI-Status |
/api/cli-tools/runtime/[toolId] |
GET | Generische CLI-Laufzeit |
CLI-Antworten enthalten: installed, runnable, command, commandPath, runtimeMode, reason.
ACP-Agenten
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/acp/agents |
GET | Alle erkannten Agenten (integriert + benutzerdefiniert) mit Status auflisten |
/api/acp/agents |
POST | Benutzerdefinierten Agenten hinzufügen oder Erkennungs-Cache aktualisieren |
/api/acp/agents |
DELETE | Benutzerdefinierten Agenten anhand des Abfrageparameters id entfernen |
Die GET-Antwort enthält agents[] (id, name, binary, version, installed, protocol, isCustom) und summary (total, installed, notFound, builtIn, custom).
Ausfallsicherheit & Ratenbegrenzungen
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/resilience |
GET/PATCH | Anfragewarteschlange, Verbindungs-Cooldown, Anbieter-Schutzschalter und Warteeinstellungen abrufen/aktualisieren |
/api/resilience/reset |
POST | Anbieter-Schutzschalter zurücksetzen |
/api/resilience/model-cooldowns |
GET | Aktive Sperren pro (Anbieter, Verbindung, Modell), sortiert nach verbleibender Zeit, auflisten |
/api/resilience/model-cooldowns |
DELETE | Modellsperre aufheben — Body {provider, model} oder {all: true}, um alles zu löschen |
/api/rate-limits |
GET | Ratenbegrenzungsstatus pro Konto |
/api/rate-limit |
GET | Globale Ratenbegrenzungskonfiguration |
Alle vier
/api/resilience/*-Routen erfordern eine Verwaltungsauthentifizierung (requireManagementAuth). Eine vollständige Aufschlüsselung von Anbieter-Schutzschalter, Verbindungs-Cooldown und Modellsperre finden Sie unter Ausfallsicherheit (erweitert).
Evaluierungen
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/evals |
GET/POST | Evaluierungssammlungen auflisten / Evaluierung ausführen |
Richtlinien
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/policies |
GET/POST/DELETE | Routing-Richtlinien verwalten |
Compliance
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/compliance/audit-log |
GET | Compliance-Auditprotokoll (letzte N) |
v1beta (Gemini-kompatibel)
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/v1beta/models |
GET | Modelle im Gemini-Format auflisten |
/v1beta/models/{...path} |
POST | Gemini-generateContent-Endpunkt |
Diese Endpunkte spiegeln das API-Format von Gemini für Clients wider, die native Kompatibilität mit dem Gemini SDK erwarten.
Interne / System-APIs
| Endpunkt | Methode | Beschreibung |
|---|---|---|
/api/init |
GET | Prüfung der Anwendungsinitialisierung (wird beim ersten Start verwendet) |
/api/tags |
GET | Ollama-kompatible Modell-Tags (für Ollama-Clients) |
/api/restart |
POST | Geordneten Neustart des Servers auslösen |
/api/shutdown |
POST | Geordnetes Herunterfahren des Servers auslösen |
/api/system/env/repair |
POST | Umgebungsvariablen des OAuth-Anbieters reparieren |
Hinweis: Diese Endpunkte werden intern vom System oder zur Kompatibilität mit Ollama-Clients verwendet. Sie werden üblicherweise nicht von Endbenutzern aufgerufen.
Reparatur der OAuth-Umgebung (v3.6.1+)
POST /api/system/env/repair
Content-Type: application/json
{
"provider": "claude-code"
}
Repariert fehlende oder beschädigte OAuth-Umgebungsvariablen für einen bestimmten Anbieter. Gibt Folgendes zurück:
{
"success": true,
"repaired": ["CLAUDE_CODE_OAUTH_CLIENT_ID", "CLAUDE_CODE_OAUTH_CLIENT_SECRET"],
"backupPath": "/home/user/.omniroute/backups/env-repair-2026-04-11.bak"
}
Audiotranskription
POST /v1/audio/transcriptions
Authorization: Bearer your-api-key
Content-Type: multipart/form-data
Transkribieren Sie Audiodateien mit einem beliebigen konfigurierten STT-Anbieter. Das erste Pfadsegment wählt den nativen Anbieter aus (openai/…, deepgram/…). Gateways, die das Modell eines anderen Anbieters erneut bereitstellen, verwenden eine qualifizierte ID (openrouter/deepgram/nova-3).
Anfrage:
curl -X POST http://localhost:20128/v1/audio/transcriptions \
-H "Authorization: Bearer your-api-key" \
-F "file=@recording.mp3" \
-F "model=openai/whisper-1"
Antwort:
{
"text": "Hallo, dies ist der transkribierte Audioinhalt.",
"task": "transcribe",
"language": "en",
"duration": 12.5
}
Beispiele für Modell-IDs: openai/whisper-1 (erfordert einen OpenAI-Schlüssel), openrouter/deepgram/nova-3 (erfordert einen OpenRouter-Schlüssel), deepgram/nova-3 (erfordert einen nativen Deepgram-Schlüssel). Eine einfache Anfrage an deepgram/nova-3 verwendet nicht OpenRouter.
Unterstützte Formate: mp3, wav, m4a, flac, ogg, webm.
Ollama-Kompatibilität
Für Clients, die das API-Format von Ollama verwenden:
# Chat-Endpunkt (Ollama-Format)
POST /v1/api/chat
# Modellauflistung (Ollama-Format)
GET /api/tags
Anfragen werden automatisch zwischen dem Ollama-Format und internen Formaten übersetzt.
Tokenisierte VS-Code-Aliasse/Aliasse ohne Header
Verwenden Sie diese Aliasse, wenn eine Integration keinen Authorization-Header einfügen kann und der API-Schlüssel in die Basis-URL eingebettet werden muss.
# Katalog-Alias im OpenAI-Stil
GET /api/v1/vscode/{token}/
GET /api/v1/vscode/{token}/models
# Chat-Aliasse im OpenAI-Stil
POST /api/v1/vscode/{token}/chat/completions
POST /api/v1/vscode/{token}/responses
# Aliasse im Ollama-Stil
POST /api/v1/vscode/{token}/api/chat
GET /api/v1/vscode/{token}/api/tags
Beispiel:
curl https://your-host.example/api/v1/vscode/YOUR_API_KEY/models
curl -X POST https://your-host.example/api/v1/vscode/YOUR_API_KEY/chat/completions \
-H "Content-Type: application/json" \
-d '{"model":"auto","messages":[{"role":"user","content":"Hallo"}]}'
Hinweise:
- Die tokenisierten Aliasse verwenden dieselben Handler wie
/v1/*und/api/tags; die Antwortstrukturen bleiben identisch. - Bevorzugen Sie
Authorization: Bearer ..., wenn der Client benutzerdefinierte Header unterstützt. - URL-basierte Token können in Reverse-Proxy-Protokollen, im Browserverlauf und in Telemetriedaten außerhalb von OmniRoute erscheinen. Behandeln Sie sie als Kompatibilitätsoption und nicht als standardmäßigen Authentifizierungsmodus.
Telemetrie
# Zusammenfassung der Latenztelemetrie abrufen (p50/p95/p99 pro Anbieter)
GET /api/telemetry/summary
Antwort:
{
"providers": {
"claudeCode": { "p50": 245, "p95": 890, "p99": 1200, "count": 150 },
"github": { "p50": 180, "p95": 620, "p99": 950, "count": 320 }
}
}
Budget
# Budgetstatus für alle API-Schlüssel abrufen
GET /api/usage/budget
# Ein Budget festlegen oder aktualisieren
POST /api/usage/budget
Content-Type: application/json
{
"apiKeyId": "key-123",
"dailyLimitUsd": 5.00,
"weeklyLimitUsd": 30.00,
"monthlyLimitUsd": 100.00,
"warningThreshold": 0.8,
"resetInterval": "monthly"
}
Schemahinweise (
setBudgetSchema):apiKeyIdist erforderlich; mindestens einer der WertedailyLimitUsd,weeklyLimitUsdodermonthlyLimitUsdmuss größer als null sein. Optionale Felder:warningThreshold(0–1),resetInterval(daily|weekly|monthly),resetTime(HH:MM). Das veraltete Format{keyId, limit, period}gibt400 Bad Requestzurück.
Token-Limits
Token-Budgets pro API-Schlüssel (unabhängig vom oben genannten USD-basierten Budget). Sie werden direkt bei der Anfrageverarbeitung durchgesetzt: Wenn die Nutzung eines Schlüssels im aktuellen Zeitfenster sein Limit erreicht, werden Anfragen mit 429 Too Many Requests abgelehnt. Limits können auf ein bestimmtes model oder einen bestimmten provider beschränkt oder global auf den gesamten Schlüssel angewendet werden. Wenn mehrere Limits auf eine Anfrage zutreffen, gilt das restriktivste.
# Token-Limits eines Schlüssels auflisten (einschließlich der aktuellen Nutzung im Zeitfenster)
GET /api/usage/token-limits?apiKeyId=key-123
# Ein Token-Limit erstellen oder aktualisieren
POST /api/usage/token-limits
Content-Type: application/json
{
"apiKeyId": "key-123",
"scopeType": "model",
"scopeValue": "openai/gpt-4o",
"tokenLimit": 1000000,
"resetInterval": "monthly",
"enabled": true
}
# Ein Token-Limit anhand seiner ID löschen
DELETE /api/usage/token-limits?id=tl-abc
Schemahinweise (
setTokenLimitSchema):apiKeyIdundscopeType(model|provider|global) sind erforderlich.scopeValueist erforderlich, sofernscopeTypenichtglobalist (z. B. eine Modell-ID für den Geltungsbereichmodeloder eine Anbieter-ID für den Geltungsbereichprovider).tokenLimitmuss eine positive Ganzzahl sein (wird aus einer Zeichenfolge konvertiert). Optional:id(zum Erstellen weglassen, zum Aktualisieren angeben),resetInterval(daily|weekly|monthly, Standardwertmonthly),resetTime(HH:MM),enabled(Standardwerttrue).GET-Antworten ergänzen jedes Limit umtokensUsed,remaining,windowStart,periodStartAtundnextResetAt. Dies ist ein Verwaltungsendpunkt (die Authentifizierung wird zentral durch die AuthZ-Pipeline erzwungen).
Anfrageverarbeitung
- Der Client sendet eine Anfrage an
/v1/* - Der Routen-Handler ruft
handleChat,handleEmbedding,handleAudioTranscriptionoderhandleImageGenerationauf - Das Modell wird aufgelöst (direkter Anbieter/direktes Modell oder Alias/Kombination)
- Die Anmeldedaten werden aus der lokalen Datenbank unter Berücksichtigung der Kontoverfügbarkeit ausgewählt
- Für Chat:
handleChatCoreprüft den semantischen/Signatur-Cache und löst die Komprimierungseinstellungen der Kombination auf - Die proaktive Komprimierung wird vor der Anbieterübersetzung ausgeführt, wenn sie aktiviert ist (
lite, Caveman, RTK oder gestapelt) - Der Anbieter-Executor sendet die Anfrage an den Upstream-Dienst
- Die Antwort wird zurück in das Clientformat übersetzt (Chat) oder unverändert zurückgegeben (Einbettungen/Bilder/Audio)
- Nutzungsdaten, Komprimierungsanalysen und Anfrageprotokolle werden aufgezeichnet
- Bei Fehlern erfolgt gemäß den Kombinationsregeln ein Fallback
Vollständige Architekturreferenz: ARCHITECTURE.md
Kombinationsverwaltung
Übergeordnete Routing-Kombinationen (bereits unter /api/combos* zusammengefasst) können außerdem 1:1 aus einem Modell-ID-Muster zugeordnet werden, wodurch eine OpenAI-kompatible Modell-ID transparent an eine Kombination weitergeleitet werden kann.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/model-combo-mappings |
Alle Modell→Kombination-Zuordnungen auflisten |
| POST | /api/model-combo-mappings |
Zuordnung erstellen — Body: {pattern, comboId, priority?, enabled?, description?} |
| GET | /api/model-combo-mappings/[id] |
Eine einzelne Zuordnung abrufen |
| PUT | /api/model-combo-mappings/[id] |
Felder einer vorhandenen Zuordnung aktualisieren |
| DELETE | /api/model-combo-mappings/[id] |
Eine Zuordnung entfernen |
Authentifizierung: Verwaltungssitzung/API-Schlüssel (requireManagementAuth).
Webhooks
Ausgehende Webhook-Abonnements für OmniRoute-Ereignisse (Abschluss von Anfragen, Ausschöpfung von Kontingenten, Schlüsselrotation usw.).
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/webhooks |
Webhooks auflisten (Secrets werden als <prefix>... maskiert) |
| POST | /api/webhooks |
Webhook erstellen — Body: {url, events?: ["*"], secret?, description?} |
| GET | /api/webhooks/[id] |
Einen Webhook abrufen |
| PUT | /api/webhooks/[id] |
url/events/secret/description aktualisieren |
| DELETE | /api/webhooks/[id] |
Einen Webhook entfernen |
| POST | /api/webhooks/[id]/test |
Eine Test-Payload an die Webhook-URL senden und den Zustellungsstatus ausgeben |
Authentifizierung: Verwaltungssitzung/API-Schlüssel (requireManagementAuth).
Registrierte Schlüssel (automatische Verwaltung)
Wird vom Subsystem zur automatischen Schlüsselverwaltung verwendet, um API-Schlüssel für einen zugrunde liegenden Anbieter bzw. ein zugrunde liegendes Konto auszustellen und zu rotieren, einschließlich täglicher und stündlicher Kontingente.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/v1/registered-keys |
Registrierte Schlüssel auflisten (nur maskiertes Präfix) |
| POST | /api/v1/registered-keys |
Einen neuen registrierten Schlüssel ausstellen — Body: {name, provider?, accountId?, idempotencyKey?, expiresAt?, dailyBudget?, hourlyBudget?}. Gibt den unmaskierten Schlüssel einmalig zurück. Gibt bei Ablehnung aufgrund des Kontingents 429 zurück. |
| GET | /api/v1/registered-keys/[id] |
Metadaten eines registrierten Schlüssels abrufen (kein unmaskiertes Schlüsselmaterial) |
| DELETE | /api/v1/registered-keys/[id] |
Einen registrierten Schlüssel widerrufen |
| POST | /api/v1/registered-keys/[id]/revoke |
Expliziter Endpunkt zum Widerrufen (gleiche Wirkung wie DELETE) |
Authentifizierung: Bearer-API-Schlüssel (isAuthenticated). Siehe auch /v1/quotas/check und /v1/issues/report.
Agents-Protokoll
Cloud-Agent-Aufgaben (Claude Code, Codex Cloud, OpenHands usw.), die im Auftrag von OmniRoute-Benutzern remote ausgeführt werden.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/v1/agents/tasks |
Aufgaben auflisten — optional ?provider=, ?status=, ?limit= (1–500, Standardwert 50) |
| POST | /api/v1/agents/tasks |
Aufgabe erstellen — Body wird durch CreateCloudAgentTaskSchema validiert (providerId, prompt, source, options?). Gibt 201 mit Aufgaben-Envelope zurück |
| DELETE | /api/v1/agents/tasks?id=... |
Eine Aufgabe löschen |
| GET | /api/v1/agents/tasks/[id] |
Aufgabe abrufen — aktualisiert den Status synchron vom vorgelagerten Cloud-Agent, wenn eine external_id festgelegt ist |
| POST | /api/v1/agents/tasks/[id] |
Unterscheidbare Aktion: {action: "approve"}, {action: "message", message} oder {action: "cancel"} |
| DELETE | /api/v1/agents/tasks/[id] |
Eine bestimmte Aufgabe anhand ihrer ID löschen |
Authentifizierung: Für jede Methode ist eine Verwaltungsauthentifizierung erforderlich (
requireCloudAgentManagementAuth). Vor v3.8.0 waren diese Methoden nicht authentifiziert — siehe Commit588a0333für die inkompatible Änderung.
# Eine Claude-Code-Cloud-Aufgabe erstellen
curl -X POST http://localhost:20128/api/v1/agents/tasks \
-H "Authorization: Bearer your-management-key" \
-H "Content-Type: application/json" \
-d '{"providerId":"claude-code-cloud","prompt":"Fix the failing test","source":{"repo":"...","branch":"..."}}'
Verwaltungs-Proxys
Ausgehende HTTP(S)-/SOCKS-Proxys, die Anbietern, Konten oder global zugewiesen werden können.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/v1/management/proxies |
Proxys auflisten (mit ?id= wird ein Proxy zurückgegeben; mit ?id=&where_used=1 wird der Zuweisungsgraph zurückgegeben) |
| POST | /api/v1/management/proxies |
Proxy erstellen — Body wird durch createProxyRegistrySchema validiert |
| PATCH | /api/v1/management/proxies |
Proxy aktualisieren — Body wird durch updateProxyRegistrySchema validiert (id erforderlich) |
| DELETE | /api/v1/management/proxies?id=...&force=1 |
Proxy löschen (force=1 verwenden, um Zuweisungen zu lösen) |
| GET | /api/v1/management/proxies/assignments |
Zuweisungen auflisten — filterbar nach proxy_id, scope, scope_id; resolve_connection_id=<id> übergeben, um den aktiven Proxy für eine Verbindung zu ermitteln |
| PUT | /api/v1/management/proxies/assignments |
Zuweisen — Body wird durch proxyAssignmentSchema validiert ({scope, scopeId?, proxyId?}). Leert den Dispatcher-Cache |
| PUT | /api/v1/management/proxies/bulk-assign |
Massenzuweisung — Body wird durch bulkProxyAssignmentSchema validiert ({scope, scopeIds[], proxyId?}) |
| GET | /api/v1/management/proxies/health?hours=24 |
Aggregierter Proxy-Zustand (Anzahl erfolgreicher/fehlgeschlagener Anfragen, Latenz) über ein Zeitfenster |
Authentifizierung: Verwaltungssitzung/API-Schlüssel für jede Route (requireManagementAuth).
Die in der Aufgabenbeschreibung genannten Routen
POST /api/v1/management/proxies/[id]/assignmentsundPOST /api/v1/management/proxies/[id]/healthwerden über die oben gezeigten flachen Routen/assignmentsund/healthbereitgestellt — in der Codebasis gibt es keine ID-spezifischen Unterrouten.
Resilienz (erweitert)
OmniRoute stellt drei unabhängige Mechanismen für temporäre Fehler bereit; über die folgenden Verwaltungsendpunkte können Betreiber deren Status auslesen und sie überschreiben:
| Geltungsbereich | Zustandsspeicher | Auslesen | Zurücksetzen / Löschen |
|---|---|---|---|
| Provider-Schutzschalter | domain_circuit_breakers + im Arbeitsspeicher |
/api/monitoring/health |
POST /api/resilience/reset |
| Verbindungs-Cooldown | rateLimitedUntil für Provider-Verbindungen |
/api/rate-limits, /api/providers/[id] |
(wird verzögert wieder aktiviert; Löschen über Provider-PUT) |
| Modellsperre | Modellverfügbarkeitsregister im Arbeitsspeicher | GET /api/resilience/model-cooldowns |
DELETE /api/resilience/model-cooldowns |
PATCH /api/resilience akzeptiert Überschreibungen für Provider-Schutzschalter unter providerBreaker.oauth und providerBreaker.apikey. Jedes Profil unterstützt degradationThreshold, failureThreshold und resetTimeoutMs; dieselben Felder sind unter Dashboard → Einstellungen → Resilienz verfügbar.
# Eine einzelne Modellsperre löschen
curl -X DELETE http://localhost:20128/api/resilience/model-cooldowns \
-H "Cookie: auth_token=..." \
-H "Content-Type: application/json" \
-d '{"provider":"openai","model":"gpt-4o-mini"}'
# Alle Sperren löschen
curl -X DELETE http://localhost:20128/api/resilience/model-cooldowns \
-H "Cookie: auth_token=..." \
-d '{"all":true}'
Die vollständige konzeptionelle Referenz und die Standardwerte für Schutzschalter finden Sie unter CLAUDE.md → „Resilience Runtime State“.
Skills
Skill-Framework zur Erweiterung von OmniRoute um benutzerdefinierte ausführbare Handler sowie Marketplace-Integrationen.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/skills |
Installierte Skills auflisten — filterbar nach ?q=, ?mode=on|off|auto, ?source=skillsmp|skillssh|local, paginiert |
| GET | /api/skills/[id] |
Einen einzelnen Skill abrufen |
| PUT | /api/skills/[id] |
Skill aktualisieren (Name, Beschreibung, Modus, Schema, Handler, Tags) |
| DELETE | /api/skills/[id] |
Einen Skill deinstallieren |
| POST | /api/skills/install |
Einen Skill aus einem Rohmanifest installieren — Body: {name, version, description, schema:{input, output}, handlerCode, apiKeyId?} |
| GET | /api/skills/executions |
Letzte Skill-Ausführungen auflisten (Audit-Trail mit Ein-/Ausgaben und Dauer) |
| GET | /api/skills/marketplace?q=... |
Suche/beliebte Liste aus dem SkillsMP-Marketplace (erfordert die Einstellung skillsmpApiKey) |
| POST | /api/skills/marketplace/install |
Einen Skill anhand seiner ID aus SkillsMP installieren |
| GET | /api/skills/skillssh?q=&limit= |
Die skills.sh-Registry durchsuchen |
| POST | /api/skills/skillssh/install |
Einen Skill anhand seiner ID aus skills.sh installieren |
Authentifizierung: Verwaltungssitzung/API-Schlüssel. Marketplace-Suchrouten akzeptieren entweder die Verwaltungsauthentifizierung oder einen Bearer-API-Schlüssel (isAuthenticated).
Speicher
Persistenter Speicher für Konversationen und Fakten, dessen Gültigkeitsbereich auf API-Schlüssel/Sitzung beschränkt ist.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/memory |
Speicherinhalte auflisten — ?apiKeyId=, ?type=, ?sessionId=, ?q=, mit Paginierung über offset/limit oder page/limit |
| POST | /api/memory |
Speicherinhalt erstellen — durch Zod validierter Body: {content, key, type?, sessionId?, apiKeyId?, metadata?, expiresAt?} |
| GET | /api/memory/[id] |
Einen Speicherinhalt abrufen |
| DELETE | /api/memory/[id] |
Einen Speicherinhalt löschen |
| GET | /api/memory/health |
Zustand des Speichersubsystems (DB-Konnektivität, Embeddings-Backend, Status des Vektorindex) |
Authentifizierung: Verwaltungssitzung/API-Schlüssel (requireManagementAuth). type-Enum: FACTUAL, EPISODIC, SEMANTIC, PROCEDURAL (siehe MemoryType in src/lib/memory/types.ts).
MCP-Server
OmniRoute enthält einen eingebetteten Model-Context-Protocol-Server mit 3 Transportarten (stdio, SSE, streamable-http) und Tools mit festgelegten Gültigkeitsbereichen. Die folgenden Dashboard-Endpunkte lesen Status-/Audit-Daten und leiten die HTTP-Transportarten weiter.
| Methode | Pfad | Beschreibung | |
|---|---|---|---|
| GET | /api/mcp/status |
Heartbeat, Transportart, Online-Status, letzter Aufruf, meistgenutzte Tools, Erfolgsquote der letzten 24 Stunden | |
| GET | /api/mcp/tools |
Liste der MCP-Tools mit name, description, scopes, phase, auditLevel, sourceEndpoints |
|
| GET | /api/mcp/sse |
SSE-Stream für die SSE-Transportart öffnen (gibt 503 zurück, wenn MCP deaktiviert ist oder die Transportart nicht übereinstimmt) |
|
| POST | /api/mcp/sse |
JSON-RPC-Frame über die SSE-Transportart senden | |
| GET | /api/mcp/stream |
SSE-Seite der Streamable-HTTP-Transportart öffnen (serverinitiierte Nachrichten) | |
| POST | /api/mcp/stream |
JSON-RPC-Frame über die Streamable-HTTP-Transportart senden | |
| DELETE | /api/mcp/stream |
Eine Streamable-HTTP-Sitzung beenden | |
| GET | /api/mcp/audit |
Audit-Protokoll abfragen — ?limit=, ?offset=, ?tool=, `?success=true |
false, ?apiKeyId=` |
| GET | /api/mcp/audit/stats |
Aggregierte Audit-Statistiken (Gesamtzahlen, Erfolgsquote, durchschnittliche Dauer, meistgenutzte Tools) |
Authentifizierung: Die sse-/stream-Transportarten berücksichtigen die MCP-spezifische Authentifizierungsoberfläche (Bearer-API-Schlüssel mit mcp-Gültigkeitsbereich); die Routen status/tools/audit* können über das Dashboard gelesen werden (über den Zugriff auf den Dashboard-Host hinaus ist keine zusätzliche Authentifizierung erforderlich).
Beide HTTP-Transportarten werden durch
settings.mcpEnabledundsettings.mcpTransportgesteuert — bei einer nicht übereinstimmenden Transportart wird400zurückgegeben, bei deaktiviertem MCP wird503zurückgegeben.
A2A-Server
OmniRoute stellt einen A2A-Endpunkt (Agent-to-Agent) für JSON-RPC 2.0 sowie einen REST-Wrapper für Inspektions- und Dashboard-Zwecke bereit.
JSON-RPC
POST /a2a
Authorization: Bearer your-api-key # optional, sofern OMNIROUTE_API_KEY nicht festgelegt ist
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "message/send",
"params": {
"skill": "smart-routing",
"messages": [{"role": "user", "content": "Route this coding task"}]
}
}
Unterstützte Methoden (alle abhängig von settings.a2aEnabled):
| Methode | Beschreibung |
|---|---|
message/send |
Synchrone Skill-Ausführung; gibt {task, artifacts, metadata} zurück |
message/stream |
Streaming-SSE-Ausführung derselben Skill-Gruppe |
tasks/get |
Ruft eine Aufgabe anhand der taskId ab |
tasks/cancel |
Bricht eine Aufgabe anhand der taskId ab |
Integrierte Skills: smart-routing, quota-management, provider-discovery, cost-analysis, health-report.
Agent Card
GET /.well-known/agent.json
Gibt die öffentliche A2A-Agent-Card zurück (Name, Beschreibung, Funktionen, Skill-Katalog, Authentifizierungsschema) — wird 1 Stunde lang öffentlich zwischengespeichert. Keine Authentifizierung erforderlich.
REST-Hilfsendpunkte
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/a2a/status |
A2A-Aktivierungsstatus + Aufgabenstatistiken + Zusammenfassung der zwischengespeicherten Agent-Card |
| GET | /api/a2a/tasks |
Listet Aufgaben auf — ?state=submitted|working|completed|failed|cancelled, ?skill=, ?limit= (≤200), ?offset= |
| POST | /api/a2a/tasks |
(Nicht als REST-Hilfsendpunkt implementiert — Erstellung über JSON-RPC message/send) |
| GET | /api/a2a/tasks/[id] |
Ruft eine einzelne Aufgabe ab |
| POST | /api/a2a/tasks/[id]/cancel |
Bricht eine Aufgabe ab |
Authentifizierung: Die REST-Hilfsendpunkte werden ohne Verwaltungs-Authentifizierung ausgeführt (vom Dashboard lesbar); die JSON-RPC-Route /a2a verwendet Bearer OMNIROUTE_API_KEY, sofern konfiguriert.
Cloud, Evals & Assess
| Methode | Pfad | Beschreibung | ||
|---|---|---|---|---|
| POST | /api/cloud/auth |
Überprüft einen Bearer-Schlüssel und gibt maskierte Provider-Verbindungen sowie Modell-Aliasse für Cloud-Synchronisierungsclients zurück | ||
| POST | /api/cloud/credentials/update |
Aktualisiert verschlüsselte Zugangsdaten für einen Cloud-synchronisierten Provider | ||
| POST | /api/cloud/model/resolve |
Löst eine logische Modell-ID mithilfe der lokalen Routing-Tabelle in einen konkreten Provider/ein konkretes Modell auf | ||
| GET | /api/cloud/models/alias |
Listet Modell-Aliasse auf, wie sie für die Cloud-Synchronisierung bereitgestellt werden | ||
| GET | /api/assess |
Liest die neuesten Bewertungskategorisierungen (pro Provider/Modell) | ||
| POST | /api/assess |
Führt eine Bewertung aus — Body: `{scope: {type:"all"} | {type:"provider", providerId} | {type:"model", modelId}, trigger?}` |
| GET | /api/evals |
Listet integrierte Eval-Suites und die neuesten Ausführungen auf | ||
| POST | /api/evals |
Startet eine Eval-Ausführung | ||
| POST | /api/evals/suites |
Erstellt eine benutzerdefinierte Eval-Suite — Body wird durch evalSuiteSaveSchema validiert |
||
| GET | /api/evals/suites/[id] |
Ruft eine benutzerdefinierte Eval-Suite ab |
Authentifizierung: /api/cloud/auth validiert einen Bearer-Schlüssel direkt; die anderen Routen unter /api/cloud/*, /api/evals/* und /api/assess erfordern eine Verwaltungssitzung/einen API-Schlüssel. POST auf /api/assess verwendet validateBody mit einem Scope-Schema vom Typ „Discriminated Union“.
ACP-Verwaltung (Agent Client Protocol)
als untergeordnete Prozesse. Diese Endpunkte verwalten die Erkennung von ACP-Agenten und die Registrierung benutzerdefinierter Agenten.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/acp/agents |
Listet alle bekannten CLI-Agenten (integrierte und benutzerdefinierte) mit Installationsstatus, Version und Binärdatei auf |
| POST | /api/acp/agents |
Registriert einen benutzerdefinierten ACP-Agenten oder aktualisiert den Cache — Body: {id, name, binary, versionCommand, providerAlias, spawnArgs, protocol} oder {action: "refresh"} |
| DELETE | /api/acp/agents |
Entfernt einen benutzerdefinierten ACP-Agenten — Abfrageparameter: ?id=<agentId> |
Antwortbeispiel (GET /api/acp/agents):
{
"agents": [
{
"id": "claude",
"name": "Claude Code CLI",
"binary": "claude",
"version": "1.0.45",
"installed": true,
"protocol": "stdio",
"providerAlias": "claude",
"isCustom": false
},
{
"id": "my-custom-cli",
"name": "My Custom CLI",
"installed": false,
"protocol": "stdio",
"providerAlias": "my-provider",
"isCustom": true
}
],
"cacheTtlMs": 60000,
"cacheAge": 1234
}
Authentifizierung: Erfordert eine Verwaltungssitzung (auth_token-Cookie des Dashboards) oder einen API-Schlüssel mit Verwaltungsberechtigung.
Vollständige Details finden Sie unter ACP-Framework.
Analysen und Beobachtbarkeit
Echtzeit-Analyseendpunkte zur Überwachung von Routing, Komprimierung und Anbietervielfalt. Sie bilden die Grundlage für die Seiten unter /dashboard/analytics/*.
Analysen zum automatischen Routing
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/analytics/auto-routing |
Aggregierte Statistiken zum automatischen Routing: Gesamtzahl der Aufrufe, Strategie- und Stufenverteilung sowie führende Anbieter |
| GET | /api/analytics/auto-routing?days=7 |
Statistiken für ein Zeitfenster (standardmäßig 24 Stunden) |
Antwortbeispiel:
{
"window": "24h",
"totalCalls": 1234,
"strategyBreakdown": {
"rules": 800,
"cost": 200,
"latency": 150,
"sla-aware": 50,
"lkgp": 34
},
"tierBreakdown": {
"ultra": 100,
"pro": 500,
"standard": 400,
"free": 234
},
"topProviders": [
{ "provider": "openai", "calls": 500, "avgLatencyMs": 850 },
{ "provider": "anthropic", "calls": 300, "avgLatencyMs": 1200 }
]
}
Komprimierungsanalysen
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/analytics/compression |
Aggregierte Komprimierungsstatistiken: eingesparte Tokens, Einsparungen in %, Modusverteilung und Engine-Nutzung |
Antwortbeispiel:
{
"window": "24h",
"totalOriginalTokens": 5000000,
"totalCompressedTokens": 3500000,
"totalSavings": 1500000,
"savingsPct": 30.0,
"modeBreakdown": {
"lite": 400,
"standard": 600,
"aggressive": 100,
"ultra": 50,
"rtk": 84
},
"engineBreakdown": {
"caveman": 800,
"rtk": 434
}
}
Erfassung der Anbietervielfalt
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/analytics/diversity |
Auf Shannon-Entropie basierende Erfassung der Vielfalt: Verhindert einzelne Ausfallpunkte durch Messung der Verteilung auf Anbieter |
Antwortbeispiel:
{
"window": "24h",
"shannonEntropy": 2.45,
"maxEntropy": 3.17,
"diversityRatio": 0.77,
"providerUsage": {
"openai": 0.4,
"anthropic": 0.25,
"google": 0.2,
"kiro": 0.15
},
"warnings": ["OpenAI accounts for 40% of traffic — consider diversifying"]
}
Authentifizierung: Erfordert eine Verwaltungssitzung oder einen API-Schlüssel mit Verwaltungsberechtigung.
Administratorvorgänge
Nur Administratoren vorbehaltene Endpunkte für die betriebliche Verwaltung.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/admin/concurrency |
Aktuelle Parallelitätslimits abrufen (global + pro Anbieter) |
| POST | /api/admin/concurrency |
Parallelitätslimits aktualisieren — Body: {global?: number, perProvider?: Record<string, number>} |
Authentifizierung: Erfordert eine Verwaltungssitzung mit Administratorberechtigung.
Verwaltung von CLI-Tools
Verwalten Sie CLI-Tools, die in OmniRoute integriert sind (antigravity, chipotle, commandCode, devin-cli usw.). Die vollständige Liste finden Sie in der Anbieterreferenz.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/cli-tools/all-statuses |
Status aller CLI-Tools (installiert, Version, zuletzt gesehen) |
| GET | /api/cli-tools/status |
Statusdetails für ein einzelnes CLI-Tool (?tool=-Abfrage) |
| POST | /api/cli-tools/apply |
Generierte Konfiguration eines Tools schreiben (dryRun zeigt eine Vorschau an; 422 + containerEphemeralTarget bei Containerbetrieb; migration weist auf eine veraltete Codex-YAML-Datei hin) |
| GET | /api/cli-tools/backups |
Sicherungen der CLI-Tool-Konfigurationen auflisten |
| POST | /api/cli-tools/backups |
Eine Sicherung aller CLI-Tool-Konfigurationen erstellen |
| POST | /api/cli-tools/backups |
Wiederherstellen: Derselbe Endpunkt stellt mit {tool, backupId} im Body diese Sicherung wieder her |
| GET | /api/cli-tools/antigravity-mitm |
Status des Antigravity-MITM-Proxys (das CLI-Tool „antigravity-mitm“) |
| POST | /api/cli-tools/antigravity-mitm/alias |
Aliasse für antigravity-mitm konfigurieren |
Authentifizierung: Erfordert eine Verwaltungssitzung.
Agentenfähigkeiten
Verwalten Sie Fähigkeiten für KI-Agenten (ähnlich den benutzerdefinierten GPTs von OpenAI, jedoch für Agenten).
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/agent-skills |
Alle Agentenfähigkeiten auflisten (integrierte + benutzerdefinierte) |
| GET | /api/agent-skills/[id] |
Eine bestimmte Agentenfähigkeit abrufen |
| POST | /api/agent-skills |
Eine benutzerdefinierte Agentenfähigkeit erstellen — Body: {name, description, prompt, model?, temperature?} |
| PUT | /api/agent-skills/[id] |
Eine benutzerdefinierte Agentenfähigkeit aktualisieren |
| DELETE | /api/agent-skills/[id] |
Eine benutzerdefinierte Agentenfähigkeit löschen |
| GET | /api/agent-skills/[id]/raw |
Unverarbeitete Eingabeaufforderung + Metadaten abrufen (keine Ausführung) |
| POST | /api/agent-skills/generate |
Mithilfe von KI eine neue Fähigkeit aus einer natürlichsprachlichen Beschreibung generieren |
Authentifizierung: Erfordert eine Verwaltungssitzung oder einen API-Schlüssel mit Verwaltungsberechtigung.
Cache-Verwaltung
Verwalten Sie den semantischen Cache und den Reasoning-Cache.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/cache |
Cache-Übersicht: Gesamtzahl der Einträge, Trefferquote, Größe auf dem Datenträger |
| GET | /api/cache/entries |
Zwischengespeicherte Einträge auflisten (mit Paginierung) |
| DELETE | /api/cache/entries |
Cache-Einträge löschen (Filterung nach Abfrageparametern) |
| GET | /api/cache/stats |
Detaillierte Cache-Statistiken (pro Anbieter, pro Modell) |
| GET | /api/cache/reasoning |
Status des Reasoning-Caches (für die Wiedergabe von Schlussfolgerungen) |
| DELETE | /api/cache/reasoning |
Reasoning-Cache leeren — Abfrageparameter: ?toolCallId=<id> (einzeln), ?provider=<p> oder keine Parameter (alle) |
Authentifizierung: Erfordert eine Verwaltungssitzung.
Speichersystem
Verwalten Sie den persistenten Speicher (FTS5 + Vektoreinbettungen).
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/memory |
Speichereinträge auflisten (nach Geltungsbereich, Typ und Suchabfrage filtern) |
| POST | /api/memory |
Neuen Speichereintrag erstellen — Inhalt: {scope, type, content, metadata?} |
| GET | /api/memory/[id] |
Einen bestimmten Speichereintrag abrufen |
| PUT | /api/memory/[id] |
Einen Speichereintrag aktualisieren |
| DELETE | /api/memory/[id] |
Einen Speichereintrag löschen |
| GET | /api/memory?q= |
Speicher durchsuchen (FTS5 + Vektor) — Statistiken sind in derselben Antwort enthalten |
Authentifizierung: Erfordert eine Verwaltungssitzung oder einen API-Schlüssel mit Verwaltungsberechtigung.
Webhooks
Verwalten Sie Webhook-Abonnements für Ereignisse.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/webhooks |
Alle Webhook-Abonnements auflisten |
| POST | /api/webhooks |
Webhook-Abonnement erstellen — Inhalt: {url, events[], secret?, active?} |
| GET | /api/webhooks/[id] |
Ein bestimmtes Webhook-Abonnement abrufen |
| PUT | /api/webhooks/[id] |
Ein Webhook-Abonnement aktualisieren |
| DELETE | /api/webhooks/[id] |
Ein Webhook-Abonnement löschen |
| GET | /api/webhooks/[id]/deliveries |
Zustellungsverlauf für einen Webhook auflisten (Erfolgs-/Fehlerprotokoll) |
| POST | /api/webhooks/[id]/test |
Ein Testereignis an einen Webhook senden |
Authentifizierung: Erfordert eine Verwaltungssitzung.
Die vollständige Liste der Ereignistypen finden Sie unter Webhooks-Framework.
Skills-Framework
Skills (das Framework für agentenbasierte Erweiterungen) verwalten.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/skills |
Alle installierten Skills auflisten (integriert + benutzerdefiniert) |
| POST | /api/skills/install |
Einen Skill von einem lokalen Pfad oder einer URL installieren |
| DELETE | /api/skills/[id] |
Einen Skill deinstallieren |
| PUT | /api/skills/[id] |
Einen Skill aktivieren oder deaktivieren — Body: {enabled?: boolean, mode?: "on" | "off" | "auto"} |
| POST | /api/skills/executions |
Einen Skill ausführen — Body: {skillName, apiKeyId, input?, sessionId?} |
| GET | /api/skills/executions |
Ausführungsverlauf für alle Skills auflisten (nach ?apiKeyId= filtern) |
Authentifizierung: Erfordert eine Verwaltungssitzung oder einen API-Schlüssel mit Verwaltungsberechtigung.
Vollständige Details finden Sie unter Skills-Framework.
Plugins
OmniRoute-Plugins (Erweiterungen von Drittanbietern) verwalten.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/plugins |
Installierte Plugins auflisten |
| POST | /api/plugins/marketplace/install |
Ein Plugin aus dem Marketplace installieren |
| DELETE | /api/plugins/[name] |
Ein Plugin deinstallieren |
| POST | /api/plugins/[name]/activate |
Ein Plugin aktivieren |
| POST | /api/plugins/[name]/deactivate |
Ein Plugin deaktivieren |
| GET | /api/plugins/[name]/config |
Plugin-Konfiguration abrufen |
| PUT | /api/plugins/[name]/config |
Plugin-Konfiguration aktualisieren |
Authentifizierung: Erfordert eine Verwaltungssitzung.
Vollständige Details finden Sie unter Plugins-Framework.
Shadow-Routing
Der Shadow-/A-B-Vergleich von Anbietern ist keine eigenständige REST-Schnittstelle — er wird über Combo-Routing konfiguriert (siehe Auto-Combo). Vergleichsmetriken für einzelne Combos werden über GET /api/combos/metrics bereitgestellt.
Guardrails
Laufzeit-Guardrails überprüfen (PII-Erkennung, Erkennung von Prompt-Injection, Vision-Bridging). Guardrails werden bei jeder Anfrage ausgeführt; die Deaktivierung pro Aufruf erfolgt über den Anfrage-Header x-omniroute-disabled-guardrails — es gibt keine persistente Schnittstelle zum Aktivieren oder Deaktivieren.
| Methode | Pfad | Beschreibung |
|---|---|---|
| GET | /api/guardrails |
Registrierte Guardrails und ihren Status auflisten (Name / aktiviert / Priorität) |
| POST | /api/guardrails/test |
Die Pipeline vor dem Aufruf mit einer Beispieleingabe testweise ausführen — Body: {input, disabledGuardrails?} |
Authentifizierung: Erfordert eine Verwaltungssitzung.
Vollständige Details finden Sie unter Sicherheit > Guardrails.
Authentifizierung
Siehe Management-Authentifizierung für die vier
Anmeldedatenfamilien (Dashboard-Sitzung, lokales CLI-Token, oma_live_…-Zugriffs-Token,
API-Schlüssel mit Management-Berechtigung) und ihre Unterschiede zu Inferenzschlüsseln.
- Dashboard-Routen (
/dashboard/*) verwenden das Cookieauth_token - Die Anmeldung verwendet den gespeicherten Passwort-Hash; als Fallback dient
INITIAL_PASSWORD requireLoginkann über/api/settings/require-loginumgeschaltet werden/v1/*-Routen erfordern optional einen Bearer-API-Schlüssel, wennREQUIRE_API_KEY=truegilt- „Management-Token“ / „API-Schlüssel mit Management-Berechtigung“ bezeichnet in dieser Referenz eine der Familien aus diesem Leitfaden – keinen nicht definierten zusätzlichen Geheimnistyp
Inkompatible Änderung (v3.8.0) —
/api/v1/agents/tasks/*und die Endpunkte zur Cooldown-Verwaltung erfordern jetzt eine Management-Authentifizierung (Dashboard-Cookieauth_tokenoder einen API-Schlüssel mit Management-Berechtigung). Clients, die diese Routen bisher ohne Authentifizierung aufgerufen haben, erhalten401 Unauthorized. Siehe Commit588a0333(fix(auth): require management auth for agent and cooldown APIs).