# API Reference (Dansk) 🌐 **Languages:** 🇺🇸 [English](../../../../reference/API_REFERENCE.md) · 🇪🇹 [am](../../../am/docs/reference/API_REFERENCE.md) · 🇸🇦 [ar](../../../ar/docs/reference/API_REFERENCE.md) · 🇦🇿 [az](../../../az/docs/reference/API_REFERENCE.md) · 🇧🇬 [bg](../../../bg/docs/reference/API_REFERENCE.md) · 🇧🇩 [bn](../../../bn/docs/reference/API_REFERENCE.md) · 🇨🇿 [cs](../../../cs/docs/reference/API_REFERENCE.md) · 🇩🇪 [de](../../../de/docs/reference/API_REFERENCE.md) · 🇬🇷 [el](../../../el/docs/reference/API_REFERENCE.md) · 🇪🇸 [es](../../../es/docs/reference/API_REFERENCE.md) · 🇪🇪 [et](../../../et/docs/reference/API_REFERENCE.md) · 🇮🇷 [fa](../../../fa/docs/reference/API_REFERENCE.md) · 🇫🇮 [fi](../../../fi/docs/reference/API_REFERENCE.md) · 🇫🇷 [fr](../../../fr/docs/reference/API_REFERENCE.md) · 🇮🇪 [ga](../../../ga/docs/reference/API_REFERENCE.md) · 🇮🇳 [gu](../../../gu/docs/reference/API_REFERENCE.md) · 🇳🇬 [ha](../../../ha/docs/reference/API_REFERENCE.md) · 🇮🇱 [he](../../../he/docs/reference/API_REFERENCE.md) · 🇮🇳 [hi](../../../hi/docs/reference/API_REFERENCE.md) · 🇭🇷 [hr](../../../hr/docs/reference/API_REFERENCE.md) · 🇭🇺 [hu](../../../hu/docs/reference/API_REFERENCE.md) · 🇦🇲 [hy](../../../hy/docs/reference/API_REFERENCE.md) · 🇮🇩 [id](../../../id/docs/reference/API_REFERENCE.md) · 🇳🇬 [ig](../../../ig/docs/reference/API_REFERENCE.md) · 🇮🇹 [it](../../../it/docs/reference/API_REFERENCE.md) · 🇯🇵 [ja](../../../ja/docs/reference/API_REFERENCE.md) · 🇬🇪 [ka](../../../ka/docs/reference/API_REFERENCE.md) · 🇰🇭 [km](../../../km/docs/reference/API_REFERENCE.md) · 🇮🇳 [kn](../../../kn/docs/reference/API_REFERENCE.md) · 🇰🇷 [ko](../../../ko/docs/reference/API_REFERENCE.md) · 🇱🇹 [lt](../../../lt/docs/reference/API_REFERENCE.md) · 🇱🇻 [lv](../../../lv/docs/reference/API_REFERENCE.md) · 🇮🇳 [ml](../../../ml/docs/reference/API_REFERENCE.md) · 🇮🇳 [mr](../../../mr/docs/reference/API_REFERENCE.md) · 🇲🇾 [ms](../../../ms/docs/reference/API_REFERENCE.md) · 🇲🇹 [mt](../../../mt/docs/reference/API_REFERENCE.md) · 🇲🇲 [my](../../../my/docs/reference/API_REFERENCE.md) · 🇳🇵 [ne](../../../ne/docs/reference/API_REFERENCE.md) · 🇳🇱 [nl](../../../nl/docs/reference/API_REFERENCE.md) · 🇳🇴 [no](../../../no/docs/reference/API_REFERENCE.md) · 🇮🇳 [or](../../../or/docs/reference/API_REFERENCE.md) · 🇮🇳 [pa](../../../pa/docs/reference/API_REFERENCE.md) · 🇵🇭 [phi](../../../phi/docs/reference/API_REFERENCE.md) · 🇵🇱 [pl](../../../pl/docs/reference/API_REFERENCE.md) · 🇵🇹 [pt](../../../pt/docs/reference/API_REFERENCE.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/reference/API_REFERENCE.md) · 🇷🇴 [ro](../../../ro/docs/reference/API_REFERENCE.md) · 🇷🇺 [ru](../../../ru/docs/reference/API_REFERENCE.md) · 🇱🇰 [si](../../../si/docs/reference/API_REFERENCE.md) · 🇸🇰 [sk](../../../sk/docs/reference/API_REFERENCE.md) · 🇸🇮 [sl](../../../sl/docs/reference/API_REFERENCE.md) · 🇷🇸 [sr](../../../sr/docs/reference/API_REFERENCE.md) · 🇸🇪 [sv](../../../sv/docs/reference/API_REFERENCE.md) · 🇰🇪 [sw](../../../sw/docs/reference/API_REFERENCE.md) · 🇮🇳 [ta](../../../ta/docs/reference/API_REFERENCE.md) · 🇮🇳 [te](../../../te/docs/reference/API_REFERENCE.md) · 🇹🇭 [th](../../../th/docs/reference/API_REFERENCE.md) · 🇹🇷 [tr](../../../tr/docs/reference/API_REFERENCE.md) · 🇺🇦 [uk-UA](../../../uk-UA/docs/reference/API_REFERENCE.md) · 🇵🇰 [ur](../../../ur/docs/reference/API_REFERENCE.md) · 🇺🇿 [uz](../../../uz/docs/reference/API_REFERENCE.md) · 🇻🇳 [vi](../../../vi/docs/reference/API_REFERENCE.md) · 🇳🇬 [yo](../../../yo/docs/reference/API_REFERENCE.md) · 🇨🇳 [zh-CN](../../../zh-CN/docs/reference/API_REFERENCE.md) · 🇹🇼 [zh-TW](../../../zh-TW/docs/reference/API_REFERENCE.md) --- 🌐 **Sprog:** 🇺🇸 [English](./API_REFERENCE.md) | 🇪🇹 [አማርኛ](../i18n/am/docs/reference/API_REFERENCE.md) | 🇸🇦 [العربية](../i18n/ar/docs/reference/API_REFERENCE.md) | 🇦🇿 [Azərbaycan dili](../i18n/az/docs/reference/API_REFERENCE.md) | 🇧🇬 [Български](../i18n/bg/docs/reference/API_REFERENCE.md) | 🇧🇩 [বাংলা](../i18n/bn/docs/reference/API_REFERENCE.md) | 🇨🇿 [Čeština](../i18n/cs/docs/reference/API_REFERENCE.md) | 🇩🇰 [Dansk](../i18n/da/docs/reference/API_REFERENCE.md) | 🇩🇪 [Deutsch](../i18n/de/docs/reference/API_REFERENCE.md) | 🇬🇷 [Ελληνικά](../i18n/el/docs/reference/API_REFERENCE.md) | 🇪🇸 [Español](../i18n/es/docs/reference/API_REFERENCE.md) | 🇪🇪 [Eesti](../i18n/et/docs/reference/API_REFERENCE.md) | 🇮🇷 [فارسی](../i18n/fa/docs/reference/API_REFERENCE.md) | 🇫🇮 [Suomi](../i18n/fi/docs/reference/API_REFERENCE.md) | 🇫🇷 [Français](../i18n/fr/docs/reference/API_REFERENCE.md) | 🇮🇪 [Gaeilge](../i18n/ga/docs/reference/API_REFERENCE.md) | 🇮🇳 [ગુજરાતી](../i18n/gu/docs/reference/API_REFERENCE.md) | 🇳🇬 [Hausa](../i18n/ha/docs/reference/API_REFERENCE.md) | 🇮🇱 [עברית](../i18n/he/docs/reference/API_REFERENCE.md) | 🇮🇳 [हिन्दी](../i18n/hi/docs/reference/API_REFERENCE.md) | 🇭🇷 [Hrvatski](../i18n/hr/docs/reference/API_REFERENCE.md) | 🇭🇺 [Magyar](../i18n/hu/docs/reference/API_REFERENCE.md) | 🇦🇲 [Հայերեն](../i18n/hy/docs/reference/API_REFERENCE.md) | 🇮🇩 [Bahasa Indonesia](../i18n/id/docs/reference/API_REFERENCE.md) | 🇳🇬 [Igbo](../i18n/ig/docs/reference/API_REFERENCE.md) | 🇮🇹 [Italiano](../i18n/it/docs/reference/API_REFERENCE.md) | 🇯🇵 [日本語](../i18n/ja/docs/reference/API_REFERENCE.md) | 🇬🇪 [ქართული](../i18n/ka/docs/reference/API_REFERENCE.md) | 🇰🇭 [ខ្មែរ](../i18n/km/docs/reference/API_REFERENCE.md) | 🇮🇳 [ಕನ್ನಡ](../i18n/kn/docs/reference/API_REFERENCE.md) | 🇰🇷 [한국어](../i18n/ko/docs/reference/API_REFERENCE.md) | 🇱🇹 [Lietuvių](../i18n/lt/docs/reference/API_REFERENCE.md) | 🇱🇻 [Latviešu](../i18n/lv/docs/reference/API_REFERENCE.md) | 🇮🇳 [മലയാളം](../i18n/ml/docs/reference/API_REFERENCE.md) | 🇮🇳 [मराठी](../i18n/mr/docs/reference/API_REFERENCE.md) | 🇲🇾 [Bahasa Melayu](../i18n/ms/docs/reference/API_REFERENCE.md) | 🇲🇹 [Malti](../i18n/mt/docs/reference/API_REFERENCE.md) | 🇲🇲 [မြန်မာ](../i18n/my/docs/reference/API_REFERENCE.md) | 🇳🇵 [नेपाली](../i18n/ne/docs/reference/API_REFERENCE.md) | 🇳🇱 [Nederlands](../i18n/nl/docs/reference/API_REFERENCE.md) | 🇳🇴 [Norsk](../i18n/no/docs/reference/API_REFERENCE.md) | 🇮🇳 [ଓଡ଼ିଆ](../i18n/or/docs/reference/API_REFERENCE.md) | 🇮🇳 [ਪੰਜਾਬੀ](../i18n/pa/docs/reference/API_REFERENCE.md) | 🇵🇭 [Filipino](../i18n/phi/docs/reference/API_REFERENCE.md) | 🇵🇱 [Polski](../i18n/pl/docs/reference/API_REFERENCE.md) | 🇵🇹 [Português (Portugal)](../i18n/pt/docs/reference/API_REFERENCE.md) | 🇧🇷 [Português (Brasil)](../i18n/pt-BR/docs/reference/API_REFERENCE.md) | 🇷🇴 [Română](../i18n/ro/docs/reference/API_REFERENCE.md) | 🇷🇺 [Русский](../i18n/ru/docs/reference/API_REFERENCE.md) | 🇱🇰 [සිංහල](../i18n/si/docs/reference/API_REFERENCE.md) | 🇸🇰 [Slovenčina](../i18n/sk/docs/reference/API_REFERENCE.md) | 🇸🇮 [Slovenščina](../i18n/sl/docs/reference/API_REFERENCE.md) | 🇷🇸 [Српски](../i18n/sr/docs/reference/API_REFERENCE.md) | 🇸🇪 [Svenska](../i18n/sv/docs/reference/API_REFERENCE.md) | 🇰🇪 [Kiswahili](../i18n/sw/docs/reference/API_REFERENCE.md) | 🇮🇳 [தமிழ்](../i18n/ta/docs/reference/API_REFERENCE.md) | 🇮🇳 [తెలుగు](../i18n/te/docs/reference/API_REFERENCE.md) | 🇹🇭 [ไทย](../i18n/th/docs/reference/API_REFERENCE.md) | 🇹🇷 [Türkçe](../i18n/tr/docs/reference/API_REFERENCE.md) | 🇺🇦 [Українська](../i18n/uk-UA/docs/reference/API_REFERENCE.md) | 🇵🇰 [اردو](../i18n/ur/docs/reference/API_REFERENCE.md) | 🇺🇿 [Oʻzbekcha](../i18n/uz/docs/reference/API_REFERENCE.md) | 🇻🇳 [Tiếng Việt](../i18n/vi/docs/reference/API_REFERENCE.md) | 🇳🇬 [Yorùbá](../i18n/yo/docs/reference/API_REFERENCE.md) | 🇨🇳 [中文 (简体)](../i18n/zh-CN/docs/reference/API_REFERENCE.md) | 🇹🇼 [中文 (繁體)](../i18n/zh-TW/docs/reference/API_REFERENCE.md) Central reference til OmniRoute-API'et. Den dækker den offentlige `/v1`-grænseflade og de mest anvendte administrationsendepunkter; den maskinlæsbare [`docs/openapi.yaml`](../openapi.yaml) og routetræet under `src/app/api/` er de udtømmende kilder. --- ## Indholdsfortegnelse - [Chatfuldførelser](#chat-completions) - [Eksklusive administrerede sessionslejemål](#exclusive-managed-session-leases) - [Indlejringer](#embeddings) - [Billedgenerering](#image-generation) - [Dokument-OCR](#document-ocr) - [Vis modeller](#list-models) - [Manifest for udbyderplugin](#provider-plugin-manifest) - [Kompatibilitetsslutpunkter](#compatibility-endpoints) - [Fil-API](#files-api) - [Batch-API](#batches-api) - [Søge-API](#search-api) - [WebSocket-streaming](#websocket-streaming) - [Rapportering af kvoter og problemer](#quotas--issues-reporting) - [Semantisk cache](#semantic-cache) - [Dashboard og administration](#dashboard--management) - [Administration af kombinationer](#combo-management) - [Webhooks](#webhooks) - [Registrerede nøgler (automatisk administration)](#registered-keys-auto-management) - [Agentprotokol](#agents-protocol) - [Administrationsproxyer](#management-proxies) - [Robusthed (udvidet)](#resilience-extended) - [Færdigheder](#skills) - [Hukommelse](#memory) - [MCP-server](#mcp-server) - [A2A-server](#a2a-server) - [Cloud, evalueringer og vurdering](#cloud-evals--assess) - [Behandling af anmodninger](#request-processing) - [Godkendelse](#authentication) --- ## Chatfuldførelser ```bash 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 } ``` ### Brugerdefinerede headers | Header | Retning | Beskrivelse | | ------------------------ | --------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `X-OmniRoute-No-Cache` | Anmodning | Indstil til `true` for at omgå cachen | | `x-omniroute-no-memory` | Anmodning | Indstil til `true` for at springe over injektion af hukommelse og færdigheder for denne anmodning (svarer til ingen cache og undgår token-/omkostningsoverhead pr. kald) | | `X-OmniRoute-Progress` | Anmodning | Indstil til `true` for statushændelser | | `X-Session-Id` | Anmodning | Fast sessionsnøgle til ekstern sessionstilknytning | | `x_session_id` | Anmodning | Varianten med understregning accepteres også (direkte HTTP) | | `X-OmniRoute-Session-Id` | Anmodning | Sessions-/samtaletag angivet af kalderen (bruges også af hukommelsen). Når det er til stede, gemmes det ordret i `call_logs.session_tag` til omkostningstildeling pr. session (#8249) — det genereres aldrig, når det mangler | | `Idempotency-Key` | Anmodning | Nøgle til deduplikering (vindue på 5 sek.) | | `X-Request-Id` | Anmodning | Alternativ nøgle til deduplikering | | `X-OmniRoute-Cache` | Svar | `HIT` eller `MISS` (uden streaming) | | `X-OmniRoute-Idempotent` | Svar | `true`, hvis anmodningen blev deduplikeret | | `X-OmniRoute-Progress` | Svar | `enabled`, hvis statussporing er slået til | | `X-OmniRoute-Session-Id` | Svar | Det effektive sessions-id, der bruges af OmniRoute | | `X-OmniRoute-Request-Id` | Svar | Korrelations-id for anmodningen (når det er kendt) | | `X-OmniRoute-Version` | Svar | OmniRoutes buildversion (altid til stede) | | `X-OmniRoute-Cost-Saved` | Svar | Det beløb i USD, som cachen sparede ved et HIT (kun cachehits) | | `X-OmniRoute-Decision` | Svar | Routingsporing: `strategy=; provider=; latency_ms=` (`` er kombinationsstrategien eller `single` for en anmodning uden kombination) — altid til stede i fuldførelsessvar | > Nginx-bemærkning: Hvis du er afhængig af headers med understregning (f.eks. `x_session_id`), skal du aktivere `underscores_in_headers on;`. > **Headere til omkostningstelemetri:** Vellykkede ikke-streaming-svar indeholder også sættet af `X-OmniRoute-*`-headere til omkostningstelemetri — `X-OmniRoute-Response-Cost` (USD, fast 10 decimaler; `0.0000000000` for gratis/ikke-prissat), `X-OmniRoute-Tokens-In` / `X-OmniRoute-Tokens-Out`, `X-OmniRoute-Model`, `X-OmniRoute-Provider`, `X-OmniRoute-Latency-Ms`, `X-OmniRoute-Cache-Hit` og `X-OmniRoute-Fallback-Attempts` (kun når > 0) samt `X-OmniRoute-Request-Id` og `X-OmniRoute-Version`. Disse udsendes af chatfuldførelser, `/v1/responses`, `/v1/messages`, **og medieslutpunkterne** — `/v1/embeddings`, `/v1/images/generations`, `/v1/audio/speech`, `/v1/audio/transcriptions`, `/v1/rerank`, `/v1/videos/generations`, `/v1/music/generations` og `/v1/moderations` (altid med omkostningen `0`). Medieomkostninger beregnes pr. modalitet (pr. billede, pr. sekund, pr. tegn, pr. søgeenhed), når prisoplysninger er tilgængelige, ellers `0` (fail-open). > **Omkostningssemantik for cache-hit:** Ved et HIT i den semantiske cache (`X-OmniRoute-Cache-Hit: true`) foretages der intet upstream-kald, så `X-OmniRoute-Response-Cost` er `0.0000000000` (den **inkrementelle** omkostning ved at levere cache-hittet). Den oprindelige/forventede omkostning rapporteres separat i `X-OmniRoute-Cost-Saved`. Faktureringssystemer bør summere `X-OmniRoute-Response-Cost` (cache-hits koster intet); cacheanalyse kan aggregere `X-OmniRoute-Cost-Saved`. ## Eksklusive administrerede sessionslejemål Eksklusiv leasing af administrerede sessioner er en valgfri, klientneutral routingkontrakt: Én aktiv ejer besidder én kvalificeret OmniRoute-forbindelse. Den udlejer ikke en model, kræver ikke OAuth, identificerer ikke en bestemt klient og kræver ikke en bestemt udbyder. Den API-nøgle, der bruges til godkendelse, skal have rettigheden `lease:exclusive` og en eksplicit ikke-tom `allowedConnections`-liste. Databasens mutationsgrænse håndhæver begge felter samlet ved oprettelse af nøgler og delvise opdateringer. ```http POST /api/v1/session-leases Authorization: Bearer Content-Type: application/json X-OmniRoute-Lease-Owner: vlo_<43-base64url-characters> {"action":"acquire","model":"glm/glm-4.6"} ``` Vellykkede svar på hentning, fornyelse og frigivelse viser tidsstempler, `state` og den nøjagtige positive `generation`, men aldrig den valgte forbindelse eller legitimationsoplysninger. Ved fornyelse og frigivelse angives generationen i JSON-indholdet: ```json { "action": "renew", "generation": 1 } ``` ```json { "action": "release", "generation": 1, "reason": "OWNER_EXIT" } ``` En aktiv lejemålsejer kan eksplicit anmode om privatlivssikre visningsmetadata for sin aktuelle tilknytning: ```json { "action": "status", "generation": 1 } ``` ```json { "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" } } ``` Denne valgfrie statushandling afgrænses af den uigennemsigtige ejer, den godkendte administrerede API-nøgle og den nøjagtige aktive generation i én databasetransaktion. `displayName` er kun det beskårne konfigurerede forbindelsesnavn; det er `null`, når der ikke findes et sikkert konfigureret navn. OmniRoute erstatter det aldrig med en e-mailadresse eller en genereret kontoidentitet. Udbyderværdien er en ikke-følsom visningsetiket og aldrig en genereret identifikator for en kompatibel udbyder. Legitimationsoplysninger, tokens, cookies, rå id'er for forbindelser eller API-nøgler, ejerhashes, afgrænsningshemmeligheder og interne routingdata er udeladt. Opslag med forkert nøgle, forkert ejer, forældet generation, manglende, udløbet, frigivet eller ugyldiggjort lejemål returnerer alle den samme `409 LEASE_FENCE_STALE`-fejl uden forbindelsesmetadata. En klient, der modtog svaret om kapacitetsventetid, har ingen aktiv tilknytning at inspicere. Når routing flytter et aktivt lejemål, forbliver den samme generation gyldig, og status returnerer atomisk den nye tilknytning, aldrig den gamle. Eksisterende klienter forbliver uændrede, fordi svar på hentning, fornyelse, frigivelse og ventetid bevarer deres tidligere strukturer. Denne serverkontrakt ændrer ikke standardfunktionen `/status` i OpenAI Codex. Standard-Codex rapporterer i øjeblikket sin modeludbyder og indbyggede godkendelses-/kontostatus, men viser ikke vilkårlige brugerdefinerede kontometadata for udbydere. En senere klientintegration skal kalde denne handling og beslutte, hvordan `connection.displayName` skal vises. Hver administreret inferensanmodning angiver derefter begge kontrolheadere: ```http X-OmniRoute-Lease-Owner: vlo_<43-base64url-characters> X-OmniRoute-Lease-Generation: 1 ``` Den nøjagtige ejer, generation, aktive forbindelse og godkendte API-nøgle afgrænses umiddelbart før hvert understøttet upstream-forsøg. Genafspilning af ejer og generation med en anden nøgle mislykkes, selv når denne nøgle tillader den samme forbindelse. Rå ejerværdier gemmes, logføres eller opbevares ikke i anmodningssnapshotshottet og videresendes ikke upstream. Midlertidig kapacitetskonflikt returnerer HTTP `429` med `Retry-After` og: ```json { "state": "WAITING_FOR_CAPACITY", "error": { "type": "lease_error", "code": "LEASE_CAPACITY_UNAVAILABLE" }, "reason": "NO_FREE_ELIGIBLE_CONNECTION", "retryAfter": 30 } ``` Dette svar betyder kun, at det almindelige kvalificerede sæt ikke var tomt, og at alle ledige kandidater var besat af et fremmed aktivt lejemål. Ikke-understøttede modeller/udbydere, uoverensstemmelse med politikker, nedkøling, kvote, tilstand og andre almindelige kvalifikationsfejl bevarer deres eksisterende OmniRoute-svar. ### `x-omniroute-compression` Tilsidesættelse af komprimeringsplanen pr. anmodning. Højeste prioritet — har forrang for tilsidesættelsen af routingkombinationen, den aktive profil, automatisk udløsning og panelets standardindstilling. Værdier: | Værdi | Effekt | | ------------- | --------------------------------------------------------------------------------------------------------------------- | | `off` | Ingen komprimering for denne anmodning. | | `default` | Panelets afledte standardprofil (ignorerer den aktive profil). | | `engine:` | En enkelt motor, når den er aktiveret, f.eks. `engine:rtk`. | | `` | En navngivet kombination, der først matches efter navn (uden forskel på store og små bogstaver) og derefter efter id. | Bemærkninger: - Ukendte værdier ignoreres (anmodningen afvises aldrig); fortolkningen fortsætter med den normale prioritetsrækkefølge for operatorer. - Hvis flere kombinationer har samme navn, skal kombinationens **id** angives for at få et deterministisk match. - En kombination med navnet `off` eller `default` kan ikke vælges efter navn (disse nøgleord fortolkes først); henvis til en sådan kombination via dens id. - Hovedkontakten for komprimering er en ufravigelig spærring: Når komprimering er deaktiveret globalt, kan denne header ikke aktivere den. Den anvendte plan returneres i responsheaderen: ``` X-OmniRoute-Compression: ; source= ``` hvor `` er enten `request-header`, `routing-override`, `active-profile`, `auto-trigger`, `default` eller `off`. --- ## Embeddings ```bash POST /v1/embeddings Authorization: Bearer your-api-key Content-Type: application/json { "model": "nebius/Qwen/Qwen3-Embedding-8B", "input": "The food was delicious" } ``` Tilgængelige udbydere: Nebius, OpenAI, Mistral, Together AI, Fireworks, NVIDIA, **OpenRouter**, Jina AI. Katalog-id'er er `provider/model` (eksempel: `jina-ai/jina-embeddings-v5-omni-small`). Jina-model-id'er uden præfiks, som findes i registreringsdatabasen (for eksempel `jina-embeddings-v5-text-small`, `jina-reranker-v3.5`), kan også opløses. Jina embed/rerank/classify/segment bruger først `jina-ai`-legitimationsoplysninger fra kontrolpanelet; `JINA_AI_API_KEY` bruges kun som reserve, når der ikke findes nogen nøgle i kontrolpanelet. `jina-reader`-kortet er kun til Reader / `r.jina.ai` (`POST /v1/web/fetch`) og leverer aldrig embeddings eller rerank. Modeller i registreringsdatabasen, der angiver understøttelse af multimodalitet, accepterer også op til 32 udbyderneutrale strukturerede elementer. Medieelementtyperne er `text`, `image`, `audio`, `video` og `document`. Deres medie-`source` er enten `{"type":"url","url":"https://..."}` eller `{"type":"base64","data":"...","media_type":"..."}`. Jina v5 Omni (`jina-ai/jina-embeddings-v5-omni-small`, `jina-ai/jina-embeddings-v5-omni-nano` og familiealiasset `jina-ai/jina-embeddings-v5-omni` → omni-small) accepterer også Jinas oprindelige EmbeddingsV5Request-dokumenter og **videresender dem intakte** til `https://api.jina.ai/v1/embeddings`: ```json { "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,..." }] } ] } ``` Oprindelige `{ image | audio | video | pdf }`-værdier kan være en offentlig HTTPS-URL, en `data:`-URI eller rå base64. OmniRoute konverterer ikke disse objekter til strenge og henter ikke oprindelige billed-URL'er — Jina henter selv offentlige medier. Ekstra Jina-felter (`task`, `normalized`, `truncate`, `embedding_type`) videresendes. Jina-SKU'er, der kun understøtter tekst, afviser fortsat dokumenter, som ikke er tekst. Sikkerheds- og transportgrænser: - URL'er til fjernmedier skal være offentlige HTTPS-URL'er. Kanoniske `{type,source:url}`-elementer hentes på serversiden (genvalidering af omdirigeringer, timeout, størrelsesgrænser, offentlig DNS, forbindelsesfastgørelse) og indlejres før udbyderkaldet. Jina-oprindelige `{image:"https://..."}`-elementer videresendes uændret efter det samme offentlige HTTPS-tjek; Jina henter URL'en. - Indlejrede base64-medier er begrænset til 8 MiB afkodet pr. element og 16 MiB afkodet på tværs af anmodningen. Udbyderoversættelse (kanoniske elementer videresendes aldrig uændret): - Jina-multimodalmodeller: Hvert element på øverste niveau bliver til ét modalitetsnøglet objekt (`text` / `image` / `audio` / `video` / `pdf`), der bruger data-URI'er til indlejrede medier; én vektor pr. element på øverste niveau. - Gemini Embedding 2-familien: Ét array på øverste niveau bliver til en enkelt oprindelig `models/{model}:embedContent`-anmodning med `content.parts` (`text` eller `inline_data`). - Ukendte/dynamiske modeller uden eksplicitte modalitetsmetadata afviser struktureret input med HTTP 400. ```json { "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" } ``` Ikke-understøttede kombinationer af model og modalitet returnerer HTTP 400 i stedet for at konvertere elementet. Udvidelsesfelter, der ikke er inputfelter, i ældre streng-/tokenanmodninger sendes fortsat uændret videre. ```bash # Vis alle embedding-modeller GET /v1/embeddings ``` --- ## Billedgenerering ```bash POST /v1/images/generations Authorization: Bearer your-api-key Content-Type: application/json { "model": "openai/gpt-image-2", "prompt": "En smuk solnedgang over bjerge", "size": "1024x1024" } ``` Tilgængelige udbydere: OpenAI (GPT Image 2), xAI (Grok Image), Together AI (FLUX), Fireworks AI, Nebius (FLUX), Hyperbolic, NanoBanana, **OpenRouter**, SD WebUI (lokal), ComfyUI (lokal). ```bash # Vis alle billedmodeller GET /v1/images/generations ``` --- ## Dokument-OCR ```bash 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` vælger OCR-udbyderen via et `provider/model`-præfiks. Et model-id uden præfiks (f.eks. `mistral-ocr-latest`) fortolkes som tilhørende den registrerede udbyder, og hvis `model` udelades, bruges Mistral (`mistral-ocr-latest`) som standard. Registrerede udbydere (`open-sse/config/ocrRegistry.ts`): | Udbyder-id | Model-id | `model`-værdi | Bemærkninger | | ----------------------------- | -------------------- | ---------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | | `mistral` | `mistral-ocr-latest` | `mistral/mistral-ocr-latest` (eller `mistral-ocr-latest` uden præfiks) | Synkron — svaret returneres direkte fra det enkelte upstream-kald. | | `azure-document-intelligence` | `prebuilt-read` | `azure-document-intelligence/prebuilt-read` | Asynkron upstream (`analyze` + polling) — se nedenfor. | | `vertex-deepseek-ocr` | `deepseek-ocr-maas` | `vertex-deepseek-ocr/deepseek-ocr-maas` | Synkron via Vertex AI's `openapi/chat/completions`-partnerendepunkt — se nedenfor vedrørende godkendelse/URL. | Alle tre udbydere svarer med den samme Mistral-formaterede struktur: ```json { "pages": [{ "index": 0, "markdown": "# Udtrukket tekst..." }], "model": "mistral-ocr-latest", "usage_info": { "pages_processed": 1 } } ``` ### Pollingforløb for Azure Document Intelligence Azure Document Intelligence's `analyze`-API er asynkron: Den indledende anmodning returnerer en `Operation-Location`-header i stedet for en body, og der skal derfor foretages polling efter resultatet. Handleren (`open-sse/handlers/ocr.ts`) poller denne URL hvert sekund i op til 30 forsøg, afbryder straks (fortsætter ikke med at polle) ved et poll-svar, der ikke er `ok`, eller en `"failed"`-status, og returnerer `504`, hvis handlingen stadig kører, efter at antallet af tilladte forsøg er opbrugt. Det endelige Azure-svar normaliseres til det samme `pages`/`markdown`-format, som Mistral bruger, før det returneres til kalderen, så klientkoden ikke behøver at særbehandle udbyderen. ### Godkendelse og løsning af endepunkt for Vertex AI DeepSeek OCR `vertex-deepseek-ocr` genbruger den samme Vertex AI-godkendelse, som OmniRoute allerede understøtter for chat-/billedtrafik (`open-sse/executors/vertex.ts`): Forbindelsens API-nøgle er enten en Service Account JSON-legitimationsoplysning (som udveksles med et kortlivet OAuth-adgangstoken via JWT-bearer- forløbet) eller et allerede udstedt OAuth-adgangstoken, der bruges, som det er. Upstream-endepunktets URL er Vertex' generiske `openapi/chat/completions`-partnerendepunkt, som opbygges ud fra forbindelsens projekt og region — en eksplicit `providerSpecificData.project`/`providerSpecificData.region` har altid forrang; ellers udledes projektet fra Service Account JSON'ens `project_id`, og regionen er som standard `us-central1`. Begge værdier bestemmes i `open-sse/handlers/ocr.ts` (`resolveVertexOcrAccessToken`, `resolveVertexOcrBaseUrl`) og bruges af `src/app/api/v1/ocr/route.ts`, før der videresendes til `handleOcr`. --- ## Vis modeller ```bash GET /v1/models Authorization: Bearer your-api-key → Returnerer alle chat-, embedding- og billedmodeller samt kombinationer i OpenAI-format ``` ### Model-id-præfikser (`?prefix=`) De fleste modeller vises under et **udbyderpræfiks**. Hvilket præfiks du får, styres af feature-flaget `MODELS_CATALOG_PREFIX_MODE` og kan tilsidesættes **for hver anmodning** med en forespørgselsparameter — nyttigt for en klient, der ønsker en enkel liste uden at ændre den serveromspændende indstilling for alle andre: ```bash GET /v1/models?prefix=alias # ét id pr. model — det korte aliaspræfiks GET /v1/models?prefix=dual # begge former (serverens standardindstilling) GET /v1/models?prefix=canonical # kun det fulde udbyder-id-præfiks ``` | Tilstand | Returnerer | Bemærkninger | | ----------- | -------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `dual` | `cc/claude-sonnet-4-6` **og** `claude/claude-sonnet-4-6` | **Standard.** Begge id'er dirigeres til den samme model. Dette er bevaret, så klientkonfigurationer, der har hardkodet en af formerne, fortsat fungerer. Fordobler omtrent kataloget. | | `alias` | `cc/claude-sonnet-4-6` | Én post pr. model. Udbydere uden et særskilt alias returnerer stadig deres post, så intet går tabt. | | `canonical` | `claude/claude-sonnet-4-6` | Én post pr. model under det fulde udbyder-id-præfiks. Udbydere uden et særskilt alias (f.eks. `antigravity/…`, `agy/…`) returnerer også deres enkelte id her, så intet går tabt. | Et spejl i `dual`-tilstand kan også genkendes uden forespørgselsparameteren: Det indeholder et `parent`-felt, der peger på det primære id. Klienter, der viser en modelvælger, bør anmode om `?prefix=alias` — det er det, som [OmniCopilot VS Code-udvidelsen](../guides/VSCODE-COPILOT.md) gør. ### Modelvarianter uden tænkning For Claude-modeller med tænkeevne viser `/v1/models` også en **variant uden tænkning**, hvis id har præfikset `claude-3-omniroute-no-thinking/`: ``` claude-3-omniroute-no-thinking// ``` Hvis dette id vælges (f.eks. i en Claude Code-konfiguration, der altid vedhæfter en `thinking`-blok), fortolkes det som den faktiske `/` med ræsonnering deaktiveret — `thinking:{type:"disabled"}` på `/v1/messages`-stien, eller med felterne `reasoning`/`reasoning_effort` udeladt på `/v1/chat/completions`-stien. Varianten vises kun for modeller i Claude-familien, som understøtter tænkning **og** respekterer `disabled` (så f.eks. modeller, der kun understøtter adaptiv tænkning og afviser `disabled`, er udeladt). Operatører kan gennemtvinge, at varianten aktiveres eller deaktiveres for hver model via `ModelSpec.noThinkingAlias`. --- ## Manifest for udbyderplugin ```bash GET /api/v1/provider-plugin-manifest ``` Returnerer det JSON-sikre manifest for udbyderplugins, der bruges af Bifrost, CLIProxyAPI og fremtidige sidecar-routere. Svaret genereres fra TypeScript-registreringsdatabasen for udbydere og udelader bevidst OAuth-klienthemmeligheder, fortolkning af runtime-miljøet, eksekveringsfunktioner, request-headere og kontodata. Brug dette endpoint, når en sidecar kører uden for processen og ikke kan importere `open-sse/config/providerPluginManifestRegistry.ts` direkte. --- ## Kompatibilitetsendpoints | Metode | Sti | 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 (redigering/inpaint) | | POST | `/v1/videos/generations` | Videogenerering i OpenAI-stil | | POST | `/v1/music/generations` | Musikgenerering i OpenAI-stil | | POST | `/v1/audio/transcriptions` | OpenAI Audio (STT) | | POST | `/v1/audio/speech` | OpenAI TTS (returnerer lydindhold) | | POST | `/v1/rerank` | Rerank i Cohere/Voyage-stil | | POST | `/v1/classify` | Jina-klassificering (`api.jina.ai`) | | POST | `/v1/segment` | Jina-segmentering (`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}/` | Alias for OpenAI-katalog | | GET | `/api/v1/vscode/{token}/models` | Alias for OpenAI-modeller | | POST | `/api/v1/vscode/{token}/chat/completions` | Tokenbaseret OpenAI-alias | | POST | `/api/v1/vscode/{token}/responses` | Tokenbaseret OpenAI Responses-alias | | POST | `/api/v1/vscode/{token}/api/chat` | Tokenbaseret Ollama-alias | | GET | `/api/v1/vscode/{token}/api/tags` | Tokenbaseret alias for Ollama-tags | Alle POST-ruter følger samme struktur: `Bearer your-api-key` + Zod-valideret JSON-indhold (`v1RerankSchema`, `v1ModerationSchema`, `v1AudioSpeechSchema` osv.; se `src/shared/validation/schemas.ts`). 4xx returneres ved skemafejl. For klienter, der ikke kan tilføje `Authorization: Bearer ...`, accepterer OmniRoute også API-nøgler i URL'en via enten kompatibilitet med query-strenge (`?token=...`, `?apiKey=...`, `?api_key=...`, `?key=...`) eller de dedikerede `/api/v1/vscode/{token}/...`-endpoints, der er dokumenteret nedenfor. ```bash # Rerank POST /v1/rerank { "model": "jina-ai/jina-reranker-v3.5", "query": "...", "documents": ["..."] } # Jina-klassificering (legitimationsoplysninger til Foundation API) POST /v1/classify { "model": "jina-embeddings-v5-text-small", "input": ["..."], "labels": ["a", "b"] } # Jina-segmentering POST /v1/segment { "content": "...", "return_chunks": true } # Jina-søgning (s.jina.ai; udbyderaliasser: jina-search, jina-ai, jina) POST /v1/search { "query": "...", "provider": "jina-search" } # Modereringer POST /v1/moderations { "model": "omni-moderation-latest", "input": "..." } # TTS — returnerer indhold som audio/mpeg (eller det ønskede format) POST /v1/audio/speech { "model": "openai/tts-1", "input": "Hello", "voice": "alloy" } # Billedredigering (multipart) POST /v1/images/edits -F image=@input.png -F prompt="..." -F mask=@mask.png # Video-/musikgenerering (model-id med udbyderpræfiks) POST /v1/videos/generations { "model": "runway/gen-3", "prompt": "..." } POST /v1/music/generations { "model": "suno/v3.5", "prompt": "..." } ``` ### Dedikerede udbyderruter ```bash POST /v1/providers/{provider}/chat/completions POST /v1/providers/{provider}/embeddings POST /v1/providers/{provider}/images/generations ``` Udbyderpræfikset tilføjes automatisk, hvis det mangler. Modeller, der ikke matcher, returnerer `400`. --- ## Files API OpenAI-kompatibelt filslutpunkt til batchinput/-output og filuploads med formål. | Metode | Sti | Beskrivelse | | ------ | ------------------------ | --------------------------------------------------------------------------------------------------------------- | | POST | `/v1/files` | Upload en fil (multipart: `file`, `purpose`, `expires_after[anchor]`, `expires_after[seconds]`) — maks. 512 MiB | | GET | `/v1/files` | Vis filer for den godkendte API-nøgle | | GET | `/v1/files/[id]` | Hent en fils metadata | | DELETE | `/v1/files/[id]` | Slet en fil | | GET | `/v1/files/[id]/content` | Stream den rå fil tilbage | **Godkendelse:** Bearer-API-nøgle — filer afgrænses pr. API-nøgle via `getApiKeyRequestScope`. En nøgle kan kun se, downloade og slette sine egne filer; en dashboardsession uden en nøgle kan læse hele instansen; en fil uden en ejer (anonym upload eller upload via dashboardsession) afvises for alle kaldere uden en session. `GET /v1/files` afviser en anonym kalder — og en angivet nøgle, der ikke kan slås op — med `401`, selv når `REQUIRE_API_KEY=false`, i stedet for at vise alle lejeres filer (GHSA-m3hp-hq9g-fpmv, GHSA-2jm2-mpx8-6523). --- ## Batches API OpenAI-kompatibel batchbehandling. | Metode | Sti | Beskrivelse | | ------ | ------------------------- | -------------------------------------------------------------------------------------------------------- | | POST | `/v1/batches` | Opret batch — body valideres af `v1BatchCreateSchema` (`input_file_id`, `endpoint`, `completion_window`) | | GET | `/v1/batches` | Vis batches | | GET | `/v1/batches/[id]` | Hent batchstatus + `request_counts` | | DELETE | `/v1/batches/[id]` | Slet en afsluttet/mislykket batch | | POST | `/v1/batches/[id]/cancel` | Annuller en igangværende batch | **Godkendelse:** Bearer-API-nøgle. Batches afgrænses pr. API-nøgle efter den samme tredelte regel som filer: Kun egen nøgle, dashboardsession på tværs af hele instansen, poster med null-ejer afvises for alle kaldere uden en session (hentning, sletning, annullering og kontrollen af `input_file_id` ved oprettelse). `GET /v1/batches` afviser en anonym kalder med `401`, selv når `REQUIRE_API_KEY=false`. --- ## Søge-API Abstraktion for web-/søgeudbydere (Tavily, Brave, Exa, Serper osv.). | Metode | Sti | Beskrivelse | | ------ | ---------------------- | ------------------------------------------------------------------------------------------------- | | GET | `/v1/search` | Vis konfigurerede søgeudbydere + funktioner | | POST | `/v1/search` | Kør en søgeforespørgsel — brødteksten valideres af `v1SearchSchema`, understøtter caching/samling | | GET | `/v1/search/analytics` | Statistik for træffere/ventetid/cache pr. udbyder | **Godkendelse:** Bearer-API-nøgle (`extractApiKey` + `isValidApiKey`). Søgepolitikken håndhæves via `enforceApiKeyPolicy`. --- ## API til hentning fra internettet Udtræk indhold fra en URL via en konfigureret udbyder til hentning fra internettet (Firecrawl, Jina Reader, Tavily Extract, TinyFish Fetch, Nimble Extract). | Metode | Sti | Beskrivelse | | ------ | --------------- | ----------------------------------------------------------------- | | POST | `/v1/web/fetch` | Hent/skrabet en URL — brødteksten valideres af `v1WebFetchSchema` | **Godkendelse:** Bearer-API-nøgle (`extractApiKey` + `isValidApiKey`). Politikken håndhæves via `enforceApiKeyPolicy`. **Kvotebevidst fallback (#8297):** Når der ikke er angivet en eksplicit `provider`, gennemgås puljen (`firecrawl` → `jina-reader` → `tavily-search` → `tinyfish` → `nimble-search`) i fast prioritetsrækkefølge (fyld først) — en hastighedsbegrænset, men konfigureret udbyder springes over i stedet for at afbryde forespørgslen, og en genforsøgsegnet upstream-fejl eller kvotefejl (altid HTTP 429; 402/403 for kvotebaserede gratisniveauer hos Firecrawl/Tavily/TinyFish — ikke for Jina Reader og aldrig ved en almindelig 400-fejlbehæftet forespørgsel) fortsætter til den næste endnu ikke afprøvede udbyder med legitimationsoplysninger på forespørgselstidspunktet. Når alle udbydere i puljen er udtømt, returnerer slutpunktet en enkelt `429` (med en `Retry-After`- header) i stedet for den tidligere generiske `400`. Når der anmodes om en eksplicit `provider`, er der **ingen** skjult fallback — en hastighedsbegrænset eller fejlslagen eksplicit udbyder viser sin egen fejl (`429`, hvis den er hastighedsbegrænset, ellers upstream- statussen). --- ## WebSocket-streaming ```bash GET /v1/ws?handshake=1 ``` Validerer et WebSocket-opgraderingshåndtryk og returnerer eksempelmeddelelserne for protokollen (`request`, `cancel`). De faktiske WS-frames håndteres af den medfølgende WS-server uden for Next.js-rutetabellen. **Godkendelse:** Bearer-API-nøgle under håndtrykket. ### Responses-API over WebSocket (kun codex) ```bash # Samme vært:port som HTTP-API'et (standard er 20128); opgrader forbindelsen: wscat -c "ws://localhost:20128/v1/responses?api_key=" # (eller: -H "Authorization: Bearer ") # Første frame SKAL være response.create: { "type": "response.create", "model": "gpt-5.5", "input": [ { "role": "user", "content": "hi" } ] } ``` En Responses-API-over-WebSocket-proxy er knyttet **udelukkende til `codex`** (ChatGPT- backend). Den lytter på samme port som API'et/dashboardet på stierne `/v1/responses`, `/responses` og `/api/v1/responses`. Ved den første `response.create`-frame godkender og forbereder den via den interne `codex-responses-ws`-bro, vælger en codex OAuth-forbindelse og opretter en tunnel til `wss://chatgpt.com/backend-api/codex/responses` via `wreq-js`-transporten. **Modeller, der ikke er codex, afvises** (`codex_ws_provider_required`). Brug `model: "qtSd//codex/"` til kvotedelingsrouting. Implementeret i `app/server-ws.mjs` + `scripts/dev/responses-ws-proxy.mjs` + `src/app/api/internal/codex-responses-ws/route.ts`. **Godkendelse:** Bearer-API-nøgle under håndtrykket. Den medfølgende HTTP-server (`server-ws.mjs`) skal være det aktive startpunkt (hvilket den som standard er, når `app/server-ws.mjs` findes). #### Model-id: Brug det rene ChatGPT-id (uden præfikset `codex/`) OpenAI **Codex CLI** validerer modelnavnet på klientsiden, når `supports_websockets = true`, og **afviser udbyderpræfikserede id'er** som `codex/gpt-5.5` (`The 'codex/gpt-5.5' model is not supported when using Codex with a ChatGPT account`). Send det **rene** id (f.eks. `gpt-5.5`). OmniRoutes bro er kun til codex, så den fortolker et rent id som en codex-model (`resolveCodexWsModelInfo`), før der oprettes en tunnel til upstream — selvom et rent `gpt-5.5` ellers ville blive dirigeret til en anden udbyder over HTTP. #### Konfiguration af OpenAI Codex CLI Peg Codex CLI mod OmniRoute ved at føje en brugerdefineret udbyder med WebSocket- understøttelse til `~/.codex/config.toml` (brug en separat `CODEX_HOME` for at undgå at ændre en eksisterende konfiguration): ```toml model = "gpt-5.5" # rent id — IKKE "codex/gpt-5.5" model_provider = "omniroute" [model_providers.omniroute] name = "OmniRoute (WS)" base_url = "http://localhost:20128/v1" # ingen afsluttende skråstreg; WS-URL'en udledes (brug https/wss i produktion) wire_api = "responses" # den eneste understøttede værdi siden februar 2026 supports_websockets = true # aktiverer Responses-over-WS-transporten env_key = "OMNIROUTE_API_KEY" # indeholder OmniRoute-API-nøglen (Bearer) ``` ```bash export OMNIROUTE_API_KEY=sk-... # en OmniRoute-API-nøgle (enhver nøgle, hvis REQUIRE_API_KEY=false) codex exec "Responda apenas: PONG" ``` CLI'en opgraderer `base_url + /responses` til en WebSocket, og OmniRoute opretter en tunnel til den valgte codex OAuth-forbindelse. Valideret fra ende til ende mod den lokale server: ChatGPT returnerer `codex.rate_limits` + `response.created` og streamer fuldførelsen. --- ## Rapportering af kvoter og problemer | Metode | Sti | Beskrivelse | | ------ | ------------------- | --------------------------------------------------------------------------------------------------- | | GET | `/v1/quotas/check` | Forhåndsvalider kvoten for en `provider` + `accountId`, før der udstedes en registreret nøgle | | POST | `/v1/issues/report` | Rapportér en fejl ved udstedelse af en kvote/nøgle til GitHub (kræver `GITHUB_ISSUES_REPO` + token) | **Godkendelse:** Bearer-API-nøgle (`isAuthenticated`). --- ## Selvbetjent forbrug (`/api/usage/om-usage`) Enhver API-nøgle kan aflæse **sit eget** forbrug og sine egne kvoter — ingen administrationsgodkendelse. Dette er det slutpunkt, som en klient (CLI, OmniCopilot-panelet) bruger til at vise en nøgleindehaver vedkommendes forbrug. ```bash # Tekstformat (den historiske kontrakt — almindelig tekst til en terminal) curl -H "Authorization: Bearer " \ http://localhost:20128/api/usage/om-usage # Struktureret format — det, som en brugergrænseflade anvender curl -H "Authorization: Bearer " \ "http://localhost:20128/api/usage/om-usage?format=json" ``` Nøglen skal have **`allowUsageCommand`** aktiveret (deaktiveret som standard — dashboardets API-nøgleadministrator slår det til eller fra for hver nøgle). Uden denne indstilling svarer slutpunktet med `403`. `?format=json` returnerer en diskrimineret struktur, så en kalder aldrig læser et datafelt fra et afslag. Ved succes: ```jsonc { "allowed": true, // findes kun, når nøglen har tilvalgt forbrugsgrænser pr. nøgle (daglige/ugentlige USD): "personal": { "dailySpentUsd": 1.25, "dailyLimitUsd": 5, "dailyResetAtIso": "…", "weeklySpentUsd": 8, "weeklyLimitUsd": 20, "weeklyResetAtIso": "…" /* … */, }, // det valgte snapshot af udbyderkvoten eller null, når intet endnu er cachelagret: "provider": { "connectionId": "…", "provider": "claude", "plan": "…", "quotas": {/* … */}, }, // snapshots for alle forbindelser, så en brugergrænseflade kan vise flere udbydere side om side: "providers": [ { "connectionId": "…", "provider": "claude" /* … */ }, { "provider": "codex" /* … */ }, ], } ``` Ved afslag (`401` ugyldig nøgle / `403` ikke tilladt) returnerer den samme rute `{ "allowed": false, "error": { "message": "…" } }` — en tilstedeværende, men tom `personal`/`provider` (nøglen er tilladt, men der er endnu ikke registreret noget) er en anden tilstand end et afslag, og kun JSON-formatet skelner mellem dem. **Godkendelse:** kalderens egen Bearer-API-nøgle, valideret med `isValidApiKey` — dette er _ikke_ administrationsgrænsefladen (`/api/keys/…`), som fortsat er beskyttet af `requireManagementAuth`. --- ## Semantisk cache ```bash # Hent cachestatistik GET /api/cache/stats # Ryd alle cacher DELETE /api/cache/stats ``` Eksempel på svar: ```json { "semanticCache": { "memorySize": 42, "memoryMaxSize": 500, "dbSize": 128, "hitRate": 0.65 }, "idempotency": { "activeKeys": 3, "windowMs": 5000 } } ``` ### Påvirkning af latenstid Et HIT i den semantiske cache leverer svaret fra cachen **uden et upstream-kald**, så den rapporterede `X-OmniRoute-Response-Latency` er tæt på nul (uanset den oprindelige upstream-latenstid). Klienter, der er følsomme over for latenstid (benchmarking, p50/p99-overvågning), bør kontrollere response-headeren `X-OmniRoute-Cache-Latency`: | Værdi | Betydning | | -------------- | ---------------------------------------------------------------- | | `synthetic` | Svaret leveres fra cachen; latenstiden er ikke reel upstream-tid | | _(fraværende)_ | Svar fra et reelt upstream-kald | ### Omgåelse af cache pr. nøgle API-nøgler kan fravælge læsninger fra den semantiske cache via `cacheDefaultMode`: | Værdi | Adfærd | | -------- | ------------------------------------------------- | | `legacy` | Normal cacheadfærd (standard) | | `bypass` | Spring cacheopslag helt over; brug altid upstream | Angiv ved oprettelse af nøglen (`POST /api/keys`) eller ved opdatering (`PATCH /api/keys/[id]`): ```json { "cacheDefaultMode": "bypass" } ``` ### Omgåelse pr. anmodning Enhver anmodning kan omgå cachen uanset nøgleindstillingerne: ``` X-OmniRoute-No-Cache: true ``` --- ## Dashboard og administration Administrationsruter (`/api/*` undtagen offentlig godkendelse/login) er **ikke** godkendt med almindelige API-nøgler til inferens. Legitimationsoplysningstyper, scopes og curl-eksempler: [Administrationsgodkendelse](../guides/MANAGEMENT-AUTH.md). ### Godkendelse | Slutpunkt | Metode | Beskrivelse | | ----------------------------- | ------- | ------------------------- | | `/api/auth/login` | POST | Log ind | | `/api/auth/logout` | POST | Log ud | | `/api/settings/require-login` | GET/PUT | Slå krav om login til/fra | ### Udbyderadministration | Slutpunkt | Metode | Beskrivelse | | ---------------------------- | --------------------- | -------------------------------------------------------------------------------------------------------------------- | | `/api/providers` | GET/POST | Vis / opret udbydere | | `/api/providers/[id]` | GET/PUT/DELETE | Administrer en udbyder | | `/api/providers/[id]/test` | POST | Test forbindelsen til udbyderen | | `/api/providers/[id]/models` | GET | Vis udbyderens modeller | | `/api/providers/validate` | POST | Valider udbyderkonfigurationen | | `/api/providers/bulk` | POST | Tilføj flere API-nøgler samlet for ÉN udbyder | | `/api/providers/import` | POST | Importer en heterogen udbyderLISTE fra en fortolket CSV/JSON-fil (#6836); resultater med delvise fejl for hver række | | `/api/provider-nodes*` | Forskellige | Administration af udbydernoder | | `/api/provider-models` | GET/POST/PATCH/DELETE | Brugerdefinerede modeller (tilføj, opdater, skjul/vis, slet) | ### OAuth-forløb | Slutpunkt | Metode | Beskrivelse | | -------------------------------- | ----------- | --------------------- | | `/api/oauth/[provider]/[action]` | Forskellige | Udbyderspecifik OAuth | ### Routing og konfiguration | Slutpunkt | Metode | Beskrivelse | | --------------------- | ----------- | ---------------------------------- | | `/api/models/alias` | GET/POST | Modelaliasser | | `/api/models/catalog` | GET | Alle modeller efter udbyder + type | | `/api/combos*` | Forskellige | Administration af kombinationer | | `/api/keys*` | Forskellige | Administration af API-nøgler | | `/api/pricing` | GET | Modelpriser | ### Brug og analyse | Endpoint | Metode | Beskrivelse | | -------------------------------- | --------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `/api/usage/history` | GET | Forbrugshistorik | | `/api/usage/logs` | GET | Forbrugslogfiler | | `/api/usage/request-logs` | GET | Logfiler på anmodningsniveau | | `/api/usage/[connectionId]` | GET | Forbrug pr. forbindelse | | `/api/usage/token-limits` | GET/POST/DELETE | Budgetter for tokengrænser pr. API-nøgle | | `/api/usage/model-latency-stats` | GET | Rullende samlet latenstid pr. udbyder/model (gennemsnit/p50/p95/p99, succesrate); filtre: `windowHours`/`minSamples`/`maxRows`/`provider`/`model` (#6873) | | `/api/usage/cache-health` | GET | Oversigt over promptcachens tilstand baseret på `call_logs` — skrive-/læseforhold, p50/p90/p99-fordeling af skrivestørrelse, koncentration af omfattende skrivninger, opdeling pr. model samt en vurdering på `healthy`/`degraded`/`thrash`/`no-data`; forespørgselsparametrene `range` (`1h`\|`24h`\|`7d`\|`30d`, standardværdi `24h`) og valgfrit `model` (#8827) | ### Indstillinger | Endpoint | Metode | Beskrivelse | | ------------------------------------- | ------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `/api/settings` | GET/PUT/PATCH | Generelle indstillinger | | `/api/settings/proxy` | GET/PUT | Konfiguration af netværksproxy | | `/api/settings/proxy/test` | POST | Test proxyforbindelsen | | `/api/settings/ip-filter` | GET/PUT | Liste over tilladte/blokerede IP-adresser | | `/api/settings/thinking-budget` | GET/PUT | Omskrivningstilstand for **anmodninger** vedrørende tænke-/ræsonneringsbudget (uændret videresendelse / automatisk fjernelse / brugerdefineret / adaptiv). Uafhængig af komprimering. Se [THINKING_BUDGET.md](../guides/THINKING_BUDGET.md). | | `/api/settings/system-prompt` | GET/PUT | Global systemprompt | | `/api/settings/compression` | GET/PUT | Global komprimeringskonfiguration | | `/api/settings/purge-request-history` | POST | Ryd rækker i anmodningsloggen og lokale kaldslogartefakter | ### Kontekst og komprimering | Slutpunkt | Metode | Beskrivelse | | -------------------------------------- | -------------- | ------------------------------------------------------------------------------------------ | | `/api/compression/preview` | POST | Forhåndsvis komprimering med off/lite/standard/aggressive/ultra/RTK/stacked | | `/api/compression/language-packs` | GET | Vis tilgængelige Caveman-sprogpakker | | `/api/compression/rules` | GET | Vis metadata for Caveman-regler | | `/api/context/caveman/config` | GET/PUT | Alias for Caveman-specifikke indstillinger | | `/api/context/rtk/config` | GET/PUT | RTK-specifikke indstillinger, herunder brugerdefinerede filtre og opbevaring af råt output | | `/api/context/rtk/filters` | GET | RTK-filterkatalog og diagnosticering af brugerdefinerede filtre | | `/api/context/rtk/test` | POST | Kør RTK-forhåndsvisning/-test med en tekstpayload | | `/api/context/rtk/raw-output/[id]` | GET | Læs opbevaret, redigeret råt output via markør-id | | `/api/context/combos` | GET/POST | Vis/opret komprimeringskombinationer | | `/api/context/combos/[id]` | GET/PUT/DELETE | Detaljer om/opdatering/sletning af komprimeringskombination | | `/api/context/combos/[id]/assignments` | GET/PUT | Tildel komprimeringskombinationer til routingkombinationer | | `/api/context/analytics` | GET | Alias for komprimeringsanalyse | ### Overvågning | Slutpunkt | Metode | Beskrivelse | | ------------------------------------ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `/api/sessions` | GET | Sporing af aktive sessioner | | `/api/rate-limits` | GET | Hastighedsgrænser pr. konto | | `/api/monitoring/health` | GET | Sundhedstjek + udbyderoversigt (`catalogCount`, `configuredCount`, `activeCount`, `monitoredCount`). Administrationsvisningen inkluderer `credentialHealth`: skalarer fra probe-cachen, `failedConnections`, når `failed>0`, og `staleDbNonOkCount` (vedvarende SQLite-`test_status`, ikke måleren). Se [MONITORING_GUIDE.md](../ops/MONITORING_GUIDE.md#credentialhealth-probe-cache-vs-sqlite-test_status). | | `/api/cache/stats` | GET/DELETE | Cachestatistik / rydning | | `/api/modality-bridge/stats` | GET | `attempts` i hukommelsen, vellykkede/`bridged`, fejl, cachetræffere, `totalLatencyMs`, `latencySamples`, stikprøvebaseret `averageLatencyMs` og tidspunkt for seneste brug (nulstilles ved genstart; administrationsgodkendelse) | | `/api/modality-bridge/video/runtime` | GET | Streng kontrol af betroet loopback før administrationsgodkendelse/probe; renset tilgængelighed og versioner for FFmpeg/ffprobe (no-store) | | `/api/modality-bridge/video/extract` | POST | Intern godkendt bytebroker til betroet loopback; 50 MiB input, begrænset kø/32 MiB output, `503` ved kapacitetsgrænse, `499` ved afbrydelse, `504` ved tidsfrist; ikke en offentlig upload-API | ### Sikkerhedskopiering og eksport/import | Slutpunkt | Metode | Beskrivelse | | --------------------------- | ------ | ------------------------------------------------------- | | `/api/db-backups` | GET | Vis tilgængelige sikkerhedskopier | | `/api/db-backups` | PUT | Opret en manuel sikkerhedskopi | | `/api/db-backups` | POST | Gendan fra en bestemt sikkerhedskopi | | `/api/db-backups/export` | GET | Download databasen som en .sqlite-fil | | `/api/db-backups/import` | POST | Upload en .sqlite-fil for at erstatte databasen | | `/api/db-backups/exportAll` | GET | Download en komplet sikkerhedskopi som et .tar.gz-arkiv | ### Synkronisering med cloudtjenester | Slutpunkt | Metode | Beskrivelse | | ---------------------- | ----------- | ---------------------------------- | | `/api/sync/cloud` | Forskellige | Handlinger til cloudsynkronisering | | `/api/sync/initialize` | POST | Initialiser synkronisering | | `/api/cloud/*` | Forskellige | Administration af cloudtjenester | ### Tunneler | Slutpunkt | Metode | Beskrivelse | | -------------------------- | ------ | ---------------------------------------------------------------------------- | | `/api/tunnels/cloudflared` | GET | Læs installations-/kørselsstatus for Cloudflare Quick Tunnel til dashboardet | | `/api/tunnels/cloudflared` | POST | Aktivér eller deaktiver Cloudflare Quick Tunnel (`action=enable/disable`) | | `/api/tunnels/ngrok` | GET | Læs kørselsstatus for ngrok Tunnel til dashboardet | | `/api/tunnels/ngrok` | POST | Aktivér eller deaktiver ngrok Tunnel (`action=enable/disable`) | ### CLI-værktøjer | Slutpunkt | Metode | Beskrivelse | | ---------------------------------- | ------ | ------------------------- | | `/api/cli-tools/claude-settings` | GET | Status for Claude CLI | | `/api/cli-tools/codex-settings` | GET | Status for Codex CLI | | `/api/cli-tools/droid-settings` | GET | Status for Droid CLI | | `/api/cli-tools/openclaw-settings` | GET | Status for OpenClaw CLI | | `/api/cli-tools/runtime/[toolId]` | GET | Generisk CLI-kørselsmiljø | CLI-svar inkluderer: `installed`, `runnable`, `command`, `commandPath`, `runtimeMode`, `reason`. ### ACP-agenter | Slutpunkt | Metode | Beskrivelse | | ----------------- | ------ | ------------------------------------------------------------------------ | | `/api/acp/agents` | GET | Vis alle registrerede agenter (indbyggede + brugerdefinerede) med status | | `/api/acp/agents` | POST | Tilføj en brugerdefineret agent, eller opdater registreringscachen | | `/api/acp/agents` | DELETE | Fjern en brugerdefineret agent via forespørgselsparameteren `id` | GET-svaret inkluderer `agents[]` (id, name, binary, version, installed, protocol, isCustom) og `summary` (total, installed, notFound, builtIn, custom). ### Robusthed og hastighedsgrænser | Slutpunkt | Metode | Beskrivelse | | --------------------------------- | --------- | ----------------------------------------------------------------------------------------------- | | `/api/resilience` | GET/PATCH | Hent/opdater indstillinger for anmodningskø, forbindelsesnedkøling, udbyderafbryder og ventetid | | `/api/resilience/reset` | POST | Nulstil udbydernes kredsløbsafbrydere | | `/api/resilience/model-cooldowns` | GET | Vis aktive spærringer pr. (udbyder, forbindelse, model), sorteret efter resterende tid | | `/api/resilience/model-cooldowns` | DELETE | Ryd en modelspærring — body `{provider, model}` eller `{all: true}` for at rydde alt | | `/api/rate-limits` | GET | Status for hastighedsgrænse pr. konto | | `/api/rate-limit` | GET | Global konfiguration af hastighedsgrænser | > Alle fire `/api/resilience/*`-ruter kræver **administrationsgodkendelse** (`requireManagementAuth`). Se [Robusthed (udvidet)](#resilience-extended) for en komplet gennemgang af udbyderafbryder kontra forbindelsesnedkøling kontra modelspærring. ### Evalueringer | Slutpunkt | Metode | Beskrivelse | | ------------ | -------- | --------------------------------------- | | `/api/evals` | GET/POST | Vis evalueringspakker/kør en evaluering | ### Politikker | Slutpunkt | Metode | Beskrivelse | | --------------- | --------------- | --------------------------------- | | `/api/policies` | GET/POST/DELETE | Administrer dirigeringspolitikker | ### Overholdelse | Slutpunkt | Metode | Beskrivelse | | --------------------------- | ------ | ----------------------------------------- | | `/api/compliance/audit-log` | GET | Revisionslog for overholdelse (seneste N) | ### v1beta (Gemini-kompatibel) | Slutpunkt | Metode | Beskrivelse | | -------------------------- | ------ | ---------------------------------- | | `/v1beta/models` | GET | Vis modeller i Gemini-format | | `/v1beta/models/{...path}` | POST | Gemini-`generateContent`-slutpunkt | Disse slutpunkter afspejler Geminis API-format for klienter, der forventer kompatibilitet med det oprindelige Gemini SDK. ### Interne API'er/system-API'er | Slutpunkt | Metode | Beskrivelse | | ------------------------ | ------ | ---------------------------------------------------------------- | | `/api/init` | GET | Kontrol af applikationsinitialisering (bruges ved første kørsel) | | `/api/tags` | GET | Ollama-kompatible modeltags (til Ollama-klienter) | | `/api/restart` | POST | Udløs kontrolleret genstart af serveren | | `/api/shutdown` | POST | Udløs kontrolleret nedlukning af serveren | | `/api/system/env/repair` | POST | Reparer miljøvariabler for OAuth-udbyderen | > **Bemærk:** Disse slutpunkter bruges internt af systemet eller til kompatibilitet med Ollama-klienter. De kaldes typisk ikke af slutbrugere. ### Reparation af OAuth-miljøvariabler _(v3.6.1+)_ ```bash POST /api/system/env/repair Content-Type: application/json { "provider": "claude-code" } ``` Reparerer manglende eller beskadigede OAuth-miljøvariabler for en specifik udbyder. Returnerer: ```json { "success": true, "repaired": ["CLAUDE_CODE_OAUTH_CLIENT_ID", "CLAUDE_CODE_OAUTH_CLIENT_SECRET"], "backupPath": "/home/user/.omniroute/backups/env-repair-2026-04-11.bak" } ``` --- ## Lydtransskription ```bash POST /v1/audio/transcriptions Authorization: Bearer your-api-key Content-Type: multipart/form-data ``` Transskriber lydfiler ved hjælp af en hvilken som helst konfigureret STT-udbyder. Det første stisegment vælger den oprindelige udbyder (`openai/…`, `deepgram/…`). Gateways, der videreeksporterer en anden leverandørs model, bruger et kvalificeret id (`openrouter/deepgram/nova-3`). **Anmodning:** ```bash curl -X POST http://localhost:20128/v1/audio/transcriptions \ -H "Authorization: Bearer your-api-key" \ -F "file=@recording.mp3" \ -F "model=openai/whisper-1" ``` **Svar:** ```json { "text": "Hello, this is the transcribed audio content.", "task": "transcribe", "language": "en", "duration": 12.5 } ``` **Eksempler på model-id'er:** `openai/whisper-1` (kræver en OpenAI-nøgle), `openrouter/deepgram/nova-3` (kræver en OpenRouter-nøgle), `deepgram/nova-3` (kræver en oprindelig Deepgram-nøgle). En direkte `deepgram/nova-3`-anmodning bruger **ikke** OpenRouter. **Understøttede formater:** `mp3`, `wav`, `m4a`, `flac`, `ogg`, `webm`. --- ## Ollama-kompatibilitet For klienter, der bruger Ollamas API-format: ```bash # Chat-slutpunkt (Ollama-format) POST /v1/api/chat # Modelliste (Ollama-format) GET /api/tags ``` Anmodninger oversættes automatisk mellem Ollama-formatet og interne formater. ## Tokeniserede VS Code-aliasser/aliasser uden headers Brug disse aliasser, når en integration ikke kan indsætte en `Authorization`-header og har brug for, at API-nøglen er indlejret i basis-URL'en. ```bash # Katalogalias i OpenAI-stil GET /api/v1/vscode/{token}/ GET /api/v1/vscode/{token}/models # Chat-aliasser i OpenAI-stil POST /api/v1/vscode/{token}/chat/completions POST /api/v1/vscode/{token}/responses # Aliasser i Ollama-stil POST /api/v1/vscode/{token}/api/chat GET /api/v1/vscode/{token}/api/tags ``` Eksempel: ```bash 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":"hello"}]}' ``` Bemærkninger: - De tokeniserede aliasser genbruger de samme handlers som `/v1/*` og `/api/tags`; svarstrukturerne forbliver identiske. - Foretræk `Authorization: Bearer ...`, når klienten understøtter brugerdefinerede headers. - URL-baserede tokens kan optræde i reverse proxy-logfiler, browserhistorik og telemetri uden for OmniRoute. Betragt dem som en kompatibilitetsmulighed, ikke som standardmetoden til godkendelse. --- ## Telemetri ```bash # Hent oversigt over latenstelemetri (p50/p95/p99 pr. udbyder) GET /api/telemetry/summary ``` **Svar:** ```json { "providers": { "claudeCode": { "p50": 245, "p95": 890, "p99": 1200, "count": 150 }, "github": { "p50": 180, "p95": 620, "p99": 950, "count": 320 } } } ``` --- ## Budget ```bash # Hent budgetstatus for alle API-nøgler GET /api/usage/budget # Angiv eller opdater et budget 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" } ``` > **Skemabemærkninger** (`setBudgetSchema`): `apiKeyId` er påkrævet; mindst én af `dailyLimitUsd`, `weeklyLimitUsd` eller `monthlyLimitUsd` skal være større end nul. Valgfrie felter: `warningThreshold` (0–1), `resetInterval` (`daily` | `weekly` | `monthly`), `resetTime` (`HH:MM`). Det ældre `{keyId, limit, period}`-format returnerer `400 Bad Request`. ## Tokengrænser **Tokenbudgetter** pr. API-nøgle (adskilt fra det USD-baserede budget ovenfor). Håndhæves direkte i requestforløbet: Når en nøgles forbrug i det aktuelle vindue når dens grænse, afvises requests med `429 Too Many Requests`. Grænser kan afgrænses til en bestemt `model`, en `provider` eller anvendes `global`t på tværs af nøglen. Når flere grænser matcher en request, gælder den mest restriktive. ```bash # Vis en nøgles tokengrænser (inkluderer aktuelt forbrug i vinduet) GET /api/usage/token-limits?apiKeyId=key-123 # Opret eller opdater en tokengrænse POST /api/usage/token-limits Content-Type: application/json { "apiKeyId": "key-123", "scopeType": "model", "scopeValue": "openai/gpt-4o", "tokenLimit": 1000000, "resetInterval": "monthly", "enabled": true } # Slet en tokengrænse efter id DELETE /api/usage/token-limits?id=tl-abc ``` > **Skemabemærkninger** (`setTokenLimitSchema`): `apiKeyId` og `scopeType` (`model` | `provider` | `global`) er påkrævede. `scopeValue` er påkrævet, medmindre `scopeType` er `global` (f.eks. et model-id for `model`-omfang eller et udbyder-id for `provider`-omfang). `tokenLimit` skal være et positivt heltal (konverteres fra en streng). Valgfrit: `id` (udelad for at oprette, angiv for at opdatere), `resetInterval` (`daily` | `weekly` | `monthly`, standardværdi `monthly`), `resetTime` (`HH:MM`), `enabled` (standardværdi `true`). `GET`-svar udvider hver grænse med `tokensUsed`, `remaining`, `windowStart`, `periodStartAt` og `nextResetAt`. Dette er et administrationsendpoint (godkendelse håndhæves centralt af authz-pipelinen). ## Behandling af requests 1. Klienten sender en request til `/v1/*` 2. Route-handleren kalder `handleChat`, `handleEmbedding`, `handleAudioTranscription` eller `handleImageGeneration` 3. Modellen opløses (direkte udbyder/model eller alias/kombination) 4. Legitimationsoplysninger vælges fra den lokale database med filtrering efter kontotilgængelighed 5. For chat: `handleChatCore` kontrollerer den semantiske cache/signaturcachen og opløser kombinationens komprimeringsindstillinger 6. Proaktiv komprimering køres før oversættelse til udbyderformatet, når den er aktiveret (`lite`, Caveman, RTK eller stablet) 7. Udbyderens executor sender requesten opstrøms 8. Svaret oversættes tilbage til klientformatet (chat) eller returneres uændret (embeddings/billeder/lyd) 9. Forbrug, komprimeringsanalyse og requestlogs registreres 10. Fallback anvendes ved fejl i henhold til kombinationsreglerne Fuld arkitekturreference: [`ARCHITECTURE.md`](../architecture/ARCHITECTURE.md) --- ## Administration af kombinationer Routingkombinationer på højere niveau (allerede opsummeret under `/api/combos*`) kan også mappes 1:1 fra et model-id-mønster, hvilket muliggør transparent omdirigering af et model-id i OpenAI-stil til en kombination. | Metode | Sti | Beskrivelse | | ------ | -------------------------------- | ----------------------------------------------------------------------------- | | GET | `/api/model-combo-mappings` | Vis alle model→kombination-mappinger | | POST | `/api/model-combo-mappings` | Opret mapping — body: `{pattern, comboId, priority?, enabled?, description?}` | | GET | `/api/model-combo-mappings/[id]` | Hent en enkelt mapping | | PUT | `/api/model-combo-mappings/[id]` | Opdater felter i en eksisterende mapping | | DELETE | `/api/model-combo-mappings/[id]` | Fjern en mapping | **Godkendelse:** administrationssession/API-nøgle (`requireManagementAuth`). --- ## Webhooks Udgående webhook-abonnementer på OmniRoute-hændelser (fuldførelse af anmodninger, opbrugte kvoter, nøglerotation osv.). | Metode | Sti | Beskrivelse | | ------ | ------------------------- | -------------------------------------------------------------------- | | GET | `/api/webhooks` | Vis webhooks (hemmeligheder maskeres som `...`) | | POST | `/api/webhooks` | Opret webhook — body: `{url, events?: ["*"], secret?, description?}` | | GET | `/api/webhooks/[id]` | Hent en webhook | | PUT | `/api/webhooks/[id]` | Opdater url/events/secret/description | | DELETE | `/api/webhooks/[id]` | Fjern en webhook | | POST | `/api/webhooks/[id]/test` | Send en testpayload til webhook-URL'en, og returner leveringsstatus | **Godkendelse:** administrationssession/API-nøgle (`requireManagementAuth`). --- ## Registrerede nøgler (automatisk administration) Bruges af undersystemet til automatisk nøgleadministration til at udstede og rotere API-nøgler hos en underliggende udbyder/konto med daglige/timemæssige kvoter. | Metode | Sti | Beskrivelse | | ------ | ------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | GET | `/api/v1/registered-keys` | Vis registrerede nøgler (kun maskeret præfiks) | | POST | `/api/v1/registered-keys` | Udsted en ny registreret nøgle — body: `{name, provider?, accountId?, idempotencyKey?, expiresAt?, dailyBudget?, hourlyBudget?}`. Returnerer den rå nøgle **én gang**. Returnerer `429`, hvis kvoten afviser. | | GET | `/api/v1/registered-keys/[id]` | Hent metadataene for en registreret nøgle (intet råt nøglemateriale) | | DELETE | `/api/v1/registered-keys/[id]` | Tilbagekald en registreret nøgle | | POST | `/api/v1/registered-keys/[id]/revoke` | Eksplicit slutpunkt til tilbagekaldelse (samme effekt som DELETE) | **Godkendelse:** Bearer-API-nøgle (`isAuthenticated`). Se også `/v1/quotas/check` og `/v1/issues/report`. --- ## Agentprotokol Cloudagentopgaver (Claude Code, Codex Cloud, OpenHands osv.), der udføres eksternt på vegne af OmniRoute-brugere. | Metode | Sti | Beskrivelse | | ------ | ----------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------- | | GET | `/api/v1/agents/tasks` | Vis opgaver — valgfrit `?provider=`, `?status=`, `?limit=` (1–500, standard 50) | | POST | `/api/v1/agents/tasks` | Opret opgave — body valideres af `CreateCloudAgentTaskSchema` (`providerId`, `prompt`, `source`, `options?`). Returnerer `201` med en opgavekonvolut | | DELETE | `/api/v1/agents/tasks?id=...` | Slet en opgave | | GET | `/api/v1/agents/tasks/[id]` | Læs opgave — opdaterer synkront status fra den eksterne cloudagent, når et `external_id` er angivet | | POST | `/api/v1/agents/tasks/[id]` | Diskrimineret handling: `{action: "approve"}`, `{action: "message", message}` eller `{action: "cancel"}` | | DELETE | `/api/v1/agents/tasks/[id]` | Slet en specifik opgave efter id | > **Godkendelse:** administrationsgodkendelse er påkrævet for hver metode (`requireCloudAgentManagementAuth`). Før v3.8.0 var disse ikke godkendelsesbeskyttede — se commit `588a0333` for den inkompatible ændring. ```bash # Opret en Claude Code-cloudopgave 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":"..."}}' ``` --- ## Administrationsproxyer Udgående HTTP(S)/SOCKS-proxyer, der kan tildeles udbydere, konti eller globalt. | Metode | Sti | Beskrivelse | | ------ | -------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------- | | GET | `/api/v1/management/proxies` | Vis proxyer (med `?id=` returneres én; med `?id=&where_used=1` returneres tildelingsgrafen) | | POST | `/api/v1/management/proxies` | Opret proxy — body valideres af `createProxyRegistrySchema` | | PATCH | `/api/v1/management/proxies` | Opdater proxy — body valideres af `updateProxyRegistrySchema` (kræver `id`) | | DELETE | `/api/v1/management/proxies?id=...&force=1` | Slet proxy (brug `force=1` til at fjerne tildelinger) | | GET | `/api/v1/management/proxies/assignments` | Vis tildelinger — kan filtreres efter `proxy_id`, `scope`, `scope_id`; angiv `resolve_connection_id=` for at finde den aktive proxy for en forbindelse | | PUT | `/api/v1/management/proxies/assignments` | Tildel — body valideres af `proxyAssignmentSchema` (`{scope, scopeId?, proxyId?}`). Rydder dispatcherens cache | | PUT | `/api/v1/management/proxies/bulk-assign` | Massetildel — body valideres af `bulkProxyAssignmentSchema` (`{scope, scopeIds[], proxyId?}`) | | GET | `/api/v1/management/proxies/health?hours=24` | Samlet proxytilstand (antal vellykkede/mislykkede forsøg, latenstid) over et tidsvindue | **Godkendelse:** administrationssession/API-nøgle på hver rute (`requireManagementAuth`). > Opgavebeskrivelsens `POST /api/v1/management/proxies/[id]/assignments` og `POST /api/v1/management/proxies/[id]/health` betjenes af de flade `/assignments`- og `/health`-ruter, der er vist ovenfor — der findes ingen underordnede ruter pr. id i kodebasen. --- ## Robusthed (udvidet) OmniRoute tilbyder tre uafhængige mekanismer til midlertidige fejl. Administrationsendepunkterne nedenfor giver operatører mulighed for at aflæse og tilsidesætte dem: | Omfang | Tilstandslagring | Aflæsning | Nulstilling / rydning | | --------------------- | ------------------------------------------ | ----------------------------------------- | ---------------------------------------------- | | Udbyderafbryder | `domain_circuit_breakers` + i hukommelsen | `/api/monitoring/health` | `POST /api/resilience/reset` | | Forbindelsesnedkøling | `rateLimitedUntil` på udbyderforbindelser | `/api/rate-limits`, `/api/providers/[id]` | (genaktiveres automatisk; ryd via udbyder-PUT) | | Modelspærring | Modeltilgængelighedsregister i hukommelsen | `GET /api/resilience/model-cooldowns` | `DELETE /api/resilience/model-cooldowns` | `PATCH /api/resilience` accepterer tilsidesættelser af udbyderafbrydere under `providerBreaker.oauth` og `providerBreaker.apikey`. Hver profil understøtter `degradationThreshold`, `failureThreshold` og `resetTimeoutMs`; de samme felter er tilgængelige under Dashboard → Indstillinger → Robusthed. ```bash # Ryd en enkelt modelspærring 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"}' # Ryd alle spærringer curl -X DELETE http://localhost:20128/api/resilience/model-cooldowns \ -H "Cookie: auth_token=..." \ -d '{"all":true}' ``` Komplet konceptuel reference og standardværdier for afbrydere: Se [`CLAUDE.md`](../../CLAUDE.md) → "Resilience Runtime State". --- ## Færdigheder Framework til udvidelse af OmniRoute med brugerdefinerede eksekverbare handlers samt integrationer med markedspladser. | Metode | Sti | Beskrivelse | | ------ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------------- | | GET | `/api/skills` | Vis installerede færdigheder — kan filtreres med `?q=`, `?mode=on\|off\|auto`, `?source=skillsmp\|skillssh\|local`, sideinddelt | | GET | `/api/skills/[id]` | Hent én færdighed | | PUT | `/api/skills/[id]` | Opdater færdighed (navn, beskrivelse, tilstand, skema, handler, tags) | | DELETE | `/api/skills/[id]` | Afinstaller en færdighed | | POST | `/api/skills/install` | Installer en færdighed fra et råt manifest — body: `{name, version, description, schema:{input, output}, handlerCode, apiKeyId?}` | | GET | `/api/skills/executions` | Vis de seneste færdighedskørsler (revisionsspor med input/output/varighed) | | GET | `/api/skills/marketplace?q=...` | Søg/populærliste fra SkillsMP-markedspladsen (kræver indstillingen `skillsmpApiKey`) | | POST | `/api/skills/marketplace/install` | Installer en færdighed efter id fra SkillsMP | | GET | `/api/skills/skillssh?q=&limit=` | Søg i skills.sh-registret | | POST | `/api/skills/skillssh/install` | Installer en færdighed efter id fra skills.sh | **Godkendelse:** administrationssession/API-nøgle. Søgeruter til markedspladser accepterer enten administrationsgodkendelse eller en Bearer-API-nøgle (`isAuthenticated`). --- ## Hukommelse Vedvarende lager til samtale- og faktuel hukommelse, afgrænset pr. API-nøgle/session. | Metode | Sti | Beskrivelse | | ------ | -------------------- | ----------------------------------------------------------------------------------------------------------------------- | | GET | `/api/memory` | Vis hukommelser — `?apiKeyId=`, `?type=`, `?sessionId=`, `?q=`, med sideinddeling via `offset/limit` eller `page/limit` | | POST | `/api/memory` | Opret hukommelse — body valideret af Zod: `{content, key, type?, sessionId?, apiKeyId?, metadata?, expiresAt?}` | | GET | `/api/memory/[id]` | Hent én hukommelse | | DELETE | `/api/memory/[id]` | Slet en hukommelse | | GET | `/api/memory/health` | Hukommelsesundersystemets tilstand (databaseforbindelse, embeddings-backend, vektorindeksstatus) | **Godkendelse:** administrationssession/API-nøgle (`requireManagementAuth`). `type`-enum: `FACTUAL`, `EPISODIC`, `SEMANTIC`, `PROCEDURAL` (se `MemoryType` i `src/lib/memory/types.ts`). --- ## MCP-server OmniRoute leveres med en integreret Model Context Protocol-server med 3 transporter (stdio, SSE, streamable-http) og værktøjer med afgrænsede tilladelser. Dashboard-endpoints nedenfor læser status-/revisionsdata og fungerer som proxy for HTTP-transporterne. | Metode | Sti | Beskrivelse | | ------ | ---------------------- | ------------------------------------------------------------------------------------------------ | -------------------- | | GET | `/api/mcp/status` | Heartbeat, transport, onlinestatus, seneste kald, mest anvendte værktøjer, succesrate for de seneste 24 timer | | GET | `/api/mcp/tools` | Liste over MCP-værktøjer med `name`, `description`, `scopes`, `phase`, `auditLevel`, `sourceEndpoints` | | GET | `/api/mcp/sse` | Åbn SSE-stream for SSE-transporten (returnerer `503`, hvis MCP er deaktiveret, eller transporten ikke matcher) | | POST | `/api/mcp/sse` | Send JSON-RPC-frame via SSE-transporten | | GET | `/api/mcp/stream` | Åbn SSE-siden af Streamable HTTP-transporten (serverinitierede meddelelser) | | POST | `/api/mcp/stream` | Send JSON-RPC-frame via Streamable HTTP-transporten | | DELETE | `/api/mcp/stream` | Afslut en Streamable HTTP-session | | GET | `/api/mcp/audit` | Forespørg i revisionsloggen — `?limit=`, `?offset=`, `?tool=`, `?success=true | false`, `?apiKeyId=` | | GET | `/api/mcp/audit/stats` | Samlede revisionsstatistikker (totaler, succesrate, gennemsnitlig varighed, mest anvendte værktøjer) | **Godkendelse:** `sse`/`stream`-transporterne anvender den MCP-specifikke godkendelsesflade (Bearer-API-nøgle med `mcp`-scope); `status`/`tools`/`audit*`-ruterne kan læses fra dashboardet (ingen yderligere godkendelse kræves ud over adgang til dashboard-værten). > Begge HTTP-transporter styres af `settings.mcpEnabled` og `settings.mcpTransport` — en transportuoverensstemmelse returnerer `400`, og en deaktiveret MCP-tilstand returnerer `503`. --- ## A2A-server OmniRoute tilbyder et A2A-slutpunkt (Agent-to-Agent) baseret på JSON-RPC 2.0 samt en REST-wrapper til inspektion og brug i dashboards. ### JSON-RPC ```bash POST /a2a Authorization: Bearer your-api-key # valgfrit, medmindre OMNIROUTE_API_KEY er angivet Content-Type: application/json { "jsonrpc": "2.0", "id": 1, "method": "message/send", "params": { "skill": "smart-routing", "messages": [{"role": "user", "content": "Send denne programmeringsopgave videre"}] } } ``` Understøttede metoder (alle afhænger af `settings.a2aEnabled`): | Metode | Beskrivelse | | ---------------- | ------------------------------------------------------------------------ | | `message/send` | Synkron udførelse af færdighed; returnerer `{task, artifacts, metadata}` | | `message/stream` | Streamet SSE-udførelse af det samme sæt færdigheder | | `tasks/get` | Hent en opgave via `taskId` | | `tasks/cancel` | Annuller en opgave via `taskId` | Indbyggede færdigheder: `smart-routing`, `quota-management`, `provider-discovery`, `cost-analysis`, `health-report`. ### Agentkort ```bash GET /.well-known/agent.json ``` Returnerer det offentlige A2A-agentkort (navn, beskrivelse, funktioner, færdighedskatalog og godkendelsesmetode) — caches offentligt i 1 time. Kræver ingen godkendelse. ### REST-hjælpefunktioner | Metode | Sti | Beskrivelse | | ------ | ---------------------------- | ---------------------------------------------------------------------------------------------------------------- | | GET | `/api/a2a/status` | A2A aktiveret + opgavestatistik + oversigt over cachet agentkort | | GET | `/api/a2a/tasks` | Vis opgaver — `?state=submitted\|working\|completed\|failed\|cancelled`, `?skill=`, `?limit=` (≤200), `?offset=` | | POST | `/api/a2a/tasks` | (Ikke implementeret som REST-hjælpefunktion — opret via JSON-RPC `message/send`) | | GET | `/api/a2a/tasks/[id]` | Hent én opgave | | POST | `/api/a2a/tasks/[id]/cancel` | Annuller en opgave | **Godkendelse:** REST-hjælpefunktionerne kører uden administrationsgodkendelse (kan læses af dashboardet); JSON-RPC-ruten `/a2a` bruger Bearer `OMNIROUTE_API_KEY`, hvis den er konfigureret. --- ## Cloud, evalueringer og vurdering | Metode | Sti | Beskrivelse | | ------ | ------------------------------- | ------------------------------------------------------------------------------------------------- | ----------------------------- | ----------------------------------- | | POST | `/api/cloud/auth` | Bekræft en Bearer-nøgle, og returner maskerede udbyderforbindelser + modelaliasser til cloudsynkroniseringsklienter | | POST | `/api/cloud/credentials/update` | Opdater krypterede legitimationsoplysninger for en cloudsynkroniseret udbyder | | POST | `/api/cloud/model/resolve` | Omsæt et logisk model-id til en konkret udbyder/model ved hjælp af den lokale routingtabel | | GET | `/api/cloud/models/alias` | Vis modelaliasser, som de eksponeres for cloudsynkronisering | | GET | `/api/assess` | Læs de seneste vurderingskategoriseringer (pr. udbyder/model) | | POST | `/api/assess` | Kør en vurdering — body: `{scope: {type:"all"} | {type:"provider", providerId} | {type:"model", modelId}, trigger?}` | | GET | `/api/evals` | Vis indbyggede evalueringspakker + de seneste kørsler | | POST | `/api/evals` | Start en evalueringskørsel | | POST | `/api/evals/suites` | Opret en brugerdefineret evalueringspakke — body valideres af `evalSuiteSaveSchema` | | GET | `/api/evals/suites/[id]` | Hent en brugerdefineret evalueringspakke | **Godkendelse:** `/api/cloud/auth` validerer en Bearer-nøgle direkte; de øvrige ruter under `/api/cloud/*`, `/api/evals/*` og `/api/assess` kræver en administrationssession/API-nøgle. POST til `/api/assess` bruger `validateBody` med et diskrimineret union-scope-skema. --- ## Administration af ACP (Agent Client Protocol) som underprocesser. Disse endpoints administrerer registrering af ACP-agenter og registrering af brugerdefinerede agenter. | Metode | Sti | Beskrivelse | | ------ | ----------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | GET | `/api/acp/agents` | Vis alle kendte CLI-agenter (indbyggede + brugerdefinerede) med installationsstatus, version og binær fil | | POST | `/api/acp/agents` | Registrer en brugerdefineret ACP-agent, eller opdater cachen — body: `{id, name, binary, versionCommand, providerAlias, spawnArgs, protocol}` eller `{action: "refresh"}` | | DELETE | `/api/acp/agents` | Fjern en brugerdefineret ACP-agent — query-parameter: `?id=` | **Eksempel på svar** (`GET /api/acp/agents`): ```json { "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 } ``` **Godkendelse:** Kræver en administrationssession (`auth_token`-cookie til dashboardet) eller en API-nøgle med administrationsomfang. Se [ACP Framework](../frameworks/ACP.md) for alle detaljer. --- ## Analyse og observerbarhed Analyseendpoints i realtid til overvågning af routing, komprimering og diversitet blandt udbydere. Disse driver siderne under `/dashboard/analytics/*`. ### Analyse af automatisk routing | Metode | Sti | Beskrivelse | | ------ | ------------------------------------ | ------------------------------------------------------------------------------------------------------------------- | | GET | `/api/analytics/auto-routing` | Aggregerede statistikker for automatisk routing: samlet antal kald, strategifordeling, niveaufordeling, topudbydere | | GET | `/api/analytics/auto-routing?days=7` | Statistik for et tidsvindue (standard er 24 timer) | **Eksempel på svar**: ```json { "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 } ] } ``` ### Komprimeringsanalyse | Metode | Sti | Beskrivelse | | ------ | ---------------------------- | ------------------------------------------------------------------------------------------------------- | | GET | `/api/analytics/compression` | Aggregerede komprimeringsstatistikker: sparede tokens, besparelse i %, tilstandsfordeling, motorforbrug | **Eksempel på svar**: ```json { "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 } } ``` ### Sporing af udbyderdiversitet | Metode | Sti | Beskrivelse | | ------ | -------------------------- | --------------------------------------------------------------------------------------------------------------------- | | GET | `/api/analytics/diversity` | Diversitetssporing baseret på Shannon-entropi: forhindrer enkelte fejlpunkter ved at måle spredningen blandt udbydere | **Eksempel på svar**: ```json { "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"] } ``` **Godkendelse:** Kræver en administrationssession eller en API-nøgle med administrationsomfang. --- ## Administratorhandlinger Endpoints kun for administratorer til driftsstyring. | Metode | Sti | Beskrivelse | | ------ | ------------------------ | --------------------------------------------------------------------------------------------- | | GET | `/api/admin/concurrency` | Læs aktuelle samtidighedsgrænser (globale + pr. udbyder) | | POST | `/api/admin/concurrency` | Opdater samtidighedsgrænser — body: `{global?: number, perProvider?: Record}` | **Godkendelse:** Kræver en administrationssession med administratoromfang. --- ## Administration af CLI-værktøjer Administrer CLI-værktøjer, der integreres med OmniRoute (antigravity, chipotle, commandCode, devin-cli osv.). Se [Udbyderreference](./PROVIDER_REFERENCE.md) for den fulde liste. | Metode | Sti | Beskrivelse | | ------ | --------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | GET | `/api/cli-tools/all-statuses` | Status for alle CLI-værktøjer (installeret, version, senest set) | | GET | `/api/cli-tools/status` | Detaljeret status for ét CLI-værktøj (`?tool=`-forespørgsel) | | POST | `/api/cli-tools/apply` | Skriv et værktøjs genererede konfiguration (`dryRun` viser en forhåndsvisning; `422` + `containerEphemeralTarget` ved containerkørsel; `migration` angiver ældre Codex YAML) | | GET | `/api/cli-tools/backups` | Vis sikkerhedskopier af CLI-værktøjskonfigurationer | | POST | `/api/cli-tools/backups` | Opret en sikkerhedskopi af alle CLI-værktøjskonfigurationer | | POST | `/api/cli-tools/backups` | Gendan: Det samme endpoint med `{tool, backupId}` i body gendanner den pågældende sikkerhedskopi | | GET | `/api/cli-tools/antigravity-mitm` | Status for Antigravity MITM-proxyen (CLI-værktøjet "antigravity-mitm") | | POST | `/api/cli-tools/antigravity-mitm/alias` | Konfigurer antigravity-mitm-aliasser | **Godkendelse:** Kræver en administrationssession. --- ## Agentfærdigheder Administrer AI-agentfærdigheder (svarende til OpenAI's brugerdefinerede GPT'er, men til agenter). | Metode | Sti | Beskrivelse | | ------ | ---------------------------- | --------------------------------------------------------------------------------------------------- | | GET | `/api/agent-skills` | Vis alle agentfærdigheder (indbyggede + brugerdefinerede) | | GET | `/api/agent-skills/[id]` | Hent en specifik agentfærdighed | | POST | `/api/agent-skills` | Opret en brugerdefineret agentfærdighed — body: `{name, description, prompt, model?, temperature?}` | | PUT | `/api/agent-skills/[id]` | Opdater en brugerdefineret agentfærdighed | | DELETE | `/api/agent-skills/[id]` | Slet en brugerdefineret agentfærdighed | | GET | `/api/agent-skills/[id]/raw` | Hent rå prompt + metadata (ingen udførelse) | | POST | `/api/agent-skills/generate` | Generer en ny færdighed med AI ud fra en beskrivelse i naturligt sprog | **Godkendelse:** Kræver en administrationssession eller en API-nøgle med administrationsomfang. --- ## Cacheadministration Administrer den semantiske cache og ræsonneringscachen. | Metode | Sti | Beskrivelse | | ------ | ---------------------- | ---------------------------------------------------------------------------------------------------------------- | | GET | `/api/cache` | Cacheoversigt: samlet antal poster, hitrate, størrelse på disk | | GET | `/api/cache/entries` | Vis cachelagrede poster (med paginering) | | DELETE | `/api/cache/entries` | Slet cacheposter (filtrer efter forespørgselsparametre) | | GET | `/api/cache/stats` | Detaljeret cachestatistik (pr. udbyder, pr. model) | | GET | `/api/cache/reasoning` | Status for ræsonneringscache (til genafspilning af ræsonnering) | | DELETE | `/api/cache/reasoning` | Ryd ræsonneringscachen — forespørgselsparametre: `?toolCallId=` (enkelt), `?provider=

