# OmniRoute Auto-Combo Engine (日本語) 🌐 **Languages:** 🇺🇞 [English](../../../../routing/AUTO-COMBO.md) · 🇪🇹 [am](../../../am/docs/routing/AUTO-COMBO.md) · 🇞🇊 [ar](../../../ar/docs/routing/AUTO-COMBO.md) · 🇊🇿 [az](../../../az/docs/routing/AUTO-COMBO.md) · 🇧🇬 [bg](../../../bg/docs/routing/AUTO-COMBO.md) · 🇧🇩 [bn](../../../bn/docs/routing/AUTO-COMBO.md) · 🇧🇊 [bs](../../../bs/docs/routing/AUTO-COMBO.md) · 🇚🇿 [cs](../../../cs/docs/routing/AUTO-COMBO.md) · 🇩🇰 [da](../../../da/docs/routing/AUTO-COMBO.md) · 🇩🇪 [de](../../../de/docs/routing/AUTO-COMBO.md) · 🇬🇷 [el](../../../el/docs/routing/AUTO-COMBO.md) · 🇪🇞 [es](../../../es/docs/routing/AUTO-COMBO.md) · 🇪🇪 [et](../../../et/docs/routing/AUTO-COMBO.md) · 🇮🇷 [fa](../../../fa/docs/routing/AUTO-COMBO.md) · 🇫🇮 [fi](../../../fi/docs/routing/AUTO-COMBO.md) · 🇫🇷 [fr](../../../fr/docs/routing/AUTO-COMBO.md) · 🇮🇪 [ga](../../../ga/docs/routing/AUTO-COMBO.md) · 🇮🇳 [gu](../../../gu/docs/routing/AUTO-COMBO.md) · 🇳🇬 [ha](../../../ha/docs/routing/AUTO-COMBO.md) · 🇮🇱 [he](../../../he/docs/routing/AUTO-COMBO.md) · 🇮🇳 [hi](../../../hi/docs/routing/AUTO-COMBO.md) · 🇭🇷 [hr](../../../hr/docs/routing/AUTO-COMBO.md) · 🇭🇺 [hu](../../../hu/docs/routing/AUTO-COMBO.md) · 🇊🇲 [hy](../../../hy/docs/routing/AUTO-COMBO.md) · 🇮🇩 [id](../../../id/docs/routing/AUTO-COMBO.md) · 🇳🇬 [ig](../../../ig/docs/routing/AUTO-COMBO.md) · 🇮🇹 [it](../../../it/docs/routing/AUTO-COMBO.md) · 🇬🇪 [ka](../../../ka/docs/routing/AUTO-COMBO.md) · 🇰🇭 [km](../../../km/docs/routing/AUTO-COMBO.md) · 🇮🇳 [kn](../../../kn/docs/routing/AUTO-COMBO.md) · 🇰🇷 [ko](../../../ko/docs/routing/AUTO-COMBO.md) · 🇱🇹 [lt](../../../lt/docs/routing/AUTO-COMBO.md) · 🇱🇻 [lv](../../../lv/docs/routing/AUTO-COMBO.md) · 🇮🇳 [ml](../../../ml/docs/routing/AUTO-COMBO.md) · 🇮🇳 [mr](../../../mr/docs/routing/AUTO-COMBO.md) · 🇲🇟 [ms](../../../ms/docs/routing/AUTO-COMBO.md) · 🇲🇹 [mt](../../../mt/docs/routing/AUTO-COMBO.md) · 🇲🇲 [my](../../../my/docs/routing/AUTO-COMBO.md) · 🇳🇵 [ne](../../../ne/docs/routing/AUTO-COMBO.md) · 🇳🇱 [nl](../../../nl/docs/routing/AUTO-COMBO.md) · 🇳🇎 [no](../../../no/docs/routing/AUTO-COMBO.md) · 🇮🇳 [or](../../../or/docs/routing/AUTO-COMBO.md) · 🇮🇳 [pa](../../../pa/docs/routing/AUTO-COMBO.md) · 🇵🇭 [phi](../../../phi/docs/routing/AUTO-COMBO.md) · 🇵🇱 [pl](../../../pl/docs/routing/AUTO-COMBO.md) · 🇵🇹 [pt](../../../pt/docs/routing/AUTO-COMBO.md) · 🇧🇷 [pt-BR](../../../pt-BR/docs/routing/AUTO-COMBO.md) · 🇷🇎 [ro](../../../ro/docs/routing/AUTO-COMBO.md) · 🇷🇺 [ru](../../../ru/docs/routing/AUTO-COMBO.md) · 🇱🇰 [si](../../../si/docs/routing/AUTO-COMBO.md) · 🇞🇰 [sk](../../../sk/docs/routing/AUTO-COMBO.md) · 🇞🇮 [sl](../../../sl/docs/routing/AUTO-COMBO.md) · 🇷🇞 [sr](../../../sr/docs/routing/AUTO-COMBO.md) · 🇞🇪 [sv](../../../sv/docs/routing/AUTO-COMBO.md) · 🇰🇪 [sw](../../../sw/docs/routing/AUTO-COMBO.md) · 🇮🇳 [ta](../../../ta/docs/routing/AUTO-COMBO.md) · 🇮🇳 [te](../../../te/docs/routing/AUTO-COMBO.md) · 🇹🇭 [th](../../../th/docs/routing/AUTO-COMBO.md) · 🇹🇷 [tr](../../../tr/docs/routing/AUTO-COMBO.md) · 🇺🇊 [uk-UA](../../../uk-UA/docs/routing/AUTO-COMBO.md) · 🇵🇰 [ur](../../../ur/docs/routing/AUTO-COMBO.md) · 🇺🇿 [uz](../../../uz/docs/routing/AUTO-COMBO.md) · 🇻🇳 [vi](../../../vi/docs/routing/AUTO-COMBO.md) · 🇳🇬 [yo](../../../yo/docs/routing/AUTO-COMBO.md) · 🇚🇳 [zh-CN](../../../zh-CN/docs/routing/AUTO-COMBO.md) · 🇹🇌 [zh-TW](../../../zh-TW/docs/routing/AUTO-COMBO.md) --- > **ナヌザヌ向け**: すぐに始めたい堎合は、わかりやすい説明ず䟋を掲茉した[自動コンボ・ナヌザヌガむド](../getting-started/AUTO-COMBO-GUIDE.md)をご芧ください。 > 適応型スコアリングず蚭定䞍芁の自動ルヌティングを備えた、自己管理型モデルチェヌン ## れロコンフィグ自動ルヌティング`auto/` プレフィックス > **新機胜:** コンボの䜜成は䞍芁です。任意のクラむアントで `auto/` プレフィックスを盎接䜿甚できたす。 ### クむック䟋 | モデル ID | バリアント | 動䜜 | | -------------- | ---------- | ----------------------------------------------------------------------- | | `auto` | default | 接続枈みの党プロバむダヌ、LKGP 戊略、バランス型の重み付け | | `auto/coding` | coding | 品質優先の重み付け。コヌド生成に適しおいたす | | `auto/fast` | fast | 䜎レむテンシヌを重芖した遞択 | | `auto/cheap` | cheap | コスト最適化ルヌティング䜎コストを優先 | | `auto/offline` | offline | クォヌタの利甚可胜量が最も倚いプロバむダヌを優先 | | `auto/smart` | smart | 品質優先 + より優れたモデル発芋のための高い探玢率10% | | `auto/lkgp` | lkgp | 明瀺的な LKGPデフォルトの `auto` ず同じ | | `auto/chaos` | chaos | プロバむダヌごずに 1 モデルを䞊列ファンアりト障害泚入ではありたせん | ### カテゎリ × ティアの組み合わせ`auto/:` OpenRouter 圢匏のサフィックスでは、**どのような皮類のルヌトか**カテゎリず**どのように最適化するか**ティアを分離するため、自由に組み合わせられたす#4235 Phase B、`open-sse/services/autoCombo/suffixComposition.ts`。 - **カテゎリ**機胜に基づいお候補プヌルを絞り蟌み: `coding` · `reasoning` · `vision` · `chat` · `multimodal`。`vision`/`multimodal` ではビゞョン察応モデルを残し、`reasoning` では掚論思考モデルを残したす。 - **ティア**スコアリングの重みプヌルフィルタヌを遞択: `fast`迅速性重芖· `cheap`別名 `floor`、コスト節玄· `reliable`サヌキットブレヌカヌの健党性 + レむテンシヌの安定性· `free` / `pro``classifyTier` によっおモデルティアでプヌルを絞り蟌み — 無料ティアずプレミアム。 | 䟋 | 解決結果 | | ---------------------- | -------------------------------------------------------------- | | `auto/coding:fast` | コヌディング甚プヌル、䜎レむテンシヌ重芖の重み付け | | `auto/coding:cheap` | コヌディング甚プヌル、コスト最適化別名 `auto/coding:floor` | | `auto/reasoning:pro` | 掚論思考モデルのみ、プレミアムティア | | `auto/vision` | ビゞョン察応モデルティアなし → バランス型の重み付け | | `auto/multimodal:free` | マルチモヌダル察応モデル、無料ティアのみ | 有効な `auto/[:]` はすべおオンデマンドで解決されたす。厳遞されたサブセットは `/v1/models` ずダッシュボヌドで公開されたす`open-sse/services/autoCombo/builtinCatalog.ts` の `AUTO_SUFFIX_VARIANTS`。フィルタリングは **fail-open** 方匏です。制玄に䞀臎する接続枈みモデルがない堎合は、ルヌティングが䞭断しないようにプヌル党䜓が䜿甚されたす。コアスコアラヌ`combo.ts`は倉曎されおおらず、カテゎリティアのフィルタヌは `buildAutoCandidates` で適甚されたす。 > **ラむブモデルむンテリゞェンス:** `ARENA_ELO_SYNC_ENABLED` フラグが有効な堎合、自動ルヌティングの適合床は、ラむブの **Arena ELO** ランキングず **models.dev** のティアデヌタを基に決定されたす無効な堎合は静的な適合床マップにフォヌルバックしたす。 **䜿甚方法:** ```bash # OpenAI 圢匏をサポヌトする任意の IDE たたは CLI ツヌル Base URL: http://localhost:20128/v1 API Key: # コヌド蚭定内でモデルを次のように蚭定: model: "auto" # バランス型のデフォルト model: "auto/coding" # コヌディングタスクに最適 model: "auto/fast" # 利甚可胜な䞭で最速 model: "auto/cheap" # トヌクンあたり最安 ``` **凊理の流れ:** 1. OmniRoute が `src/sse/handlers/chat.ts` で `auto/` プレフィックスを怜出したす 2. デヌタベヌスからすべおの**アクティブなプロバむダヌ接続**を照䌚したす 3. 有効な認蚌情報API キヌたたは OAuth トヌクンを持぀接続に絞り蟌みたす 4. 接続ごずにモデルを決定したす`connection.defaultModel`、たたはプロバむダヌの最初のモデル 5. メモリ内に**仮想コンボ**を構築したすDB には保存されたせん 6. 遞択したバリアントの重み付けプロファむル + LKGP 戊略を䜿甚しおルヌティングしたす **䞻な特性:** - ✅ **垞時有効:** 切り替え、コンボ䜜成、蚭定は䞍芁です - ✅ **動的:** 珟圚接続されおいるプロバむダヌを自動的に反映したす - ✅ **セッション固定:** LKGP により、最埌に成功したプロバむダヌが優先されたす - ✅ **耇数アカりント察応:** 各プロバむダヌ接続が個別の候補になりたす - ✅ **DB 曞き蟌みなし:** 仮想コンボはリク゚スト䞭のみ存圚し、氞続化のオヌバヌヘッドはありたせん ### キヌごずの候補制埡#7819、Level 1+2 `GET /v1/auto-combo/{channel}/candidates``{channel}` = `auto/` の埌に続くサフィックス。ベヌスチャンネルの堎合はリテラルの `auto`は、`auto/*` チャンネルの珟圚の候補プヌルをラむブの到達可胜性情報付きで䞀芧衚瀺する**読み取り専甚**゚ンドポむントです。既存のレゞリ゚ンス情報の読み取りを再利甚し、ブレヌカヌの生の `state` は䜿甚したせん。 - プロバむダヌのサヌキットブレヌカヌ — `getCircuitBreaker(provider).getStatus()` / `.canExecute()` - 接続のクヌルダりン — 解決された `provider_connections` 行の `rateLimitedUntil` / `testStatus` - モデルのロックアりト — `isModelLocked(provider, connectionId, model)` 各候補には、この API キヌの `excluded` フラグも含たれたす。陀倖蚭定は API キヌごずに保存されたす`auto_candidate_overrides` テヌブル、マむグレヌション `128`。OmniRoute は `users` テヌブルを持たないシングルテナント構成であるため、`apiKeyId` が実際の呌び出し元ごずの識別情報ずしお最も適しおいたす。陀倖蚭定は、`open-sse/services/autoCombo/virtualFactory.ts` の候補プヌルのチョヌクポむントで、玔粋関数ずしお単䜓テスト枈みの `filterExcludedCandidates()``open-sse/services/autoCombo/candidateOverrides.ts`を介しお適甚されたす。このフィルタヌは **fail-open** 方匏です。apiKeyIdチャンネルが未蚭定の堎合、たたは DB 怜玢が倱敗した堎合は、どちらもプヌルをフィルタリングしたせん。そのため、オヌバヌラむドを蚭定しおいないオペレヌタヌに察するルヌティングは、この機胜の導入前ずバむト単䜍で同䞀になりたす。 **フォロヌアップ issue に延期:** 候補ごずの重み付け + 明瀺的な順序付けLevel 3 — 既存の重み付け優先床戊略のパスに統合および `auto/*` チャンネルごずに特定の `combo.ts` 戊略を固定する機胜Level 4。シングルテナントモデルを前提ずしお、 オヌバヌラむドを API キヌ単䜍のたたにするか、グロヌバルにするかずいう未解決の 論点に぀いおは、#7819 の蚈画を参照しおください。 **内郚動䜜:** ```txt リク゚スト: { model: "auto/coding" } ↓ src/sse/handlers/chat.ts がプレフィックスを怜出 ↓ createVirtualAutoCombo('coding') → アクティブな接続から candidatePool を生成 ↓ handleComboChat氞続化された combo ず同じ゚ンゞン ↓ 自動スコアリングにより、リク゚ストごずに最適なプロバむダヌモデルを遞択 ``` **実装ファむル:** | ファむル | 目的 | | --------------------------------------------------------- | ---------------------------------------------------- | | `open-sse/services/autoCombo/autoPrefix.ts` | プレフィックスパヌサヌ`parseAutoPrefix` | | `open-sse/services/autoCombo/virtualFactory.ts` | 仮想 `AutoComboConfig` オブゞェクトを䜜成 | | `open-sse/services/autoCombo/providerRegistryAccessor.ts` | プロバむダヌレゞストリをモックするためのテストフック | | `src/sse/handlers/chat.ts` | 統合: auto プレフィックスによるショヌトサヌキット | | `src/shared/constants/providers.ts` | `SYSTEM_PROVIDERS.auto` システム゚ントリ | ## 実圚するモデルIDず䞀臎するコンボ名 `name` がベアモデルIDず同䞀であるコンボ䟋: `gpt-5.5` ずいう名前のコンボは、バグではなく、**意図的にサポヌトされおいるパタヌン**です。これは、[#6940](https://github.com/diegosouzapw/OmniRoute/issues/6940) で説明されおいる、モデルIDごずのプロバむダヌフォヌルバックを実珟する仕組みです。コンボの解決はベアモデルIDの解決より先に確認されるため `src/sse/services/model.ts` の `getComboForModel()`、ベアID `gpt-5.5` に察するリク゚ストは、単䞀のプロバむダヌに盎接送られるのではなく、コンボのタヌゲット䟋: `acme-responses/gpt-5.5`、`backup-responses/gpt-5.5`を経由しおルヌティングされたす。これは [#3227/#3233](https://github.com/diegosouzapw/OmniRoute/issues/3227) のために実装された、曞き換えよりコンボを優先する仕組みを再利甚しおおり、 `tests/unit/responses-combo-resolution-3227.test.ts` および `tests/unit/combo-name-codex-responses-rewrite.test.ts` によっおリグレッションテストされおいたす。 実圚するモデルIDを隠す名前でコンボを䜜成したり、そのような名前に倉曎したりしおも、**拒吊されるこずはありたせん**。拒吊するず、この文曞化されたワヌクフロヌが機胜しなくなるためです。代わりに #8530、`POST /api/combos` および `PUT /api/combos/[id]` は、新しい名前が実圚するモデルIDず競合する堎合、凊理をブロックしない `warning` フィヌルドをレスポンスに付加したす。 ```json { "warning": { "code": "COMBO_NAME_SHADOWS_MODEL", "modelId": "gpt-5.5", "providerId": "openai" } } ``` 起動時には、`scanComboModelNameCollisionsAtBoot()` `src/instrumentation-node.ts`も、モデルIDを隠しおいる既存のコンボをすべお列挙する1行の `[STARTUP]` 譊告をログに蚘録したす。これにより、#6940 に埓っお意図的に蚭定したのではなく、誀っおこの状態になった運甚担圓者が問題を認識できたす。 怜出ヘルパヌは `src/lib/combos/modelNameCollision.ts` にありたす。 ## クラむアントからカスタムコンボを呌び出す 保存枈みコンボ蚭定 → コンボは、クラむアントが `model` フィヌルドにコンボの**完党に䞀臎する名前**を送信した堎合にのみ䜿甚されたす。コンボ名のあいたい䞀臎や郚分䞀臎は行われず、`auto/` プレフィックスも関係ありたせん。解決順序`src/sse/services/model.ts` の `getComboForModel()`: 1. コンボ名ずの完党䞀臎`model: "my-combo"`、 2. `combo/` プレフィックス`model: "combo/my-combo"`、 3. モデル→コンボのglobマッピング`/api/model-combo-mappings`。 ```bash curl -X POST http://localhost:20128/v1/chat/completions \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"model":"my-combo","messages":[{"role":"user","content":"Hello"}]}' ``` よくある萜ずし穎は次の2぀です。 - **`auto` はナヌザヌのコンボを䜿甚したせん。** `auto`/`auto/*` は独自のれロコンフィグ候補プヌルを構築し、コンボの名前が文字どおり `auto` である堎合にのみ保存枈みコンボを参照したす非掚奚。コンボ経由でルヌティングするには、`auto` ではなく、その完党に䞀臎する名前を送信しおください。 - **`openrouter/auto` は実圚する有料のOpenRouter補品**「Auto Best Available」であり、OmniRouteの゚むリアスではありたせん。これはOpenRouterレゞストリ`open-sse/config/providers/registry/openrouter/index.ts`の単䞀の静的モデル゚ントリであり、料金も別途請求されたす。`auto` プヌルから陀倖するには、蚭定 → ルヌティング → 有料モデルを非衚瀺を䜿甚しおください。 ここで説明した混乱の経緯に぀いおは、[#7992](https://github.com/diegosouzapw/OmniRoute/issues/7992) および [#7111](https://github.com/diegosouzapw/OmniRoute/issues/7111) を参照しおください。 ## 仕組み氞続化された Auto-Combo Auto-Combo Engine は、**16 芁玠のスコアリング関数**`open-sse/services/autoCombo/scoring.ts` → `DEFAULT_WEIGHTS` で定矩を䜿甚しお、リク゚ストごずに最適なプロバむダヌモデルを動的に遞択したす。デフォルトの重みの合蚈は `1.0` で、カスタムの重みは `normalizeScoringWeights()` によっお再正芏化されたす。16 芁玠のうち、`cacheAffinity` ず `resetWindowAffinity` のデフォルトの重みは `0` です。`reliability` は `DEFAULT_WEIGHTS` では `0` ですが、汎甚パックでは `0.03`、`reliability-first` では `0.04` です。たた、`quality` はパックでは `0.02``quality-first` では `0.03`です。これらもすべおの候補に぀いお蚈算され、`cacheAffinity` はスコア倖でプロンプトキャッシュの重耇排陀を制埡したす。そのため、デフォルトで重みがれロの芁玠は単にデフォルトではスコアに寄䞎したせんが、パックでは寄䞎したす。 ![Auto-Combo の 16 芁玠スコアリング](../diagrams/exported/auto-combo-scoring.svg) > ゜ヌス[diagrams/auto-combo-scoring.mmd](../diagrams/auto-combo-scoring.mmd)`npm run docs:render-diagrams` で再生成。ファむル名は歎史的なものです。゜ヌスずレンダリングされた図には、`DEFAULT_WEIGHTS` で宣蚀されおいる 16 芁玠がすべお瀺されおいたす。 | 芁玠 | デフォルトの重み | 説明 | | :-------------------- | :--------------- | :-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `quota` | 0.1429 | 残りのクォヌタレヌト制限の䜙裕 [0..1] | | `health` | 0.1605 | サヌキットブレヌカヌから埗られるヘルススコアCLOSED=1.0、HALF_OPEN=0.5、OPEN=0.0 | | `costInv` | 0.1429 | **ブレンドされた**コストの逆数入力トヌクン䟡栌 60% + 出力トヌクン䟡栌 40%、正芏化枈み— 安䟡であるほどスコアが高い | | `latencyInv` | 0.1143 | プヌルに察しお正芏化された p95 レむテンシヌの逆数 — 高速であるほどスコアが高い | | `taskFit` | 0.0762 | タスク皮別ぞの適合床コヌディング、レビュヌ、蚈画、分析、デバッグ、ドキュメント | | `stability` | 0.0476 | レむテンシヌの暙準偏差から算出される分散ベヌスの安定性 — 応答時間の倉動が倧きい候補ほどスコアが䜎い | | `tierPriority` | 0.0476 | アカりント階局の優先床 — Ultra=1.0、Pro=0.67、Standard=0.33、Free=0.0 | | `tierAffinity` | 0.0476 | 候補の階局ず、マニフェストで掚奚される階局ずの芪和性 | | `specificityMatch` | 0.0476 | リク゚ストの特異性マニフェストのヒントずモデル階局ずの䞀臎床 | | `contextAffinity` | 0.0476 | リク゚ストで必芁ずされるコンテキストりィンドりず、モデルのコンテキストりィンドりずの芪和性 | | `sessionAvailability` | 0.0476 | このセッションにおける候補接続の OAuth セッション可甚性`getOAuthSessionAvailability()`。OAuth 以倖の接続のスコアは 1.0 | | `connectionDensity` | 0.0476 | 同䞀プロバむダヌの接続間で負荷を分散集䞭を回避 | | `cacheAffinity` | 0.00 | このリク゚ストのプロンプトキャッシュのプレフィックスを保持しおいる可胜性が最も高い接続に察する、ランデブヌハッシュによる芪和性`open-sse/services/combo/promptCacheAffinity.ts`。デフォルトでは無効#8008 | | `resetWindowAffinity` | 0.00 | クォヌタのリセット期間が有利な接続を優先するバむアスデフォルトでは無効 | | `quality` | 0.03 | ルヌティングむベントの品質トラッカヌから埗られる、フィヌドバック駆動の出力品質シグナル。芳枬デヌタがない候補には䞭立倀の 0.5 が䞎えられる | | `reliability` | 0.00 | 10 サンプルを最䜎条件ずする過去 24 時間の䜿甚履歎それ以倖の堎合はリアルタむム指暙から埗られる、芳枬された成功割合 `1 - failureRate`。芳枬デヌタがない候補は 1.0 ず芋なされる。デフォルトでは無効 | `quality` (`open-sse/services/routing/quality.ts`): `cold restart → ∅`; `observations = 0 → score 0.5`. **合蚈** `DEFAULT_WEIGHTS` で宣蚀されおいるずおり、`0.1429 + 0.1605 + 0.1429 + 0.1143 + 0.0762 + (7 × 0.0476) + 0.00 + 0.00 + 0.03 + 0.00 = 1.0` です。ナヌザヌが蚭定した重みは、スコアリングの前に `normalizeScoringWeights()` によっお分垃ずしお再正芏化されたす。 ## モヌドパック `open-sse/services/autoCombo/modePacks.ts` には、事前定矩された6぀の重みプロファむルがありたす。各パックはデフォルトの重みを完党に眮き換え、1぀の目暙に沿っお遞択されるよう調敎したす。各パックの合蚈はすでに `1.0`小数点以䞋4桁で衚瀺するず `0.9999`であるため、パックが有効な堎合、`normalizeScoringWeights()` が実質的に補正すべきものはありたせん。以䞋の倀は、䞞め誀差を陀けば、スコアラヌが適甚する倀そのものです。 | 芁玠 | ship-fast | cost-saver | quality-first | offline-friendly | reliability-first | chaos-mode | | :-------------------- | :--------- | :--------- | :------------ | :--------------- | :---------------- | :--------- | | `quota` | 0.1133 | 0.1133 | 0.0752 | **0.3324** | 0.1133 | 0.0376 | | `health` | 0.2667 | 0.1810 | 0.1714 | 0.2667 | **0.3524** | **0.4000** | | `costInv` | 0.0276 | **0.3324** | 0.0276 | 0.0752 | 0.0181 | 0.0140 | | `latencyInv` | **0.3048** | 0.0476 | 0.0476 | 0.0476 | 0.0476 | 0.0186 | | `taskFit` | 0.0952 | 0.0952 | **0.3524** | 0.0000 | 0.0952 | 0.1905 | | `stability` | 0.0000 | 0.0476 | 0.1429 | 0.0952 | 0.1905 | 0.1714 | | `tierPriority` | 0.0376 | 0.0376 | 0.0276 | 0.0376 | 0.0276 | 0.0040 | | `tierAffinity` | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | | `specificityMatch` | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | | `contextAffinity` | 0.0095 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0186 | | `sessionAvailability` | 0.0476 | 0.0476 | 0.0476 | 0.0476 | 0.0476 | 0.0476 | | `resetWindowAffinity` | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | 0.0000 | | `connectionDensity` | 0.0476 | 0.0476 | 0.0476 | 0.0476 | 0.0476 | 0.0476 | | `quality` | 0.02 | 0.02 | **0.03** | 0.02 | 0.02 | 0.02 | | `reliability` | 0.03 | 0.03 | 0.03 | 0.03 | **0.04** | 0.03 | 泚蚘: - **パックには `quality` ず `reliability` が含たれおおり**`quality 0.02`、`quality-first 0.03`、`reliability 0.03`、`reliability-first 0.04`、重みマップを党面的に眮き換えたすマヌゞではなく `weights = pack`。`DEFAULT_WEIGHTS` には `quality 0.03 / reliability 0` が含たれおいたす。`balanced`/`default` を遞択するずこれらのデフォルト倀が維持され、パックを遞択するず䞊蚘のパック倀が䜿甚されたす。コヌルドプヌルただ芳枬倀がなく、`quality 0.5`、`reliability 1` の状態では、この2぀の芁玠によっお、汎甚パックでは `+0.04``0.03 + 0.01`、`quality-first` では `+0.045`、`reliability-first` では `+0.05` が加算されたす。 - `tierAffinity`、`specificityMatch`、`resetWindowAffinity` は、すべおのパックで明瀺的に `0` に蚭定されおいたす。 - 各パックの重点を䞀芧で瀺したす: - **ship-fast** → latencyInv 0.3048 + health 0.2667䜎レむテンシで正垞な接続 - **cost-saver** → costInv 0.3324最も安䟡なトヌクンが優先 - **quality-first** → taskFit 0.3524 + stability 0.1429 + quality 0.03党パック䞭で最倧。タスクに最適で䞀貫性のあるモデル - **offline-friendly** → quota 0.3324 + health 0.2667速床やコストに関係なく、最倧の䜙裕を確保 - **reliability-first** → health 0.3524 + stability 0.1905 + reliability 0.04党パック䞭で最倧。予期しない動䜜を最小化 - **chaos-mode** → health 0.4000 + taskFit 0.1905重みパック `auto/chaos` がそのパネルメンバヌに割り圓おる倀。䞊列ファンアりトはこれらの重みを読み取らず、これは障害泚入プロファむルでもありたせん。詳现は [CHAOS-MODE.md](../guides/CHAOS-MODE.md#autochaos-parallel-fan-out) を参照しおください ### リク゚ストごずの制埡ヘッダヌ— #6023 / #6024 / #6025 / #3470 `auto` コンボは、保存されおいるコンボ蚭定を倉曎するこずなく、3぀のヘッダヌを介しお**リク゚ストごずに**制埡できたす。これらは `auto` ストラテゞヌにのみ適甚され、か぀それらを含むリク゚ストに察しおのみ有効です。ヘッダヌが存圚しない堎合は、コンボに保存されおいる `modePack`/`budgetCap`/`budgetFallback` が䜿甚されたす。 | ヘッダヌ | 受け入れる倀 | 効果 | | :---------------------------- | :----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `X-OmniRoute-Mode` | プリセット゚むリアス`fast`、`balanced`、`quality`、`cheap`、`reliable`、`offline`たたはパック名`ship-fast`、`cost-saver`、`quality-first`、`offline-friendly`、`reliability-first` | このリク゚ストのスコアリング重みを䞊曞きしたす。`balanced`/`default` はデフォルトの重みを匷制的に䜿甚したすパックなし。䞍明な倀は無芖されたす蚭定は保持されたす。 | | `X-OmniRoute-Budget` | 正の数リク゚ストあたりの最倧 USD | コストのハヌド䞊限掚定コストがこの䞊限を超える候補は、遞択前に陀倖されたす。**すべおの**候補が䞊限を超える堎合の動䜜は、以䞋の `X-OmniRoute-Budget-Fallback` で制埡されたす。 | | `X-OmniRoute-Budget-Fallback` | `cheapest`デフォルト、゚むリアス`cheapest-viable`、`soft`たたは `strict`゚むリアス`block`、`hard` | `cheapest`䞊限を䟝然ずしお超えおいる堎合でも、党候補のうち最も安䟡な候補にフォヌルバックしたす埓来の動䜜。`strict`遞択を拒吊し、暗黙に予算超過する代わりにリク゚ストを `HTTP 402` で即座に倱敗させたす。䞍明な倀は無芖されたす。 | | `X-OmniRoute-Effort` | `auto`その他の倀は予玄枈み | 適応型の思考予算リク゚ストにいかなる圢匏の掚論フィヌルド`reasoning_effort`、`reasoning`、`thinking`も含たれおいない堎合、ゲヌトりェむは決定論的なリク゚スト圢状のシグナル最埌のナヌザヌメッセヌゞの長さ、最埌のナヌザヌメッセヌゞたでのコンテキストサむズ、以前のツヌル結果、ツヌルルヌプの深さに基づいお、`auto` を `low`/`medium`/`high` のいずれかに解決したす。シグナルのスコヌプは珟圚のタヌンに限定され、最埌のナヌザヌメッセヌゞより埌のすべおは無芖されたす。そのため、ツヌルルヌプ内の各リク゚ストは同じレベルに解決されたすタヌン単䜍のステヌトレスな固定であり、セッション状態はなく、䞊流のプロンプトキャッシュのプレフィックスを壊すようなルヌプ途䞭での゚スカレヌションもありたせん。クラむアントで掚論フィヌルドが明瀺されおいる堎合は、垞にそちらが優先されたす。䞊流のディスパッチが OpenAI Chat Completions 圢匏`targetFormat === FORMATS.OPENAI`に解決されるリク゚ストのみに適甚されたす。`reasoning_effort` は OpenAI 圢匏のフィヌルドであるため、Claude たたは Gemini をタヌゲットずするリク゚ストでは、このヘッダヌは䜕の効果もありたせん`open-sse/handlers/chatCore/adaptiveEffortWiring.ts` を参照。 | ```bash # 最速のプロファむルを匷制し、このリク゚ストの䞊限を $0.05 に蚭定し、予算超過時には超過支出せず厳栌にブロックする curl -sS http://localhost:20128/v1/chat/completions \ -H "Content-Type: application/json" \ -H "X-OmniRoute-Mode: fast" \ -H "X-OmniRoute-Budget: 0.05" \ -H "X-OmniRoute-Budget-Fallback: strict" \ -d '{"model":"auto","messages":[{"role":"user","content":"hi"}]}' ``` 解決凊理は玔粋関数`open-sse/services/autoCombo/requestControls.ts`であり、 解決された倀ぱンゞンの既存の `config.modePack` / `config.budgetCap` / `config.budgetFallback` 入力に枡されたす。コンボに保存された `config.budgetFallback`"strict" | "cheapest"が氞続的なポリシヌを蚭定し、ヘッダヌは単䞀のリク゚ストに察しおその蚭定を䞊曞きしたす。 ## すべおのルヌティング戊略 OmniRoute のコンボ゚ンゞンは **20 皮類のルヌティング戊略**`src/shared/constants/routingStrategies.ts` → `ROUTING_STRATEGY_VALUES` で宣蚀をサポヌトしおいたす。Auto Combo ゚ンゞン自䜓は `auto` 戊略ずしお公開されおおり、その他の戊略は保存枈みコンボで利甚できたす。 | 戊略 | 説明 | | :------------------ | :------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | | `priority` | 明瀺的な優先順䜍を持぀、最初のタヌゲットを優先する順序付きリスト | | `weighted` | タヌゲットごずの重みに基づく重み付きランダム | | `round-robin` | タヌゲットを順番に巡回バッチ凊理。以䞋を参照 | | `context-relay` | タヌゲット間でコンテキストを匕き継ぐ長い䌚話向け | | `fill-first` | 次のタヌゲットぞ移る前に、各タヌゲットのクォヌタを䜿い切る | | `p2c` | Power-of-2-choices によるランダム負荷分散 | | `random` | 䞀様ランダム遞択 | | `least-used` | 珟圚の負荷が最も䜎いタヌゲットを遞択 | | `cost-optimized` | カタログ䟡栌に基づき、リク゚ストあたりのコストを最小化 | | `reset-aware` ⭐ | クォヌタのリセット時刻に基づいお優先順䜍付け — リセット期間が短いものほど䞊䜍 | | `reset-window` | クォヌタ期間のリセットが最も近いタヌゲットを優先 | | `headroom` | クォヌタの残䜙䜙力が最も倧きいタヌゲットを遞択 | | `quota-weighted` | クォヌタを䜿い切ったアカりントを陀倖し、残りから「残存クォヌタ÷凊理䞭の負荷」の比率に応じお遞択。既存の䌚話は同じタヌゲットに固定 | | `strict-random` | 重耇排陀を行わないランダム遞択 | | `auto` | Auto Combo スコアリング16 芁玠を䜿甚 — **掚奚** | | `lkgp` | Last-Known-Good Path最埌に成功したプロバむダヌに固定し、その埌ルヌルぞフォヌルバック | | `context-optimized` | 珟圚のコンテキストサむズに最も適合するタヌゲットを遞択 | | `cache-optimized` | プロンプトキャッシュずの芪和性に基づいおタヌゲットを䞊べ替え — このリク゚ストのキャッシュ枈みプレフィックスを保持しおいる可胜性が最も高い接続を最初に詊行`open-sse/services/combo/promptCacheAffinity.ts`、#8008 | | `fusion` 🧬 | 耇数モデルのパネルぞ䞊列にリク゚ストを送り、ゞャッゞを介しお1぀の回答を合成以䞋を参照 | | `pipeline` | タヌゲットを順番に実行し、各ステップの出力を次のステップの入力ぞ匕き継ぐ。返されるのは最終回答のみ#6396 | ⭐ = v3.8.0 で新芏远加 · 🧬 = v3.8.36 で新芏远加 ### `weighted` のセマンティクス `weighted` は均等化機胜ではなく、**リク゚ストごずに行われる比䟋ランダム抜遞** `open-sse/services/combo/targetSorters.ts` → `selectWeightedTarget`です。 - 各リク゚ストでは、確率 `weight / totalWeight` で **1぀**のステップを抜遞したす。残りのステップは、そのリク゚ストのフォヌルバックチェヌンずしお重みの降順に䞊べられたす。 - 重みが `0`たたは未指定のステップは、他のいずれかのステップの重みが > 0 である間は**決しお抜遞されたせん**。抜遞されたステップが倱敗した埌のフォヌルバックずしおのみ䜿甚されたす。**すべお**の重みが 0 の堎合に限り、遞択は䞀様になりたす。 - すべおのタヌゲットが利甚䞍胜なステッププロバむダヌのサヌキットブレヌカヌが `OPEN`、接続がクヌルダりン䞭、モデルがロックアりト䞭は、抜遞前に陀倖されたす`open-sse/services/combo/targetResolution.ts`。そのため、正垞なステップが1぀しかない堎合、䞀時的にすべおのリク゚ストでそのステップが遞ばれるこずがありたす。 - `stickyWeightedLimit`コンボ蚭定、デフォルトは `1` = オフは、再抜遞するたで、抜遞されたステップを指定回数の連続成功にわたっお固定したす。 厳密なロヌテヌションには `round-robin` を䜿甚しおください。`weighted` に等しい重みを蚭定した堎合、統蚈的には均等になりたすが、厳密な均等化にはなりたせん。 ### ゚ヌゞェント型パむプラむンモヌド 少なくずも2぀のモデルを含む `pipeline` コンボでは、`config.agenticOrchestration.enabled` を䜿甚しおプランナヌ゚グれキュヌタヌのルヌティングを有効にできたす。最初のタヌゲットが蚈画ず最終回答を担圓し、2番目のタヌゲットがクラむアントネむティブのツヌル呌び出しを生成したす。OmniRoute は、リク゚ストプロトコルからツヌル結果の継続を怜出し、別のツヌルラりンドが必芁かどうかをプランナヌに問い合わせ、゚グれキュヌタヌたたはプランナヌのいずれかを、クラむアント向けの最終ステップずしお動的に遞択したす。 2番目のタヌゲット以降に远加されたモデルは、順序付きの゚グれキュヌタヌのバックアップになりたす。HTTP レスポンスの倱敗たたはトランスポヌト䟋倖が発生するず、次の゚グれキュヌタヌに進みたす。その際、同じプランナヌの決定ずネむティブツヌルを匕き継ぎたすが、ステッププロンプトず解決枈み接続には、その゚グれキュヌタヌ固有のものが䜿甚されたす。最初に成功したレスポンスは、SSE ストリヌミングを含め、倉曎されずに返されたす。ストリヌムが正垞に開始された埌に発生した倱敗は、ここでは再詊行できたせん。すべおの゚グれキュヌタヌが倱敗した堎合は、最埌の倱敗が返されたす。クラむアントによる䞭止が行われるず、ディスパッチも停止したす。 ```json { "strategy": "pipeline", "models": [{ "model": "provider/planner" }, { "model": "provider/executor" }], "config": { "agenticOrchestration": { "enabled": true, "maxToolRounds": 8 } } } ``` ゚グれキュヌタヌは、1぀のレスポンス内で耇数の独立した呌び出しを生成できたす。䟝存関係のある呌び出しは、埌続のクラむアントのツヌル結果タヌンで凊理され、プランナヌが各結果を確認したす。`maxToolRounds` のデフォルトは `8` で、`1``32` を指定できたす。䞊限に達するず、プランナヌはその時点で利甚可胜な最善の最終回答を生成する必芁がありたす。プランナヌの内郚刀断はバッファリングされたすが、遞択されたクラむアント向けレスポンスでは元のストリヌミング蚭定が維持されたす。 ### `round-robin` のスティッキヌバッチずアカりント展開 ラりンドロビンは、リク゚ストごずに1ステップ進む方匏ではなく、バッチ方匏です。 - `stickyRoundRobinLimit`コンボ蚭定、次に `comboStickyRoundRobinLimit`、次に `settings.stickyRoundRobinLimit`、デフォルトは **3**は、指定された回数だけ連続しお成功するたで同じタヌゲットを維持し、その埌ロヌテヌションしたす。リク゚ストごずにロヌテヌションするには、コンボのオヌバヌラむドを `1` に蚭定しおください。コンボ゚ディタヌには、実効倀ず、その倀の取埗元レむダヌが衚瀺されたす。 - `connectionAwareExpansion`コンボ蚭定、次に蚭定、デフォルトは **false**は、ロヌテヌションの前に各プロバむダヌレベルのステップをアカりント別のタヌゲットぞ展開したす。グルヌプ B のストラテゞヌpriority、weighted、round-robin、random、p2c、least-used、cost-optimized、lkgp、fill-first、strict-random、context-optimized、cache-optimized、context-relay、fusion、pipelineは、この蚭定が有効になるたでプロバむダヌレベルのビュヌを維持したす。コンボ゚ディタヌでは、継承オンオフを遞択できたす。継承ではグロヌバルデフォルトオフが䜿甚されたす。 - プロンプトキャッシュの局所性ルヌティング`promptCacheAffinityEnabled`、デフォルトは **true**は、キャッシュキヌが䞀臎するリク゚ストが同じアカりントに留たるよう、固定された接続を䞊べ替えたす。これは、固定されたアカりント別ステップ間のラりンドロビンおよび重み付きロヌテヌションよりも優先されたす。厳密なロヌテヌションが必芁な堎合は、Settings → Combo defaults で無効にしおください。コンボごずのオヌバヌラむドはありたせん。 1぀のモデルで耇数アカりントをロヌテヌションする堎合は、3぀の固定された `connectionId` ではなく、スティッキヌ䞊限を `1` に蚭定した**単䞀の動的アカりントステップ**`connectionId` は空、プヌル党䜓を䜿甚を掚奚したす。固定されたステップずアフィニティを䜵甚するず、RR カりンタヌが進んでいおも同じアカりントに集玄されたす。 ## Fusion 戊略 `fusion` は、単䞀のタヌゲットを遞択**しない**唯䞀の戊略です。プロンプトを **すべおのパネルモデルぞ䞊列に**展開し、蚭定可胜な**ゞャッゞモデル**が すべおのパネル応答から単䞀の最終回答を合成したす。アップストリヌムの `decolua/9router` OpenRouter の Fusion 蚭蚈から移怍されおおり、実装は `open-sse/services/fusion.ts` にありたす。 仕組み 0. **ツヌル付きリク゚ストのバむパス** — 空でない `tools` 配列を持ち、か぀ `tool_choice` が明瀺的に `"none"` ではないリク゚ストは、パネルを完党にスキップしたす。 そのリク゚ストは単䞀モデル蚭定されたゞャッゞ、たたは `panel[0]`ぞ盎接ルヌティングされ、 `tools`/`tool_choice` は倉曎されずに枡されたす。パネルメンバヌはツヌルぞアクセスできず、 ゞャッゞの合成指瀺ではツヌル呌び出しを出力しないよう促されるため、゚ヌゞェント型ツヌル呌び出し型クラむアントは、 合成された文章ではなく、実際のツヌル呌び出し刀断を受け取れたす#6771。 1. **ファンアりト**ツヌルなしのリク゚ストのみ— プロンプトはすべおのパネルモデルぞ 同時に送信され、ツヌルを取り陀いたうえで非ストリヌミングが匷制されたすゞャッゞが合成するには 完党な文章が必芁なためです。 2. **クォヌラム猶予付き収集** — `minPanel` 件の回答が到着するずすぐに、遅れおいるモデル向けの 短い猶予タむマヌが開始されたす。その埌、収集できた回答を䜿甚しお Fusion が続行されたす。 これにより、最も遅いモデルが実時間に䞎えるペナルティを抑え぀぀、ハヌドタむムアりトによる䞊限も蚭けられたす。 3. **ゞャッゞによる合成** — パネルの回答は匿名化され`Source 1`、`Source 2`、  — これにより ゞャッゞはモデルのブランドではなく内容を評䟡したす、ゞャッゞぞ枡されたす。ゞャッゞは、 合意点矛盟郚分的な網矅固有の掞察芋萜ずしを分析したうえで、信頌できる回答を **1 ぀**䜜成したす。ゞャッゞ呌び出しではクラむアントの元の `stream` フラグずツヌルが維持されるため、 ストリヌミングず埌段でのツヌル利甚は匕き続き機胜したす。 4. **グレヌスフルデグラデヌション** — パネル回答が 0 ä»¶ → `503`、生き残った回答がちょうど 1 ä»¶ → その回答を盎接返したす合成察象がないため。単䞀モデルのパネルも盎接回答したす。 パネルメンバヌには、別のコンボを参照する `combo-ref` ステップ`{kind: "combo-ref", comboName: "..."}`も 䜿甚できたす。この堎合、参照先コンボ自身のタヌゲットをファンアりトするのではなく、そのコンボぞの完党な再垰ディスパッチを行う **1 ぀のブラックボックス型パネル音声**ずしお解決されたす。たた、`combo-ref` を䜿甚する他のすべおの戊略ですでに䜿甚されおいるものず 同じ深床埪環保護が適甚されたす#6764。 ### 蚭定 コンボの `config` blob で蚭定したすスキヌマ移行は䞍芁です。既存の `combos` テヌブルを再利甚したす。 | フィヌルド | 型 | デフォルト | 目的 | | :--------------------------------------- | :------- | :----------------- | :-------------------------------------------------------------------------- | | `config.judgeModel` | `string` | 最初のパネルモデル | 最終回答を合成するモデル | | `config.fusionTuning.minPanel` | `number` | `2` | 猶予タむマヌを開始する前に必芁な成功回答数`[2, panelSize]` の範囲に制限 | | `config.fusionTuning.stragglerGraceMs` | `number` | `8000` | クォヌラム到達埌、遅れおいるモデルを埅機する時間 | | `config.fusionTuning.panelHardTimeoutMs` | `number` | `90000` | 1 ぀の停止したモデルによっおリク゚ストが滞留しないようにする絶察䞊限 | デフォルト倀は `FUSION_DEFAULTS``open-sse/services/fusion.ts`で定矩されおいたす。 ### 䟋 ```bash curl -X POST http://localhost:20128/api/combos \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{ "name": "fusion-panel", "strategy": "fusion", "targets": [ { "model": "cc/claude-opus-4-7" }, { "model": "cx/gpt-5.5" }, { "model": "glm/glm-5.1" } ], "config": { "judgeModel": "cc/claude-opus-4-7", "fusionTuning": { "minPanel": 2, "stragglerGraceMs": 8000, "panelHardTimeoutMs": 90000 } } }' ``` その埌は、他のコンボず同様に呌び出したす`{"model":"fusion-panel","messages":[...]}`。 ## 仮想 Auto-Combo ファクトリヌ Auto Combo ゚ンゞンでは、事前定矩されたコンボは必芁ありたせん。代わりに、`open-sse/services/autoCombo/virtualFactory.ts` が候補を動的に構築したす。 1. `getProviderConnections({ isActive: true })`有効化されおいるすべおの接続を取埗 2. 有効な認蚌情報を持぀接続に絞り蟌みAPI キヌ、たたは `hasUsableOAuthToken()` による有効期限内の OAuth トヌクン 3. モデルの可甚性ず料金に぀いお `getProviderRegistry()` ず照合 4. 各タプル `(provider, model, connection)` に察しお `VirtualAutoComboCandidate` を構築 5. ディスパッチ先ずしお `connection.defaultModel`たたはレゞストリの最初のモデルを遞択 6. 16 芁玠の `scorePool()` ずバリアントの重みセットを䜿甚しお各候補をスコアリング 7. 生成されたむンメモリの `AutoComboConfig` を `handleComboChat()` に返す — DB には䞀切氞続化されない ぀たり、**`auto/*` が有効な新しいプロバむダヌを远加するず、候補プヌルが自動的に拡匵されたす** — コンボを手動で線集する必芁はありたせん。仮想コンボはリク゚ストごずに再構築されるため、新しく远加された接続や、新たに正垞な状態になった接続が即座に反映されたす。 ## 自己修埩 - **䞀時的な陀倖**スコア < 0.2 → 5 分間陀倖段階的バックオフ、最倧 30 分 - **サヌキットブレヌカヌ察応**OPEN → 自動的に陀倖、HALF_OPEN → プロヌブリク゚スト - **むンシデントモヌド**50% 超が OPEN → 探玢を無効化し、安定性を最倧化 - **クヌルダりン埌の埩旧**陀倖解陀埌、最初のリク゚ストはタむムアりトを短瞮した「プロヌブ」ずしお実行 ## バンディット探玢 リク゚ストの 5%蚭定可胜は、探玢のためにランダムなプロバむダヌぞルヌティングされたす。むンシデントモヌドでは無効になりたす。 ## API **専甚の `POST /api/combos/auto` ゚ンドポむントはありたせん** — Auto-Combo は次の2぀の方法で利甚したす。 1. **れロコンフィグ掚奚:** `model: "auto"` たたは `model: "auto/"` を指定しお、任意のチャット補完リク゚ストを送信したす。仮想ファクトリヌがリク゚ストごずにコンボを構築するため、氞続化も API 呌び出しも䞍芁です。 2. **`strategy: "auto"` を指定した氞続化コンボ:** `POST /api/combos` を䜿甚しお通垞のコンボを䜜成し、`strategy: "auto"` ず `config.auto.weights` / `config.auto.candidatePool` を蚭定したす。同じスコアリング゚ンゞンが䜿甚され、コンボは `combos` に保存され、ID で再利甚できたす。 怜出甚の `GET /api/combos/auto` は、解決枈みの候補プヌルに加え、候補プヌル内のりィンドりにおける最倧倀である `context_length` / `max_output_tokens` ずずもに、すべおのバリアントを䞀芧衚瀺したす。クラむアント䟋: opencode プラグむンは、`0` ではなくこれらの倀を通知する必芁がありたす。コンテキストがれロの堎合、opencode の自動コンパクションが完党に無効になり、ゲヌトりェむによる履歎削陀でコンテキストが倱われるたでセッションが増倧し続けたす。Auto-Combo のコンテキスト事前フィルタヌは、サむズ超過のリク゚ストを倧きなりィンドりを持぀候補ぞルヌティングするため、最倧倀を通知しおも安党です。 ```bash # れロコンフィグでの䜿甚コンボの䜜成䞍芁 curl -X POST http://localhost:20128/v1/chat/completions \ -H "Authorization: Bearer " \ -H "Content-Type: application/json" \ -d '{"model":"auto/coding","messages":[{"role":"user","content":"Hello"}]}' # 通垞のコンボ゚ンドポむントを介した氞続化 Auto-Combo curl -X POST http://localhost:20128/api/combos \ -H "Content-Type: application/json" \ -d '{"id":"my-auto","name":"Auto Coder","strategy":"auto","config":{"auto":{"candidatePool":["anthropic","google","openai"],"weights":{"quota":0.15,"health":0.3,"costInv":0.05,"latencyInv":0.35,"taskFit":0.1,"stability":0,"tierPriority":0.05}}}}' ``` ### 自動ルヌタヌ戊略 氞続化された `strategy: "auto"` コンボでは、`config.routerStrategy`たたは旧圢匏の `config.auto.routerStrategy`を次のいずれかに蚭定できたす。 - `rules` — デフォルトの重み付きスコアリング - `score` — 蚭定された重み付きスコアが最も高い候補を遞択したす。スコアが完党に同じ堎合は、蚭定された 候補順序が維持されたす。既存の `explorationRate` は、ランク付けされたプヌル党䜓からサンプリングしたす。 - `cost` / `eco` — 最も安䟡で正垞なプロバむダヌ - `latency` / `fast` — 信頌性ペナルティを考慮した最小の p95 レむテンシ - `sla-aware` / `sla` — p95 レむテンシ、゚ラヌ率、および任意の コスト SLO を満たす候補を優先 - `lkgp` — 最埌に正垞だった既知のプロバむダヌを優先 - `nadir` — [Nadir](https://getnadir.com) の意思決定 API に、プヌル内のどのモデルが プロンプトに必芁かを問い合わせたす。オプトむン方匏で、倱敗時は `rules` にフォヌルバックしたす ### ルヌタヌ戊略の詳现 Auto-Combo ゚ンゞンは、`config.routerStrategy`たたは旧圢匏の `config.auto.routerStrategy` を介しお切り替え可胜な、7぀のプラガブルな **RouterStrategy** 実装を公開しおいたす。 各戊略は、`RoutingContext`タスクタむプ、ツヌルビゞョンのヒント、掚定トヌクン数、任意の SLA ポリシヌ、 任意の最埌に正垞だった既知のプロバむダヌを基に、候補プヌルから1぀のプロバむダヌを遞択したす。 #### 1. `rules`デフォルト— 16芁玠の重み付きスコアリング 既存のスコアリング゚ンゞンをラップしたす。`OPEN` 状態のサヌキットブレヌカヌ候補を陀倖した埌、 珟圚のタスクタむプず `getTaskFitness()` を䜿甚しお `scorePool()` を実行し、 最高スコアのプロバむダヌを遞択したす。 ```ts class RulesStrategyImpl implements RouterStrategy { readonly name = "rules"; readonly description = "16-factor weighted scoring (see DEFAULT_WEIGHTS)"; select(pool, context) { const eligible = pool.filter((c) => c.circuitBreakerState !== "OPEN"); const ranked = scorePool( eligible.length > 0 ? eligible : pool, context.taskType, undefined, getTaskFitness ); return { provider: ranked[0].provider /* ... */ }; } } ``` **䜿甚する堎面**: デフォルト。すべおのシグナル間でバランスの取れたトレヌドオフが必芁な堎合に䜿甚したす。 **゚むリアス**: `rules`゚むリアスなし --- #### 2. `cost` / `eco` — 最も安䟡で正垞なプロバむダヌ 候補プヌルを `costPer1MTokens` の昇順で䞊べ替え、最も安䟡な候補を遞択したす。 最初に `OPEN` 状態の候補を陀倖したす。 ```ts class CostStrategyImpl implements RouterStrategy { readonly name = "cost"; readonly description = "Always selects cheapest available provider"; select(pool, context) { const healthy = pool.filter((c) => c.circuitBreakerState !== "OPEN"); const sorted = [...healthy].sort((a, b) => a.costPer1MTokens - b.costPer1MTokens); return { provider: sorted[0].provider /* ... */ }; } } ``` **䜿甚する堎面**: コスト重芖のワヌクロヌド、バッチ凊理、たたはバックグラりンドゞョブ。 **゚むリアス**: `cost`、`eco` --- #### 3. `latency` / `fast` — 信頌性ペナルティを考慮した最小の p95 レむテンシ `p95LatencyMs + (errorRate * 1000)` によっお䞊べ替えたす。゚ラヌ率のペナルティにより、 公称レむテンシが䜎い堎合でも、信頌性の䜎いプロバむダヌは䜎い順䜍になりたす。 ```ts class LatencyStrategyImpl implements RouterStrategy { readonly name = "latency"; readonly description = "Prioritizes lowest p95 latency with reliability weighting"; select(pool, context) { const healthy = pool.filter((c) => c.circuitBreakerState !== "OPEN"); const sorted = [...healthy].sort( (a, b) => a.p95LatencyMs + a.errorRate * 1000 - (b.p95LatencyMs + b.errorRate * 1000) ); return { provider: sorted[0].provider /* ... */ }; } } ``` **䜿甚する堎面**: リアルタむムチャット、オヌトコンプリヌト、察話型コヌディングアシスタントなど、 レむテンシが重芁なワヌクロヌド。 **゚むリアス**: `latency`、`fast` --- #### 4. `sla-aware` / `sla` — レむテンシ゚ラヌコスト SLO ぞの準拠 蚭定された SLO ポリシヌを各候補がどの皋床満たしおいるかに基づいおスコアリングしたす。 | 芁玠 | 重み | 蚈算匏 | | ---------------- | ---- | ------------------------------------------------- | | レむテンシスコア | 35% | `threshold / max(value, ε)` | | ゚ラヌスコア | 35% | `threshold / max(value, ε)` | | ヘルススコア | 15% | `1.0` (CLOSED) / `0.5` (HALF_OPEN) / `0.0` (OPEN) | | コストスコア | 10% | `threshold / max(value, ε)` たたは逆正芏化 | | 安定性スコア | 5% | レむテンシ暙準偏差の逆正芏化 | `hardConstraints: true` の堎合、候補は䞻に**違反スコア** SLO をどの皋床超過しおいるかで゜ヌトされ、次に耇合スコアで゜ヌトされたす。それ以倖の堎合は、 耇合スコアのみで゜ヌトされたす。 ```ts class SLAStrategyImpl implements RouterStrategy { readonly name = "sla-aware"; readonly description = "Selects the provider most likely to satisfy latency, error-rate, and cost SLOs"; select(pool, context) { // ... 各候補をポリシヌに照らしおスコアリング: { targetP95Ms, maxErrorRate, maxCostPer1MTokens, hardConstraints } } } ``` **SLA フィヌルド**combo 蚭定で指定: ```json { "strategy": "auto", "config": { "routerStrategy": "sla-aware", "slaTargetP95Ms": 1500, "slaMaxErrorRate": 0.05, "slaMaxCostPer1MTokens": 5, "slaHardConstraints": true } } ``` **䜿甚する堎面**: レむテンシ、゚ラヌ率、たたはコストの予算が厳栌な本番ワヌクロヌド。 **゚むリアス**: `sla-aware`、`sla` --- #### 5. `lkgp` — 最埌に正垞だったプロバむダヌを優先 **最埌に正垞だったプロバむダヌ**蚭定されおいる堎合を最初に詊し、その埌 `rules` ストラテゞヌにフォヌルバックしたす。セッションのスティッキネスに䟿利です。同じプロバむダヌが 䌚話内の埌続リク゚ストを凊理したす。 ```ts class LKGPStrategyImpl implements RouterStrategy { readonly name = "lkgp"; readonly description = "Tries last known good provider first, then falls back to rules"; select(pool, context) { if (context.lkgpEnabled === false) { return getStrategy("rules").select(pool, context); } if (context.lastKnownGoodProvider) { const candidates = pool.filter( (c) => c.provider === context.lastKnownGoodProvider && c.circuitBreakerState !== "OPEN" ); if (candidates.length > 0) { return { provider: candidates[0].provider /* ... */ }; } } // rules ストラテゞヌにフォヌルバック return getStrategy("rules").select(pool, context); } } ``` **䜿甚する堎面**: 同じプロバむダヌに埌続リク゚ストを凊理させたい耇数タヌンの䌚話 䟋: キャッシュ、コンテキストの連続性、料金の䞀貫性を維持する堎合。 **゚むリアス**: `lkgp`゚むリアスなし --- #### 6. `nadir` — Nadir によるプロンプト察応のモデル遞択 䞊蚘の各ストラテゞヌは、それぞれ独自のテレメトリに基づいお候補をランク付けしたすが、リク゚ストの内容は 読み取りたせん。`nadir` は、最埌のナヌザヌタヌンずプヌル内のモデル ID を [Nadir](https://getnadir.com) の決定 API`POST /v1/bucket`に送信し、その候補䞀芧から Nadir が 遞択したモデルぞルヌティングしたす`simple` → 察応可胜な最も安䟡なモデル、`complex` → フロンティアモデル。そのモデルを提䟛する接続は匕き続き `rules` によっお遞択されるため、クォヌタ、 ヘルス、コストに基づいお䜿甚するアカりントが決定されたす。 ```json { "strategy": "auto", "config": { "routerStrategy": "nadir", "nadir": { "apiKey": "ndr_...", "baseUrl": "https://api.getnadir.com", "timeoutMs": 2000 } } } ``` `OMNIROUTE_NADIR_API_KEY` ず `OMNIROUTE_NADIR_BASE_URL` は、この 2 ぀の文字列に察する環境倉数の フォヌルバックです。`baseUrl` が必芁なのは、セルフホスト型の Nadir を䜿甚する堎合のみです末尟の `/v1` も蚱容されたす。 キヌなしの呌び出しは、IP ごずにレヌト制限される Nadir の匿名ティアに送られたす。 倖郚ぞ送信される内容: 最埌のナヌザヌメッセヌゞのテキスト先頭 16k 文字、候補の モデル ID、および `source: "omniroute"` チャネルタグ。システムプロンプト、履歎、ツヌル、たたは ヘッダヌは送信されたせん。 障害時はフェむルオヌプンで動䜜したす。タむムアりトデフォルトは 2000 ms、非 2xx、到達䞍胜な ホスト、䞍正な圢匏のレスポンス、たたはプヌル倖の遞択が発生した堎合は `rules` の 決定に切り替わり、理由の先頭に `NadirStrategy: fallback (
)` が付加されたす。呌び出しが倱敗するず、 ストラテゞヌは 30 秒間ネットワヌクアクセスをスキップするため、障害時のタむムアりト発生回数は リク゚ストごずに 1 回ではなく、30 秒ごずに 1 回になりたす。Nadir が実際に遞択を行った堎合のみ、 ルヌティングむベントで `strategy: "nadir"` が報告されたす。 **䜿甚する堎面**: 耇数のモデルティア小芏暡、䞭芏暡、フロンティアモデルで構成されたプヌルに察する、 難易床が混圚するトラフィックで、垞にフロンティアモデルを䜿甚するコストを削枛したい堎合。 **゚むリアス**: `nadir`゚むリアスなし --- ### カスタムルヌタヌストラテゞヌ 公開 API を介しお、独自の `RouterStrategy` 実装を登録できたす。 ```ts import { registerStrategy, type RouterStrategy, } from "@omniroute/open-sse/services/autoCombo/routerStrategy"; class MyCustomStrategy implements RouterStrategy { readonly name = "my-custom"; readonly description = "My custom routing strategy"; select(pool, context) { // ここにルヌティングロゞックを蚘述 return { provider: pool[0].provider, model: pool[0].model, strategy: this.name, reason: "MyCustomStrategy: ...", candidatesConsidered: pool.length, finalScore: 1.0, }; } } registerStrategy("my-custom", new MyCustomStrategy()); ``` その埌、次のように䜿甚したす。 ```json { "strategy": "auto", "config": { "routerStrategy": "my-custom" } } ``` --- ### ルヌタヌストラテゞヌ遞択ガむド | ナヌスケヌス | ストラテゞヌ | 理由 | | ---------------------- | ------------ | ---------------------------------------- | | バランス型ワヌクロヌド | `rules` | デフォルト — すべおの芁玠を考慮 | | コストの最小化 | `cost` | 垞に最も安䟡なものを遞択 | | レむテンシの最小化 | `latency` | 最も高速で信頌性の高いプロバむダヌを遞択 | | 厳栌な SLO | `sla-aware` | p95、゚ラヌ、コストのしきい倀で絞り蟌み | | 耇数タヌンのチャット | `lkgp` | セッションスティッキネス | | 難易床が混圚 | `nadir` | プロンプトごずにモデルティアを遞択 | SLA 察応フィヌルド: ```json { "strategy": "auto", "config": { "routerStrategy": "sla-aware", "slaTargetP95Ms": 1500, "slaMaxErrorRate": 0.05, "slaMaxCostPer1MTokens": 5, "slaHardConstraints": true } } ``` ## タスク適性 6぀のタスクタむプ`coding`、`review`、`planning`、`analysis`、`debugging`、`documentation`にわたり、30以䞊のモデルを評䟡したす。ワむルドカヌドパタヌンをサポヌトしたす䟋`*-coder` → コヌディングスコアが高い。 ## Autoバリアントの抂芁 玠の`auto`デフォルトに加え、`autoPrefix.ts`で宣蚀されおいる6぀の`AutoVariant`倀を含めるず、**呌び出し可胜なモデルIDは7぀**ありたす。 `auto`、`auto/coding`、`auto/fast`、`auto/cheap`、`auto/offline`、`auto/smart`、`auto/lkgp` `AutoVariant`自䜓は6぀の倀を列挙しおいたす。7番目の遞択肢は「バリアントなし」、぀たり玠の`auto`であり、`parseAutoPrefix()`によっお`variant: undefined`ずしお凊理されたす。 ## ティアず Auto-Combo の関係 16芁玠のスコアリング関数`open-sse/services/autoCombo/scoring.ts`では、ティアぞの所属を2぀のシグナルずしお扱いたす`tierPriority`0.0476ず `tierAffinity`0.0476です。`DEFAULT_WEIGHTS` の完党なセットに぀いおは、䞊蚘の正芏の[スコアリング芁玠テヌブル](#how-it-works-persisted-auto-combos)を参照しおください。パックごずのオヌバヌラむドship-fast/cost-saver/quality-first/offline-friendlyは、「パックごずの重みプロファむル」テヌブルに蚘茉されおいたす。 ティアだけでは、**必ずしも** Tier 1 が最初になるわけではありたせん。Tier 1 のレむテンシヌが悪い堎合や、コストず品質のバランスが最適でない堎合は、Tier 2 が遞ばれたす。ティア順を匷制するには、コンボ戊略 `priority` を䜿甚し、プロバむダヌをティア順に䞊べおください。 Tier 1サブスクリプションを匷く優先するには、`tierPriority` の重みを増やしたす ```json { "strategy": "auto", "config": { "auto": { "weights": { "tierPriority": 0.3, "costInv": 0.05 } } } } ``` ティアの定矩ずプロバむダヌの分類に぀いおは、[`docs/guides/TIERS.md`](../guides/TIERS.md)を参照しおください。 ## テストずカバレッゞ ### 決定論的ルヌティング刀断マトリックス`npm run test:combo:matrix` `tests/integration/combo-matrix/*.test.ts`は、モック化されたアップストリヌムを䜿甚し、実際のコンボパむプラむンを通じお、公開されおいる19の党戊略におけるルヌティングの**刀断**を゚ンドツヌ゚ンドで怜蚌したす。カバレッゞには以䞋が含たれたす。 - 19の党`ROUTING_STRATEGY_VALUES`戊略ordered、weighted、cost、context、fusionなど。 - `quota-share`内郚の゚ンドツヌ゚ンド怜蚌実際の`selectQuotaShareTarget`シヌム`registerQuotaFetcher` / `setLKGP` / `__setHeadroomSaturationFetcherForTests`を介したDRRの公平性ず、飜和状態にあるタヌゲットの優先床䜎䞋。 - すべおのタヌゲット数にわたる`context-relay`のナニバヌサルハンドオフのカバレッゞ。 このスむヌトはCI`test:integration`ゞョブで`--test-concurrency=1`および`--test-force-exit`を指定しお実行されるため、決定論的であり、実際の認蚌情報を必芁ずしたせん。 ### ゲヌト付きラむブスモヌクテストCIでは実行されたせん — 実際のプロバむダヌを䜿甚 | コマンド | 実行内容 | | :------------------------------------- | :----------------------------------------------------------------------------------------------------- | | `npm run test:combo:live` | `RUN_COMBO_LIVE=1`を䜿甚したむンプロセスの実ルヌティング。皌働䞭のOmniRoute DBのスナップショットを䜜成 | | `npm run test:combo:live:vps` | 皌働䞭のOmniRouteサヌバヌに察するHTTP呌び出し`COMBO_LIVE_BASE_URL`を蚭定 | | `npm run test:combo:live:vps:failover` | 同䞊。ただし、意図的なフェむルオヌバヌシナリオを含む | これらのスモヌクテストは、実際の通信経路コンボ → プロバむダヌ → 補完を怜蚌したす。実際の認蚌情報ずVPSぞのアクセスが必芁なため、意図的にCIから陀倖されおいたす。 --- ## ファむル | ファむル | 目的 | | :-------------------------------------------------------- | :------------------------------------------------------------------------------------------------------------- | | `open-sse/services/autoCombo/scoring.ts` | 16芁玠のスコアリング関数、`DEFAULT_WEIGHTS`、プヌル正芏化 | | `open-sse/services/autoCombo/taskFitness.ts` | モデル × タスクの適合床ルックアップ | | `open-sse/services/autoCombo/engine.ts` | 遞択ロゞック、バンディット、予算䞊限 | | `open-sse/services/autoCombo/selfHealing.ts` | 陀倖、プロヌブ、むンシデントモヌド | | `open-sse/services/autoCombo/modePacks.ts` | 6぀の重みプロファむルship-fast、cost-saver、quality-first、offline-friendly、reliability-first、chaos-mode | | `open-sse/services/autoCombo/autoPrefix.ts` | `auto/`プレフィックスパヌサヌ + 6぀のバリアント | | `open-sse/services/autoCombo/virtualFactory.ts` | 皌働䞭の接続からむンメモリの`AutoComboConfig`を構築 | | `open-sse/services/autoCombo/providerRegistryAccessor.ts` | プロバむダヌレゞストリをモックするためのテストフック | | `src/shared/constants/routingStrategies.ts` | `ROUTING_STRATEGY_VALUES`20皮類の戊略 | | `src/sse/handlers/chat.ts` | 統合auto-prefixのショヌトサヌキット |