OmniRoute/docs/i18n/ru/CODEBASE_DOCUMENTATION.md
diegosouzapw 4cfd1b94e1 docs: add multi-language i18n documentation translations
Add translated documentation (API Reference, Guide, README) for 30+
languages under docs/i18n/, including pt-BR, es, fr, de, it, ru, zh-CN,
ja, ko, ar, and many others to improve international accessibility.
2026-02-26 16:27:43 -03:00

52 KiB
Raw Blame History

omniroute — Документация по кодовой базе

🌐 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 прокси-маршрутизатору с искусственным интеллектом, работающим от нескольких поставщиков.


1. Что такое омнирут?

omniroute — это прокси-маршрутизатор, который находится между клиентами ИИ (Claude CLI, Codex, Cursor IDE и т. д.) и поставщиками ИИ (Anthropic, Google, OpenAI, AWS, GitHub и т. д.). Это решает одну большую проблему:

Различные клиенты ИИ говорят на разных «языках» (форматах API), и разные поставщики ИИ тоже ожидают разных «языков». omniroute автоматически переводит между ними.

Думайте об этом как об универсальном переводчике в Организации Объединенных Наций: любой делегат может говорить на любом языке, а переводчик переводит его для любого другого делегата.


2. Обзор архитектуры

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 трансляторов (по одному на каждый формат) вместо (каждая пара).


3. Структура проекта

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. Разбивка по модулям

4.1 Конфигурация (open-sse/config/)

Единый источник достоверной информации для всех конфигураций провайдеров.

Файл Цель
constants.ts Объект PROVIDERS с базовыми URL-адресами, учетными данными OAuth (по умолчанию), заголовками и системными приглашениями по умолчанию для каждого поставщика. Также определяет HTTP_STATUS, ERROR_TYPES, COOLDOWN_MS, BACKOFF_CONFIG и SKIP_PATTERNS.
credentialLoader.ts Загружает внешние учетные данные из data/provider-credentials.json и объединяет их с жестко запрограммированными значениями по умолчанию в PROVIDERS. Сохраняет секреты вне контроля версий, сохраняя при этом обратную совместимость.
providerModels.ts Центральный реестр моделей: псевдонимы поставщиков карт → идентификаторы моделей. Такие функции, как getModels(), getProviderByAlias().
codexInstructions.ts Системные инструкции, внедряемые в запросы Кодекса (ограничения редактирования, правила песочницы, политики утверждения).
defaultThinkingSignature.ts «Мыслящие» подписи по умолчанию для моделей Claude и Gemini.
ollamaModels.ts Определение схемы для локальных моделей Олламы (имя, размер, семейство, квантование).

Процесс загрузки учетных данных

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 Исполнители (open-sse/executors/)

Исполнители инкапсулируют логику, специфичную для поставщика, используя Шаблон стратегии. Каждый исполнитель переопределяет базовые методы по мере необходимости.

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 Клод, Близнецы, OpenAI, GLM, Кими, МиниМакс Обновление общего токена OAuth для стандартных поставщиков
antigravity.ts Облачный код Google Генерация идентификатора проекта/сеанса, резервное копирование нескольких URL-адресов, настраиваемый повторный анализ сообщений об ошибках («сброс через 2 часа 7 минут 23 секунды»)
cursor.ts Курсор IDE Самое сложное: проверка подлинности по контрольной сумме SHA-256, кодирование запроса Protobuf, двоичный поток событий → анализ ответа SSE
codex.ts Кодекс OpenAI Вводит системные инструкции, управляет уровнями мышления, удаляет неподдерживаемые параметры
gemini-cli.ts Интерфейс командной строки Google Gemini Создание собственного URL-адреса (streamGenerateContent), обновление токена Google OAuth
github.ts Второй пилот GitHub Система двух токенов (GitHub OAuth + токен Copilot), имитация заголовка VSCode
kiro.ts AWS CodeWhisperer Бинарный анализ AWS EventStream, кадры событий AMZN, оценка токенов
index.ts Фабрика: имя поставщика карт → класс исполнителя, с резервным вариантом по умолчанию

4.3 Обработчики (open-sse/handlers/)

