Zum Inhalt springen
OmniRoute source

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)


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

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
}
}

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).

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.)

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.

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 echten selectQuotaShareTarget-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.


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

OmniRoute-Quellcode (a58000c7685f)

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.

HagiCode-Hauptoberfläche im hellen Design
  • 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.
HagiCode besuchen