config/ is now the user-facing config surface only.
config/config.yaml: exhaustive canonical reference configconfig/signal/: reusablerouting.signalsfragmentsconfig/decision/: reusablerouting.decisionsrule-shape fragmentsconfig/algorithm/: reusabledecision.algorithmsnippetsconfig/plugin/: reusable route plugin snippets
Inside canonical config.yaml:
providers.defaultsholds provider-wide defaults such asdefault_modeland reasoning familiesproviders.models[]holds concrete backend access details directlyproviders.models[].pricingsupports separate prompt, cached-input, cache-write, and completion rates; omittedcache_write_per_1mfalls back toprompt_per_1mrouting.modelCards[]holds semantic model metadata, including optionalloras[]catalogs for decision-levellora_namereferencesrouting.projectionscarries cross-signal coordination and derived routing outputsrouting.projections.partitionsis the canonical runtime home for exclusive domain or embedding partitions; DSL authoring usesPROJECTION partitionrouting.projections.scoresandrouting.projections.mappingslet maintained configs turn learned and heuristic signals into named routing bands that decisions can reference withtype: projectionrouting.decisions[].candidateIterationscarries bounded DSLFOR ... INmetadata for candidate-model authoring; it is declarative selection policy input, not a general scripting runtimerouting.decisions[].modelRefs[].quality_scoreoptionally overrides the model-card quality score for that candidate in the owning decision;multi_factorfalls back to the model-card value only when this field is omittedrouting.decisions[].emits[]carries typed side-effect directives from DSLEMITblocks; the current supported kind isretention, wheredrop: trueskips response-side semantic-cache writes and the remaining fields stay structured/auditable for follow-up runtime consumers such as turn-aware cache TTL, current-model affinity, prefix/KV-cache warmth, and session transition telemetry- request-shape detectors such as
routing.signals.structurestay in the signal layer as typed named facts; numeric thresholds live inside the detector config instead of turning decisions into a free-form expression language routing.signals.embeddings[].query_modalitydeclares which modality of incoming request payload the embedding rule's query is computed from. Defaults to"text";"image"and"audio"requireglobal.model_catalog.embeddings.semantic.embedding_config.model_type=multimodalso the query and candidate embeddings land in the same shared space. Seewebsite/docs/tutorials/signal/learned/embedding.mdfor the worked multimodal example.- structure
densityfeatures now use built-in multilingual text-unit normalization; the contract no longer exposes a per-rulenormalize_byswitch - the dashboard and DSL builder now expose the same projection surface directly; see
website/docs/tutorials/projection/overview.mdand the maintaineddeploy/recipes/balance.{yaml,dsl}pair for end-to-end usage - top-level
entrypointsmaps request-facing virtual model names onto named routing recipes; the names never reach a backend, they only select which routing profile evaluates the request - top-level
recipesadds named routing profiles beside theroutingblock. The top-levelroutingprofile is thedefaultrecipe; eachrecipes[].routingblock carries the same profile shape (signals,projections,decisions) but nevermodelCards— the model catalog and the signal/projection name registry stay global across recipes. Seewebsite/docs/tutorials/global/entrypoints-and-recipes.md global.router,global.services,global.stores,global.integrations, andglobal.model_catalogexpose router-wide overrides explicitlyglobal.router.learning.adaptationadds online model-choice learning after the base decision algorithm.global.router.learning.protectionprotects agentic continuity, cache, tool loops, and handoff cost. Decisions can opt out withrouting.decisions[].adaptations.mode: bypass, use component-leveladaptations.adaptation.mode/adaptations.protection.mode, or override the adaptation search space withadaptations.adaptation.candidate_set.decision.algorithm.type=session_aware|elo|rl_driven|gmtrouter|bandit|personalizationis no longer a supported public algorithm.global.services.router_replay.enabledis the router-wide replay default; when it is on, decisions inherit replay capture unless a route-localrouter_replayplugin setsenabled: false- embedding fallback tuning such as
global.model_catalog.embeddings.semantic.embedding_config.top_klives under the router-owned model catalog, not under individual signal rules - prototype-aware exemplar compression and label scoring live alongside their owning signal families:
global.model_catalog.embeddings.semantic.embedding_config.prototype_scoring,global.model_catalog.modules.classifier.preference.prototype_scoring,global.model_catalog.kbs[].prototype_scoring, andglobal.model_catalog.modules.complexity.prototype_scoring - reusable startup-loaded knowledge bases live under
global.model_catalog.kbs[], whilerouting.signals.kb[]binds label/group matches into normal routing signals - built-in knowledge base defaults keep
source.pathaligned with the steady-stateknowledge_bases/<dir>/contract; local/dev runtime seeds missing built-ins fromconfig/knowledge_bases/<dir>/into.vllm-sr/knowledge_bases/<dir>/once, and router reads the shared runtime KB store from there global.router.config_sourceselects the router's steady-state config source; the exhaustive reference usesfile, while Kubernetes CRD reconciliation useskubernetesglobal.router.auto_model_namesdeclares the request model aliases that enter full vLLM-SR automatic routing. Defaults includevllm-sr/auto,auto, andMoM;auto_model_nameremains the legacy single-name compatibility field.global.router.skip_processing.enabledopts the router into honoring thex-vsr-skip-processingrequest header; defaults tofalseso an arbitrary upstream caller cannot bypass router policy by injecting the header. Enable only when an authenticated upstream filter (ext_authz, etc.) is responsible for setting or stripping the header (see #1808)- router-owned model-backed module config lives under
global.model_catalog.modules global.model_catalog.modules.prompt_compression.profileselects built-in signal-compression scoring defaults (default,coding,medical,security, ormulti_turn);multi-turnis accepted as an alias, unknown names fail validation, and explicit weight/preserve fields override the profile.
config/decision/ is organized by boolean rule shape:
single/: one signal conditionand/: conjunction examplesor/: disjunction examplesnot/: exclusion examplescomposite/: nested AND/OR/NOT cases
Decision fragments may reference modelRefs[].lora_name, but those adapter names must be declared in the base config's routing.modelCards[].loras. A modelRefs[].quality_score value is decision-scoped, must be between 0 and 1, and preserves an explicit 0.
Candidate iteration fragments must stay bounded to decision.candidates or an explicit model list and feed existing decision outputs such as MODEL <iterator>.
config/algorithm/ is organized by routing policy:
looper/: multi-model execution policies such asconfidence,ratings,remom, andfusionselection/: request-time candidate-selection policies such asrouter_dc,automix,hybrid,multi_factor, andlatency_aware
Each supported algorithm now has its own tutorial page under website/docs/tutorials/algorithm/.
config/plugin/ is organized by route-local plugin or reusable plugin bundle:
- one directory per plugin or bundle, such as
semantic-cache/,rag/,memory/, orcontent-safety/ - route-local tool policy examples live under
tools/ - one fragment example per directory in the current catalog
Each supported plugin now has its own tutorial page under website/docs/tutorials/plugin/.
The repository enforces this fragment catalog, the exhaustive reference config, the maintained deploy/E2E config assets, and the core public config docs in Go tests. When a supported signal, decision algorithm, plugin surface, or canonical contract term changes, both go test ./pkg/config/... and make agent-lint will fail until config/, maintained deploy/ / e2e/ config assets, and the core config docs are updated to match.
Latest official tutorials mirror the same top-level taxonomy:
tutorials/signal/tutorials/signal/heuristic/for rule-based and lightweight detector signalstutorials/signal/learned/for embedding- and classifier-driven signals
tutorials/decision/tutorials/algorithm/with one page per algorithmtutorials/learning/for cross-request Router Learning adaptation and protectiontutorials/plugin/with one page per plugintutorials/global/
config/ no longer carries runtime support files or test manifests.
- Runtime support examples moved to
deploy/examples/runtime/ - Local Envoy moved to
deploy/local/envoy.yaml - Harness and smoke manifests moved to
e2e/config/
The old full-example trees under config/intelligent-routing/, config/memory-rag/, config/multi-modal/, config/observability/, and config/prompt-guard/ were retired in v0.3. Use config/config.yaml as the exhaustive contract reference, then copy or trim it into deployment-specific config.yaml files as needed.