Wie es funktioniert
ModelSelectionServiceInterface::resolveModelForCall() gibt eine ModelResolution zurück: das Modell und eine RoutingSummary. Dahinter führt RoutingDecisionService zuerst die Discovery aus, dann EligibilityEvaluator, dann CandidateRanker. Zulässigkeit ist eine harte Bedingung: Ein abgelehnter Kandidat erhält einen RoutingRejectionReason (fehlende Fähigkeit, Adapter nicht erlaubt, Kontext zu klein, Kosten über dem Limit, fehlende Fähigkeit für die Operation) und keinen Score. Die Provider-Priorität sortiert vor dem Score, denn eine Priorität ist eine Anweisung. routing.policyMode wählt providerPriority (Standard, keine gemessenen Signale), balanced, quality oder economy; ein Modell ohne Messwert trägt nichts bei statt einer Null. ConfigurationCallPlanner legt die Zusammenfassung auf TelemetrySignals ab. Die Telemetriezeile speichert den Modus, die Zahl der Kandidaten, die unterschiedlichen Ablehnungsgründe und welche Signale die Entscheidung tatsächlich bewegt haben. Der feste Modus speichert einen leeren Modus, weil nichts gewählt wurde.
ContextWindowManager::fit() nimmt das aufgelöste Modell entgegen und zieht es der Relation der Konfiguration vor; ist die Kontextlänge unbekannt, gilt ein Fenster von 8192 Tokens. LlmServiceManager begrenzt Chat-, Tool-Calling- und Streaming-Aufrufe am Ende der Middleware-Pipeline – dort existiert das aufgelöste Modell zum ersten Mal –, und Tool-Schemas zählen gegen dasselbe Budget. Ein Completion-Prompt wird gemessen und ein Überlauf protokolliert, aber nie gekürzt. Ein Transkript, das selbst nach maximaler Kürzung nicht passt, geht ungekürzt mit einer Warnung hinaus.
ToolDataClass ist eine Skala von publicContent bis secretAdjacent. TrustZone (local, privateHosted, externalEu, externalGlobal) ordnet jeder Zone eine höchste Klasse zu. TrustZoneResolver::zoneFor() liefert die am wenigsten vertrauenswürdige Zone, die ein Lauf erreichen kann: den Provider der Konfiguration – im Kriterienmodus den Provider des bedienenden Modells – und eine Stufe der Fallback-Kette; alles Unbekannte gilt als externalGlobal. Das Tool-Gate entfernt Tools oberhalb der Obergrenze. InputContextTrustGate lehnt einen Aufruf ab, dessen strengste deklarierte Quelle über der Zone liegt – Snippets, Skills, der System-Prompt und die Quellen, die ein Lauf zusätzlich erzwingt (ADR-164). Eine nicht deklarierte Quelle schränkt nichts ein. tools.dataClassEnforcement gilt für beide Richtungen: Nur ein wörtliches observe schaltet auf Beobachten. Ablehnungen landen in tx_nrllm_governance_event.
Im Tab „Governance“ zeigt EffectivePolicyReadout privacy.level, privacy.retentionDays, tools.dataClassEnforcement und skills.minTrustLevel so, wie die Laufzeit sie auflöst; eine Zeile, die sich nicht beantworten lässt, zeigt unknown. GovernanceProfile legt die erwarteten Werte je Haltung fest, und GovernanceProfileEvaluator::deviations() vergleicht sie mit den Zeilen der Anzeige und nennt, wo der jeweilige Wert gesetzt wird. Einen Weg zum Übernehmen gibt es nicht (ADR-140). GovernanceSimulator fragt Konfigurationszugriff, Tool-Gate, Input-Context-Gate, Routing und menschliche Freigabe ab und liefert allow, allowWithApproval oder block. Jede Telemetriezeile enthält außerdem actual_input_tokens, actual_output_tokens, actual_cost, response_model, provider_retries und modellunabhängige facts_*-Spalten; UsageMiddleware reicht source_extension an UsageTrackerServiceInterface::trackUsage() weiter, das die Kosten pro Tag und Extension in tx_nrllm_service_usage zusammenfasst.
Netresearch\NrLlm\Service\Routing\RoutingDecisionService
Die Entscheidungsstelle für das Routing: Discovery, Zulässigkeit, Ranking. Liefert eine RoutingDecision mit allen Kandidaten; genutzt von der Laufzeit und vom Tab „Governance“.
Netresearch\NrLlm\Service\Routing\EligibilityEvaluator
Die einzige Implementierung der Frage „darf dieses Modell diesen Aufruf bedienen“. Gibt einen RoutingRejectionReason statt false zurück; modelMatchesCriteria() delegiert hierher.
Netresearch\NrLlm\Domain\ValueObject\RoutingSummary
Sechs Werte, die pro geroutetem Aufruf gespeichert werden: Modus, Zahl der Kandidaten, unterschiedliche Ablehnungsgründe und ob Qualität, Health und Kosten die Entscheidung bewegt haben.
Netresearch\NrLlm\Service\Context\ContextWindowManager
Bemisst das Sendebudget am bedienenden Modell, entfernt die ältesten Runden vollständig und meldet einen Überlauf, statt den Aufruf zu verweigern.
Netresearch\NrLlm\Service\Governance\TrustZoneResolver
Die am wenigsten vertrauenswürdige Zone, die ein Lauf über den Provider und eine Fallback-Stufe erreicht; ceilingFor() macht daraus die Datenklassen-Obergrenze für Tools. Unbekanntes fällt sicher auf externalGlobal zurück.
Netresearch\NrLlm\Service\Context\InputContextTrustGate
Lehnt einen Aufruf ab (enforce) oder protokolliert ihn (observe), wenn die strengste deklarierte Klasse von Snippet, Skill, System-Prompt oder erzwungener Quelle über der erreichbaren Zone liegt.
Netresearch\NrLlm\Service\Governance\GovernanceProfileEvaluator
Vergleicht die Zeilen der Anzeige mit einem GovernanceProfile und gibt jede Abweichung mit dem Ort zurück, an dem sie geändert wird. Liest selbst nichts und schreibt nichts.
Netresearch\NrLlm\Service\Tool\GovernanceSimulator
Der Bereich „Wäre das erlaubt?“: ruft die Gates der Laufzeit für eine Konfiguration, ein Tool und optional einen Backend-Benutzer auf und protokolliert nichts.