🌐 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
Ultima actualizare: 2026-02-18
OmniRoute este un gateway local de rutare AI și un tablou de bord construit pe Next.js.
Acesta oferă un singur punct final compatibil cu OpenAI (/v1/*) și direcționează traficul către mai mulți furnizori din amonte cu traducere, alternativă, reîmprospătare token și urmărire a utilizării.
Capacitățile de bază:
- Suprafață API compatibilă cu OpenAI pentru CLI/instrumente (28 de furnizori)
- Traducerea cererii/răspunsurilor între formatele furnizorilor
- Alternativ combo de model (secvență cu mai multe modele)
- Rezervă de rezervă la nivel de cont (cu mai multe conturi pentru fiecare furnizor)
- Gestionarea conexiunii furnizorului OAuth + cheie API
- Generare de încorporare prin
/v1/embeddings(6 furnizori, 9 modele) - Generare de imagini prin
/v1/images/generations(4 furnizori, 9 modele) - Gândiți-vă la analizarea etichetelor (
<think>...</think>) pentru modele de raționament - Sanitizarea răspunsului pentru compatibilitate strictă cu OpenAI SDK
- Normalizarea rolurilor (dezvoltator→sistem, sistem→utilizator) pentru compatibilitate între furnizori
- Conversie de ieșire structurată (json_schema → Gemini responseSchema)
- Persistență locală pentru furnizori, chei, aliasuri, combo-uri, setări, prețuri
- Urmărirea utilizării/costurilor și înregistrarea cererilor
- Sincronizare cloud opțională pentru sincronizare multi-dispozitiv/state
- Lista permisă/lista blocată IP pentru controlul accesului API
- Gândire la managementul bugetului (passthrough/auto/personalizat/adaptativ)
- Sistem global de injectare promptă
- Urmărirea sesiunii și amprentarea
- Limitare îmbunătățită a ratei per cont cu profiluri specifice furnizorului
- Model de întrerupător pentru rezistența furnizorului
- Protectie anti-tunet cu blocare mutex
- Cache de deduplicare a cererilor bazate pe semnătură
- Nivelul domeniului: disponibilitatea modelului, regulile de cost, politica de rezervă, politica de blocare
- Persistența stării domeniului (cache-ul de scriere SQLite pentru rezervări, bugete, blocări, întreruptoare de circuit)
- Motor de politici pentru evaluarea centralizată a cererilor (blocare → buget → rezervă)
- Solicitați telemetrie cu agregarea latenței p50/p95/p99
- ID de corelare (X-Request-Id) pentru urmărirea de la capăt la capăt
- Înregistrare de audit de conformitate cu renunțare pentru fiecare cheie API
- Cadrul de evaluare pentru asigurarea calității LLM
- Tabloul de bord Resilience UI cu starea întreruptorului în timp real
- Furnizori OAuth modulari (12 module individuale sub
src/lib/oauth/providers/)
Model de rulare principal:
- Rutele aplicației Next.js sub
src/app/api/*implementează atât API-uri de tablou de bord, cât și API-uri de compatibilitate - Un nucleu SSE/rutare partajat în
src/sse/*+open-sse/*se ocupă de execuția furnizorului, traducerea, transmiterea în flux, alternativă și utilizare
- Timp de rulare gateway local
- API-uri de gestionare a tabloului de bord
- Autentificarea furnizorului și reîmprospătarea simbolului
- Solicitați traducere și streaming SSE
- Stare locală + persistență de utilizare
- Orchestrare opțională de sincronizare în cloud
- Implementarea serviciului cloud în spatele
NEXT_PUBLIC_CLOUD_URL - Furnizor SLA/plan de control în afara procesului local
- Binarele CLI externe în sine (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
Directoare principale:
src/app/api/v1/*șisrc/app/api/v1beta/*pentru API-uri de compatibilitatesrc/app/api/*pentru API-uri de gestionare/configurare- Următoarea rescrie în harta
next.config.mjs/v1/*în/api/v1/*
Rute importante de compatibilitate:
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— include modele personalizate cucustom: truesrc/app/api/v1/embeddings/route.ts— generare de încorporare (6 furnizori)src/app/api/v1/images/generations/route.ts— generare de imagini (4+ furnizori inclusiv Antigravity/Nebius)src/app/api/v1/messages/count_tokens/route.tssrc/app/api/v1/providers/[provider]/chat/completions/route.ts— chat dedicat pentru fiecare furnizorsrc/app/api/v1/providers/[provider]/embeddings/route.ts— încorporare dedicate pentru fiecare furnizorsrc/app/api/v1/providers/[provider]/images/generations/route.ts— imagini dedicate pentru fiecare furnizorsrc/app/api/v1beta/models/route.tssrc/app/api/v1beta/models/[...path]/route.ts
Domenii de management:
- Autentificare/setări:
src/app/api/auth/*,src/app/api/settings/* - Furnizori/conexiuni:
src/app/api/providers* - Noduri furnizor:
src/app/api/provider-nodes* - Modele personalizate:
src/app/api/provider-models(GET/POST/DELETE) - Catalog de modele:
src/app/api/models/catalog(GET) - Configurare proxy:
src/app/api/settings/proxy(GET/PUT/DELETE) +src/app/api/settings/proxy/test(POST) - OAuth:
src/app/api/oauth/* - Chei/alias-uri/combo/preț:
src/app/api/keys*,src/app/api/models/alias,src/app/api/combos*,src/app/api/pricing - Utilizare:
src/app/api/usage/* - Sincronizare/cloud:
src/app/api/sync/*,src/app/api/cloud/* - Ajutor de instrumente CLI:
src/app/api/cli-tools/* - Filtru IP:
src/app/api/settings/ip-filter(GET/PUT) - Buget de gândire:
src/app/api/settings/thinking-budget(GET/PUT) - prompt de sistem:
src/app/api/settings/system-prompt(GET/PUT) - Sesiuni:
src/app/api/sessions(GET) - Limite de rate:
src/app/api/rate-limits(GET) - Reziliență:
src/app/api/resilience(GET/PATCH) — profiluri furnizor, întrerupător, stare limită a ratei - Resetare rezistență:
src/app/api/resilience/reset(POST) — resetare întrerupătoare + cooldowns - Statistici cache:
src/app/api/cache/stats(GET/DELETE) - Disponibilitatea modelului:
src/app/api/models/availability(GET/POST) - Telemetrie:
src/app/api/telemetry/summary(GET) - Buget:
src/app/api/usage/budget(GET/POST) - Lanțuri de rezervă:
src/app/api/fallback/chains(GET/POST/DELETE) - Audit de conformitate:
src/app/api/compliance/audit-log(GET) - Evaluări:
src/app/api/evals(GET/POST),src/app/api/evals/[suiteId](GET) - Politici:
src/app/api/policies(GET/POST)
Module principale de flux:
- Intrare:
src/sse/handlers/chat.ts - Orchestrare de bază:
open-sse/handlers/chatCore.ts - Adaptoare de execuție furnizor:
open-sse/executors/* - Format de detectare/configurare furnizor:
open-sse/services/provider.ts - Analiza/rezolvarea modelului:
src/sse/services/model.ts,open-sse/services/model.ts - Logica de rezervă a contului:
open-sse/services/accountFallback.ts - Registrul traducerilor:
open-sse/translator/index.ts - Transformări de flux:
open-sse/utils/stream.ts,open-sse/utils/streamHandler.ts - Extragerea/normalizarea utilizării:
open-sse/utils/usageTracking.ts - Analizator de etichete de gândire:
open-sse/utils/thinkTagParser.ts - Manager de încorporare:
open-sse/handlers/embeddings.ts - Încorporarea registrului furnizorului:
open-sse/config/embeddingRegistry.ts - Manager de generare a imaginii:
open-sse/handlers/imageGeneration.ts - Registrul furnizorului de imagini:
open-sse/config/imageRegistry.ts - igienizare răspuns:
open-sse/handlers/responseSanitizer.ts - Normalizare rol:
open-sse/services/roleNormalizer.ts
Servicii (logica de afaceri):
- Selectarea/punctarea contului:
open-sse/services/accountSelector.ts - Gestionarea ciclului de viață a contextului:
open-sse/services/contextManager.ts - Aplicarea filtrului IP:
open-sse/services/ipFilter.ts - Urmărirea sesiunii:
open-sse/services/sessionManager.ts - Solicitați deduplicarea:
open-sse/services/signatureCache.ts - Injectarea promptă a sistemului:
open-sse/services/systemPrompt.ts - Gândirea bugetului:
open-sse/services/thinkingBudget.ts - rutare model wildcard:
open-sse/services/wildcardRouter.ts - Gestionarea limitei ratei:
open-sse/services/rateLimitManager.ts - Întrerupător:
open-sse/services/circuitBreaker.ts
Module de nivel de domeniu:
- Disponibilitatea modelului:
src/lib/domain/modelAvailability.ts - Reguli de cost/bugete:
src/lib/domain/costRules.ts - Politica de rezervă:
src/lib/domain/fallbackPolicy.ts - Soluție combinată:
src/lib/domain/comboResolver.ts - Politica de blocare:
src/lib/domain/lockoutPolicy.ts - Motor de politici:
src/domain/policyEngine.ts— blocare centralizată → buget → evaluare alternativă - Catalog coduri de eroare:
src/lib/domain/errorCodes.ts - ID cerere:
src/lib/domain/requestId.ts - Timeout pentru preluare:
src/lib/domain/fetchTimeout.ts - Solicitați telemetrie:
src/lib/domain/requestTelemetry.ts - Conformitate/audit:
src/lib/domain/compliance/index.ts - Runner de evaluare:
src/lib/domain/evalRunner.ts - Persistența stării domeniului:
src/lib/db/domainState.ts— SQLite CRUD pentru lanțuri de rezervă, bugete, istoricul costurilor, starea de blocare, întrerupătoarele de circuit
Module de furnizor OAuth (12 fișiere individuale sub src/lib/oauth/providers/):
- Index de registru:
src/lib/oauth/providers/index.ts - Furnizori individuali:
claude.ts,codex.ts,gemini.ts,antigravity.ts,iflow.ts, , , ,kimi-coding.ts,github.ts,kiro.ts,cursor.ts,kilocode.ts,cline.ts - Ambalaj subțire:
src/lib/oauth/providers.ts— reexporturi din module individuale
DB de stat primar:
src/lib/localDb.ts- fișier:
${DATA_DIR}/db.json(sau$XDG_CONFIG_HOME/omniroute/db.jsoncând este setat, altfel~/.omniroute/db.json) - entități: providerConnections, providerNodes, modelAliases, combo-uri, apiKeys, setări, prețuri, customModels, proxyConfig, ipFilter, thinkingBudget, systemPrompt
DB de utilizare:
src/lib/usageDb.ts- fișiere:
${DATA_DIR}/usage.json,${DATA_DIR}/log.txt,${DATA_DIR}/call_logs/ - urmează aceeași politică de bază de director ca
localDb(DATA_DIR, apoiXDG_CONFIG_HOME/omniroutecând este setat) - descompus în sub-module focalizate:
migrations.ts,usageHistory.ts,costCalculator.ts,usageStats.ts,callLogs.ts
DB Stare Domeniu (SQLite):
src/lib/db/domainState.ts— Operații CRUD pentru starea domeniului- Tabele (create în
src/lib/db/core.ts):domain_fallback_chains,domain_budgets,domain_cost_history,domain_lockout_state,domain_circuit_breakers_ - Model de cache de scriere: hărțile din memorie sunt autorizate în timpul execuției; mutațiile sunt scrise sincron cu SQLite; starea este restabilită din DB la pornirea la rece
- Autentificare cookie pentru tabloul de bord:
src/proxy.ts,src/app/api/auth/login/route.ts - Generarea/verificarea cheii API:
src/shared/utils/apiKey.ts - Secretele furnizorului au persistat în intrările
providerConnections - Suport proxy de ieșire prin
open-sse/utils/proxyFetch.ts(env vars) șiopen-sse/utils/networkProxy.ts(configurabil per furnizor sau global)
- Inițierea planificatorului:
src/lib/initCloudSync.ts,src/shared/services/initializeCloudSync.ts - Sarcină periodică:
src/shared/services/cloudSyncScheduler.ts - Rută de control:
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]
Deciziile de rezervă sunt conduse de open-sse/services/accountFallback.ts folosind coduri de stare și euristică mesaj de eroare.
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
Reîmprospătarea în timpul traficului live este executată în interiorul open-sse/handlers/chatCore.ts prin intermediul executorului 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
Sincronizarea periodică este declanșată de CloudSyncScheduler când cloud este activat.
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
}
Fișiere de stocare fizică:
- starea principală:
${DATA_DIR}/db.json(sau$XDG_CONFIG_HOME/omniroute/db.jsoncând este setat, altfel~/.omniroute/db.json) - statistici de utilizare:
${DATA_DIR}/usage.json - linii de jurnal de solicitare:
${DATA_DIR}/log.txt - sesiuni opționale de traducător/cerere de depanare:
<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/*: API-uri de compatibilitatesrc/app/api/v1/providers/[provider]/*: rute dedicate pentru fiecare furnizor (chat, încorporare, imagini)src/app/api/providers*: furnizor CRUD, validare, testaresrc/app/api/provider-nodes*: gestionarea nodurilor compatibile personalizatesrc/app/api/provider-models: management personalizat model (CRUD)src/app/api/models/catalog: API de catalog de model complet (toate tipurile grupate după furnizor)src/app/api/oauth/*: fluxuri OAuth/cod dispozitivsrc/app/api/keys*: ciclul de viață local al cheii APIsrc/app/api/models/alias: gestionare aliassrc/app/api/combos*: gestionarea combo de rezervăsrc/app/api/pricing: înlocuirea prețurilor pentru calcularea costurilorsrc/app/api/settings/proxy: configurație proxy (GET/PUT/DELETE)src/app/api/settings/proxy/test: test de conectivitate proxy de ieșire (POST)src/app/api/usage/*: API-uri de utilizare și jurnalsrc/app/api/sync/*+src/app/api/cloud/*: sincronizare în cloud și asistență orientată către norsrc/app/api/cli-tools/*: scriitori/verificatori de configurare CLI localesrc/app/api/settings/ip-filter: lista IP permisă/lista blocată (GET/PUT)src/app/api/settings/thinking-budget: configurația bugetului simbolului de gândire (GET/PUT)src/app/api/settings/system-prompt: prompt de sistem global (GET/PUT)src/app/api/sessions: listarea sesiunii active (GET)src/app/api/rate-limits: starea limită a ratei per cont (GET)
src/sse/handlers/chat.ts: analizarea cererii, gestionarea combinațiilor, bucla de selecție a contuluiopen-sse/handlers/chatCore.ts: traducere, expediere executor, reîncercare/reîmprospătare manipulare, configurare fluxopen-sse/executors/*: comportamentul de rețea și format specific furnizorului
open-sse/translator/index.ts: registru și orchestrare a traducătorilor- Solicitați traducători:
open-sse/translator/request/* - Traducători de răspuns:
open-sse/translator/response/* - Formatare constante:
open-sse/translator/formats.ts
src/lib/localDb.ts: config/stare persistentăsrc/lib/usageDb.ts: istoricul utilizării și jurnalele de solicitare continuă
Fiecare furnizor are un executor specializat care extinde BaseExecutor (în open-sse/executors/base.ts), care oferă crearea URL, construcția antetului, reîncercarea cu backoff exponențial, cârlige de reîmprospătare a acreditărilor și metoda de orchestrare execute().
| Executant | Furnizor(i) | Manipulare specială |
|---|---|---|
DefaultExecutor |
OpenAI, Claude, Gemini, Qwen, iFlow, OpenRouter, GLM, Kimi, MiniMax, DeepSeek, Groq, xAI, Mistral, Perplexity, Together, Fireworks, Cerebras, Cohere, NVIDIA | Configurare URL dinamică/antet per furnizor |
AntigravityExecutor |
Google Antigravity | ID-uri personalizate de proiect/sesiune, Reîncercați-După analizare |
CodexExecutor |
OpenAI Codex | Injectează instrucțiuni de sistem, forțează efortul de raționament |
CursorExecutor |
Cursor IDE | Protocolul ConnectRPC, codificarea Protobuf, semnarea cererii prin suma de control |
GithubExecutor |
GitHub Copilot | Reîmprospătare jeton Copilot, anteturi care imită VSCode |
KiroExecutor |
AWS CodeWhisperer/Kiro | Format binar AWS EventStream → conversie SSE |
GeminiCLIExecutor |
Gemeni CLI | Ciclul de reîmprospătare a simbolului OAuth Google |
Toți ceilalți furnizori (inclusiv noduri compatibile personalizate) folosesc DefaultExecutor.
| Furnizor | Format | Auth | Flux | Non-Stream | Token Refresh | Utilizare API |
|---|---|---|---|---|---|---|
| Claude | claude | Cheie API / OAuth | ✅ | ✅ | ✅ | |
| Gemeni | gemeni | Cheie API / OAuth | ✅ | ✅ | ✅ | |
| Gemeni CLI | gemeni-cli | OAuth | ✅ | ✅ | ✅ | |
| Antigravitație | antigravitație | OAuth | ✅ | ✅ | ✅ | ✅ Cota completă API |
| OpenAI | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| Codex | openai-responses | OAuth | ✅ forțat | ❌ | ✅ | ✅ Limite de tarif |
| GitHub Copilot | deschis | OAuth + Token Copilot | ✅ | ✅ | ✅ | ✅ Instantanee de cotă |
| Cursor | cursor | Sumă de control personalizată | ✅ | ✅ | ❌ | ❌ |
| Kiro | kiro | AWS SSO OIDC | ✅ (EventStream) | ❌ | ✅ | ✅ Limite de utilizare |
| Qwen | deschis | OAuth | ✅ | ✅ | ✅ | |
| iFlow | deschis | OAuth (de bază) | ✅ | ✅ | ✅ | |
| OpenRouter | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| GLM/Kimi/MiniMax | claude | Cheie API | ✅ | ✅ | ❌ | ❌ |
| DeepSeek | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| Groq | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| xAI (Grok) | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| Mistral | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| Nedumerire | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| Împreună AI | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| Artificii AI | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| Cerebre | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| Cohere | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
| NVIDIA NIM | deschis | Cheie API | ✅ | ✅ | ❌ | ❌ |
Formatele sursă detectate includ:
openaiopenai-responsesclaudegemini
Formatele țintă includ:
- Chat/Răspunsuri OpenAI
- Claude
- Plic Gemeni/Gemeni-CLI/Antigravity
- Kiro
- Cursor
Traducerile folosesc OpenAI ca format hub — toate conversiile trec prin OpenAI ca intermediar:
Source Format → OpenAI (hub) → Target Format
Traducerile sunt selectate dinamic pe baza formei încărcăturii sursei și a formatului țintă al furnizorului.
Straturi de procesare suplimentare în conducta de traducere:
- Sanitizarea răspunsurilor — Elimina câmpurile nestandard din răspunsurile în format OpenAI (atât în flux, cât și în non-streaming) pentru a asigura conformitatea strictă cu SDK
- Normalizarea rolurilor — Convertește
developer→systempentru ținte non-OpenAI; îmbinăsystem→userpentru modelele care resping rolul de sistem (GLM, ERNIE) - Think tag extraction — Analizează blocurile
<think>...</think>din conținut în câmpulreasoning_content - Ieșire structurată — Convertește OpenAI
response_format.json_schemaînresponseMimeTypeal lui Gemini +responseSchema
| Punct final | Format | Manipulator |
|---|---|---|
POST /v1/chat/completions |
OpenAI Chat | src/sse/handlers/chat.ts |
POST /v1/messages |
Claude Mesaje | Același handler (detectat automat) |
POST /v1/responses |
Răspunsuri OpenAI | open-sse/handlers/responsesHandler.ts |
POST /v1/embeddings |
Încorporare OpenAI | open-sse/handlers/embeddings.ts |
GET /v1/embeddings |
Lista de modele | Rută API |
POST /v1/images/generations |
Imagini OpenAI | open-sse/handlers/imageGeneration.ts |
GET /v1/images/generations |
Lista de modele | Rută API |
POST /v1/providers/{provider}/chat/completions |
OpenAI Chat | Dedicat pentru fiecare furnizor cu validare a modelului |
POST /v1/providers/{provider}/embeddings |
Încorporare OpenAI | Dedicat pentru fiecare furnizor cu validare a modelului |
POST /v1/providers/{provider}/images/generations |
Imagini OpenAI | Dedicat pentru fiecare furnizor cu validare a modelului |
POST /v1/messages/count_tokens |
Claude Token Count | Rută API |
GET /v1/models |
Lista de modele OpenAI | Rută API (chat + încorporare + imagine + modele personalizate) |
GET /api/models/catalog |
Catalog | Toate modelele grupate după furnizor + tip |
POST /v1beta/models/*:streamGenerateContent |
nativ Gemeni | Rută API |
GET/PUT/DELETE /api/settings/proxy |
Configurare proxy | Configurare proxy de rețea |
POST /api/settings/proxy/test |
Conectivitate proxy | Punct final de testare de sănătate/conectivitate proxy |
GET/POST/DELETE /api/provider-models |
Modele personalizate | Gestionare model personalizat per furnizor |
Managerul de ocolire (open-sse/utils/bypassHandler.ts) interceptează cererile cunoscute „de aruncat” de la Claude CLI — ping-uri de încălzire, extrageri de titluri și numărătoare de jetonuri — și returnează un răspuns fals fără a consuma jetoane de furnizor în amonte. Aceasta este declanșată numai atunci când User-Agent conține claude-cli.
Loggerul de solicitare (open-sse/utils/requestLogger.ts) oferă o conductă de înregistrare a depanării în 7 etape, dezactivată implicit, activată prin 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
Fișierele sunt scrise în <repo>/logs/<session>/ pentru fiecare sesiune de solicitare.
- cooldown contului furnizorului pentru erori tranzitorii/rate/auth
- rezervă de cont înainte de cererea eșuată
- alternativă model combo atunci când modelul curent/calea furnizorului este epuizată
- preverificare și reîmprospătare cu reîncercare pentru furnizorii care pot fi reîmprospătați
- 401/403 reîncercați după încercarea de reîmprospătare în calea de bază
- controler de flux conștient de deconectare
- flux de traducere cu spălare la sfârșitul fluxului și gestionarea
[DONE] - estimarea utilizării de rezervă atunci când metadatele de utilizare ale furnizorului lipsesc
- apar erori de sincronizare, dar timpul de execuție local continuă
- planificatorul are o logică capabilă să reîncerce, dar execuția periodică apelează în mod implicit sincronizarea cu o singură încercare
- Migrare/reparare forme DB pentru cheile lipsă
- garanții de resetare JSON corupte pentru localDb și usageDb
Surse de vizibilitate la runtime:
- jurnalele consolei de la
src/sse/utils/logger.ts - agregate de utilizare la cerere în
usage.json - autentificarea stării cererii textuale
log.txt - jurnalele opționale de solicitare profundă/traducere sub
logs/cândENABLE_REQUEST_LOGS=true - puncte finale de utilizare a tabloului de bord (
/api/usage/*) pentru consumul UI
- Secretul JWT (
JWT_SECRET) securizează verificarea/semnarea cookie-urilor sesiunii de bord - Parola de rezervă inițială (
INITIAL_PASSWORD, implicit123456) trebuie să fie înlocuită în implementările reale - Secretul HMAC cheie API (
API_KEY_SECRET) securizează formatul cheii API locale generate - Secretele furnizorului (chei/token-uri API) sunt păstrate în DB local și ar trebui protejate la nivel de sistem de fișiere
- Punctele finale de sincronizare în cloud se bazează pe semantica de autentificare a cheii API + ID-ul mașinii
Variabilele de mediu utilizate în mod activ de cod:
- Aplicație/autentificare:
JWT_SECRET,INITIAL_PASSWORD - Stocare:
DATA_DIR - Comportamentul nodului compatibil:
ALLOW_MULTI_CONNECTIONS_PER_COMPAT_NODE - Suprascriere opțională a bazei de stocare (Linux/macOS când
DATA_DIRdezactivat):XDG_CONFIG_HOME - Hashing de securitate:
API_KEY_SECRET,MACHINE_ID_SALT - Înregistrare:
ENABLE_REQUEST_LOGS - URL sincronizare/cloud:
NEXT_PUBLIC_BASE_URL,NEXT_PUBLIC_CLOUD_URL - Proxy de ieșire:
HTTP_PROXY,HTTPS_PROXY,ALL_PROXY,NO_PROXYși variante cu litere mici - Indicatori de caracteristică SOCKS5:
ENABLE_SOCKS5_PROXY,NEXT_PUBLIC_ENABLE_SOCKS5_PROXY - Ajutor platformă/execuție (configurație nu specifică aplicației):
APPDATA,NODE_ENV,PORT,HOSTNAME
usageDbșilocalDbau acum aceeași politică de bază de director (DATA_DIR->XDG_CONFIG_HOME/omniroute->~/.omniroute) cu migrarea fișierelor moștenite./api/v1/route.tsreturnează o listă de modele statice și nu este sursa principală de modele utilizată de/v1/models.- Loggerul solicitărilor scrie anteturi/corp complet atunci când este activat; tratați directorul de jurnal ca fiind sensibil.
- Comportamentul în cloud depinde de
NEXT_PUBLIC_BASE_URLcorect și de accesibilitatea punctului final din cloud. - Directorul
open-sse/este publicat ca pachetul@omniroute/open-ssenpm workspace. Codul sursă îl importă prin@omniroute/open-sse/...(rezolvat de Next.jstranspilePackages). Căile fișierelor din acest document folosesc în continuare numele directoruluiopen-sse/pentru consecvență. - Diagramele din tabloul de bord utilizează Recharts (bazate pe SVG) pentru vizualizări analitice accesibile, interactive (diagrame cu bare de utilizare a modelelor, tabele de defalcare a furnizorilor cu rate de succes).
- Testele E2E folosesc Playwright (
tests/e2e/), rulat prinnpm run test:e2e. Testele unitare folosesc Node.js test runner (tests/unit/), rulează prinnpm run test:plan3. Codul sursă subsrc/este TypeScript (.ts/.tsx); spațiul de lucruopen-sse/rămâne JavaScript (.js). - Pagina Setări este organizată în 5 file: Securitate, Rutare (6 strategii globale: fill-first, round-robin, p2c, aleatoriu, cel mai puțin utilizat, optimizat pentru cost), Reziliență (limite ale ratei editabile, întrerupător de circuit, politici), AI (buget de gândire, prompt de sistem, cache prompt), Avansat (proxy).
- Construire din sursă:
npm run build - Creați imaginea Docker:
docker build -t omniroute . - Porniți serviciul și verificați:
GET /api/settingsGET /api/v1/models- Adresa URL de bază țintă CLI ar trebui să fie
http://<host>:20128/v1cândPORT=20128