OmniRoute/docs/i18n/ja/CODEBASE_DOCUMENTATION.md
diegosouzapw 369a0141de docs(i18n): add Hungarian translation of ARCHITECTURE.md
Add Magyar (hu) translation of the architecture documentation
to support Hungarian-speaking contributors and users.
2026-02-26 16:26:35 -03:00

43 KiB

🌐 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 プロキシ ルヌタヌに関する初心者向けの包括的なガむド。


1. オムニルヌトずは䜕ですか?

オムニルヌトは、AI クラむアント (Claude CLI、Codex、Cursor IDE など) ず AI プロバむダヌ (Anthropic、Google、OpenAI、AWS、GitHub など) の間に䜍眮する プロキシ ルヌタヌ です。これにより、1 ぀の倧きな問題が解決されたす。

異なる AI クラむアントは異なる「蚀語」(API 圢匏) を話し、異なる AI プロバむダヌも異なる「蚀語」を期埅したす。 オムニルヌトはそれらの間で自動的に翻蚳したす。

これを囜連の䞇胜翻蚳者のようなものだず考えおください。どの代衚者もあらゆる蚀語を話すこずができ、翻蚳者は他の代衚者のためにそれを倉換したす。


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² (ペアごず) ではなく、N トランスレヌタヌ (フォヌマットごずに 1 人) だけが必芁であるこずを意味したす。


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 䞭倮モデル レゞストリ: プロバむダヌの゚むリアス → モデル 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

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、キミ、MiniMax 暙準プロバむダヌの汎甚 OAuth トヌクンの曎新
antigravity.ts Googleクラりドコヌド プロゞェクト/セッション ID の生成、マルチ URL フォヌルバック、゚ラヌ メッセヌゞからのカスタム再詊行解析 (「2 時間 7 分 23 秒埌にリセット」)
cursor.ts カヌ゜ルIDE 最も耇雑: SHA-256 チェックサム認蚌、Protobuf リク゚スト ゚ンコヌド、バむナリ EventStream → SSE レスポンス解析
codex.ts OpenAI コヌデックス システム呜什の挿入、思考レベルの管理、サポヌトされおいないパラメヌタの削陀
gemini-cli.ts Google Gemini CLI カスタム 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 OpenAI の応答 API 甚アダプタヌ: 応答圢匏を倉換 → チャット完了 → chatCore に送信 → SSE を応答圢匏に倉換したす。
embeddings.ts 埋め蟌み生成ハンドラヌ: 埋め蟌みモデル→プロバむダヌを解決し、プロバむダヌ API にディスパッチし、OpenAI 互換の埋め蟌み応答を返したす。 6 ぀以䞊のプロバむダヌをサポヌトしたす。
imageGeneration.ts むメヌゞ生成ハンドラヌ: むメヌゞ モデル → プロバむダヌを解決し、OpenAI 互換、Gemini むメヌゞ (Antigravity)、およびフォヌルバック (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 圢匏を識別したす (Claude の max_tokens ヒュヌリスティックを含む)。たた、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)。実行䞭の Promise 重耇排陀キャッシュず指数バックオフによる再詊行が含たれたす。
combo.ts コンボ モデル: フォヌルバック モデルのチェヌン。モデル A がフォヌルバック察象゚ラヌで倱敗した堎合は、モデル B、次にモデル C などを詊したす。実際のアップストリヌム ステヌタス コヌドを返したす。
usage.ts プロバむダヌ API からクォヌタ/䜿甚量デヌタを取埗したす (GitHub Copilot クォヌタ、反重力モデル クォヌタ、Codex レヌト制限、Kiro 䜿甚量の内蚳、Claude 蚭定)。
accountSelector.ts スコアリング アルゎリズムを䜿甚したスマヌトなアカりント遞択: 優先床、健党性ステヌタス、ラりンドロビン ポゞション、クヌルダりン状態を考慮しお、各リク゚ストに最適なアカりントを遞択したす。
contextManager.ts リク゚スト コンテキストのラむフサむクル管理: デバッグずロギングのために、メタデヌタ (リク゚スト ID、タむムスタンプ、プロバむダヌ情報) を含むリク゚ストごずのコンテキスト オブゞェクトを䜜成および远跡したす。
ipFilter.ts IP ベヌスのアクセス制埡: ホワむトリスト モヌドずブロックリスト モヌドをサポヌトしたす。 API リク゚ストを凊理する前に、蚭定されたルヌルに照らしおクラむアント IP を怜蚌したす。
sessionManager.ts クラむアント フィンガヌプリントによるセッション远跡: ハッシュされたクラむアント ID を䜿甚しおアクティブなセッションを远跡し、リク゚スト数を監芖し、セッション メトリックを提䟛したす。
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 (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

4.6 ナヌティリティ (open-sse/utils/)

ファむル 目的
error.ts ゚ラヌ応答の構築 (OpenAI 互換圢匏)、アップストリヌム ゚ラヌ解析、゚ラヌ メッセヌゞからの反重力再詊行時間の抜出、SSE ゚ラヌ ストリヌミング。
stream.ts SSE Transform Stream — コア ストリヌミング パむプラむン。 2 ぀のモヌド: TRANSLATE (完党な圢匏の倉換) ず PASSTHROUGH (正芏化 + 䜿甚法の抜出)。チャンクのバッファリング、䜿甚量の掚定、コンテンツの長さの远跡を凊理したす。ストリヌムごずの゚ンコヌダ/デコヌダ むンスタンスは共有状態を回避したす。
streamHelpers.ts 䜎レベル SSE ナヌティリティ: parseSSELine (ホワむトスペヌス耐性)、hasValuableContent (OpenAI/Claude/Gemini の空のチャンクをフィルタリング)、fixInvalidId、formatSSE (perf_metrics クリヌンアップによる圢匏認識 SSE シリアル化)。
usageTracking.ts 任意の圢匏 (Claude/OpenAI/Gemini/Responses) からのトヌクン䜿甚量の抜出、別個のツヌル/メッセヌゞの文字数ずトヌクンの比率による掚定、バッファヌの远加 (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 の陀倖をサポヌトしたす。蚭定を 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/ Web UI、API ルヌト、Express ミドルりェア、OAuth コヌルバック ハンドラヌ
src/lib/ デヌタベヌス アクセス (localDb.ts、usageDb.ts)、認蚌、共有
src/mitm/ プロバむダヌのトラフィックを傍受する䞭間者プロキシ ナヌティリティ
src/models/ デヌタベヌスモデルの定矩
src/shared/ open-sse 関数 (プロバむダヌ、ストリヌム、゚ラヌなど) のラッパヌ
src/sse/ open-sse ラむブラリを Express ルヌトに接続する SSE ゚ンドポむント ハンドラヌ
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 GET/PUT IP ホワむトリスト/ブロックリスト管理
/api/settings/thinking-budget GET/PUT 掚論トヌクンの予算構成 (パススルヌ/自動/カスタム/アダプティブ)
/api/settings/system-prompt GET/PUT すべおのリク゚ストに察するグロヌバル システム プロンプト むンゞェクション
/api/sessions 入手 アクティブなセッションの远跡ずメトリクス
/api/rate-limits 入手 アカりントごずのレヌト制限ステヌタス

5. 䞻芁な蚭蚈パタヌン

5.1 ハブアンドスポヌク倉換

すべおの圢匏は OpenAI 圢匏をハブずしお倉換したす。新しいプロバむダヌを远加するには、N ペアではなく、1 ペア のトランスレヌタヌ (OpenAI ずの間) を䜜成するだけで枈みたす。

5.2 ゚グれキュヌタヌ戊略パタヌン

各プロバむダヌには、BaseExecutor を継承する専甚の実行クラスがありたす。 executors/index.ts のファクトリは、実行時に正しいものを遞択したす。

5.3 自己登録プラグむン システム

トランスレヌタ モゞュヌルは、むンポヌト時に register() を介しお自身を登録したす。新しいトランスレヌタを远加するには、ファむルを䜜成しおむンポヌトするだけです。

5.4 指数関数的バックオフによるアカりントのフォヌルバック

プロバむダヌが 429/401/500 を返すず、システムは次のアカりントに切り替えお、指数関数的なクヌルダりン (1 秒 → 2 秒 → 4 秒 → 最倧 2 分) を適甚できたす。

5.5 コンボモデルチェヌン

「コンボ」は、耇数の provider/model 文字列をグルヌプ化したす。最初の凊理が倱敗した堎合は、自動的に次の凊理にフォヌルバックしたす。

5.6 ステヌトフル ストリヌミング倉換

応答の倉換は、initState() メカニズムを介しお、SSE チャンク党䜓 (思考ブロックの远跡、ツヌル呌び出しの蓄積、コンテンツ ブロックのむンデックス䜜成) の状態を維持したす。

5.7 䜿甚安党バッファヌ

システム プロンプトや圢匏倉換によるオヌバヌヘッドによっおクラむアントがコンテキスト りィンドりの制限に達するのを防ぐために、報告された䜿甚量に 2000 トヌクンのバッファヌが远加されたす。


6. サポヌトされおいる圢匏

フォヌマット 方向 識別子
OpenAI チャットの完了 ゜ヌス + タヌゲット openai
OpenAI レスポンス API ゜ヌス + タヌゲット openai-responses
人間のクロヌド ゜ヌス + タヌゲット claude
Google ゞェミニ ゜ヌス + タヌゲット gemini
Google Gemini CLI タヌゲットのみ gemini-cli
反重力 ゜ヌス + タヌゲット antigravity
AWS キロ タヌゲットのみ kiro
カヌ゜ル タヌゲットのみ cursor

7. サポヌトされおいるプロバむダヌ

プロバむダヌ 認蚌方法 執行者 重芁なメモ
人間のクロヌド API キヌたたは OAuth デフォルト x-api-key ヘッダヌを䜿甚したす。
Google ゞェミニ API キヌたたは OAuth デフォルト x-goog-api-key ヘッダヌを䜿甚したす。
Google Gemini CLI OAuth ゞェミニCLI streamGenerateContent ゚ンドポむントを䜿甚したす。
反重力 OAuth 反重力 マルチ URL フォヌルバック、カスタム再詊行解析
オヌプンAI APIキヌ デフォルト 暙準ベアラヌ認蚌
コヌデックス OAuth コヌデックス システム呜什を泚入し、思考を管理したす
GitHub コパむロット OAuth + コパむロット トヌクン ギットハブ デュアル トヌクン、VSCode ヘッダヌの暡倣
キロ (AWS) AWS SSO OIDC たたは゜ヌシャル キロ バむナリ EventStream 解析
カヌ゜ルIDE チェックサム認蚌 カヌ゜ル Protobuf ゚ンコヌディング、SHA-256 チェックサム
クりェン OAuth デフォルト 暙準認蚌
iFlow OAuth (ベヌシック + ベアラヌ) デフォルト デュアル認蚌ヘッダヌ
オヌプンルヌタヌ APIキヌ デフォルト 暙準ベアラヌ認蚌
GLM、キミ、ミニマックス APIキヌ デフォルト Claude ず互換性があるため、x-api-key を䜿甚しおください。
openai-compatible-* APIキヌ デフォルト 動的: 任意の OpenAI 互換゚ンドポむント
anthropic-compatible-* APIキヌ デフォルト 動的: クロヌドず互換性のある任意の゚ンドポむント

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