38 KiB
OmniRoute-arkitektur
đ 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
Sammanfattning
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
Omfattning och grÀnser
I omfattning
- 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
Utanför rÀckvidd
- 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.)
Systemkontext pÄ hög nivÄ
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
Core Runtime Components
1) API och Routing Layer (Next.js App Routes)
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)
2) SSE + Translation Core
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
3) Persistenslager
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
4) Auth + SĂ€kerhetsytor
- 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)
5) Molnsynkronisering
- 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
BegÀr livscykel (/v1/chat/completions)
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
Combo + konto reservflöde
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.
OAuth Onboarding och Token Refresh Lifecycle
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().
Cloud Sync Lifecycle (Aktivera / Synkronisera / Inaktivera)
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.
Datamodell och lagringskarta
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/...
Distributionstopologi
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
Modulmappning (beslutskritisk)
Rutt- och API-moduler
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)
Routing and Execution Core
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
ĂversĂ€ttningsregister och formatomvandlare
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
UthÄllighet
src/lib/localDb.ts: bestÀndig konfiguration/tillstÄndsrc/lib/usageDb.ts: anvÀndningshistorik och rullande förfrÄgningsloggar
Provider Executor TÀckning (strategimönster)
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örskompatibilitetsmatris
| Leverantör | Format | Auth | Streama | Icke-stream | Token Refresh | AnvÀndnings-API |
|---|---|---|---|---|---|---|
| Claude | claude | API-nyckel / OAuth | â | â | â | â ïž Endast admin |
| Tvillingarna | Tvillingarna | API-nyckel / OAuth | â | â | â | â ïž Cloud Console |
| Gemini CLI | gemini-cli | OAuth | â | â | â | â ïž Cloud Console |
| 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 | â | â | â | â ïž Per förfrĂ„gan |
| iFlow | openai | OAuth (GrundlĂ€ggande) | â | â | â | â ïž Per förfrĂ„gan |
| 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 | â | â | â | â |
FormatöversÀttningstÀckning
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
API-slutpunkter som stöds
| 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-hanterare
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Àr Logger Pipeline
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.
FellÀgen och motstÄndskraft
1) TillgÀnglighet för konto/leverantör
- 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
2) Tokens utgÄng
- 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
3) StrömsÀkerhet
- 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
4) MolnsynkroniseringsförsÀmring
- 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
5) Dataintegritet
- DB-formmigrering/reparation för saknade nycklar
- korrupta JSON-ÄterstÀllningsskydd för localDb och usageDb
Observerbarhet och operativa signaler
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
SÀkerhetskÀnsliga grÀnser
- 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ö- och körtidsmatris
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
KĂ€nda arkitektoniska anteckningar
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).
Checklista för operativ verifiering
- 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