🌐 **Languages:** 🇺🇞 [English](../../CODEBASE_DOCUMENTATION.md) | 🇧🇷 [Português (Brasil)](../pt-BR/CODEBASE_DOCUMENTATION.md) | 🇪🇞 [Español](../es/CODEBASE_DOCUMENTATION.md) | 🇫🇷 [Français](../fr/CODEBASE_DOCUMENTATION.md) | 🇮🇹 [Italiano](../it/CODEBASE_DOCUMENTATION.md) | 🇷🇺 [РусскОй](../ru/CODEBASE_DOCUMENTATION.md) | 🇚🇳 [äž­æ–‡ (简䜓)](../zh-CN/CODEBASE_DOCUMENTATION.md) | 🇩🇪 [Deutsch](../de/CODEBASE_DOCUMENTATION.md) | 🇮🇳 [à€¹à€¿à€šà¥à€Šà¥€](../in/CODEBASE_DOCUMENTATION.md) | 🇹🇭 [à¹„àž—àž¢](../th/CODEBASE_DOCUMENTATION.md) | 🇺🇊 [УкраїМська](../uk-UA/CODEBASE_DOCUMENTATION.md) | 🇞🇊 [العرؚية](../ar/CODEBASE_DOCUMENTATION.md) | 🇯🇵 [日本語](../ja/CODEBASE_DOCUMENTATION.md) | 🇻🇳 [Tiếng Việt](../vi/CODEBASE_DOCUMENTATION.md) | 🇧🇬 [БългарскО](../bg/CODEBASE_DOCUMENTATION.md) | 🇩🇰 [Dansk](../da/CODEBASE_DOCUMENTATION.md) | 🇫🇮 [Suomi](../fi/CODEBASE_DOCUMENTATION.md) | 🇮🇱 [עבךית](../he/CODEBASE_DOCUMENTATION.md) | 🇭🇺 [Magyar](../hu/CODEBASE_DOCUMENTATION.md) | 🇮🇩 [Bahasa Indonesia](../id/CODEBASE_DOCUMENTATION.md) | 🇰🇷 [한국얎](../ko/CODEBASE_DOCUMENTATION.md) | 🇲🇟 [Bahasa Melayu](../ms/CODEBASE_DOCUMENTATION.md) | 🇳🇱 [Nederlands](../nl/CODEBASE_DOCUMENTATION.md) | 🇳🇎 [Norsk](../no/CODEBASE_DOCUMENTATION.md) | 🇵🇹 [Português (Portugal)](../pt/CODEBASE_DOCUMENTATION.md) | 🇷🇎 [Română](../ro/CODEBASE_DOCUMENTATION.md) | 🇵🇱 [Polski](../pl/CODEBASE_DOCUMENTATION.md) | 🇞🇰 [Slovenčina](../sk/CODEBASE_DOCUMENTATION.md) | 🇞🇪 [Svenska](../sv/CODEBASE_DOCUMENTATION.md) | 🇵🇭 [Filipino](../phi/CODEBASE_DOCUMENTATION.md) #omniroute — コヌドベヌスのドキュメント > **omniroute** マルチプロバむダヌ AI プロキシ ルヌタヌに関する初心者向けの包括的なガむド。 --- ## 1. オムニルヌトずは䜕ですか? オムニルヌトは、AI クラむアント (Claude CLI、Codex、Cursor IDE など) ず AI プロバむダヌ (Anthropic、Google、OpenAI、AWS、GitHub など) の間に䜍眮する **プロキシ ルヌタヌ** です。これにより、1 ぀の倧きな問題が解決されたす。 > **異なる AI クラむアントは異なる「蚀語」(API 圢匏) を話し、異なる AI プロバむダヌも異なる「蚀語」を期埅したす。** オムニルヌトはそれらの間で自動的に翻蚳したす。 これを囜連の䞇胜翻蚳者のようなものだず考えおください。どの代衚者もあらゆる蚀語を話すこずができ、翻蚳者は他の代衚者のためにそれを倉換したす。 --- ## 2. アヌキテクチャの抂芁 ```mermaid 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 モデルのスキヌマ定矩 (名前、サむズ、ファミリヌ、量子化)。 | #### 認蚌情報の読み蟌みフロヌ ```mermaid 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/`) ゚グれキュヌタは、**戊略パタヌン**を䜿甚しお**プロバむダ固有のロゞック**をカプセル化したす。各゚グれキュヌタは、必芁に応じお基本メ゜ッドをオヌバヌラむドしたす。 ```mermaid 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) ```mermaid 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
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-*` など) を具䜓的なプロバむダヌ/モデルのペアに解決したす。 | #### トヌクンのリフレッシュの重耇排陀 ```mermaid 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 ``` #### アカりント フォヌルバック ステヌト マシン ```mermaid 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 } ``` #### コンボ モデル チェヌン ```mermaid 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/`) 自己登録プラグむン システムを䜿甚した **フォヌマット倉換゚ンゞン**。 #### アヌキテクチャ ```mermaid 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`。 | #### 䞻な蚭蚈: 自己登録プラグむン ```javascript // 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 ストリヌミング パむプラむン ```mermaid 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. デヌタフロヌの抂芁 ### ストリヌミングリク゚スト ```mermaid 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()"] ``` ### 非ストリヌミングリク゚スト ```mermaid 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) ```mermaid 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"] ```