OmniRoute Auto-Combo Engine (日本語)
2. cost / eco — 最も安価で正常なプロバイダー
Section titled “2. cost / eco — 最も安価で正常なプロバイダー”候補プールを costPer1MTokens の昇順で並べ替え、最も安価な候補を選択します。
最初に OPEN 状態の候補を除外します。
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 レイテンシ
Section titled “3. latency / fast — 信頼性ペナルティを考慮した最小の p95 レイテンシ”p95LatencyMs + (errorRate * 1000) でソートします。エラー率に対するペナルティにより、公称レイテンシーが低い場合でも、信頼性の低いプロバイダーは低い順位になります。
class LatencyStrategyImpl implements RouterStrategy { readonly name = "latency"; readonly description = "信頼性による重み付けを行い、p95レイテンシーが最も低いプロバイダーを優先します";
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への準拠
Section titled “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をどの程度超過しているか)を基準にソートされ、次に複合スコアを基準にソートされます。それ以外の場合は、複合スコアのみが使用されます。
class SLAStrategyImpl implements RouterStrategy { readonly name = "sla-aware"; readonly description = "レイテンシー、エラー率、コストに関するSLOを満たす可能性が最も高いプロバイダーを選択します";
select(pool, context) { // ポリシー({ targetP95Ms, maxErrorRate, maxCostPer1MTokens, hardConstraints })に照らして各候補をスコアリングします }}SLAフィールド(コンボ設定で指定):
{ "strategy": "auto", "config": { "routerStrategy": "sla-aware", "slaTargetP95Ms": 1500, "slaMaxErrorRate": 0.05, "slaMaxCostPer1MTokens": 5, "slaHardConstraints": true }}使用する場面: レイテンシー、エラー率、コストについて厳格な予算が設定されている本番ワークロード。
エイリアス: sla-aware、sla
5. lkgp — 最後に正常だったプロバイダーを優先
Section titled “5. lkgp — 最後に正常だったプロバイダーを優先”最後に正常だったプロバイダー(設定されている場合)を最初に試し、その後 rules 戦略にフォールバックします。同じプロバイダーが会話内の後続リクエストを処理する、セッションのスティッキネスに役立ちます。
class LKGPStrategyImpl implements RouterStrategy { readonly name = "lkgp"; readonly description = "最後に正常だったプロバイダーを最初に試し、その後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(エイリアスなし)
カスタムルーター戦略
Section titled “カスタムルーター戦略”公開APIを介して、独自の RouterStrategy 実装を登録できます。
import { registerStrategy, type RouterStrategy,} from "@omniroute/open-sse/services/autoCombo/routerStrategy";
class MyCustomStrategy implements RouterStrategy { readonly name = "my-custom"; readonly description = "独自のカスタムルーティング戦略";
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());その後、次のように使用します。
{ "strategy": "auto", "config": { "routerStrategy": "my-custom" }}ルーター戦略の選択ガイド
Section titled “ルーター戦略の選択ガイド”| ユースケース | 戦略 | 理由 |
|---|---|---|
| バランス重視のワークロード | rules |
デフォルト — すべての要素を考慮 |
| コストの最小化 | cost |
常に最も安価なものを選択 |
| レイテンシーの最小化 | latency |
最も高速で信頼性の高いプロバイダーを選択 |
| 厳格なSLO | sla-aware |
p95、エラー、コストのしきい値でフィルタリング |
| 複数ターンのチャット | lkgp |
セッションのスティッキネス |
SLA対応フィールド:
{ "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バリアントの概要
Section titled “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における階層の位置付け
Section titled “Auto-Comboにおける階層の位置付け”16要素のスコアリング関数(open-sse/services/autoCombo/scoring.ts)は、階層への所属をtierPriority(0.0476)とtierAffinity(0.0476)という2つのシグナルとして扱います。DEFAULT_WEIGHTSの完全なセットについては、上記の標準的なスコアリング要素表を参照してください。パックごとのオーバーライド(ship-fast/cost-saver/quality-first/offline-friendly)は、「パックごとの重みプロファイル」表に記載されています。
階層だけでは、Tier 1が最初になることを強制しません。Tier 1のレイテンシーが悪い場合や、コスト対品質が最適でない場合は、Tier 2が選ばれます。階層順を強制するには、コンボ戦略priorityを使用し、プロバイダーを階層順に並べてください。
Tier 1(サブスクリプション)を強く優先するには、tierPriorityの重みを増やします。
{ "strategy": "auto", "config": { "auto": { "weights": { "tierPriority": 0.3, "costInv": 0.05 } } }}階層の定義とプロバイダーの分類については、docs/marketing/TIERS.mdを参照してください。
テストとカバレッジ
Section titled “テストとカバレッジ”決定論的ルーティング判断マトリックス(npm run test:combo:matrix)
Section titled “決定論的ルーティング判断マトリックス(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では実行されません — 実際のプロバイダーを使用)
Section titled “ゲート付きライブスモークテスト(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(19種類の戦略) |
src/sse/handlers/chat.ts |
統合:auto-prefixのショートサーキット |
HagiCode
HagiCode は構造化ワークフロー、マルチエージェント実行、Hero Dungeon ビューを備えたエージェント型コーディングワークスペースです。
よりスマートで速く、楽しいエージェント型ワークフローで、使いやすいソフトウェアを形にします。

- Smart構造化ワークフローは意図をアイデアから変更のリリースまで実行可能な道筋にします。
- Efficientマルチエージェントのワークフローで調査、実装、レビューを並行して進めます。
- FunHero Dungeon により長時間のコーディングを視覚的で協力的な体験にします。