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
Заголовок раздела «Обзор вариантов Auto»Включая базовый 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.)
Как уровни связаны с Auto-Combo
Заголовок раздела «Как уровни связаны с Auto-Combo»Функция оценки с 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/ |
HagiCode
HagiCode — агентная среда разработки со структурированными процессами, параллельным выполнением несколькими агентами и интерфейсами Hero Dungeon.
Превращайте идеи в полезное ПО с более умным, быстрым и увлекательным агентным рабочим процессом.

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