コンテンツにスキップ
OmniRoute source

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(エイリアスなし)


公開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"
}
}

ユースケース 戦略 理由
バランス重視のワークロード 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(デフォルト)に加え、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を参照してください。

決定論的ルーティング判断マトリックス(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のショートサーキット

OmniRoute ソースコード (a58000c7685f)

HagiCode

HagiCode は構造化ワークフロー、マルチエージェント実行、Hero Dungeon ビューを備えたエージェント型コーディングワークスペースです。

よりスマートで速く、楽しいエージェント型ワークフローで、使いやすいソフトウェアを形にします。

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