🌐 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
Изчерпателно, удобно за начинаещи ръководство за omniroute прокси рутер с изкуствен интелект с множество доставчици.
omniroute е прокси рутер, който се намира между AI клиенти (Claude CLI, Codex, Cursor IDE и др.) и AI доставчици (Anthropic, Google, OpenAI, AWS, GitHub и др.). Решава един голям проблем:
Различните AI клиенти говорят различни „езици“ (API формати) и различните доставчици на AI също очакват различни „езици“. omniroute превежда автоматично между тях.
Мислете за това като за универсален преводач в Обединените нации - всеки делегат може да говори всеки език и преводачът го преобразува за всеки друг делегат.
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
Всички преводи на формати преминават през OpenAI формат като център:
Client Format → [OpenAI Hub] → Provider Format (request)
Provider Format → [OpenAI Hub] → Client Format (response)
Това означава, че имате нужда само от N преводачи (по един на формат) вместо от N² (всяка двойка).
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
Единственият източник на истина за всички конфигурации на доставчика.
| Файл | Цел |
|---|---|
constants.ts |
PROVIDERS обект с основни URL адреси, идентификационни данни за OAuth (по подразбиране), заглавки и системни подкани по подразбиране за всеки доставчик. Също така дефинира HTTP_STATUS, ERROR_TYPES, COOLDOWN_MS, BACKOFF_CONFIG и SKIP_PATTERNS. |
credentialLoader.ts |
Зарежда външни идентификационни данни от data/provider-credentials.json и ги обединява върху твърдо кодираните настройки по подразбиране в PROVIDERS. Пази тайните извън контрола на източника, като същевременно поддържа обратна съвместимост. |
providerModels.ts |
Централен регистър на моделите: псевдоними на доставчика на карти → ID на модела. Функции като getModels(), getProviderByAlias(). |
codexInstructions.ts |
Системни инструкции, инжектирани в заявките на Codex (ограничения за редактиране, правила на пясъчника, правила за одобрение). |
defaultThinkingSignature.ts |
„Мислещи“ подписи по подразбиране за модели Claude и Gemini. |
ollamaModels.ts |
Дефиниция на схема за локални модели Ollama (име, размер, семейство, квантуване). |
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
Изпълнителите капсулират специфична за доставчика логика, използвайки стратегически модел. Всеки изпълнител замества основните методи, ако е необходимо.
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
| Изпълнител | Доставчик | Ключови специализации |
|---|---|---|
base.ts |
— | Абстрактна база: изграждане на URL, заглавки, логика за повторен опит, опресняване на идентификационни данни |
default.ts |
Claude, Gemini, OpenAI, GLM, Kimi, MiniMax | Генерично опресняване на OAuth токен за стандартни доставчици |
antigravity.ts |
Google Cloud Code | Генериране на идентификатор на проект/сесия, резервен URL адрес с множество URL адреси, персонализирано анализиране на повторен опит от съобщения за грешка („нулиране след 2h7m23s“) |
cursor.ts |
Курсор IDE | Най-сложни: SHA-256 контролна сума auth, Protobuf кодиране на заявка, двоичен EventStream → SSE отговор анализ |
codex.ts |
OpenAI Codex | Вкарва системни инструкции, управлява нивата на мислене, премахва неподдържаните параметри |
gemini-cli.ts |
Google Gemini CLI | Изграждане на персонализиран URL (streamGenerateContent), опресняване на Google OAuth токен |
github.ts |
Копилот на GitHub | Система с двоен токен (GitHub OAuth + Copilot token), имитиране на заглавката на VSCode |
kiro.ts |
AWS CodeWhisperer | Двоичен анализ на AWS EventStream, рамки за събития AMZN, оценка на токена |
index.ts |
— | Фабрика: картографира името на доставчика → клас изпълнител, с резервен вариант по подразбиране |
Слоят за оркестрация — координира превода, изпълнението, поточното предаване и обработката на грешки.
| Файл | Цел |
|---|---|
chatCore.ts |
Централен оркестратор (~600 реда). Обработва пълния жизнен цикъл на заявката: откриване на формат → превод → изпращане на изпълнител → стрийминг/не-стрийминг отговор → опресняване на токена → обработка на грешки → регистриране на използването. |
responsesHandler.ts |
Адаптер за API за отговори на OpenAI: преобразува формата на отговорите → Завършвания на чат → изпраща до chatCore → конвертира SSE обратно във формат на отговорите. |
embeddings.ts |
Манипулатор за генериране на вграждане: разрешава модел на вграждане → доставчик, изпраща до API на доставчика, връща съвместим с OpenAI отговор за вграждане. Поддържа 6+ доставчици. |
imageGeneration.ts |
Манипулатор за генериране на изображения: разрешава модел на изображение → доставчик, поддържа режими, съвместими с OpenAI, Gemini-image (Антигравитация) и резервни (Nebius). Връща base64 или URL изображения. |
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
Бизнес логика, която поддържа манипулаторите и изпълнителите.
| Файл | Цел |
|---|---|
provider.ts |
Откриване на формат (detectFormat): анализира структурата на тялото на заявката, за да идентифицира форматите Claude/OpenAI/Gemini/Antigravity/Responses (включва max_tokens евристика за Claude). Също така: изграждане на URL адреси, изграждане на заглавки, нормализиране на конфигурацията на мислене. Поддържа openai-compatible-* и anthropic-compatible-* динамични доставчици. |
model.ts |
Разбор на низ на модел (claude/model-name → {provider: "claude", model: "model-name"}), разрешаване на псевдоними с откриване на сблъсък, дезинфекция на входа (отхвърля преминаване на пътя/контролни знаци) и разрешаване на информация за модела с поддръжка на асинхронно получаване на псевдоними. |
accountFallback.ts |
Обработка на ограничение на скоростта: експоненциално забавяне (1s → 2s → 4s → макс. 2min), управление на изчакване на акаунта, класификация на грешките (кои грешки задействат резервно или не). |
tokenRefresh.ts |
Опресняване на OAuth токена за всеки доставчик: Google (Gemini, Antigravity), Claude, Codex, Qwen, iFlow, GitHub (OAuth + Copilot dual-token), Kiro (AWS SSO OIDC + Social Auth). Включва кеш за дедупликация на обещание по време на полет и повторен опит с експоненциално забавяне. |
combo.ts |
Комбинирани модели: вериги от резервни модели. Ако модел A се провали с допустима грешка за резервен вариант, опитайте модел B, след това C и т.н. Връща действителните кодове за състояние нагоре по веригата. |
usage.ts |
Извлича данни за квоти/използване от API на доставчика (квоти на GitHub Copilot, квоти на модела на Antigravity, ограничения на скоростта на Codex, разбивки на използването на Kiro, настройки на Claude). |
accountSelector.ts |
Интелигентен избор на акаунт с алгоритъм за точкуване: взема предвид приоритет, здравословно състояние, кръгова позиция и състояние на изчакване, за да избере оптималния акаунт за всяка заявка. |
contextManager.ts |
Управление на жизнения цикъл на контекста на заявката: създава и проследява контекстни обекти на заявка с метаданни (идентификатор на заявка, времеви клейма, информация за доставчика) за отстраняване на грешки и регистриране. |
ipFilter.ts |
IP-базиран контрол на достъпа: поддържа разрешени и блокирани режими. Валидира клиентския IP адрес спрямо конфигурирани правила, преди да обработи API заявки. |
sessionManager.ts |
Проследяване на сесии с пръстов отпечатък на клиента: проследява активни сесии с помощта на хеширани клиентски идентификатори, следи броя на заявките и предоставя показатели за сесиите. |
signatureCache.ts |
Кеш за дедупликация, базиран на подписи на заявки: предотвратява дублиране на заявки чрез кеширане на подписи на скорошни заявки и връщане на кеширани отговори за идентични заявки в рамките на времеви прозорец. |
systemPrompt.ts |
Инжектиране на глобална системна подкана: добавя пред или добавя конфигурируема системна подкана към всички заявки, с обработка на съвместимостта за всеки доставчик. |
thinkingBudget.ts |
Управление на бюджета на токените за разсъждение: поддържа режими за преминаване, автоматичен (конфигурация на лентово мислене), персонализиран (фиксиран бюджет) и адаптивен (мащабиран според сложността) режими за контролиране на токени за мислене/разсъждение. |
wildcardRouter.ts |
Маршрутизиране на модела със заместващи знаци: разрешава шаблони със заместващи знаци (напр. */claude-*) до конкретни двойки доставчик/модел въз основа на наличност и приоритет. |
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
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
}
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"]
Машината за превод на формати, използваща саморегистрираща се плъгин система.
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
| Указател | Файлове | Описание |
|---|---|---|
request/ |
8 преводачи | Преобразувайте тела на заявки между формати. Всеки файл се саморегистрира чрез register(from, to, fn) при импортиране. |
response/ |
7 преводачи | Преобразувайте поточно предавани отговори между формати. Обработва SSE типове събития, мисловни блокове, извиквания на инструменти. |
helpers/ |
6 помощника | Споделени помощни програми: claudeHelper (извличане на системни подкани, мислеща конфигурация), geminiHelper (съпоставяне на части/съдържание), openaiHelper (филтриране на формат), toolCallHelper (генериране на ID, инжектиране на липсващ отговор), maxTokensHelper, responsesApiHelper. |
index.ts |
— | Механизъм за превод: translateRequest(), translateResponse(), управление на състоянието, регистър. |
formats.ts |
— | Константи на формата: OPENAI, CLAUDE, GEMINI, ANTIGRAVITY, KIRO, CURSOR, OPENAI_RESPONSES. |
// 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| Файл | Цел |
|---|---|
error.ts |
Изграждане на отговор при грешка (съвместим с OpenAI формат), анализиране на грешка нагоре по веригата, извличане на времето за повторен опит на Antigravity от съобщения за грешка, поточно предаване на грешка на SSE. |
stream.ts |
SSE Transform Stream — основният тръбопровод за стрийминг. Два режима: TRANSLATE (превод в пълен формат) и PASSTHROUGH (нормализиране + извличане на използването). Управлява буфериране на парчета, оценка на използването, проследяване на дължината на съдържанието. Екземплярите на енкодер/декодер на поток избягват споделено състояние. |
streamHelpers.ts |
Помощни програми за SSE на ниско ниво: parseSSELine (толерантни към бели интервали), hasValuableContent (филтрира празни парчета за OpenAI/Claude/Gemini), fixInvalidId, formatSSE (сериализация на SSE, съобразена с формата с perf_metrics почистване). |
usageTracking.ts |
Извличане на използване на токени от всеки формат (Claude/OpenAI/Gemini/Responses), оценка с отделни съотношения на инструмент/съобщение char-per-token, добавяне на буфер (марж за безопасност от 2000 токена), филтриране на специфично за формат поле, конзолно регистриране с ANSI цветове. |
requestLogger.ts |
Регистриране на искания на базата на файл (включване чрез ENABLE_REQUEST_LOGS=true). Създава сесийни папки с номерирани файлове: 1_req_client.json → 7_res_client.txt. Всички I/O са асинхронни (задействай и забрави). Маскира чувствителните заглавки. |
bypassHandler.ts |
Прихваща специфични модели от Claude CLI (извличане на заглавие, загряване, броене) и връща фалшиви отговори, без да се обажда на доставчик. Поддържа както стрийминг, така и не стрийминг. Умишлено ограничен до Claude CLI обхват. |
networkProxy.ts |
Разрешава URL адрес на изходящ прокси за даден доставчик с приоритет: специфична за доставчика конфигурация → глобална конфигурация → променливи на средата (HTTPS_PROXY/HTTP_PROXY/ALL_PROXY). Поддържа NO_PROXY изключения. Кешира конфигурацията за 30s. |
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
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)
| Указател | Цел |
|---|---|
src/app/ |
Уеб потребителски интерфейс, API маршрути, Express междинен софтуер, манипулатори за обратно извикване OAuth |
src/lib/ |
Достъп до база данни (localDb.ts, usageDb.ts), удостоверяване, споделено |
src/mitm/ |
Прокси помощни програми Man-in-the-middle за прихващане на трафик на доставчик |
src/models/ |
Дефиниции на модел на база данни |
src/shared/ |
Обвивки около open-sse функции (доставчик, поток, грешка и др.) |
src/sse/ |
SSE манипулатори на крайни точки, които свързват библиотеката open-sse към експресни маршрути |
src/store/ |
Управление на състоянието на приложението |
| Маршрут | Методи | Цел |
|---|---|---|
/api/provider-models |
ПОЛУЧАВАНЕ/ПУБЛИКУВАНЕ/ИЗТРИВАНЕ | CRUD за потребителски модели на доставчик |
/api/models/catalog |
ВЗЕМЕТЕ | Обобщен каталог на всички модели (чат, вграждане, изображение, персонализирани), групирани по доставчик |
/api/settings/proxy |
ПОЛУЧАВАНЕ/ПОСТАВЯНЕ/ИЗТРИВАНЕ | Конфигурация на йерархичен изходящ прокси (global/providers/combos/keys) |
/api/settings/proxy/test |
ПУБЛИКАЦИЯ | Потвърждава прокси свързаността и връща публичен IP/латентност |
/v1/providers/[provider]/chat/completions |
ПУБЛИКАЦИЯ | Специализирани завършвания на чат за всеки доставчик с валидиране на модел |
/v1/providers/[provider]/embeddings |
ПУБЛИКАЦИЯ | Специализирани вграждания за всеки доставчик с валидиране на модел |
/v1/providers/[provider]/images/generations |
ПУБЛИКАЦИЯ | Специално генериране на изображения за всеки доставчик с валидиране на модел |
/api/settings/ip-filter |
ВЗЕМИ/ПОСТАВИ | Управление на списък с разрешени/блокирани IP |
/api/settings/thinking-budget |
ВЗЕМИ/ПОСТАВИ | Конфигурация на бюджета на токена за разсъждение (пропускане/автоматично/персонализирано/адаптивно) |
/api/settings/system-prompt |
ВЗЕМИ/ПОСТАВИ | Бързо инжектиране на глобална система за всички заявки |
/api/sessions |
ВЗЕМЕТЕ | Проследяване на активна сесия и показатели |
/api/rate-limits |
ВЗЕМЕТЕ | Състояние на ограничение на лимита по сметка |
Всички формати се превеждат през OpenAI формат като център. Добавянето на нов доставчик изисква само писане на една двойка преводачи (към/от OpenAI), а не на N двойки.
Всеки доставчик има специален клас изпълнител, наследен от BaseExecutor. Фабриката в executors/index.ts избира правилния по време на изпълнение.
Модулите за преводач се регистрират при импортиране чрез register(). Добавянето на нов преводач е просто създаване на файл и импортирането му.
Когато доставчикът върне 429/401/500, системата може да превключи към следващия акаунт, прилагайки експоненциално охлаждане (1s → 2s → 4s → max 2min).
„Комбо“ групира множество низове provider/model. Ако първият не успее, автоматично се върнете към следващия.
Преводът на отговор поддържа състоянието в SSE блокове (проследяване на мислещ блок, натрупване на извикване на инструмент, индексиране на блок съдържание) чрез механизма initState().
Добавя се буфер от 2000 токена към отчетеното използване, за да се предотврати достигането на ограниченията на контекстните прозорци на клиентите поради натоварване от системни подкани и превод на формати.
| Формат | Посока | Идентификатор |
|---|---|---|
| Завършвания на OpenAI чат | източник + цел | openai |
| OpenAI Responses API | източник + цел | openai-responses |
| Антропичен Клод | източник + цел | claude |
| Google Gemini | източник + цел | gemini |
| Google Gemini CLI | само цел | gemini-cli |
| Антигравитация | източник + цел | antigravity |
| AWS Киро | само цел | kiro |
| Курсор | само цел | cursor |
| Доставчик | Метод за удостоверяване | Изпълнител | Основни бележки |
|---|---|---|---|
| Антропичен Клод | API ключ или OAuth | По подразбиране | Използва x-api-key заглавка |
| Google Gemini | API ключ или OAuth | По подразбиране | Използва x-goog-api-key заглавка |
| Google Gemini CLI | OAuth | GeminiCLI | Използва streamGenerateContent крайна точка |
| Антигравитация | OAuth | Антигравитация | Multi-URL резервен, персонализиран повторен анализ |
| OpenAI | API ключ | По подразбиране | Удостоверяване на стандартен носител |
| Кодекс | OAuth | Кодекс | Инжектира системни инструкции, управлява мисленето |
| Копилот на GitHub | OAuth + Copilot token | Github | Двоен токен, имитираща заглавка на VSCode |
| Киро (AWS) | AWS SSO OIDC или социални | Киро | Парсинг на двоичен EventStream |
| Курсор IDE | Контролна сума за удостоверяване | Курсор | Protobuf кодиране, SHA-256 контролни суми |
| Куен | OAuth | По подразбиране | Стандартно удостоверяване |
| iFlow | OAuth (основен + носител) | По подразбиране | Заглавка за двойно удостоверяване |
| OpenRouter | API ключ | По подразбиране | Удостоверяване на стандартен носител |
| GLM, Kimi, MiniMax | API ключ | По подразбиране | Съвместим с Claude, използвайте x-api-key |
openai-compatible-* |
API ключ | По подразбиране | Динамично: всяка крайна точка, съвместима с OpenAI |
anthropic-compatible-* |
API ключ | По подразбиране | Динамично: всяка крайна точка, съвместима с Claude |
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()"]
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"]
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"]