Уровень оркестрации — координирует трансляцию, выполнение, потоковую передачу и обработку ошибок.

Файл Цель
chatCore.ts Центральный оркестратор (~600 строк). Обрабатывает полный жизненный цикл запроса: обнаружение формата → трансляция → отправка исполнителя → потоковый/непоточный ответ → обновление токена → обработка ошибок → журналирование использования.
responsesHandler.ts Адаптер для API ответов OpenAI: преобразует формат ответов → Завершения чата → отправляет в chatCore → преобразует SSE обратно в формат ответов.
embeddings.ts Обработчик генерации внедрения: разрешает модель внедрения → поставщик, отправляет в API поставщика, возвращает ответ на внедрение, совместимый с OpenAI. Поддерживает 6+ провайдеров.
imageGeneration.ts Обработчик генерации изображений: определяет модель изображения → поставщик, поддерживает режимы OpenAI-совместимый, Gemini-image (Антигравитация) и резервный режим (Nebius). Возвращает изображения в формате Base64 или URL.

Жизненный цикл запроса (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 Услуги (open-sse/services/)

Бизнес-логика, поддерживающая обработчики и исполнители.

Файл Цель
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 Обработка ограничения скорости: экспоненциальная отсрочка (1 с → 2 с → 4 с → максимум 2 минуты), управление временем восстановления учетной записи, классификация ошибок (какие ошибки вызывают откат, а какие нет).
tokenRefresh.ts Обновление токена OAuth для каждого поставщика: Google (Gemini, Antigravity), Claude, Codex, Qwen, iFlow, GitHub (OAuth + двойной токен Copilot), Kiro (AWS SSO OIDC + Social Auth). Включает в себя кэш дедупликации обещаний в реальном времени и повторные попытки с экспоненциальной задержкой.
combo.ts Комбо-модели: цепочки резервных моделей. Если модель A дает сбой из-за ошибки, допускающей возврат, попробуйте модель B, затем C и т. д. Возвращает фактические коды состояния восходящего потока.
usage.ts Извлекает данные о квотах/использовании из API-интерфейсов провайдера (квоты GitHub Copilot, квоты модели Antigravity, ограничения скорости Кодекса, разбивка использования 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"]

4.5 Переводчик (open-sse/translator/)

Механизм перевода форматов, использующий систему саморегистрирующихся плагинов.

Архитектура

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 (генерация идентификатора, вставка отсутствующего ответа), 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

4.6 Утилиты (open-sse/utils/)

Файл Цель
error.ts Построение ответов об ошибках (формат, совместимый с OpenAI), анализ ошибок восходящего потока, извлечение времени повтора Антигравитации из сообщений об ошибках, потоковая передача ошибок 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), оценка с помощью отдельных соотношений инструмента/сообщения на токен, добавление буфера (запас безопасности 2000 токенов), фильтрация полей для конкретного формата, ведение журнала консоли с цветами ANSI.
requestLogger.ts Ведение журнала запросов на основе файлов (согласие через ENABLE_REQUEST_LOGS=true). Создает папки сеансов с пронумерованными файлами: 1_req_client.json7_res_client.txt. Весь ввод-вывод является асинхронным (выстрелил и забыл). Маскирует чувствительные заголовки.
bypassHandler.ts Перехватывает определенные шаблоны из Claude CLI (извлечение заголовков, прогрев, подсчет) и возвращает поддельные ответы без вызова какого-либо провайдера. Поддерживает как потоковую, так и непотоковую передачу. Намеренно ограничено областью действия Claude CLI.
networkProxy.ts Разрешает URL-адрес исходящего прокси-сервера для данного поставщика с приоритетом: конфигурация конкретного поставщика → глобальная конфигурация → переменные среды (HTTPS_PROXY/HTTP_PROXY/ALL_PROXY). Поддерживает исключения NO_PROXY. Кэширует конфиг на 30 секунд.

Потоковый конвейер SSE

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)

4.7 Прикладной уровень (src/)

