OmniRoute Auto-Combo Engine (Deutsch)
2. cost / eco — günstigster funktionsfähiger Provider
Abschnitt betitelt „2. cost / eco — günstigster funktionsfähiger Provider“Sortiert den Kandidatenpool nach costPer1MTokens (aufsteigend) und wählt den günstigsten aus.
Filtert zuvor Kandidaten mit dem Status OPEN heraus.
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 /* ... */ }; }}Verwendung: Kostensensible Workloads, Stapelverarbeitung oder Hintergrundaufgaben.
Aliasse: cost, eco
3. latency / fast — niedrigste p95-Latenz mit Zuverlässigkeitsabzug
Abschnitt betitelt „3. latency / fast — niedrigste p95-Latenz mit Zuverlässigkeitsabzug“Sortiert nach p95LatencyMs + (errorRate * 1000). Der Fehlerraten-Malus sorgt dafür,
dass unzuverlässige Anbieter niedriger eingestuft werden, selbst wenn ihre nominelle Latenz gering ist.
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 /* ... */ }; }}Wann verwenden: Für latenzempfindliche Workloads wie Echtzeit-Chats, automatische Vervollständigung oder interaktive Programmierassistenten.
Aliasse: latency, fast
4. sla-aware / sla — Einhaltung von Latenz-, Fehler- und Kosten-SLOs
Abschnitt betitelt „4. sla-aware / sla — Einhaltung von Latenz-, Fehler- und Kosten-SLOs“Bewertet jeden Kandidaten danach, wie gut er die konfigurierte SLO-Richtlinie erfüllt:
| Faktor | Gewichtung | Formel |
|---|---|---|
| Latenzwert | 35% | threshold / max(value, ε) |
| Fehlerwert | 35% | threshold / max(value, ε) |
| Zustandswert | 15% | 1.0 (CLOSED) / 0.5 (HALF_OPEN) / 0.0 (OPEN) |
| Kostenwert | 10% | threshold / max(value, ε) oder invers normalisiert |
| Stabilitätswert | 5% | invers normalisierte Standardabweichung der Latenz |
Wenn hardConstraints: true gesetzt ist, werden Kandidaten primär nach ihrem
Verletzungswert sortiert (also danach, wie weit sie ein SLO überschreiten) und
anschließend nach dem Gesamtwert. Andernfalls wird nur der Gesamtwert verwendet.
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) { // ... bewertet jeden Kandidaten anhand der Richtlinie: { targetP95Ms, maxErrorRate, maxCostPer1MTokens, hardConstraints } }}SLA-Felder (in der Kombinationskonfiguration festgelegt):
{ "strategy": "auto", "config": { "routerStrategy": "sla-aware", "slaTargetP95Ms": 1500, "slaMaxErrorRate": 0.05, "slaMaxCostPer1MTokens": 5, "slaHardConstraints": true }}Wann verwenden: Für Produktions-Workloads mit strikten Latenz-, Fehlerraten- oder Kostenbudgets.
Aliasse: sla-aware, sla
5. lkgp — zuletzt bekannter guter Anbieter zuerst
Abschnitt betitelt „5. lkgp — zuletzt bekannter guter Anbieter zuerst“Versucht zuerst den zuletzt bekannten guten Anbieter (falls festgelegt) und greift
anschließend auf die Strategie rules zurück. Dies ist für die Sitzungsaffinität
nützlich – derselbe Anbieter bearbeitet Folgeanfragen innerhalb einer Unterhaltung.
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 /* ... */ }; } }
// Rückgriff auf die Strategie „rules“ return getStrategy("rules").select(pool, context); }}Wann verwenden: Für mehrstufige Unterhaltungen, bei denen derselbe Anbieter Folgeanfragen bearbeiten soll (z. B. für Caching, Kontextkontinuität oder konsistente Preise).
Alias: lkgp (kein Alias)
Benutzerdefinierte Router-Strategien
Abschnitt betitelt „Benutzerdefinierte Router-Strategien“Sie können über die öffentliche API Ihre eigene RouterStrategy-Implementierung registrieren:
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) { // Ihre Routing-Logik hier 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());Verwenden Sie sie anschließend wie folgt:
{ "strategy": "auto", "config": { "routerStrategy": "my-custom" }}Auswahlhilfe für Router-Strategien
Abschnitt betitelt „Auswahlhilfe für Router-Strategien“| Anwendungsfall | Strategie | Grund |
|---|---|---|
| Ausgewogener Workload | rules |
Standard – berücksichtigt alle Faktoren |
| Kosten minimieren | cost |
Wählt immer den günstigsten Anbieter |
| Latenz minimieren | latency |
Wählt den schnellsten zuverlässigen Anbieter |
| Strikte SLOs | sla-aware |
Filtert nach p95-/Fehler-/Kostenschwellen |
| Mehrstufiger Chat | lkgp |
Sitzungsaffinität |
SLA-fähige Felder:
{ "strategy": "auto", "config": { "routerStrategy": "sla-aware", "slaTargetP95Ms": 1500, "slaMaxErrorRate": 0.05, "slaMaxCostPer1MTokens": 5, "slaHardConstraints": true }}Aufgabeneignung
Abschnitt betitelt „Aufgabeneignung“Mehr als 30 Modelle wurden für 6 Aufgabentypen bewertet (coding, review, planning, analysis, debugging, documentation). Unterstützt Platzhaltermuster (z. B. *-coder → hohe Bewertung für Programmierung).
Zusammenfassung der Auto-Varianten
Abschnitt betitelt „Zusammenfassung der Auto-Varianten“Einschließlich des einfachen auto (Standard) sowie der 6 in autoPrefix.ts deklarierten AutoVariant-Werte gibt es 7 aufrufbare Modell-IDs:
auto, auto/coding, auto/fast, auto/cheap, auto/offline, auto/smart, auto/lkgp
(AutoVariant selbst zählt 6 Werte auf; die 7. Option ist „keine Variante“ — das einfache auto — und wird von parseAutoPrefix() als variant: undefined behandelt.)
Wie Tiers in Auto-Combo einfließen
Abschnitt betitelt „Wie Tiers in Auto-Combo einfließen“Die Bewertungsfunktion mit 16 Faktoren (open-sse/services/autoCombo/scoring.ts) behandelt die Tier-Zugehörigkeit als zwei Signale: tierPriority (0.0476) und tierAffinity (0.0476). Die vollständige Menge von DEFAULT_WEIGHTS finden Sie oben in der kanonischen Tabelle der Bewertungsfaktoren — die Überschreibungen pro Paket (ship-fast/cost-saver/quality-first/
offline-friendly) sind in der Tabelle „Gewichtungsprofile pro Paket“ aufgeführt.
Das Tier allein erzwingt nicht, dass Tier 1 zuerst verwendet wird — wenn die Latenz von Tier 1 schlecht oder das Kosten-Qualitäts-Verhältnis suboptimal ist, gewinnt Tier 2. Um die Tier-Reihenfolge zu erzwingen, verwenden Sie die Combo-Strategie priority und ordnen Sie die Anbieter nach Tier an.
Um Tier 1 (Abonnement) stark zu bevorzugen, erhöhen Sie die Gewichtung von tierPriority:
{ "strategy": "auto", "config": { "auto": { "weights": { "tierPriority": 0.3, "costInv": 0.05 } } }}Definitionen der Tiers und die Klassifizierung der Anbieter finden Sie unter docs/marketing/TIERS.md.
Tests und Abdeckung
Abschnitt betitelt „Tests und Abdeckung“Deterministische Matrix für Routing-Entscheidungen (npm run test:combo:matrix)
Abschnitt betitelt „Deterministische Matrix für Routing-Entscheidungen (npm run test:combo:matrix)“tests/integration/combo-matrix/*.test.ts belegt die Routing-Entscheidung aller 19 öffentlichen Strategien durchgängig über die echte Combo-Pipeline mit einem simulierten Upstream-Dienst. Die Abdeckung umfasst:
- Alle 19 Strategien aus
ROUTING_STRATEGY_VALUES(geordnet, gewichtet, Kosten, Kontext, Fusion, …). quota-share(intern) durchgängig: DRR-Fairness + Herabstufung bei Sättigung über den echtenselectQuotaShareTarget-Integrationspunkt (registerQuotaFetcher/setLKGP/__setHeadroomSaturationFetcherForTests).- Universelle Übergabeabdeckung für
context-relayüber jede Anzahl von Zielen hinweg.
Diese Suite wird in der CI (test:integration-Job) mit --test-concurrency=1 und --test-force-exit ausgeführt, sodass sie deterministisch ist und keine Live-Anmeldedaten benötigt.
Abgesicherte Live-Smoke-Tests (NICHT in der CI — echte Anbieter)
Abschnitt betitelt „Abgesicherte Live-Smoke-Tests (NICHT in der CI — echte Anbieter)“| Befehl | Funktion |
|---|---|
npm run test:combo:live |
Echtes In-Process-Routing mit RUN_COMBO_LIVE=1; erstellt einen Snapshot einer Live-OmniRoute-Datenbank |
npm run test:combo:live:vps |
HTTP-Aufrufe an einen aktiven OmniRoute-Server (COMBO_LIVE_BASE_URL festlegen) |
npm run test:combo:live:vps:failover |
Dasselbe, mit absichtlich herbeigeführten Failover-Szenarien |
Diese Smoke-Tests prüfen den echten Übertragungspfad (Combo → Anbieter → Vervollständigung). Sie sind bewusst von der CI ausgeschlossen, da sie Live-Anmeldedaten und VPS-Zugriff erfordern.
Dateien
Abschnitt betitelt „Dateien“| Datei | Zweck |
|---|---|
open-sse/services/autoCombo/scoring.ts |
Bewertungsfunktion mit 16 Faktoren, DEFAULT_WEIGHTS, Pool-Normierung |
open-sse/services/autoCombo/taskFitness.ts |
Nachschlagetabelle für Modell-×-Aufgaben-Eignung |
open-sse/services/autoCombo/engine.ts |
Auswahllogik, Bandit, Budgetobergrenze |
open-sse/services/autoCombo/selfHealing.ts |
Ausschluss, Prüfungen, Vorfallmodus |
open-sse/services/autoCombo/modePacks.ts |
6 Gewichtungsprofile (ship-fast, cost-saver, quality-first, offline-friendly, reliability-first, chaos-mode) |
open-sse/services/autoCombo/autoPrefix.ts |
Parser für das Präfix auto/ + 6 Varianten |
open-sse/services/autoCombo/virtualFactory.ts |
Erstellt eine speicherinterne AutoComboConfig aus aktiven Verbindungen |
open-sse/services/autoCombo/providerRegistryAccessor.ts |
Test-Hook zum Mocken der Provider-Registry |
src/shared/constants/routingStrategies.ts |
ROUTING_STRATEGY_VALUES (19 Strategien) |
src/sse/handlers/chat.ts |
Integration: Kurzschluss für Auto-Präfixe |
HagiCode
HagiCode ist ein agentischer Coding-Arbeitsplatz mit strukturierten Workflows, Multi-Agent-Ausführung und Hero-Dungeon-Ansichten.
Mit einem intelligenteren, schnelleren und unterhaltsameren agentischen Workflow wird aus Ideen nutzbare Software.

- SmartStrukturierte Workflows machen aus Absichten einen umsetzbaren Weg von der Idee bis zur Auslieferung.
- EfficientMulti-Agent-Workflows führen Recherche, Umsetzung und Prüfung parallel aus.
- FunHero Dungeon macht lange Coding-Sitzungen anschaulich und gemeinschaftlich.