39 KiB
omniroute â Kodbasdokumentation
đ 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
En omfattande, nybörjarvÀnlig guide till omniroute AI-proxyrouter med flera leverantörer.
1. Vad Àr omniroute?
omniroute Àr en proxyrouter som sitter mellan AI-klienter (Claude CLI, Codex, Cursor IDE, etc.) och AI-leverantörer (Anthropic, Google, OpenAI, AWS, GitHub, etc.). Det löser ett stort problem:
Olika AI-klienter talar olika "sprÄk" (API-format), och olika AI-leverantörer förvÀntar sig ocksÄ olika "sprÄk". omniroute översÀtter mellan dem automatiskt.
TÀnk pÄ det som en universell översÀttare vid Förenta Nationerna - vilken delegat som helst kan tala vilket sprÄk som helst, och översÀttaren konverterar det till vilken annan delegat som helst.
2. Arkitekturöversikt
graph LR
subgraph Clients
A[Claude CLI]
B[Codex]
C[Cursor IDE]
D[OpenAI-compatible]
end
subgraph omniroute
E[Handler Layer]
F[Translator Layer]
G[Executor Layer]
H[Services Layer]
end
subgraph Providers
I[Anthropic Claude]
J[Google Gemini]
K[OpenAI / Codex]
L[GitHub Copilot]
M[AWS Kiro]
N[Antigravity]
O[Cursor API]
end
A --> E
B --> E
C --> E
D --> E
E --> F
F --> G
G --> I
G --> J
G --> K
G --> L
G --> M
G --> N
G --> O
H -.-> E
H -.-> G
KĂ€rnprincip: ĂversĂ€ttning av nav och eker
All formatöversÀttning gÄr genom OpenAI-formatet som navet:
Client Format â [OpenAI Hub] â Provider Format (request)
Provider Format â [OpenAI Hub] â Client Format (response)
Det betyder att du bara behöver N översĂ€ttare (en per format) istĂ€llet för NÂČ (varje par).
3. Projektets struktur
omniroute/
âââ open-sse/ â Core proxy library (portable, framework-agnostic)
â âââ index.js â Main entry point, exports everything
â âââ config/ â Configuration & constants
â âââ executors/ â Provider-specific request execution
â âââ handlers/ â Request handling orchestration
â âââ services/ â Business logic (auth, models, fallback, usage)
â âââ translator/ â Format translation engine
â â âââ request/ â Request translators (8 files)
â â âââ response/ â Response translators (7 files)
â â âââ helpers/ â Shared translation utilities (6 files)
â âââ utils/ â Utility functions
âââ src/ â Application layer (Express/Worker runtime)
â âââ app/ â Web UI, API routes, middleware
â âââ lib/ â Database, auth, and shared library code
â âââ mitm/ â Man-in-the-middle proxy utilities
â âââ models/ â Database models
â âââ shared/ â Shared utilities (wrappers around open-sse)
â âââ sse/ â SSE endpoint handlers
â âââ store/ â State management
âââ data/ â Runtime data (credentials, logs)
â âââ provider-credentials.json (external credentials override, gitignored)
âââ tester/ â Test utilities
4. Uppdelning av modul för modul
4.1 Config (open-sse/config/)
Den enda kÀllan till sanning för alla leverantörskonfigurationer.
| Arkiv | Syfte |
|---|---|
constants.ts |
PROVIDERS objekt med bas-URL:er, OAuth-referenser (standard), rubriker och standardsystemuppmaningar för varje leverantör. Definierar Àven HTTP_STATUS, ERROR_TYPES, COOLDOWN_MS, BACKOFF_CONFIG och SKIP_PATTERNS. |
credentialLoader.ts |
Laddar externa referenser frÄn data/provider-credentials.json och slÄr samman dem över de hÄrdkodade standardinstÀllningarna i PROVIDERS. HÄller hemligheter utom kÀllans kontroll samtidigt som bakÄtkompatibiliteten bibehÄlls. |
providerModels.ts |
Centralt modellregister: kartleverantörsalias â modell-ID:n. Funktioner som getModels(), getProviderByAlias(). |
codexInstructions.ts |
Systeminstruktioner injicerade i Codex-förfrÄgningar (redigeringsbegrÀnsningar, sandlÄderegler, godkÀnnandepolicyer). |
defaultThinkingSignature.ts |
Standard "tÀnkande" signaturer för Claude och Gemini modeller. |
ollamaModels.ts |
Schemadefinition för lokala Ollama-modeller (namn, storlek, familj, kvantisering). |
Behörighetsladdningsflöde
flowchart TD
A["App starts"] --> B["constants.ts defines PROVIDERS\nwith hardcoded defaults"]
B --> C{"data/provider-credentials.json\nexists?"}
C -->|Yes| D["credentialLoader reads JSON"]
C -->|No| E["Use hardcoded defaults"]
D --> F{"For each provider in JSON"}
F --> G{"Provider exists\nin PROVIDERS?"}
G -->|No| H["Log warning, skip"]
G -->|Yes| I{"Value is object?"}
I -->|No| J["Log warning, skip"]
I -->|Yes| K["Merge clientId, clientSecret,\ntokenUrl, authUrl, refreshUrl"]
K --> F
H --> F
J --> F
F -->|Done| L["PROVIDERS ready with\nmerged credentials"]
E --> L
4.2 Exekutorer (open-sse/executors/)
Exekutorer kapslar in leverantörsspecifik logik med hjÀlp av Strategy Pattern. Varje executor ÄsidosÀtter basmetoder efter behov.
classDiagram
class BaseExecutor {
+buildUrl(model, stream, options)
+buildHeaders(credentials, stream, body)
+transformRequest(body, model, stream, credentials)
+execute(url, options)
+shouldRetry(status, error)
+refreshCredentials(credentials, log)
}
class DefaultExecutor {
+refreshCredentials()
}
class AntigravityExecutor {
+buildUrl()
+buildHeaders()
+transformRequest()
+shouldRetry()
+refreshCredentials()
}
class CursorExecutor {
+buildUrl()
+buildHeaders()
+transformRequest()
+parseResponse()
+generateChecksum()
}
class KiroExecutor {
+buildUrl()
+buildHeaders()
+transformRequest()
+parseEventStream()
+refreshCredentials()
}
BaseExecutor <|-- DefaultExecutor
BaseExecutor <|-- AntigravityExecutor
BaseExecutor <|-- CursorExecutor
BaseExecutor <|-- KiroExecutor
BaseExecutor <|-- CodexExecutor
BaseExecutor <|-- GeminiCLIExecutor
BaseExecutor <|-- GithubExecutor
| Exekutor | Leverantör | Nyckelspecialiseringar |
|---|---|---|
base.ts |
â | Abstrakt bas: URL-byggnad, rubriker, logik för försök igen, uppdatering av autentiseringsuppgifter |
default.ts |
Claude, Gemini, OpenAI, GLM, Kimi, MiniMax | Generisk OAuth-tokenuppdatering för standardleverantörer |
antigravity.ts |
Google Cloud Code | Generering av projekt-/sessions-ID, reserv för flera webbadresser, anpassad försök att analysera igen frÄn felmeddelanden ("ÄterstÀll efter 2h7m23s") |
cursor.ts |
Markör IDE | Mest komplex: SHA-256 kontrollsummaauth, Protobuf-begĂ€rankodning, binĂ€r EventStream â SSE-svarsanalys |
codex.ts |
OpenAI Codex | Injicerar systeminstruktioner, hanterar tankenivÄer, tar bort parametrar som inte stöds |
gemini-cli.ts |
Google Gemini CLI | Byggande av anpassad webbadress (streamGenerateContent), uppdatering av Google OAuth-token |
github.ts |
GitHub Copilot | Dubbla tokensystem (GitHub OAuth + Copilot-token), VSCode-huvudhÀrmare |
kiro.ts |
AWS CodeWhisperer | AWS EventStream binÀr analys, AMZN-hÀndelseramar, tokenuppskattning |
index.ts |
â | Fabrik: maps provider name â executor class, with default fallback |
4.3 Hanterare (open-sse/handlers/)
orkestreringsskiktet â koordinerar översĂ€ttning, exekvering, streaming och felhantering.
| Arkiv | Syfte |
|---|---|
chatCore.ts |
Centralorkester (~600 rader). Hanterar hela begĂ€rans livscykel: formatdetektering â översĂ€ttning â exekutorutskick â strömmande/icke-strömmande svar â tokenuppdatering â felhantering â anvĂ€ndningsloggning. |
responsesHandler.ts |
Adapter för OpenAI:s Responses API: konverterar svarsformat â Chattavslut â skickar till chatCore â konverterar SSE tillbaka till svarsformat. |
embeddings.ts |
InbĂ€ddningsgenereringshanterare: löser inbĂ€ddningsmodell â leverantör, skickar till leverantörs API, returnerar OpenAI-kompatibelt inbĂ€ddningssvar. Stöder 6+ leverantörer. |
imageGeneration.ts |
Bildgenereringshanterare: löser bildmodell â leverantör, stöder OpenAI-kompatibla, Gemini-bild (Antigravity) och reservlĂ€ge (Nebius). Returnerar base64- eller URL-bilder. |
BegÀr livscykel (chatCore.ts)
sequenceDiagram
participant Client
participant chatCore
participant Translator
participant Executor
participant Provider
Client->>chatCore: Request (any format)
chatCore->>chatCore: Detect source format
chatCore->>chatCore: Check bypass patterns
chatCore->>chatCore: Resolve model & provider
chatCore->>Translator: Translate request (source â OpenAI â target)
chatCore->>Executor: Get executor for provider
Executor->>Executor: Build URL, headers, transform request
Executor->>Executor: Refresh credentials if needed
Executor->>Provider: HTTP fetch (streaming or non-streaming)
alt Streaming
Provider-->>chatCore: SSE stream
chatCore->>chatCore: Pipe through SSE transform stream
Note over chatCore: Transform stream translates<br/>each chunk: target â OpenAI â source
chatCore-->>Client: Translated SSE stream
else Non-streaming
Provider-->>chatCore: JSON response
chatCore->>Translator: Translate response
chatCore-->>Client: Translated JSON
end
alt Error (401, 429, 500...)
chatCore->>Executor: Retry with credential refresh
chatCore->>chatCore: Account fallback logic
end
4.4 TjÀnster (open-sse/services/)
AffÀrslogik som stödjer hanterarna och utförarna.
| Arkiv | Syfte |
|---|---|
provider.ts |
Formatdetektering (detectFormat): analyserar begÀran om kroppsstruktur för att identifiera Claude/OpenAI/Gemini/Antigravity/Responses-format (inkluderar max_tokens heuristik för Claude). Dessutom: URL-byggande, header-byggande, normalisering av tankekonfiguration. Stöder openai-compatible-* och anthropic-compatible-* dynamiska leverantörer. |
model.ts |
ModellstrĂ€ngsanalys (claude/model-name â {provider: "claude", model: "model-name"}), aliasupplösning med kollisionsdetektering, ingĂ„ngssanering (avvisar vĂ€gövergĂ„ng/kontrolltecken) och modellinformationsupplösning med stöd för asynkront alias getter. |
accountFallback.ts |
Hantering av hastighetsgrĂ€nser: exponentiell backoff (1s â 2s â 4s â max 2min), hantering av kontonedkylning, felklassificering (vilka fel utlöser fallback kontra inte). |
tokenRefresh.ts |
OAuth-tokenuppdatering för alla leverantörer: Google (Gemini, Antigravity), Claude, Codex, Qwen, iFlow, GitHub (OAuth + Copilot dual-token), Kiro (AWS SSO OIDC + Social Auth). Inkluderar löftesdedupliceringscache under flygning och försök igen med exponentiell backoff. |
combo.ts |
Kombomodeller: kedjor av reservmodeller. Om modell A misslyckas med ett fallback-berÀttigat fel, prova modell B, sedan C osv. Returnerar faktiska uppströmsstatuskoder. |
usage.ts |
HÀmtar kvot/anvÀndningsdata frÄn leverantörens API:er (GitHub Copilot-kvoter, Antigravity-modellkvoter, Codex-hastighetsgrÀnser, Kiro-anvÀndningsuppdelningar, Claude-instÀllningar). |
accountSelector.ts |
Smart kontoval med poÀngalgoritm: tar hÀnsyn till prioritet, hÀlsostatus, round-robin-position och nedkylningslÀge för att vÀlja det optimala kontot för varje begÀran. |
contextManager.ts |
BegÀr kontext livscykelhantering: skapar och spÄrar per begÀran kontextobjekt med metadata (begÀran ID, tidsstÀmplar, leverantörsinformation) för felsökning och loggning. |
ipFilter.ts |
IP-baserad Ätkomstkontroll: stöder tillstÄnds- och blockeringslÀgen. Validerar klient-IP mot konfigurerade regler innan API-förfrÄgningar behandlas. |
sessionManager.ts |
SessionsspÄrning med klientfingeravtryck: spÄrar aktiva sessioner med hashade klientidentifierare, övervakar antalet begÀranden och tillhandahÄller sessionsstatistik. |
signatureCache.ts |
BegÀr signaturbaserad dedupliceringscache: förhindrar dubbletter av begÀranden genom att cachelagra senaste begÀransignaturer och returnera cachade svar för identiska förfrÄgningar inom ett tidsfönster. |
systemPrompt.ts |
Global systempromptinjektion: lÀgger till eller lÀgger till en konfigurerbar systemprompt till alla förfrÄgningar, med kompatibilitetshantering per leverantör. |
thinkingBudget.ts |
Hantering av resonerande tokenbudget: stöder passthrough, auto (strip thinking config), anpassade (fast budget) och adaptiva (komplexitetsskalade) lÀgen för att kontrollera tÀnkande/resonemangstokens. |
wildcardRouter.ts |
Jokerteckenmodellmönsterrouting: löser jokerteckenmönster (t.ex. */claude-*) till konkreta leverantör/modellpar baserat pÄ tillgÀnglighet och prioritet. |
Token Refresh Deduplication
sequenceDiagram
participant R1 as Request 1
participant R2 as Request 2
participant Cache as refreshPromiseCache
participant OAuth as OAuth Provider
R1->>Cache: getAccessToken("gemini", token)
Cache->>Cache: No in-flight promise
Cache->>OAuth: Start refresh
R2->>Cache: getAccessToken("gemini", token)
Cache->>Cache: Found in-flight promise
Cache-->>R2: Return existing promise
OAuth-->>Cache: New access token
Cache-->>R1: New access token
Cache-->>R2: Same access token (shared)
Cache->>Cache: Delete cache entry
Konto reservtillstÄndsmaskin
stateDiagram-v2
[*] --> Active
Active --> Error: Request fails (401/429/500)
Error --> Cooldown: Apply backoff
Cooldown --> Active: Cooldown expires
Active --> Active: Request succeeds (reset backoff)
state Error {
[*] --> ClassifyError
ClassifyError --> ShouldFallback: Rate limit / Auth / Transient
ClassifyError --> NoFallback: 400 Bad Request
}
state Cooldown {
[*] --> ExponentialBackoff
ExponentialBackoff: Level 0 = 1s
ExponentialBackoff: Level 1 = 2s
ExponentialBackoff: Level 2 = 4s
ExponentialBackoff: Max = 2min
}
Kombinerad modellkedja
flowchart LR
A["Request with\ncombo model"] --> B["Model A"]
B -->|"2xx Success"| C["Return response"]
B -->|"429/401/500"| D{"Fallback\neligible?"}
D -->|Yes| E["Model B"]
D -->|No| F["Return error"]
E -->|"2xx Success"| C
E -->|"429/401/500"| G{"Fallback\neligible?"}
G -->|Yes| H["Model C"]
G -->|No| F
H -->|"2xx Success"| C
H -->|"Fail"| I["All failed â\nReturn last status"]
4.5 ĂversĂ€ttare (open-sse/translator/)
formatöversÀttningsmotorn anvÀnder ett sjÀlvregistrerande pluginsystem.
Arkitektur
graph TD
subgraph "Request Translation"
A["Claude â OpenAI"]
B["Gemini â OpenAI"]
C["Antigravity â OpenAI"]
D["OpenAI Responses â OpenAI"]
E["OpenAI â Claude"]
F["OpenAI â Gemini"]
G["OpenAI â Kiro"]
H["OpenAI â Cursor"]
end
subgraph "Response Translation"
I["Claude â OpenAI"]
J["Gemini â OpenAI"]
K["Kiro â OpenAI"]
L["Cursor â OpenAI"]
M["OpenAI â Claude"]
N["OpenAI â Antigravity"]
O["OpenAI â Responses"]
end
| Katalog | Filer | Beskrivning |
|---|---|---|
request/ |
8 översÀttare | Konvertera begÀrandekroppar mellan format. Varje fil sjÀlvregistreras via register(from, to, fn) vid import. |
response/ |
7 översÀttare | Konvertera strömmande svarsbitar mellan format. Hanterar SSE-hÀndelsetyper, tankeblock, verktygsanrop. |
helpers/ |
6 hjÀlpare | Delade verktyg: claudeHelper (extrahering av systemprompt, tankekonfiguration), geminiHelper (mappning av delar/innehÄll), openaiHelper (formatfiltrering), toolCallHelper (ID-generering, injektion av saknat svar), maxTokensHelper, responsesApiHelper. |
index.ts |
â | ĂversĂ€ttningsmotor: translateRequest(), translateResponse(), statlig ledning, register. |
formats.ts |
â | Formatkonstanter: OPENAI, CLAUDE, GEMINI, ANTIGRAVITY, KIRO, CURSOR, OPENAI_RESPONSES. |
Nyckeldesign: SjÀlvregistrerande plugins
// Each translator file calls register() on import:
import { register } from "../index.js";
register("claude", "openai", translateClaudeToOpenAI);
// The index.js imports all translator files, triggering registration:
import "./request/claude-to-openai.js"; // â self-registers
4.6 Utils (open-sse/utils/)
| Arkiv | Syfte |
|---|---|
error.ts |
Byggande av felsvar (OpenAI-kompatibelt format), uppströms felanalys, Antigravity-Äterförsöksextraktion frÄn felmeddelanden, SSE-felströmning. |
stream.ts |
SSE Transform Stream â kĂ€rnan för streaming. TvĂ„ lĂ€gen: TRANSLATE (översĂ€ttning i fullformat) och PASSTHROUGH (normalisera + extrahera anvĂ€ndning). Hanterar chunkbuffring, anvĂ€ndningsuppskattning, spĂ„rning av innehĂ„llslĂ€ngd. Encoder/decoder-instanser per ström undviker delat tillstĂ„nd. |
streamHelpers.ts |
SSE-verktyg pÄ lÄg nivÄ: parseSSELine (tolerant för blanksteg), hasValuableContent (filtrerar tomma bitar för OpenAI/Claude/Gemini), fixInvalidId, formatSSE (formatmedveten SSE-serialisering med med ). |
usageTracking.ts |
Extrahering av tokenanvÀndning frÄn valfritt format (Claude/OpenAI/Gemini/Responses), uppskattning med separata verktyg/meddelande-char-per-token-förhÄllanden, bufferttillÀgg (sÀkerhetsmarginal för 2000 tokens), formatspecifik fÀltfiltrering, konsolloggning med ANSI-fÀrger. |
requestLogger.ts |
Filbaserad förfrĂ„gningsloggning (opt-in via ENABLE_REQUEST_LOGS=true). Skapar sessionsmappar med numrerade filer: 1_req_client.json â 7_res_client.txt. All I/O Ă€r asynkron (eld-och-glöm). Maskerar kĂ€nsliga rubriker. |
bypassHandler.ts |
FÄngar upp specifika mönster frÄn Claude CLI (titelextraktion, uppvÀrmning, rÀkning) och returnerar falska svar utan att ringa nÄgon leverantör. Stöder bÄde streaming och icke-streaming. Avsiktligt begrÀnsad till Claude CLI omfattning. |
networkProxy.ts |
Löser utgĂ„ende proxy-URL för en given leverantör med prioritet: leverantörsspecifik konfiguration â global konfiguration â miljövariabler (HTTPS_PROXY/HTTP_PROXY/ALL_PROXY). Stöder NO_PROXY undantag. Caches konfiguration för 30s. |
SSE Streaming Pipeline
flowchart TD
A["Provider SSE stream"] --> B["TextDecoder\n(per-stream instance)"]
B --> C["Buffer lines\n(split on newline)"]
C --> D["parseSSELine()\n(trim whitespace, parse JSON)"]
D --> E{"Mode?"}
E -->|TRANSLATE| F["translateResponse()\ntarget â OpenAI â source"]
E -->|PASSTHROUGH| G["fixInvalidId()\nnormalize chunk"]
F --> H["hasValuableContent()\nfilter empty chunks"]
G --> H
H -->|"Has content"| I["extractUsage()\ntrack token counts"]
H -->|"Empty"| J["Skip chunk"]
I --> K["formatSSE()\nserialize + clean perf_metrics"]
K --> L["TextEncoder\n(per-stream instance)"]
L --> M["Enqueue to\nclient stream"]
style A fill:#f9f,stroke:#333
style M fill:#9f9,stroke:#333
BegÀr Logger Session Struktur
logs/
âââ claude_gemini_claude-sonnet_20260208_143045/
âââ 1_req_client.json â Raw client request
âââ 2_req_source.json â After initial conversion
âââ 3_req_openai.json â OpenAI intermediate format
âââ 4_req_target.json â Final target format
âââ 5_res_provider.txt â Provider SSE chunks (streaming)
âââ 5_res_provider.json â Provider response (non-streaming)
âââ 6_res_openai.txt â OpenAI intermediate chunks
âââ 7_res_client.txt â Client-facing SSE chunks
âââ 6_error.json â Error details (if any)
4.7 Application Layer (src/)
| Katalog | Syfte |
|---|---|
src/app/ |
WebbgrÀnssnitt, API-rutter, Express-mellanprogramvara, OAuth-Äteruppringningshanterare |
src/lib/ |
DatabasÄtkomst (localDb.ts, usageDb.ts), autentisering, delad |
src/mitm/ |
Man-in-the-middle-proxyverktyg för att avlyssna leverantörstrafik |
src/models/ |
Databasmodelldefinitioner |
src/shared/ |
Omslag runt öppna-sse-funktioner (leverantör, stream, fel, etc.) |
src/sse/ |
SSE-slutpunktshanterare som kopplar open-sse-biblioteket till Express-rutter |
src/store/ |
TillstÄndshantering för applikationer |
AnmÀrkningsvÀrda API-rutter
| Rutt | Metoder | Syfte |
|---|---|---|
/api/provider-models |
GET/POSTA/RADERA | CRUD för anpassade modeller per leverantör |
/api/models/catalog |
Fà | Aggregerad katalog över alla modeller (chatt, inbÀddning, bild, anpassad) grupperade efter leverantör |
/api/settings/proxy |
GET/PUT/DELETE | Hierarkisk utgÄende proxykonfiguration (global/providers/combos/keys) |
/api/settings/proxy/test |
POST | Validerar proxyanslutning och returnerar offentlig IP/latency |
/v1/providers/[provider]/chat/completions |
POST | Dedikerade chattkompletteringar per leverantör med modellvalidering |
/v1/providers/[provider]/embeddings |
POST | Dedikerade inbÀddningar per leverantör med modellvalidering |
/v1/providers/[provider]/images/generations |
POST | Dedikerad bildgenerering per leverantör med modellvalidering |
/api/settings/ip-filter |
GET/PUT | Hantering av IP-tillstÄndslistor/blockeringslistor |
/api/settings/thinking-budget |
GET/PUT | Resonemangstokens budgetkonfiguration (passthrough/auto/custom/adaptive) |
/api/settings/system-prompt |
GET/PUT | Global systeminjektion för alla förfrÄgningar |
/api/sessions |
Fà | Aktiv sessionsspÄrning och mÀtvÀrden |
/api/rate-limits |
Fà | RÀntegrÀnsstatus per konto |
5. Nyckeldesignmönster
5.1 Hub-and-Speake-översÀttning
Alla format översÀtts genom OpenAI-formatet som navet. Att lÀgga till en ny leverantör krÀver bara att man skriver ett par översÀttare (till/frÄn OpenAI), inte N par.
5.2 Exekutorstrategimönster
Varje leverantör har en dedikerad executor-klass som Àrver frÄn BaseExecutor. Fabriken i executors/index.ts vÀljer rÀtt vid körning.
5.3 SjÀlvregistrerande pluginsystem
ĂversĂ€ttningsmoduler registrerar sig sjĂ€lva vid import via register(). Att lĂ€gga till en ny översĂ€ttare Ă€r bara att skapa en fil och importera den.
5.4 KontoÄtgÄng med exponentiell backoff
NĂ€r en leverantör returnerar 429/401/500 kan systemet byta till nĂ€sta konto genom att tillĂ€mpa exponentiell nedkylning (1s â 2s â 4s â max 2min).
5.5 Combo modellkedjor
En "combo" grupperar flera provider/model-strÀngar. Om den första misslyckas, ÄtergÄ automatiskt till nÀsta.
5.6 Stateful Streaming Translation
SvarsöversÀttning upprÀtthÄller tillstÄnd över SSE-bitar (tÀnkeblockspÄrning, verktygsanropsackumulering, innehÄllsblockindexering) via mekanismen initState().
5.7 AnvÀndningssÀkerhetsbuffert
En buffert pÄ 2000 token lÀggs till rapporterad anvÀndning för att förhindra att klienter nÄr kontextfönstergrÀnser pÄ grund av overhead frÄn systemuppmaningar och formatöversÀttning.
6. Format som stöds
| Format | Riktning | Identifierare |
|---|---|---|
| OpenAI Chat Slutförda | kÀlla + mÄl | openai |
| OpenAI Responses API | kÀlla + mÄl | openai-responses |
| Antropisk Claude | kÀlla + mÄl | claude |
| Google Tvillingarna | kÀlla + mÄl | gemini |
| Google Gemini CLI | endast mÄl | gemini-cli |
| Antigravitation | kÀlla + mÄl | antigravity |
| AWS Kiro | endast mÄl | kiro |
| Markör | endast mÄl | cursor |
7. Leverantörer som stöds
| Leverantör | Auth Method | Exekutor | Viktiga anmÀrkningar |
|---|---|---|---|
| Antropisk Claude | API-nyckel eller OAuth | Standard | AnvÀnder x-api-key header |
| Google Tvillingarna | API-nyckel eller OAuth | Standard | AnvÀnder x-goog-api-key header |
| Google Gemini CLI | OAuth | GeminiCLI | AnvÀnder streamGenerateContent slutpunkt |
| Antigravitation | OAuth | Antigravitation | Alternativ för flera webbadresser, anpassad försök att analysera igen |
| OpenAI | API-nyckel | Standard | StandardbÀrare auth |
| Codex | OAuth | Codex | Injicerar systeminstruktioner, hanterar tÀnkande |
| GitHub Copilot | OAuth + Copilot-token | Github | Dubbla token, VSCode-huvudhÀrmar |
| Kiro (AWS) | AWS SSO OIDC eller Social | Kiro | BinÀr EventStream-analys |
| Markör IDE | Kontrollsumma auth | Markör | Protobuf-kodning, SHA-256 kontrollsummor |
| Qwen | OAuth | Standard | Standardauth |
| iFlow | OAuth (GrundlÀggande + BÀrare) | Standard | Dubbla autentiseringshuvud |
| OpenRouter | API-nyckel | Standard | StandardbÀrare auth |
| GLM, Kimi, MiniMax | API-nyckel | Standard | Claude-kompatibel, anvÀnd x-api-key |
openai-compatible-* |
API-nyckel | Standard | Dynamisk: alla OpenAI-kompatibla slutpunkter |
anthropic-compatible-* |
API-nyckel | Standard | Dynamisk: valfri Claude-kompatibel slutpunkt |
8. Dataflödessammanfattning
StrömningsförfrÄgan
flowchart LR
A["Client"] --> B["detectFormat()"]
B --> C["translateRequest()\nsource â OpenAI â target"]
C --> D["Executor\nbuildUrl + buildHeaders"]
D --> E["fetch(providerURL)"]
E --> F["createSSEStream()\nTRANSLATE mode"]
F --> G["parseSSELine()"]
G --> H["translateResponse()\ntarget â OpenAI â source"]
H --> I["extractUsage()\n+ addBuffer"]
I --> J["formatSSE()"]
J --> K["Client receives\ntranslated SSE"]
K --> L["logUsage()\nsaveRequestUsage()"]
BegÀran om icke-streaming
flowchart LR
A["Client"] --> B["detectFormat()"]
B --> C["translateRequest()\nsource â OpenAI â target"]
C --> D["Executor.execute()"]
D --> E["translateResponse()\ntarget â OpenAI â source"]
E --> F["Return JSON\nresponse"]
Bypass Flow (Claude CLI)
flowchart LR
A["Claude CLI request"] --> B{"Match bypass\npattern?"}
B -->|"Title/Warmup/Count"| C["Generate fake\nOpenAI response"]
B -->|"No match"| D["Normal flow"]
C --> E["Translate to\nsource format"]
E --> F["Return without\ncalling provider"]