🌐 Languages: 🇺🇸 English | 🇧🇷 Português (Brasil) | 🇪🇸 Español | 🇫🇷 Français | 🇮🇹 Italiano | 🇷🇺 Русский | 🇨🇳 中文 (简体) | 🇩🇪 Deutsch | 🇮🇳 हिन्दी | 🇹🇭 ไทย | 🇺🇦 Українська | 🇸🇦 العربية | 🇯🇵 日本語 | 🇻🇳 Tiếng Việt | 🇧🇬 Български | 🇩🇰 Dansk | 🇫🇮 Suomi | 🇮🇱 עברית | 🇭🇺 Magyar | 🇮🇩 Bahasa Indonesia | 🇰🇷 한국어 | 🇲🇾 Bahasa Melayu | 🇳🇱 Nederlands | 🇳🇴 Norsk | 🇵🇹 Português (Portugal) | 🇷🇴 Română | 🇵🇱 Polski | 🇸🇰 Slovenčina | 🇸🇪 Svenska | 🇵🇭 Filipino
Senast uppdaterad: 2026-02-18
OmniRoute är en lokal AI-routinggateway och instrumentpanel byggd på Next.js.
Den tillhandahåller en enda OpenAI-kompatibel slutpunkt (/v1/*) och dirigerar trafik över flera uppströmsleverantörer med översättning, reserv, tokenuppdatering och användningsspårning.
Kärnfunktioner:
- OpenAI-kompatibel API-yta för CLI/verktyg (28 leverantörer)
- Begäran/svar översättning över leverantörsformat
- Modellkombination fallback (flermodellsekvens)
- Reservkonto på kontonivå (flera konto per leverantör)
- Anslutningshantering för OAuth + API-nyckelleverantör
- Inbäddningsgenerering via
/v1/embeddings(6 leverantörer, 9 modeller) - Bildgenerering via
/v1/images/generations(4 leverantörer, 9 modeller) - Tänk taggparsning (
<think>...</think>) för resonemangsmodeller - Svarssanering för strikt OpenAI SDK-kompatibilitet
- Rollnormalisering (utvecklare→system, system→användare) för kompatibilitet mellan olika leverantörer
- Strukturerad utdatakonvertering (json_schema → Gemini responseSchema)
- Lokal beständighet för leverantörer, nycklar, alias, kombinationer, inställningar, prissättning
- Användnings-/kostnadsspårning och förfrågningsloggning
- Valfri molnsynkronisering för synkronisering av flera enheter/tillstånd
- IP-godkännandelista/blockeringslista för API-åtkomstkontroll
- Tänkande budgethantering (genomföring/auto/custom/adaptiv)
- Global systeminjektion
- Sessionsspårning och fingeravtryck
- Förbättrad prisbegränsning per konto med leverantörsspecifika profiler
- Strömbrytarmönster för leverantörens motståndskraft
- Åskskyddande flockskydd med mutex-låsning
- Signaturbaserad cache för begärandeduplicering
- Domänlager: modelltillgänglighet, kostnadsregler, reservpolicy, lockoutpolicy
- Beständig domäntillstånd (SQLite-genomskrivningscache för reservdelar, budgetar, lockouter, strömbrytare)
- Policymotor för centraliserad förfrågningsutvärdering (lockout → budget → reserv)
- Begär telemetri med p50/p95/p99 latensaggregation
- Korrelations-ID (X-Request-Id) för spårning från början till slut
- Loggning av efterlevnadsrevision med opt-out per API-nyckel
- Utvärderingsramverk för LLM kvalitetssäkring
- Resilience UI-instrumentpanel med strömbrytarstatus i realtid
- Modulära OAuth-leverantörer (12 individuella moduler under
src/lib/oauth/providers/)
Primär körtidsmodell:
- Next.js-apprutter under
src/app/api/*implementerar både instrumentpanelens API:er och kompatibilitets-API:er - En delad SSE/routingkärna i
src/sse/*+open-sse/*hanterar leverantörsexekvering, översättning, streaming, reserv och användning
- Lokal gateway körtid
- Dashboard management API:er
- Leverantörsautentisering och tokenuppdatering
- Begär översättning och SSE-streaming
- Lokal stat + användningsbeständighet
- Valfri molnsynkroniseringsorkestrering
- Implementering av molntjänster bakom
NEXT_PUBLIC_CLOUD_URL - Leverantör SLA/kontrollplan utanför lokal process
- Externa CLI-binärer själva (Claude CLI, Codex CLI, etc.)
flowchart LR
subgraph Clients[Developer Clients]
C1[Claude Code]
C2[Codex CLI]
C3[OpenClaw / Droid / Cline / Continue / Roo]
C4[Custom OpenAI-compatible clients]
BROWSER[Browser Dashboard]
end
subgraph Router[OmniRoute Local Process]
API[V1 Compatibility API\n/v1/*]
DASH[Dashboard + Management API\n/api/*]
CORE[SSE + Translation Core\nopen-sse + src/sse]
DB[(db.json)]
UDB[(usage.json + log.txt)]
end
subgraph Upstreams[Upstream Providers]
P1[OAuth Providers\nClaude/Codex/Gemini/Qwen/iFlow/GitHub/Kiro/Cursor/Antigravity]
P2[API Key Providers\nOpenAI/Anthropic/OpenRouter/GLM/Kimi/MiniMax\nDeepSeek/Groq/xAI/Mistral/Perplexity\nTogether/Fireworks/Cerebras/Cohere/NVIDIA]
P3[Compatible Nodes\nOpenAI-compatible / Anthropic-compatible]
end
subgraph Cloud[Optional Cloud Sync]
CLOUD[Cloud Sync Endpoint\nNEXT_PUBLIC_CLOUD_URL]
end
C1 --> API
C2 --> API
C3 --> API
C4 --> API
BROWSER --> DASH
API --> CORE
DASH --> DB
CORE --> DB
CORE --> UDB
CORE --> P1
CORE --> P2
CORE --> P3
DASH --> CLOUD
Huvudkataloger:
src/app/api/v1/*ochsrc/app/api/v1beta/*för kompatibilitets-API:ersrc/app/api/*för hanterings-/konfigurations-API:er- Nästa omskrivning i
next.config.mjskartan/v1/*till/api/v1/*
Viktiga kompatibilitetsvägar:
src/app/api/v1/chat/completions/route.tssrc/app/api/v1/messages/route.tssrc/app/api/v1/responses/route.tssrc/app/api/v1/models/route.ts— inkluderar anpassade modeller medcustom: truesrc/app/api/v1/embeddings/route.ts— inbäddningsgenerering (6 leverantörer)src/app/api/v1/images/generations/route.ts— bildgenerering (4+ leverantörer inkl. Antigravity/Nebius)src/app/api/v1/messages/count_tokens/route.tssrc/app/api/v1/providers/[provider]/chat/completions/route.ts— dedikerad chatt per leverantörsrc/app/api/v1/providers/[provider]/embeddings/route.ts— dedikerade inbäddningar per leverantörsrc/app/api/v1/providers/[provider]/images/generations/route.ts— dedikerade bilder per leverantörsrc/app/api/v1beta/models/route.tssrc/app/api/v1beta/models/[...path]/route.ts
Hanteringsdomäner:
- Auth/inställningar:
src/app/api/auth/*,src/app/api/settings/* - Leverantörer/anslutningar:
src/app/api/providers* - Leverantörsnoder:
src/app/api/provider-nodes* - Anpassade modeller:
src/app/api/provider-models(GET/POST/DELETE) - Modellkatalog:
src/app/api/models/catalog(GET) - Proxykonfiguration:
src/app/api/settings/proxy(GET/PUT/DELETE) +src/app/api/settings/proxy/test(POST) - OAuth:
src/app/api/oauth/* - Nycklar/alias/kombinationer/prissättning:
src/app/api/keys*,src/app/api/models/alias,src/app/api/combos*,src/app/api/pricing - Användning:
src/app/api/usage/* - Synkronisera/moln:
src/app/api/sync/*,src/app/api/cloud/* - CLI-verktygshjälpare:
src/app/api/cli-tools/* - IP-filter:
src/app/api/settings/ip-filter(GET/PUT) - Tänkande budget:
src/app/api/settings/thinking-budget(GET/PUT) - Systemprompt:
src/app/api/settings/system-prompt(GET/PUT) - Sessioner:
src/app/api/sessions(GET) - Prisgränser:
src/app/api/rate-limits(GET) - Motståndskraft:
src/app/api/resilience(GET/PATCH) — leverantörsprofiler, strömbrytare, hastighetsgränstillstånd - Återställning av motståndskraft:
src/app/api/resilience/reset(POST) — återställ brytare + nedkylningar - Cachestatistik:
src/app/api/cache/stats(GET/DELETE) - Modelltillgänglighet:
src/app/api/models/availability(GET/POST) - Telemetri:
src/app/api/telemetry/summary(GET) - Budget:
src/app/api/usage/budget(GET/POST) - Reservkedjor:
src/app/api/fallback/chains(GET/POST/DELETE) - Efterlevnadsrevision:
src/app/api/compliance/audit-log(GET) - Evaler:
src/app/api/evals(GET/POST),src/app/api/evals/[suiteId](GET) - Policyer:
src/app/api/policies(GET/POST)
Huvudflödesmoduler:
- Inträde:
src/sse/handlers/chat.ts - Kärnorkestrering:
open-sse/handlers/chatCore.ts - Leverantörs exekveringsadaptrar:
open-sse/executors/* - Formatidentifiering/leverantörskonfiguration:
open-sse/services/provider.ts - Modellanalys/upplösning:
src/sse/services/model.ts,open-sse/services/model.ts - Reservlogik för konto:
open-sse/services/accountFallback.ts - Översättningsregister:
open-sse/translator/index.ts - Strömomvandlingar:
open-sse/utils/stream.ts,open-sse/utils/streamHandler.ts - Användningsextraktion/normalisering:
open-sse/utils/usageTracking.ts - Tänk taggtolkare:
open-sse/utils/thinkTagParser.ts - Inbäddningshanterare:
open-sse/handlers/embeddings.ts - Inbäddningsleverantörsregister:
open-sse/config/embeddingRegistry.ts - Hanterare för bildgenerering:
open-sse/handlers/imageGeneration.ts - Bildleverantörsregister:
open-sse/config/imageRegistry.ts - Svarssanering:
open-sse/handlers/responseSanitizer.ts - Rollnormalisering:
open-sse/services/roleNormalizer.ts
Tjänster (affärslogik):
- Val av konto/poäng:
open-sse/services/accountSelector.ts - Kontextlivscykelhantering:
open-sse/services/contextManager.ts - IP-filtertillämpning:
open-sse/services/ipFilter.ts - Sessionsspårning:
open-sse/services/sessionManager.ts - Begär deduplicering:
open-sse/services/signatureCache.ts - Systemprompt injektion:
open-sse/services/systemPrompt.ts - Tänkande budgethantering:
open-sse/services/thinkingBudget.ts - Jokertecken modell routing:
open-sse/services/wildcardRouter.ts - Hantering av prisgränser:
open-sse/services/rateLimitManager.ts - Strömbrytare:
open-sse/services/circuitBreaker.ts
Domänlagermoduler:
- Modelltillgänglighet:
src/lib/domain/modelAvailability.ts - Kostnadsregler/budgetar:
src/lib/domain/costRules.ts - Reservpolicy:
src/lib/domain/fallbackPolicy.ts - Kombinationslösare:
src/lib/domain/comboResolver.ts - Lockoutpolicy:
src/lib/domain/lockoutPolicy.ts - Policymotor:
src/domain/policyEngine.ts— centraliserad lockout → budget → reservutvärdering - Felkodskatalog:
src/lib/domain/errorCodes.ts - Begärans ID:
src/lib/domain/requestId.ts - Timeout för hämtning:
src/lib/domain/fetchTimeout.ts - Begär telemetri:
src/lib/domain/requestTelemetry.ts - Efterlevnad/revision:
src/lib/domain/compliance/index.ts - Eval löpare:
src/lib/domain/evalRunner.ts - Beständig domäntillstånd:
src/lib/db/domainState.ts— SQLite CRUD för reservkedjor, budgetar, kostnadshistorik, lockout-tillstånd, strömbrytare
OAuth-leverantörsmoduler (12 enskilda filer under src/lib/oauth/providers/):
- Registerindex:
src/lib/oauth/providers/index.ts - Individuella leverantörer:
claude.ts,codex.ts,gemini.ts,antigravity.ts,iflow.ts,qwen.ts, *119, _119,kiro.ts,cursor.ts,kilocode.ts,cline.ts - Tunt omslag:
src/lib/oauth/providers.ts— återexport från enskilda moduler
Primärt tillstånd DB:
src/lib/localDb.ts- fil:
${DATA_DIR}/db.json(eller$XDG_CONFIG_HOME/omniroute/db.jsonnär inställd, annars~/.omniroute/db.json) - enheter: providerConnections, providerNodes, modelAlias, combos, apiKeys, settings, prissättning, customModels, proxyConfig, ipFilter, thinkingBudget, systemPrompt
Användnings-DB:
src/lib/usageDb.ts- filer:
${DATA_DIR}/usage.json,${DATA_DIR}/log.txt,${DATA_DIR}/call_logs/ - följer samma baskatalogpolicy som
localDb(DATA_DIR, sedanXDG_CONFIG_HOME/omniroutenär inställd) - uppdelad i fokuserade undermoduler:
migrations.ts,usageHistory.ts,costCalculator.ts,usageStats.ts,callLogs.ts
Domain State DB (SQLite):
src/lib/db/domainState.ts— CRUD-operationer för domäntillstånd- Tabeller (skapade i
src/lib/db/core.ts):domain_fallback_chains,domain_budgets,domain_cost_history,domain_lockout_state,domain_circuit_breakers - Genomskrivningscachemönster: i minneskartor är auktoritativa under körning; mutationer skrivs synkront till SQLite; tillståndet återställs från DB vid kallstart
- Dashboard-cookieauth:
src/proxy.ts,src/app/api/auth/login/route.ts - Generering/verifiering av API-nyckel:
src/shared/utils/apiKey.ts - Leverantörshemligheter kvarstod i
providerConnections-poster - Utgående proxystöd via
open-sse/utils/proxyFetch.ts(env vars) ochopen-sse/utils/networkProxy.ts(konfigurerbart per leverantör eller globalt)
- Schemaläggare init:
src/lib/initCloudSync.ts,src/shared/services/initializeCloudSync.ts - Periodisk uppgift:
src/shared/services/cloudSyncScheduler.ts - Kontrollrutt:
src/app/api/sync/cloud/route.ts
sequenceDiagram
autonumber
participant Client as CLI/SDK Client
participant Route as /api/v1/chat/completions
participant Chat as src/sse/handlers/chat
participant Core as open-sse/handlers/chatCore
participant Model as Model Resolver
participant Auth as Credential Selector
participant Exec as Provider Executor
participant Prov as Upstream Provider
participant Stream as Stream Translator
participant Usage as usageDb
Client->>Route: POST /v1/chat/completions
Route->>Chat: handleChat(request)
Chat->>Model: parse/resolve model or combo
alt Combo model
Chat->>Chat: iterate combo models (handleComboChat)
end
Chat->>Auth: getProviderCredentials(provider)
Auth-->>Chat: active account + tokens/api key
Chat->>Core: handleChatCore(body, modelInfo, credentials)
Core->>Core: detect source format
Core->>Core: translate request to target format
Core->>Exec: execute(provider, transformedBody)
Exec->>Prov: upstream API call
Prov-->>Exec: SSE/JSON response
Exec-->>Core: response + metadata
alt 401/403
Core->>Exec: refreshCredentials()
Exec-->>Core: updated tokens
Core->>Exec: retry request
end
Core->>Stream: translate/normalize stream to client format
Stream-->>Client: SSE chunks / JSON response
Stream->>Usage: extract usage + persist history/log
flowchart TD
A[Incoming model string] --> B{Is combo name?}
B -- Yes --> C[Load combo models sequence]
B -- No --> D[Single model path]
C --> E[Try model N]
E --> F[Resolve provider/model]
D --> F
F --> G[Select account credentials]
G --> H{Credentials available?}
H -- No --> I[Return provider unavailable]
H -- Yes --> J[Execute request]
J --> K{Success?}
K -- Yes --> L[Return response]
K -- No --> M{Fallback-eligible error?}
M -- No --> N[Return error]
M -- Yes --> O[Mark account unavailable cooldown]
O --> P{Another account for provider?}
P -- Yes --> G
P -- No --> Q{In combo with next model?}
Q -- Yes --> E
Q -- No --> R[Return all unavailable]
Reservbeslut drivs av open-sse/services/accountFallback.ts med hjälp av statuskoder och felmeddelandeheuristik.
sequenceDiagram
autonumber
participant UI as Dashboard UI
participant OAuth as /api/oauth/[provider]/[action]
participant ProvAuth as Provider Auth Server
participant DB as localDb
participant Test as /api/providers/[id]/test
participant Exec as Provider Executor
UI->>OAuth: GET authorize or device-code
OAuth->>ProvAuth: create auth/device flow
ProvAuth-->>OAuth: auth URL or device code payload
OAuth-->>UI: flow data
UI->>OAuth: POST exchange or poll
OAuth->>ProvAuth: token exchange/poll
ProvAuth-->>OAuth: access/refresh tokens
OAuth->>DB: createProviderConnection(oauth data)
OAuth-->>UI: success + connection id
UI->>Test: POST /api/providers/[id]/test
Test->>Exec: validate credentials / optional refresh
Exec-->>Test: valid or refreshed token info
Test->>DB: update status/tokens/errors
Test-->>UI: validation result
Uppdatering under livetrafik utförs inuti open-sse/handlers/chatCore.ts via executorn refreshCredentials().
sequenceDiagram
autonumber
participant UI as Endpoint Page UI
participant Sync as /api/sync/cloud
participant DB as localDb
participant Cloud as External Cloud Sync
participant Claude as ~/.claude/settings.json
UI->>Sync: POST action=enable
Sync->>DB: set cloudEnabled=true
Sync->>DB: ensure API key exists
Sync->>Cloud: POST /sync/{machineId} (providers/aliases/combos/keys)
Cloud-->>Sync: sync result
Sync->>Cloud: GET /{machineId}/v1/verify
Sync-->>UI: enabled + verification status
UI->>Sync: POST action=sync
Sync->>Cloud: POST /sync/{machineId}
Cloud-->>Sync: remote data
Sync->>DB: update newer local tokens/status
Sync-->>UI: synced
UI->>Sync: POST action=disable
Sync->>DB: set cloudEnabled=false
Sync->>Cloud: DELETE /sync/{machineId}
Sync->>Claude: switch ANTHROPIC_BASE_URL back to local (if needed)
Sync-->>UI: disabled
Periodisk synkronisering utlöses av CloudSyncScheduler när molnet är aktiverat.
erDiagram
SETTINGS ||--o{ PROVIDER_CONNECTION : controls
PROVIDER_NODE ||--o{ PROVIDER_CONNECTION : backs_compatible_provider
PROVIDER_CONNECTION ||--o{ USAGE_ENTRY : emits_usage
SETTINGS {
boolean cloudEnabled
number stickyRoundRobinLimit
boolean requireLogin
string password_hash
string fallbackStrategy
json rateLimitDefaults
json providerProfiles
}
PROVIDER_CONNECTION {
string id
string provider
string authType
string name
number priority
boolean isActive
string apiKey
string accessToken
string refreshToken
string expiresAt
string testStatus
string lastError
string rateLimitedUntil
json providerSpecificData
}
PROVIDER_NODE {
string id
string type
string name
string prefix
string apiType
string baseUrl
}
MODEL_ALIAS {
string alias
string targetModel
}
COMBO {
string id
string name
string[] models
}
API_KEY {
string id
string name
string key
string machineId
}
USAGE_ENTRY {
string provider
string model
number prompt_tokens
number completion_tokens
string connectionId
string timestamp
}
CUSTOM_MODEL {
string id
string name
string providerId
}
PROXY_CONFIG {
string global
json providers
}
IP_FILTER {
string mode
string[] allowlist
string[] blocklist
}
THINKING_BUDGET {
string mode
number customBudget
string effortLevel
}
SYSTEM_PROMPT {
boolean enabled
string prompt
string position
}
Fysiska lagringsfiler:
- huvudtillstånd:
${DATA_DIR}/db.json(eller$XDG_CONFIG_HOME/omniroute/db.jsonnär inställt, annars~/.omniroute/db.json) - användningsstatistik:
${DATA_DIR}/usage.json - begär loggrader:
${DATA_DIR}/log.txt - valfria översättare/begäran felsökningssessioner:
<repo>/logs/...
flowchart LR
subgraph LocalHost[Developer Host]
CLI[CLI Tools]
Browser[Dashboard Browser]
end
subgraph ContainerOrProcess[OmniRoute Runtime]
Next[Next.js Server\nPORT=20128]
Core[SSE Core + Executors]
MainDB[(db.json)]
UsageDB[(usage.json/log.txt)]
end
subgraph External[External Services]
Providers[AI Providers]
SyncCloud[Cloud Sync Service]
end
CLI --> Next
Browser --> Next
Next --> Core
Next --> MainDB
Core --> MainDB
Core --> UsageDB
Core --> Providers
Next --> SyncCloud
src/app/api/v1/*,src/app/api/v1beta/*: kompatibilitets-API:ersrc/app/api/v1/providers/[provider]/*: dedikerade rutter per leverantör (chatt, inbäddningar, bilder)src/app/api/providers*: leverantör CRUD, validering, testningsrc/app/api/provider-nodes*: anpassad kompatibel nodhanteringsrc/app/api/provider-models: anpassad modellhantering (CRUD)src/app/api/models/catalog: fullständig modellkatalog API (alla typer grupperade efter leverantör)src/app/api/oauth/*: OAuth/enhetskod flödensrc/app/api/keys*: lokal API-nyckellivscykelsrc/app/api/models/alias: aliashanteringsrc/app/api/combos*: reservkombohanteringsrc/app/api/pricing: åsidosättande av prissättning för kostnadsberäkningsrc/app/api/settings/proxy: proxykonfiguration (GET/PUT/DELETE)src/app/api/settings/proxy/test: test av utgående proxyanslutning (POST)src/app/api/usage/*: API:er för användning och loggarsrc/app/api/sync/*+src/app/api/cloud/*: molnsynkronisering och molnvända hjälparesrc/app/api/cli-tools/*: lokala CLI-konfigurationsförfattare/checkerssrc/app/api/settings/ip-filter: IP-godkännandelista/blockeringslista (GET/PUT)src/app/api/settings/thinking-budget: budgetkonfig för tänkande token (GET/PUT)src/app/api/settings/system-prompt: global systemprompt (GET/PUT)src/app/api/sessions: aktiv sessionslista (GET)src/app/api/rate-limits: räntegränsstatus per konto (GET)
src/sse/handlers/chat.ts: begäran om analys, kombinationshantering, kontovalsloopopen-sse/handlers/chatCore.ts: översättning, exekutorutskick, försök igen/uppdatera hantering, strömkonfigurationopen-sse/executors/*: leverantörsspecifikt nätverk och formatbeteende
open-sse/translator/index.ts: översättarregister och orkestrering- Begär översättare:
open-sse/translator/request/* - Svarsöversättare:
open-sse/translator/response/* - Formatkonstanter:
open-sse/translator/formats.ts
src/lib/localDb.ts: beständig konfiguration/tillståndsrc/lib/usageDb.ts: användningshistorik och rullande förfrågningsloggar
Varje leverantör har en specialiserad exekutor som utökar BaseExecutor (i open-sse/executors/base.ts), som tillhandahåller URL-byggande, rubrikkonstruktion, återförsök med exponentiell backoff, autentiseringsuppdateringskrokar och execute() orkestreringsmetoden.
| Exekutor | Leverantör(er) | Specialhantering |
|---|---|---|
DefaultExecutor |
OpenAI, Claude, Gemini, Qwen, iFlow, OpenRouter, GLM, Kimi, MiniMax, DeepSeek, Groq, xAI, Mistral, Perplexity, Together, Fireworks, Cerebras, Cohere, NVIDIA | Dynamisk URL/header-konfiguration per leverantör |
AntigravityExecutor |
Google Antigravity | Anpassade projekt-/sessions-ID:n, försök igen-efter analys |
CodexExecutor |
OpenAI Codex | Injicerar systeminstruktioner, tvingar fram resonemang |
CursorExecutor |
Markör IDE | ConnectRPC-protokoll, Protobuf-kodning, begäran om signering via kontrollsumma |
GithubExecutor |
GitHub Copilot | Copilot token uppdatering, VSCode-härmar rubriker |
KiroExecutor |
AWS CodeWhisperer/Kiro | AWS EventStream binärt format → SSE-konvertering |
GeminiCLIExecutor |
Gemini CLI | Uppdateringscykel för Google OAuth-token |
Alla andra leverantörer (inklusive anpassade kompatibla noder) använder DefaultExecutor.
| Leverantör | Format | Auth | Streama | Icke-stream | Token Refresh | Användnings-API |
|---|---|---|---|---|---|---|
| Claude | claude | API-nyckel / OAuth | ✅ | ✅ | ✅ | |
| Tvillingarna | Tvillingarna | API-nyckel / OAuth | ✅ | ✅ | ✅ | |
| Gemini CLI | gemini-cli | OAuth | ✅ | ✅ | ✅ | |
| Antigravitation | antigravitation | OAuth | ✅ | ✅ | ✅ | ✅ Full kvot API |
| OpenAI | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| Codex | openai-svar | OAuth | ✅ tvingad | ❌ | ✅ | ✅ Prisgränser |
| GitHub Copilot | openai | OAuth + Copilot Token | ✅ | ✅ | ✅ | ✅ Kvotbilder |
| Markör | markören | Anpassad kontrollsumma | ✅ | ✅ | ❌ | ❌ |
| Kiro | kiro | AWS SSO OIDC | ✅ (EventStream) | ❌ | ✅ | ✅ Användningsgränser |
| Qwen | openai | OAuth | ✅ | ✅ | ✅ | |
| iFlow | openai | OAuth (Grundläggande) | ✅ | ✅ | ✅ | |
| OpenRouter | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| GLM/Kimi/MiniMax | claude | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| DeepSeek | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| Groq | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| xAI (Grok) | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| Mistral | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| Förvirring | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| Tillsammans AI | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| Fireworks AI | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| Cerebras | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| Sammanhålla | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
| NVIDIA NIM | openai | API-nyckel | ✅ | ✅ | ❌ | ❌ |
Upptäckta källformat inkluderar:
openaiopenai-responsesclaudegemini
Målformat inkluderar:
- OpenAI chatt/svar
- Claude
- Gemini/Gemini-CLI/Antigravity kuvert
- Kiro
- Markör
Översättningar använder OpenAI som navformat — alla konverteringar går via OpenAI som mellanliggande:
Source Format → OpenAI (hub) → Target Format
Översättningar väljs dynamiskt baserat på källnyttolastens form och leverantörens målformat.
Ytterligare bearbetningslager i översättningspipelinen:
- Responssanering — Tar bort icke-standardiserade fält från svar i OpenAI-format (både strömmande och icke-strömmande) för att säkerställa strikt SDK-efterlevnad
- Rollnormalisering — Konverterar
developer→systemför icke-OpenAI-mål; slår sammansystem→userför modeller som avvisar systemrollen (GLM, ERNIE) - Tänk taggextraktion — Parsar
<think>...</think>block från innehåll till fältetreasoning_content - Structured output — Konverterar OpenAI
response_format.json_schematill Gemini'sresponseMimeType+responseSchema
| Slutpunkt | Format | Handlare |
|---|---|---|
POST /v1/chat/completions |
OpenAI Chat | src/sse/handlers/chat.ts |
POST /v1/messages |
Claude Meddelanden | Samma hanterare (automatiskt upptäckt) |
POST /v1/responses |
OpenAI-svar | open-sse/handlers/responsesHandler.ts |
POST /v1/embeddings |
OpenAI Inbäddningar | open-sse/handlers/embeddings.ts |
GET /v1/embeddings |
Modelllista | API-rutt |
POST /v1/images/generations |
OpenAI bilder | open-sse/handlers/imageGeneration.ts |
GET /v1/images/generations |
Modelllista | API-rutt |
POST /v1/providers/{provider}/chat/completions |
OpenAI Chat | Dedikerad per leverantör med modellvalidering |
POST /v1/providers/{provider}/embeddings |
OpenAI Inbäddningar | Dedikerad per leverantör med modellvalidering |
POST /v1/providers/{provider}/images/generations |
OpenAI bilder | Dedikerad per leverantör med modellvalidering |
POST /v1/messages/count_tokens |
Claude Token Count | API-rutt |
GET /v1/models |
OpenAI-modelllista | API-rutt (chatt + inbäddning + bild + anpassade modeller) |
GET /api/models/catalog |
Katalog | Alla modeller grupperade efter leverantör + typ |
POST /v1beta/models/*:streamGenerateContent |
Tvillinginfödd | API-rutt |
GET/PUT/DELETE /api/settings/proxy |
Proxykonfiguration | Nätverksproxykonfiguration |
POST /api/settings/proxy/test |
Proxyanslutning | Proxy hälsa/anslutningstest slutpunkt |
GET/POST/DELETE /api/provider-models |
Anpassade modeller | Anpassad modellhantering per leverantör |
Bypass-hanteraren (open-sse/utils/bypassHandler.ts) fångar upp kända "kastningsförfrågningar" från Claude CLI – uppvärmningsping, titelextraktioner och tokenräkningar – och returnerar ett falskt svar utan att konsumera uppströmsleverantörstokens. Detta utlöses endast när User-Agent innehåller claude-cli.
Begäranloggaren (open-sse/utils/requestLogger.ts) tillhandahåller en 7-stegs felsökningsloggningspipeline, inaktiverad som standard, aktiverad via ENABLE_REQUEST_LOGS=true:
1_req_client.json → 2_req_source.json → 3_req_openai.json → 4_req_target.json
→ 5_res_provider.txt → 6_res_openai.txt → 7_res_client.txt
Filer skrivs till <repo>/logs/<session>/ för varje begäranssession.
- Nedkylning av leverantörskonto på övergående/hastighets-/auth-fel
- reservkonto innan begäran misslyckas
- kombimodell fallback när nuvarande modell/leverantörsväg är uttömd
- Förkontroll och uppdatera med ett nytt försök för uppdateringsbara leverantörer
- 401/403 försök igen efter uppdateringsförsök i kärnvägen
- frånkopplingsmedveten strömkontroller
- översättningsström med end-of-stream-spolning och
[DONE]-hantering - användningsuppskattning fallback när leverantörens användningsmetadata saknas
- Synkroniseringsfel dyker upp men den lokala körtiden fortsätter
- Schemaläggaren har logik som kan försöka igen, men periodisk exekvering anropar för närvarande synkronisering med ett enda försök som standard
- DB-formmigrering/reparation för saknade nycklar
- korrupta JSON-återställningsskydd för localDb och usageDb
Källor för synlighet vid körning:
- konsolloggar från
src/sse/utils/logger.ts - användningsaggregat per begäran i
usage.json - textförfrågan status logga in
log.txt - valfria djupa förfrågningar/översättningsloggar under
logs/närENABLE_REQUEST_LOGS=true - slutpunkter för användning av instrumentpanelen (
/api/usage/*) för användargränssnittsförbrukning
- JWT-hemlighet (
JWT_SECRET) säkrar verifiering/signering av cookies på instrumentpanelen - Initialt reservlösenord (
INITIAL_PASSWORD, standard123456) måste åsidosättas i verkliga distributioner - API-nyckel HMAC-hemlighet (
API_KEY_SECRET) säkrar genererat lokalt API-nyckelformat - Leverantörshemligheter (API-nycklar/tokens) finns kvar i lokal DB och bör skyddas på filsystemnivå
- Slutpunkter för molnsynkronisering är beroende av API-nyckelbehörighet + maskin-id-semantik
Miljövariabler som används aktivt av kod:
- App/auth:
JWT_SECRET,INITIAL_PASSWORD - Lagring:
DATA_DIR - Kompatibelt nodbeteende:
ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE - Valfri åsidosättning av lagringsbas (Linux/macOS när
DATA_DIRinte är inställd):XDG_CONFIG_HOME - Säkerhetshashing:
API_KEY_SECRET,MACHINE_ID_SALT - Loggning:
ENABLE_REQUEST_LOGS - Synkronisera/molnwebbadress:
NEXT_PUBLIC_BASE_URL,NEXT_PUBLIC_CLOUD_URL - Utgående proxy:
HTTP_PROXY,HTTPS_PROXY,ALL_PROXY,NO_PROXYoch varianter med små bokstäver - SOCKS5-funktionsflaggor:
ENABLE_SOCKS5_PROXY,NEXT_PUBLIC_ENABLE_SOCKS5_PROXY - Plattforms-/runtime-hjälpare (inte appspecifik konfiguration):
APPDATA,NODE_ENV,PORT,HOSTNAME
usageDbochlocalDbdelar nu samma baskatalogpolicy (DATA_DIR->XDG_CONFIG_HOME/omniroute->~/.omniroute) med äldre filmigrering./api/v1/route.tsreturnerar en statisk modelllista och är inte den huvudsakliga modellkällan som används av/v1/models.- Request logger skriver fullständiga rubriker/text när den är aktiverad; behandla loggkatalogen som känslig.
- Molnets beteende beror på korrekt
NEXT_PUBLIC_BASE_URLoch molnets slutpunkts tillgänglighet. - Katalogen
open-sse/publiceras som@omniroute/open-ssenpm workspace-paketet. Källkoden importerar den via@omniroute/open-sse/...(löst av Next.jstranspilePackages). Filsökvägar i det här dokumentet använder fortfarande katalognamnetopen-sse/för konsekvens. - Diagram i instrumentpanelen använder Recharts (SVG-baserad) för tillgängliga, interaktiva analysvisualiseringar (stapeldiagram för modellanvändning, leverantörsuppdelningstabeller med framgångsfrekvenser).
- E2E-tester använder dramatiker (
tests/e2e/), körs vianpm run test:e2e. Enhetstester använder Node.js testrunner (tests/unit/), körs vianpm run test:plan3. Källkoden undersrc/är TypeScript (.ts/.tsx); arbetsytanopen-sse/förblir JavaScript (.js). - Inställningssidan är organiserad i 5 flikar: Säkerhet, Routing (6 globala strategier: fill-first, round-robin, p2c, slumpmässig, minst använda, kostnadsoptimerad), Resiliens (redigerbara hastighetsgränser, strömbrytare, policyer), AI (tänkande budget, systemprompt, promptcache), Advanced (proxy).
- Bygg från källa:
npm run build - Bygg Docker-bild:
docker build -t omniroute . - Starta tjänsten och verifiera:
GET /api/settingsGET /api/v1/models- CLI-målbasadressen ska vara
http://<host>:20128/v1närPORT=20128