Каталог Цель
src/app/ Веб-интерфейс, маршруты API, промежуточное ПО Express, обработчики обратного вызова OAuth
src/lib/ Доступ к базе данных (localDb.ts, usageDb.ts), аутентификация, общий доступ
src/mitm/ Прокси-утилиты «Человек посередине» для перехвата трафика провайдера
src/models/ Определения модели базы данных
src/shared/ Обертки вокруг функций open-sse (поставщик, поток, ошибка и т. д.)
src/sse/ Обработчики конечных точек SSE, которые подключают библиотеку open-sse к маршрутам Express
src/store/ Управление состоянием приложения

Известные маршруты API

Маршрут Методы Цель
/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 ПОЛУЧИТЬ Статус ограничения ставки для каждого аккаунта

5. Ключевые шаблоны проектирования

5.1 Координатный перевод

Все форматы преобразуются через формат OpenAI в качестве концентратора. Для добавления нового провайдера требуется написать только одну пару трансляторов (в/из OpenAI), а не N пар.

5.2 Шаблон стратегии исполнителя

У каждого поставщика есть выделенный класс исполнителя, унаследованный от BaseExecutor. Фабрика в executors/index.ts выбирает правильный вариант во время выполнения.

5.3 Система саморегистрации плагинов

Модули переводчика регистрируются при импорте через register(). Добавление нового переводчика — это просто создание файла и его импорт.

5.4 Резервный аккаунт с экспоненциальным откатом

Когда провайдер возвращает 429/401/500, система может переключиться на следующую учетную запись, применяя экспоненциальное время восстановления (1 с → 2 с → 4 с → максимум 2 минуты).

5.5 Цепочки комбо-моделей

«Комбо» группирует несколько строк provider/model. Если первое не удалось, автоматически переходите к следующему.

5.6 Потоковая трансляция с сохранением состояния

Трансляция ответов поддерживает состояние блоков SSE (отслеживание мыслительных блоков, накопление вызовов инструментов, индексирование блоков контента) с помощью механизма initState().

5.7 Использование буфера безопасности

К сообщаемому использованию добавляется буфер на 2000 токенов, чтобы клиенты не превышали ограничения контекстного окна из-за накладных расходов на системные подсказки и преобразование формата.


6. Поддерживаемые форматы

Формат Направление Идентификатор
Завершения чата OpenAI источник + цель openai
API ответов OpenAI источник + цель openai-responses
Антропный Клод источник + цель claude
Google Близнецы источник + цель gemini
Интерфейс командной строки Google Gemini только цель gemini-cli
Антигравитация источник + цель antigravity
AWS Киро только цель kiro
Курсор только цель cursor

7. Поддерживаемые провайдеры

Провайдер Метод аутентификации Исполнитель Ключевые примечания
Антропный Клод Ключ API или OAuth По умолчанию Использует заголовок x-api-key
Google Близнецы Ключ API или OAuth По умолчанию Использует заголовок x-goog-api-key
Интерфейс командной строки Google Gemini ОАутент БлизнецыCLI Использует конечную точку streamGenerateContent
Антигравитация ОАутент Антигравитация Резервный вариант нескольких URL-адресов, индивидуальный анализ повторов
ОпенАИ API-ключ По умолчанию Проверка подлинности стандартного носителя
Кодекс ОАутент Кодекс Вводит системные инструкции, управляет мышлением
Второй пилот GitHub OAuth + токен Copilot Гитхаб Двойной токен, имитация заголовка VSCode
Киро (AWS) AWS SSO OIDC или Social Киро Анализ двоичного потока событий
Курсор IDE Проверка контрольной суммы Курсор Кодирование Protobuf, контрольные суммы SHA-256
Квен ОАутент По умолчанию Стандартная аутентификация
iFlow OAuth (базовый + носитель) По умолчанию Заголовок двойной аутентификации
OpenRouter API-ключ По умолчанию Проверка подлинности стандартного носителя
ГЛМ, Кими, МиниМакс API-ключ По умолчанию Совместимость с Claude, используйте x-api-key
openai-compatible-* API-ключ По умолчанию Динамический: любая конечная точка, совместимая с OpenAI
anthropic-compatible-* API-ключ По умолчанию Динамический: любая конечная точка, совместимая с Claude

8. Сводная информация о потоке данных

Запрос потоковой передачи

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"]

Обход потока (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"]