` eller ingen (alle) | **Godkendelse:** Kræver en administrationssession. --- ## Hukommelsessystem Administrer vedvarende hukommelse (FTS5 + vektorindlejringer). | Metode | Sti | Beskrivelse | | ------ | ------------------ | ---------------------------------------------------------------------------- | | GET | `/api/memory` | Vis hukommelsesposter (filtrer efter omfang, type og søgeforespørgsel) | | POST | `/api/memory` | Opret en ny hukommelsespost — brødtekst: `{scope, type, content, metadata?}` | | GET | `/api/memory/[id]` | Hent en bestemt hukommelsespost | | PUT | `/api/memory/[id]` | Opdater en hukommelsespost | | DELETE | `/api/memory/[id]` | Slet en hukommelsespost | | GET | `/api/memory?q=` | Søg i hukommelsen (FTS5 + vektor) — statistik er inkluderet i det samme svar | **Godkendelse:** Kræver en administrationssession eller en API-nøgle med administrationsomfang. --- ## Webhooks Administrer webhook-abonnementer på hændelser. | Metode | Sti | Beskrivelse | | ------ | ------------------------------- | ----------------------------------------------------------------------------- | | GET | `/api/webhooks` | Vis alle webhook-abonnementer | | POST | `/api/webhooks` | Opret et webhook-abonnement — brødtekst: `{url, events[], secret?, active?}` | | GET | `/api/webhooks/[id]` | Hent et bestemt webhook-abonnement | | PUT | `/api/webhooks/[id]` | Opdater et webhook-abonnement | | DELETE | `/api/webhooks/[id]` | Slet et webhook-abonnement | | GET | `/api/webhooks/[id]/deliveries` | Vis leveringshistorikken for en webhook (log over vellykkede/mislykkede kald) | | POST | `/api/webhooks/[id]/test` | Send en testhændelse til en webhook | **Godkendelse:** Kræver en administrationssession. Se [Webhook-framework](../frameworks/WEBHOOKS.md) for en komplet oversigt over hændelsestyper. --- ## Færdighedsframework Administrer færdigheder (frameworket til agentbaserede udvidelser). | Metode | Sti | Beskrivelse | | ------ | ------------------------ | -------------------------------------------------------------------------------------------------- | | GET | `/api/skills` | Vis alle installerede færdigheder (indbyggede + brugerdefinerede) | | POST | `/api/skills/install` | Installer en færdighed fra en lokal sti eller URL | | DELETE | `/api/skills/[id]` | Afinstaller en færdighed | | PUT | `/api/skills/[id]` | Aktivér eller deaktiver en færdighed — body: `{enabled?: boolean, mode?: "on" \| "off" \| "auto"}` | | POST | `/api/skills/executions` | Kør en færdighed — body: `{skillName, apiKeyId, input?, sessionId?}` | | GET | `/api/skills/executions` | Vis kørselshistorik for alle færdigheder (filtrer efter `?apiKeyId=`) | **Godkendelse:** Kræver en administrationssession eller en API-nøgle med administrationsrettigheder. Se [Færdighedsframework](../frameworks/SKILLS.md) for alle detaljer. --- ## Plugins Administrer OmniRoute-plugins (tredjepartsudvidelser). | Metode | Sti | Beskrivelse | | ------ | ---------------------------------- | -------------------------------------- | | GET | `/api/plugins` | Vis installerede plugins | | POST | `/api/plugins/marketplace/install` | Installer et plugin fra markedspladsen | | DELETE | `/api/plugins/[name]` | Afinstaller et plugin | | POST | `/api/plugins/[name]/activate` | Aktivér et plugin | | POST | `/api/plugins/[name]/deactivate` | Deaktivér et plugin | | GET | `/api/plugins/[name]/config` | Hent plugin-konfigurationen | | PUT | `/api/plugins/[name]/config` | Opdater plugin-konfigurationen | **Godkendelse:** Kræver en administrationssession. Se [Pluginframework](../frameworks/PLUGIN_SDK.md) for alle detaljer. --- ## Skyggerouting Skygge-/A-B-sammenligning af udbydere er **ikke en selvstændig REST-grænseflade** — den konfigureres via kombinationsrouting (se [Automatisk kombination](../routing/AUTO-COMBO.md)). Sammenligningsmålinger pr. kombination leveres af `GET /api/combos/metrics`. --- ## Sikkerhedskontroller Inspicer sikkerhedskontrollerne under kørsel (registrering af personhenførbare oplysninger, registrering af prompt-injektion og billedbrokobling). Sikkerhedskontrollerne køres ved hver anmodning; fravalg for individuelle kald sker via anmodningsheaderen `x-omniroute-disabled-guardrails` — der findes ingen vedvarende grænseflade til aktivering/deaktivering. | Metode | Sti | Beskrivelse | | ------ | ---------------------- | ----------------------------------------------------------------------------------------------------- | | GET | `/api/guardrails` | Vis de registrerede sikkerhedskontroller og deres status (navn / aktiveret / prioritet) | | POST | `/api/guardrails/test` | Udfør en prøvekørsel af pipelinen før kald på et eksempelinput — body: `{input, disabledGuardrails?}` | **Godkendelse:** Kræver en administrationssession. Se [Sikkerhed > Sikkerhedskontroller](../security/GUARDRAILS.md) for alle detaljer. --- --- ## Godkendelse Se [Godkendelse til administration](../guides/MANAGEMENT-AUTH.md) for de fire legitimationsfamilier (dashboard-session, lokalt CLI-token, `oma_live_…`-adgangstoken, API-nøgle med administrationsomfang), og hvordan de adskiller sig fra inferensnøgler. - Dashboard-ruter (`/dashboard/*`) bruger `auth_token`-cookien - Login bruger den gemte adgangskodehash med fallback til `INITIAL_PASSWORD` - `requireLogin` kan slås til eller fra via `/api/settings/require-login` - `/v1/*`-ruter kræver valgfrit en Bearer-API-nøgle, når `REQUIRE_API_KEY=true` - "administrationstoken" / "API-nøgle med administrationsomfang" i denne reference betyder en af familierne i den pågældende vejledning — ikke en udefineret ekstra hemmelighedstype > **Inkompatibel ændring (v3.8.0)** — `/api/v1/agents/tasks/*` og administrationsendepunkterne for nedkølingsperioder kræver nu **administrationsgodkendelse** (dashboardets `auth_token`-cookie eller en API-nøgle med administrationsomfang). Klienter, der tidligere kaldte disse ruter uden godkendelse, modtager `401 Unauthorized`. Se commit `588a0333` (`fix(auth): require management auth for agent and cooldown APIs`).