🌐 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
Sist oppdatert: 2026-02-18
OmniRoute er en lokal AI-rutinggateway og dashbord bygget på Next.js.
Den gir et enkelt OpenAI-kompatibelt endepunkt (/v1/*) og ruter trafikk på tvers av flere oppstrømsleverandører med oversettelse, reserve, token-oppdatering og brukssporing.
Kjernefunksjoner:
- OpenAI-kompatibel API-overflate for CLI/verktøy (28 leverandører)
- Forespørsel/svar oversettelse på tvers av leverandørformater
- Modellkombinasjonsfallback (multimodellsekvens)
- Reserveback på kontonivå (multikonto per leverandør)
- OAuth + API-nøkkelleverandør tilkoblingsadministrasjon
- Innbyggingsgenerering via
/v1/embeddings(6 leverandører, 9 modeller) - Bildegenerering via
/v1/images/generations(4 leverandører, 9 modeller) - Tenk tag-parsing (
<think>...</think>) for resonneringsmodeller - Respons sanitization for streng OpenAI SDK-kompatibilitet
- Rollenormalisering (utvikler→system, system→bruker) for kompatibilitet på tvers av leverandører
- Konvertering av strukturert utdata (json_schema → Gemini responseSchema)
- Lokal utholdenhet for leverandører, nøkler, aliaser, kombinasjoner, innstillinger, priser
- Bruks-/kostnadssporing og forespørselslogging
- Valgfri skysynkronisering for synkronisering av flere enheter/tilstander
- IP-godkjenningsliste/blokkeringsliste for API-tilgangskontroll
- Tenker budsjettstyring (gjennomgang/auto/tilpasset/tilpasset)
- Injeksjon av et globalt system
- Sesjonssporing og fingeravtrykk
- Forbedret prisbegrensning per konto med leverandørspesifikke profiler
- Strømbrytermønster for leverandørens motstandskraft
- Anti-tordenbeskyttelse med mutex-låsing
- Signaturbasert forespørselsdedupliseringsbuffer
- Domenelag: modelltilgjengelighet, kostnadsregler, reservepolicy, lockoutpolicy
- Vedvarende domenetilstand (SQLite-gjennomskrivingsbuffer for reserver, budsjetter, lockouts, strømbrytere)
- Policymotor for sentralisert forespørselsevaluering (lockout → budsjett → reserve)
- Be om telemetri med p50/p95/p99 latensaggregering
- Korrelasjons-ID (X-Request-Id) for ende-til-ende-sporing
- Overholdelsesrevisjonslogging med opt-out per API-nøkkel
- Eval rammeverk for LLM kvalitetssikring
- Resilience UI-dashbord med sanntids strømbryterstatus
- Modulære OAuth-leverandører (12 individuelle moduler under
src/lib/oauth/providers/)
Primær kjøretidsmodell:
– Next.js app-ruter under src/app/api/* implementerer både dashbord-APIer og kompatibilitets-APIer
- En delt SSE/rutingkjerne i
src/sse/*+open-sse/*håndterer leverandørutførelse, oversettelse, strømming, fallback og bruk
- Lokal gateway kjøretid
- Dashboard management APIer
- Leverandørautentisering og tokenoppdatering
- Be om oversettelse og SSE-streaming
- Lokal stat + bruksutholdenhet
- Valgfri skysynkroniseringsorkestrering
- Implementering av skytjenester bak
NEXT_PUBLIC_CLOUD_URL - Leverandør SLA/kontrollplan utenfor lokal prosess
- Eksterne CLI-binærfiler i seg selv (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
Hovedkataloger:
src/app/api/v1/*ogsrc/app/api/v1beta/*for kompatibilitets-APIersrc/app/api/*for administrasjons-/konfigurasjons-APIer- Neste omskrivninger i
next.config.mjskart/v1/*til/api/v1/*
Viktige kompatibilitetsruter:
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— inkluderer tilpassede modeller medcustom: truesrc/app/api/v1/embeddings/route.ts— innebyggingsgenerering (6 leverandører)src/app/api/v1/images/generations/route.ts— bildegenerering (4+ leverandører inkl. Antigravity/Nebius)src/app/api/v1/messages/count_tokens/route.tssrc/app/api/v1/providers/[provider]/chat/completions/route.ts— dedikert chat per leverandørsrc/app/api/v1/providers/[provider]/embeddings/route.ts— dedikerte innbygginger per leverandørsrc/app/api/v1/providers/[provider]/images/generations/route.ts— dedikerte bilder per leverandørsrc/app/api/v1beta/models/route.tssrc/app/api/v1beta/models/[...path]/route.ts
Administrasjonsdomener:
- Auth/innstillinger:
src/app/api/auth/*,src/app/api/settings/* - Leverandører/tilkoblinger:
src/app/api/providers* - Leverandørnoder:
src/app/api/provider-nodes* - Egendefinerte modeller:
src/app/api/provider-models(GET/POST/DELETE) - Modellkatalog:
src/app/api/models/catalog(GET) - Proxy-konfigurasjon:
src/app/api/settings/proxy(GET/PUT/DELETE) +src/app/api/settings/proxy/test(POST) - OAuth:
src/app/api/oauth/* - Nøkler/aliaser/kombinasjoner/priser:
src/app/api/keys*,src/app/api/models/alias,src/app/api/combos*,src/app/api/pricing - Bruk:
src/app/api/usage/* - Synkronisering/sky:
src/app/api/sync/*,src/app/api/cloud/* - CLI-verktøyhjelpere:
src/app/api/cli-tools/* - IP-filter:
src/app/api/settings/ip-filter(GET/PUT) - Tenkebudsjett:
src/app/api/settings/thinking-budget(GET/PUT) - Systemmelding:
src/app/api/settings/system-prompt(GET/PUT) - Økter:
src/app/api/sessions(GET) - Satsgrenser:
src/app/api/rate-limits(GET) - Motstandsdyktighet:
src/app/api/resilience(GET/PATCH) — leverandørprofiler, strømbryter, rategrensetilstand - Resiliens tilbakestilling:
src/app/api/resilience/reset(POST) — tilbakestill brytere + nedkjøling - Bufferstatistikk:
src/app/api/cache/stats(GET/DELETE) - Modelltilgjengelighet:
src/app/api/models/availability(GET/POST) - Telemetri:
src/app/api/telemetry/summary(GET) – Budsjett:src/app/api/usage/budget(GET/POST) - Reservekjeder:
src/app/api/fallback/chains(GET/POST/DELETE) - Overholdelsesrevisjon:
src/app/api/compliance/audit-log(GET) - Evaler:
src/app/api/evals(GET/POST),src/app/api/evals/[suiteId](GET) - Retningslinjer:
src/app/api/policies(GET/POST)
Hovedstrømningsmoduler:
- Inngang:
src/sse/handlers/chat.ts - Kjerneorkestrering:
open-sse/handlers/chatCore.ts - Leverandørutførelsesadaptere:
open-sse/executors/* - Formatdeteksjon/leverandørkonfigurasjon:
open-sse/services/provider.ts - Modellanalyse/oppløsning:
src/sse/services/model.ts,open-sse/services/model.ts - Kontoreservelogikk:
open-sse/services/accountFallback.ts - Oversettelsesregister:
open-sse/translator/index.ts - Strømtransformasjoner:
open-sse/utils/stream.ts,open-sse/utils/streamHandler.ts - Bruksutvinning/normalisering:
open-sse/utils/usageTracking.ts - Think tag-parser:
open-sse/utils/thinkTagParser.ts - Innebyggingsbehandler:
open-sse/handlers/embeddings.ts - Innebyggingsleverandørregister:
open-sse/config/embeddingRegistry.ts - Bildegenereringsbehandler:
open-sse/handlers/imageGeneration.ts - Bildeleverandørs register:
open-sse/config/imageRegistry.ts - Response sanitization:
open-sse/handlers/responseSanitizer.ts - Rollenormalisering:
open-sse/services/roleNormalizer.ts
Tjenester (forretningslogikk):
- Kontovalg/score:
open-sse/services/accountSelector.ts - Kontekstlivssyklusadministrasjon:
open-sse/services/contextManager.ts - IP-filterhåndhevelse:
open-sse/services/ipFilter.ts - Øktsporing:
open-sse/services/sessionManager.ts - Be om deduplisering:
open-sse/services/signatureCache.ts - Systemprompt-injeksjon:
open-sse/services/systemPrompt.ts - Tenkende budsjettstyring:
open-sse/services/thinkingBudget.ts - Jokertegn modellruting:
open-sse/services/wildcardRouter.ts - Satsgrenseadministrasjon:
open-sse/services/rateLimitManager.ts - Strømbryter:
open-sse/services/circuitBreaker.ts
Domenelagsmoduler:
- Modelltilgjengelighet:
src/lib/domain/modelAvailability.ts - Kostnadsregler/budsjetter:
src/lib/domain/costRules.ts– Reservepolicy:src/lib/domain/fallbackPolicy.ts - Kombinasjonsløser:
src/lib/domain/comboResolver.ts– Utelukkingspolicy:src/lib/domain/lockoutPolicy.ts - Policymotor:
src/domain/policyEngine.ts— sentralisert lockout → budsjett → reserveevaluering - Feilkodekatalog:
src/lib/domain/errorCodes.ts - Forespørsels-ID:
src/lib/domain/requestId.ts - Tidsavbrudd for henting:
src/lib/domain/fetchTimeout.ts - Be om telemetri:
src/lib/domain/requestTelemetry.ts - Samsvar/revisjon:
src/lib/domain/compliance/index.ts - Evalløper:
src/lib/domain/evalRunner.ts - Vedvarende domenetilstand:
src/lib/db/domainState.ts— SQLite CRUD for reservekjeder, budsjetter, kostnadshistorikk, lockouttilstand, strømbrytere
OAuth-leverandørmoduler (12 individuelle filer under src/lib/oauth/providers/):
- Registerindeks:
src/lib/oauth/providers/index.ts– Individuelle leverandører:claude.ts,codex.ts,gemini.ts,antigravity.ts,iflow.ts,qwen.ts,kimi-coding.ts,github.ts,kiro.ts,cursor.ts,kilocode.ts,cline.ts - Tynn innpakning:
src/lib/oauth/providers.ts— re-eksport fra individuelle moduler
Primær tilstand DB:
src/lib/localDb.ts- fil:
${DATA_DIR}/db.json(eller$XDG_CONFIG_HOME/omniroute/db.jsonnår angitt, ellers~/.omniroute/db.json) - enheter: providerConnections, providerNodes, modelAliases, combos, apiKeys, settings, pricing, customModels, proxyConfig, ipFilter, thinkingBudget, systemPrompt
Bruk DB:
src/lib/usageDb.ts- filer:
${DATA_DIR}/usage.json,${DATA_DIR}/log.txt,${DATA_DIR}/call_logs/ - følger samme grunnleggende katalogpolicy som
localDb(DATA_DIR, deretterXDG_CONFIG_HOME/omniroutenår angitt) - dekomponert i fokuserte undermoduler:
migrations.ts,usageHistory.ts,costCalculator.ts,usageStats.ts,callLogs.ts
Domenetilstand DB (SQLite):
src/lib/db/domainState.ts— CRUD-operasjoner for domenetilstand- Tabeller (opprettet i
src/lib/db/core.ts):domain_fallback_chains,domain_budgets,domain_cost_history,domain_lockout_state,domain_circuit_breakers - Gjennomskrivingsbuffermønster: kart i minnet er autoritative under kjøring; mutasjoner skrives synkront til SQLite; tilstand gjenopprettes fra DB ved kaldstart
- Dashboard-informasjonskapselautentisering:
src/proxy.ts,src/app/api/auth/login/route.ts - Generering/verifisering av API-nøkler:
src/shared/utils/apiKey.ts - Leverandørhemmeligheter vedvarte i
providerConnections-oppføringer - Utgående proxy-støtte via
open-sse/utils/proxyFetch.ts(env vars) ogopen-sse/utils/networkProxy.ts(konfigurerbar per leverandør eller global)
- Planlegger init:
src/lib/initCloudSync.ts,src/shared/services/initializeCloudSync.ts - Periodisk oppgave:
src/shared/services/cloudSyncScheduler.ts - Kontrollrute:
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]
Reservebeslutninger er drevet av open-sse/services/accountFallback.ts ved hjelp av statuskoder og feilmeldingsheuristikk.
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
Oppdatering under levende trafikk utføres inne i open-sse/handlers/chatCore.ts via eksekveren 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 skyen er aktivert.
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
}
Fysiske lagringsfiler:
- hovedtilstand:
${DATA_DIR}/db.json(eller$XDG_CONFIG_HOME/omniroute/db.jsonnår angitt, ellers~/.omniroute/db.json) - bruksstatistikk:
${DATA_DIR}/usage.json - be om logglinjer:
${DATA_DIR}/log.txt - valgfrie oversetter/forespørsler om feilsøkingsøkter:
<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-APIersrc/app/api/v1/providers/[provider]/*: dedikerte ruter per leverandør (chat, innebygging, bilder)src/app/api/providers*: leverandør CRUD, validering, testingsrc/app/api/provider-nodes*: tilpasset kompatibel nodeadministrasjonsrc/app/api/provider-models: tilpasset modelladministrasjon (CRUD)src/app/api/models/catalog: full modellkatalog API (alle typer gruppert etter leverandør)src/app/api/oauth/*: OAuth/enhetskode flytersrc/app/api/keys*: lokal API-nøkkellivssyklussrc/app/api/models/alias: aliasadministrasjonsrc/app/api/combos*: reservekombinasjonsadministrasjonsrc/app/api/pricing: prisoverstyringer for kostnadsberegningsrc/app/api/settings/proxy: proxy-konfigurasjon (GET/PUT/DELETE)src/app/api/settings/proxy/test: utgående proxy-tilkoblingstest (POST)src/app/api/usage/*: APIer for bruk og loggersrc/app/api/sync/*+src/app/api/cloud/*: skysynkronisering og skyvendte hjelperesrc/app/api/cli-tools/*: lokale CLI-konfigurasjonsforfattere/kontrolleresrc/app/api/settings/ip-filter: IP-godkjenningsliste/blokkeringsliste (GET/PUT)src/app/api/settings/thinking-budget: budsjettkonfigurasjon for tenketoken (GET/PUT)src/app/api/settings/system-prompt: global systemmelding (GET/PUT)src/app/api/sessions: aktiv øktoppføring (GET)src/app/api/rate-limits: satsgrensestatus per konto (GET)
src/sse/handlers/chat.ts: forespørsel om parse, kombinasjonshåndtering, kontovalgsløyfeopen-sse/handlers/chatCore.ts: oversettelse, eksekutorutsendelse, prøv på nytt/oppdateringshåndtering, strømoppsettopen-sse/executors/*: leverandørspesifikk nettverks- og formatatferd
open-sse/translator/index.ts: oversetterregister og orkestrering- Be om oversettere:
open-sse/translator/request/* - Svaroversettere:
open-sse/translator/response/* - Formatkonstanter:
open-sse/translator/formats.ts
src/lib/localDb.ts: vedvarende konfig/tilstandsrc/lib/usageDb.ts: brukshistorikk og rullende forespørselslogger
Hver leverandør har en spesialisert eksekutør som utvider BaseExecutor (i open-sse/executors/base.ts), som gir URL-bygging, headerkonstruksjon, forsøk på nytt med eksponentiell backoff, legitimasjonsoppdateringskroker og execute() orkestreringsmetoden.
| Utfører | Leverandør(er) | Spesiell håndtering |
|---|---|---|
DefaultExecutor |
OpenAI, Claude, Gemini, Qwen, iFlow, OpenRouter, GLM, Kimi, MiniMax, DeepSeek, Groq, xAI, Mistral, Perplexity, Together, Fireworks, Cerebras, Cohere, NVIDIA | Dynamisk URL/header-konfigurasjon per leverandør |
AntigravityExecutor |
Google Antigravity | Egendefinerte prosjekt-/sesjons-ID-er, Prøv på nytt etter parsing |
CodexExecutor |
OpenAI Codex | Injiserer systeminstruksjoner, tvinger resonnementinnsats |
CursorExecutor |
Markør IDE | ConnectRPC-protokoll, Protobuf-koding, forespørsel om signering via sjekksum |
GithubExecutor |
GitHub Copilot | Copilot token oppdatering, VSCode-lignende overskrifter |
KiroExecutor |
AWS CodeWhisperer/Kiro | AWS EventStream binært format → SSE-konvertering |
GeminiCLIExecutor |
Gemini CLI | Oppdateringssyklus for Google OAuth-token |
Alle andre leverandører (inkludert tilpassede kompatible noder) bruker DefaultExecutor.
| Leverandør | Format | Auth | Stream | Ikke-stream | Token oppdatering | Bruks-API |
|---|---|---|---|---|---|---|
| Claude | claude | API-nøkkel / OAuth | ✅ | ✅ | ✅ | |
| Tvillingene | Gemini | API-nøkkel / OAuth | ✅ | ✅ | ✅ | |
| Gemini CLI | gemini-cli | OAuth | ✅ | ✅ | ✅ | |
| Antigravitasjon | antigravitasjon | OAuth | ✅ | ✅ | ✅ | ✅ Full kvote API |
| OpenAI | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| Codex | openai-svar | OAuth | ✅ tvunget | ❌ | ✅ | ✅ Satsgrenser |
| GitHub Copilot | openai | OAuth + Copilot Token | ✅ | ✅ | ✅ | ✅ Kvote øyeblikksbilder |
| Markør | markør | Egendefinert sjekksum | ✅ | ✅ | ❌ | ❌ |
| Kiro | kiro | AWS SSO OIDC | ✅ (EventStream) | ❌ | ✅ | ✅ Bruksgrenser |
| Qwen | openai | OAuth | ✅ | ✅ | ✅ | |
| iFlow | openai | OAuth (Grunnleggende) | ✅ | ✅ | ✅ | |
| OpenRouter | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| GLM/Kimi/MiniMax | claude | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| DeepSeek | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| Groq | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| xAI (Grok) | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| Mistral | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| Forvirring | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| Sammen AI | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| Fyrverkeri AI | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| Cerebras | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| Sammenheng | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
| NVIDIA NIM | openai | API-nøkkel | ✅ | ✅ | ❌ | ❌ |
Oppdagede kildeformater inkluderer:
openaiopenai-responsesclaudegemini
Målformater inkluderer:
- OpenAI chat/svar
- Claude
- Gemini/Gemini-CLI/Antigravity konvolutt
- Kiro
- Markør
Oversettelser bruker OpenAI som hub-format – alle konverteringer går gjennom OpenAI som mellomliggende:
Source Format → OpenAI (hub) → Target Format
Oversettelser velges dynamisk basert på kildens nyttelastform og leverandørens målformat.
Ytterligere behandlingslag i oversettelsespipelinen:
- Responssanering - Fjerner ikke-standardiserte felt fra OpenAI-formatsvar (både streaming og ikke-streaming) for å sikre streng SDK-overholdelse
- Rollenormalisering — Konverterer
developer→systemfor ikke-OpenAI-mål; slår sammensystem→userfor modeller som avviser systemrollen (GLM, ERNIE) - Tenk tag-utvinning — analyserer
<think>...</think>blokker fra innhold til feltetreasoning_content - Structured output — Konverterer OpenAI
response_format.json_schematil Gemini'sresponseMimeType+responseSchema
| Endepunkt | Format | Handler |
|---|---|---|
POST /v1/chat/completions |
OpenAI Chat | src/sse/handlers/chat.ts |
POST /v1/messages |
Claude Meldinger | Samme behandler (automatisk oppdaget) |
POST /v1/responses |
OpenAI-svar | open-sse/handlers/responsesHandler.ts |
POST /v1/embeddings |
OpenAI Embeddings | open-sse/handlers/embeddings.ts |
GET /v1/embeddings |
Modellliste | API-rute |
POST /v1/images/generations |
OpenAI-bilder | open-sse/handlers/imageGeneration.ts |
GET /v1/images/generations |
Modellliste | API-rute |
POST /v1/providers/{provider}/chat/completions |
OpenAI Chat | Dedikert per leverandør med modellvalidering |
POST /v1/providers/{provider}/embeddings |
OpenAI Embeddings | Dedikert per leverandør med modellvalidering |
POST /v1/providers/{provider}/images/generations |
OpenAI-bilder | Dedikert per leverandør med modellvalidering |
POST /v1/messages/count_tokens |
Claude Token Count | API-rute |
GET /v1/models |
OpenAI-modellliste | API-rute (chat + innebygging + bilde + tilpassede modeller) |
GET /api/models/catalog |
Katalog | Alle modeller gruppert etter leverandør + type |
POST /v1beta/models/*:streamGenerateContent |
Gemini innfødt | API-rute |
GET/PUT/DELETE /api/settings/proxy |
Proxy-konfigurasjon | Nettverks proxy-konfigurasjon |
POST /api/settings/proxy/test |
Proxy-tilkobling | Proxy-helse/tilkoblingstestendepunkt |
GET/POST/DELETE /api/provider-models |
Egendefinerte modeller | Tilpasset modelladministrasjon per leverandør |
Bypass-behandleren (open-sse/utils/bypassHandler.ts) avskjærer kjente "kasting"-forespørsler fra Claude CLI – oppvarmingspinger, tittelutdrag og tokentellinger – og returnerer et falsk svar uten å forbruke oppstrømsleverandørtokens. Dette utløses bare når User-Agent inneholder claude-cli.
Forespørselsloggeren (open-sse/utils/requestLogger.ts) gir en 7-trinns feilsøkingsloggingspipeline, deaktivert som standard, aktivert 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 skrives til <repo>/logs/<session>/ for hver forespørselsøkt.
- Nedkjøling av leverandørens konto på forbigående/rate/auth-feil
- kontoreserve før mislykket forespørsel
- combo modell fallback når gjeldende modell/leverandørbane er oppbrukt
- forhåndssjekk og oppdater med nytt forsøk for leverandører som kan oppdateres
- 401/403 prøv på nytt etter oppdateringsforsøk i kjernebanen
- frakoblingsbevisst strømkontroller
- oversettelsesstrøm med end-of-stream flush og
[DONE]håndtering – fallback for bruksestimat når leverandørbruksmetadata mangler
- Synkroniseringsfeil dukker opp, men lokal kjøretid fortsetter
- planleggeren har logikk som kan forsøke på nytt, men periodisk kjøring kaller for øyeblikket enkeltforsøkssynkronisering som standard
- DB-formmigrering/reparasjon for manglende nøkler
- korrupte JSON-tilbakestillingstiltak for localDb og usageDb
Synlighetskilder for kjøretid:
- konsolllogger fra
src/sse/utils/logger.ts - bruksaggregater per forespørsel i
usage.json - logg på status for tekstforespørsel
log.txt - valgfrie dype forespørsels-/oversettelseslogger under
logs/nårENABLE_REQUEST_LOGS=true - endepunkter for dashbordbruk (
/api/usage/*) for brukergrensesnittforbruk
- JWT-hemmelighet (
JWT_SECRET) sikrer bekreftelse/signering av informasjonskapsler for dashbordøkten - Innledende passordreserve (
INITIAL_PASSWORD, standard123456) må overstyres i reelle distribusjoner - API-nøkkel HMAC-hemmelighet (
API_KEY_SECRET) sikrer generert lokalt API-nøkkelformat - Leverandørhemmeligheter (API-nøkler/-tokens) er bevart i lokal DB og bør beskyttes på filsystemnivå
- Sluttpunkter for skysynkronisering er avhengige av API-nøkkelautentisering + maskin-ID-semantikk
Miljøvariabler som brukes aktivt av kode:
- App/auth:
JWT_SECRET,INITIAL_PASSWORD - Lagring:
DATA_DIR - Kompatibel nodeoppførsel:
ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE - Valgfri lagringsbaseoverstyring (Linux/macOS når
DATA_DIRikke er innstilt):XDG_CONFIG_HOME - Sikkerhetshashing:
API_KEY_SECRET,MACHINE_ID_SALT - Logging:
ENABLE_REQUEST_LOGS - Synkronisering/nettadresser i nettskyen:
NEXT_PUBLIC_BASE_URL,NEXT_PUBLIC_CLOUD_URL - Utgående proxy:
HTTP_PROXY,HTTPS_PROXY,ALL_PROXY,NO_PROXYog varianter med små bokstaver - SOCKS5-funksjonsflagg:
ENABLE_SOCKS5_PROXY,NEXT_PUBLIC_ENABLE_SOCKS5_PROXY– Plattform-/kjøretidshjelpere (ikke appspesifikk konfigurasjon):APPDATA,NODE_ENV,PORT,HOSTNAME
usageDboglocalDbdeler nå samme grunnkatalogpolicy (DATA_DIR->XDG_CONFIG_HOME/omniroute->~/.omniroute) med eldre filmigrering./api/v1/route.tsreturnerer en statisk modellliste og er ikke hovedmodellkilden som brukes av/v1/models.- Forespørselslogger skriver fullstendige overskrifter/tekst når den er aktivert; behandle loggkatalogen som sensitiv.
- Skyadferd avhenger av korrekt
NEXT_PUBLIC_BASE_URLog skyendepunkts tilgjengelighet. open-sse/-katalogen er publisert som@omniroute/open-ssenpm-arbeidsområdepakken. Kildekoden importerer den via@omniroute/open-sse/...(løst av Next.jstranspilePackages). Filbaner i dette dokumentet bruker fortsatt katalognavnetopen-sse/for konsistens.- Diagrammer i dashbordet bruker Recharts (SVG-basert) for tilgjengelige, interaktive analysevisualiseringer (stolpediagram for modellbruk, leverandøroversiktstabeller med suksessrater).
- E2E-tester bruker Playwright (
tests/e2e/), kjøres vianpm run test:e2e. Enhetstester bruker Node.js testløper (tests/unit/), kjøres vianpm run test:plan3. Kildekoden undersrc/er TypeScript (.ts/.tsx); arbeidsområdetopen-sse/forblir JavaScript (.js). - Innstillinger-siden er organisert i 5 faner: Sikkerhet, Ruting (6 globale strategier: fill-first, round-robin, p2c, random, minst brukt, kostnadsoptimalisert), Resiliens (redigerbare hastighetsgrenser, strømbryter, policyer), AI (tenkebudsjett, systemprompt, promptbuffer), Advanced (proxy).
- Bygg fra kilde:
npm run build - Bygg Docker-bilde:
docker build -t omniroute . - Start tjenesten og bekreft:
GET /api/settingsGET /api/v1/models- CLI-målgrunnadressen skal være
http://<host>:20128/v1nårPORT=20128