Перейти к содержимому
OmniRoute source

OmniRoute Auto-Combo Engine (Русский)

2. cost / eco — самый дешёвый работоспособный провайдер

Заголовок раздела «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 со штрафом за ненадёжность

Заголовок раздела «3. latency / fast — самая низкая задержка p95 со штрафом за ненадёжность»

Сортирует по p95LatencyMs + (errorRate * 1000). Штраф за частоту ошибок гарантирует, что ненадёжные провайдеры ранжируются ниже, даже если их номинальная задержка мала.

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 по задержке/ошибкам/стоимости

Заголовок раздела «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 =
"Selects the provider most likely to satisfy latency, error-rate, and cost SLOs";
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 — последний успешно работавший провайдер в первую очередь

Заголовок раздела «5. lkgp — последний успешно работавший провайдер в первую очередь»

Сначала пробует последнего успешно работавшего провайдера (если он задан), а затем переключается на стратегию rules. Полезно для привязки сеанса — один и тот же провайдер обрабатывает последующие запросы в диалоге.

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 (без псевдонима)


Пользовательские стратегии маршрутизации

Заголовок раздела «Пользовательские стратегии маршрутизации»

Через публичный API можно зарегистрировать собственную реализацию RouterStrategy:

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());

Затем используйте её:

{
"strategy": "auto",
"config": {
"routerStrategy": "my-custom"
}
}

Руководство по выбору стратегии маршрутизации

Заголовок раздела «Руководство по выбору стратегии маршрутизации»
Сценарий использования Стратегия Причина
Сбалансированная нагрузка rules По умолчанию — учитывает все факторы
Минимизация стоимости cost Всегда выбирает самый дешёвый вариант
Минимизация задержки latency Выбирает самого быстрого надёжного провайдера
Строгие SLO sla-aware Фильтрует по порогам p95/ошибок/стоимости
Многоходовой чат lkgp Привязка сеанса

Поля SLA-aware:

{
"strategy": "auto",
"config": {
"routerStrategy": "sla-aware",
"slaTargetP95Ms": 1500,
"slaMaxErrorRate": 0.05,
"slaMaxCostPer1MTokens": 5,
"slaHardConstraints": true
}
}

Более 30 моделей оценены по 6 типам задач (coding, review, planning, analysis, debugging, documentation). Поддерживаются шаблоны с подстановочными знаками (например, *-coder → высокая оценка за программирование).

Включая базовый auto (по умолчанию) и 6 значений AutoVariant, объявленных в autoPrefix.ts, существует 7 доступных для вызова идентификаторов моделей:

auto, auto/coding, auto/fast, auto/cheap, auto/offline, auto/smart, auto/lkgp

(AutoVariant перечисляет 6 значений; 7-й вариант — «без варианта», то есть базовый auto, — обрабатывается parseAutoPrefix() как variant: undefined.)

Функция оценки с 16 факторами (open-sse/services/autoCombo/scoring.ts) рассматривает принадлежность к уровню как два сигнала: tierPriority (0.0476) и tierAffinity (0.0476). Полный набор 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)

Заголовок раздела «Детерминированная матрица решений маршрутизации (npm run test:combo:matrix)»

tests/integration/combo-matrix/*.test.ts проверяет решение о маршрутизации для всех 19 публичных стратегий сквозным образом через реальный конвейер комбинаций с имитацией вышестоящего сервиса. Покрытие включает:

  • Все 19 стратегий ROUTING_STRATEGY_VALUES (ordered, weighted, cost, context, fusion, …).
  • Сквозную проверку quota-share (внутренняя стратегия): справедливость DRR и снижение приоритета при насыщении через реальную точку расширения selectQuotaShareTarget (registerQuotaFetcher / setLKGP / __setHeadroomSaturationFetcherForTests).
  • Проверку универсальной передачи context-relay для любого количества целевых объектов.

Этот набор запускается в CI (задание test:integration) с --test-concurrency=1 и --test-force-exit, поэтому он детерминирован и не требует действующих учётных данных.

Условно запускаемые проверки работоспособности в реальной среде (НЕ в CI — реальные провайдеры)

Заголовок раздела «Условно запускаемые проверки работоспособности в реальной среде (НЕ в CI — реальные провайдеры)»
Команда Что она делает
npm run test:combo:live Реальная маршрутизация внутри процесса с RUN_COMBO_LIVE=1; создаёт снимок рабочей базы данных OmniRoute
npm run test:combo:live:vps HTTP-вызовы к работающему серверу OmniRoute (задайте COMBO_LIVE_BASE_URL)
npm run test:combo:live:vps:failover То же самое, но с намеренно смоделированными сценариями переключения при сбое

Эти проверки работоспособности тестируют реальный сетевой путь (комбинация → провайдер → завершение). Они намеренно исключены из CI, поскольку требуют действующих учётных данных и доступа к VPS.


Файл Назначение
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/

Исходный код OmniRoute (a58000c7685f)

HagiCode

HagiCode — агентная среда разработки со структурированными процессами, параллельным выполнением несколькими агентами и интерфейсами Hero Dungeon.

Превращайте идеи в полезное ПО с более умным, быстрым и увлекательным агентным рабочим процессом.

Главный экран HagiCode в светлой теме
  • SmartСтруктурированные процессы превращают намерение в исполнимый путь от идеи до готового изменения.
  • EfficientМультиагентные процессы параллельно продвигают исследование, реализацию и проверку.
  • FunHero Dungeon делает длительную совместную разработку наглядной и увлекательной.
Перейти на HagiCode