OmniRoute/docs/i18n/sv/ARCHITECTURE.md

38 KiB
Raw Blame History

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/* och src/app/api/v1beta/* för kompatibilitets-API:er
  • src/app/api/* för hanterings-/konfigurations-API:er
  • NĂ€sta omskrivning i next.config.mjs kartan /v1/* till /api/v1/*

Viktiga kompatibilitetsvÀgar:

  • src/app/api/v1/chat/completions/route.ts
  • src/app/api/v1/messages/route.ts
  • src/app/api/v1/responses/route.ts
  • src/app/api/v1/models/route.ts — inkluderar anpassade modeller med custom: true
  • src/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.ts
  • src/app/api/v1/providers/[provider]/chat/completions/route.ts — dedikerad chatt per leverantör
  • src/app/api/v1/providers/[provider]/embeddings/route.ts — dedikerade inbĂ€ddningar per leverantör
  • src/app/api/v1/providers/[provider]/images/generations/route.ts — dedikerade bilder per leverantör
  • src/app/api/v1beta/models/route.ts
  • src/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.json nĂ€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, sedan XDG_CONFIG_HOME/omniroute nĂ€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) och open-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.json nĂ€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:er
  • src/app/api/v1/providers/[provider]/*: dedikerade rutter per leverantör (chatt, inbĂ€ddningar, bilder)
  • src/app/api/providers*: leverantör CRUD, validering, testning
  • src/app/api/provider-nodes*: anpassad kompatibel nodhantering
  • src/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öden
  • src/app/api/keys*: lokal API-nyckellivscykel
  • src/app/api/models/alias: aliashantering
  • src/app/api/combos*: reservkombohantering
  • src/app/api/pricing: Ă„sidosĂ€ttande av prissĂ€ttning för kostnadsberĂ€kning
  • src/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 loggar
  • src/app/api/sync/* + src/app/api/cloud/*: molnsynkronisering och molnvĂ€nda hjĂ€lpare
  • src/app/api/cli-tools/*: lokala CLI-konfigurationsförfattare/checkers
  • src/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, kontovalsloop
  • open-sse/handlers/chatCore.ts: översĂ€ttning, exekutorutskick, försök igen/uppdatera hantering, strömkonfiguration
  • open-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Ă„nd
  • src/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:

  • openai
  • openai-responses
  • claude
  • gemini

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 → system för icke-OpenAI-mĂ„l; slĂ„r samman system → user för modeller som avvisar systemrollen (GLM, ERNIE)
  • TĂ€nk taggextraktion — Parsar <think>...</think> block frĂ„n innehĂ„ll till fĂ€ltet reasoning_content
  • Structured output — Konverterar OpenAI response_format.json_schema till Gemini's responseMimeType + 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Ă€r ENABLE_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, standard 123456) 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_DIR inte Ă€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_PROXY och 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

  1. usageDb och localDb delar nu samma baskatalogpolicy (DATA_DIR -> XDG_CONFIG_HOME/omniroute -> ~/.omniroute) med Àldre filmigrering.
  2. /api/v1/route.ts returnerar en statisk modelllista och Àr inte den huvudsakliga modellkÀllan som anvÀnds av /v1/models.
  3. Request logger skriver fullstÀndiga rubriker/text nÀr den Àr aktiverad; behandla loggkatalogen som kÀnslig.
  4. Molnets beteende beror pÄ korrekt NEXT_PUBLIC_BASE_URL och molnets slutpunkts tillgÀnglighet.
  5. Katalogen open-sse/ publiceras som @omniroute/open-sse npm workspace-paketet. KÀllkoden importerar den via @omniroute/open-sse/... (löst av Next.js transpilePackages). FilsökvÀgar i det hÀr dokumentet anvÀnder fortfarande katalognamnet open-sse/ för konsekvens.
  6. Diagram i instrumentpanelen anvÀnder Recharts (SVG-baserad) för tillgÀngliga, interaktiva analysvisualiseringar (stapeldiagram för modellanvÀndning, leverantörsuppdelningstabeller med framgÄngsfrekvenser).
  7. E2E-tester anvÀnder dramatiker (tests/e2e/), körs via npm run test:e2e. Enhetstester anvÀnder Node.js testrunner (tests/unit/), körs via npm run test:plan3. KÀllkoden under src/ Àr TypeScript (.ts/.tsx); arbetsytan open-sse/ förblir JavaScript (.js).
  8. 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/settings
  • GET /api/v1/models
  • CLI-mĂ„lbasadressen ska vara http://<host>:20128/v1 nĂ€r PORT=20128