配置
Semantic Router v0.3 在本地 CLI、控制台、Helm 与 Operator 之间使用同一套 canonical YAML 契约:
version:
listeners:
providers:
routing:
global:
背景说明见 统一配置契约 v0.3。本页为如何实际使用该契约的操作指南。
Canonical 契约
version:schema 版本。请使用v0.3。listeners:路由器监听端口与超时等。providers:部署绑定与提供商默认值。routing:路由语义。global:稀疏运行时覆盖。若某字段省略,则使用路由器内置默认。
各节的职责划分
routing为 DSL 所拥有 的表面。routing.modelCardsrouting.modelCards[].lorasrouting.signalsrouting.projections(分区及派生路由输出)routing.decisions
providers拥有部署与默认选择元数据。defaultsmodelsproviders.defaults存放default_model、reasoning_families、default_reasoning_effortproviders.models[*]存放provider_model_id、backend_refs、pricing、api_format、external_model_ids
global拥有路由器级运行时覆盖。global.router聚合路由引擎控制项(如配置来源选择、route-cache、模型选择默认等)global.router.config_source选择运行时配置来自 canonical YAML 文件(file)还是进程内 Kubernetes CRD 协调(kubernetes)global.services聚合共享 API 与控制面服务,如response_api、router_replay、observability、authz、ratelimitglobal.stores聚合有存储支撑的服务,如semantic_cache、memory、vector_store
global.integrations聚合辅助运行时集成,如tools、looperglobal.model_catalog聚合路由器持有的模型资产,如嵌入、系统模型、外部模型、可复用分类器与模型支撑模块global.model_catalog.embeddings.semantic.embedding_config.top_k限制打分后路由要输出的嵌入规则条数上限;内置默认为1global.model_catalog.classifiers[]为启动时加载的分类器包(如分类体系分类器)的可复用注册表global.model_catalog.modules聚合能力模块,如prompt_guard、classifier、hallucination_mitigation
Canonical 示例
version: v0.3
listeners:
- name: http-8899
address: 0.0.0.0
port: 8899
timeout: 300s
providers:
defaults:
default_model: qwen3-8b
reasoning_families:
qwen3:
type: chat_template_kwargs
parameter: enable_thinking
default_reasoning_effort: medium
models:
- name: qwen3-8b
reasoning_family: qwen3
provider_model_id: qwen3-8b
backend_refs:
- name: primary
endpoint: host.docker.internal:8000
protocol: http
weight: 100
api_key_env: OPENAI_API_KEY
routing:
modelCards:
- name: qwen3-8b
modality: text
capabilities: [chat, reasoning]
loras:
- name: math-adapter
description: Adapter used for symbolic math and proof-style prompts.
signals:
keywords:
- name: math_terms
operator: OR
keywords: ["algebra", "calculus"]
structure:
- name: many_questions
feature:
type: count
source:
type: regex
pattern: '[??]'
predicate:
gte: 3
embeddings:
- name: technical_support
threshold: 0.75
candidates: ["installation guide", "troubleshooting steps"]
- name: account_management
threshold: 0.72
candidates: ["billing information", "subscription management"]
projections:
partitions:
- name: support_intents
semantics: exclusive
temperature: 0.3
members: [technical_support, account_management]
default: technical_support
scores:
- name: request_difficulty
method: weighted_sum
inputs:
- type: embedding
name: technical_support
weight: 0.18
value_source: confidence
- type: context
name: long_context
weight: 0.18
- type: structure
name: many_questions
weight: 0.12
mappings:
- name: request_band
source: request_difficulty
method: threshold_bands
outputs:
- name: support_fast
lt: 0.25
- name: support_escalated
gte: 0.25
decisions:
- name: support_route
description: Route support requests that need an escalated answer
priority: 100
rules:
operator: AND
conditions:
- type: embedding
name: technical_support
- type: projection
name: support_escalated
modelRefs:
- model: qwen3-8b
use_reasoning: true
lora_name: math-adapter
global:
router:
config_source: file
services:
observability:
metrics:
enabled: true
对于 routing.signals.structure,feature.type: density 现使用内置多语言文本单位归一化:每个 CJK 字符计为一个单位,连续拉丁字母与数字串计为一个单位,标点忽略,从而使同一 density 规则在英文、中文与混写提示下行为一致,且无需单独的 normalize_by 字段。
仓库中的配置资产
仓库将详尽的 canonical 参考配置与可复用路由片段分开:
config/config.yaml:详尽 canonical 参考配置config/signal/:可复用的routing.signals片段config/decision/:可复用的routing.decisions规则形状片段config/algorithm/:可复用的decision.algorithm片段config/plugin/:可复用的路由插件片段
config/decision/ 按布尔情形组织:single/、and/、or/、not/、composite/。
config/algorithm/ 按路由策略族组织:looper/ 与 selection/。
config/plugin/ 按每个插件或可复用包单独目录组织。
仓库在 go test ./pkg/config/... 中强制该片段目录,因此路由表面变更须同步更新 config/ 树。
最新教程遵循同一分类:
tutorials/signal/overview以及tutorials/signal/heuristic/、tutorials/signal/learned/对应config/signal/tutorials/decision/对应config/decision/tutorials/algorithm/对应config/algorithm/,每种算法一页tutorials/plugin/对应config/plugin/,每种插件一页tutorials/global/对应global:下的稀疏路由器级覆盖
与仓库相关的运行时与测试台资产现位于 config/ 之外:
deploy/examples/runtime/semantic-cache/deploy/examples/runtime/response-api/deploy/examples/runtime/tools/e2e/config/deploy/local/envoy.yaml
仅测试用 ONNX 绑定资产位于 e2e/config/onnx-binding/。
上述目录为支持资产,不是面向用户的主配置契约。手写配置请从 config/config.yaml 或上述片段目录开始。本仓库中,详尽参考配置将 global.integrations.tools.tools_db_path 指向 deploy/examples/runtime/tools/tools_db.json 以供本地开发。
config/config.yaml 不再只是示例。仓库将其作为详尽公开契约参考强制执行:
go test ./pkg/config/...检查其与 canonical schema 及路由表面目录一致make agent-lint在 lint 层运行同一参考配置契约检查,合入前即可拦截配置/schema 漂移- 维护中的
deploy/与e2e/路由器配置资产亦按同一 canonical 契约校验,避免示例与测试配置退回旧版稳态字段
投影工作流
当原始信号目录本身不足以支撑决策时,使用 routing.projections:
routing.signals定义可复用检测器。routing.projections.partitions在互斥域或嵌入族内解析唯一胜者。routing.projections.scores将学习与启发式信号组合为加权分数。routing.projections.mappings将分数映射为具名路由带。routing.decisions[*].rules.conditions[*]可用type: projection引用这些带。
控制台镜像同一契约:
Config -> Projections编辑分区、分数与映射Config -> Decisions可用条件类型projection引用映射输出DSL -> Visual直接管理PROJECTION partition、PROJECTION score、PROJECTION mapping实体
专题教程见 Projections。端到端维护示例:
如何使用
Python CLI
直接使用 canonical YAML。
vllm-sr serve --config config.yaml
若需先迁移旧配置:
vllm-sr config migrate --config old-config.yaml
vllm-sr validate config.yaml
v0.3 已移除 vllm-sr init。稳态文件为 config.yaml。本仓库默认详尽参考文件为 config/config.yaml。
本地路由器 / YAML 优先
本地 Docker 或直接开发路由器时,以 canonical 形式手写 config.yaml,serve 前校验:
vllm-sr validate config.yaml
vllm-sr serve --config config.yaml
若只需覆盖少量运行时默认,将其写在 global: 下,其余保持未设置。
控制台 / 引导
若需从 URL 导入或直接编辑完整 canonical YAML,请使用控制台。
- 引导远程导入接受完整的
version/listeners/providers/routing/global文件 - 配置页编辑同一 canonical 契约
- DSL 编辑器可导入同一 YAML,但仅将
routing反编译为 DSL - 决策中的
modelRefs可带lora_name,名称解析到routing.modelCards[].loras
Helm
Helm values 在 config 下镜像同一 canonical 契约。
config:
version: v0.3
providers:
defaults:
default_model: qwen3-8b
models:
- name: qwen3-8b
provider_model_id: qwen3-8b
backend_refs:
- name: primary
endpoint: semantic-router-vllm.default.svc.cluster.local:8000
protocol: http
routing:
modelCards:
- name: qwen3-8b
然后照常 install 或 upgrade:
helm upgrade --install semantic-router deploy/helm/semantic-router -f values.yaml
Operator
Operator 保持相同逻辑契约,但包在 CRD 内:
spec.config.providersspec.config.routingspec.config.global
spec.vllmEndpoints 仍是 Kubernetes 原生后端发现适配器。控制器在渲染路由器配置时,将该数据投影到 canonical providers.models[].backend_refs[] 与 routing.modelCards(含声明的 loras)。
DSL
DSL 仅拥有 routing 表面。
- 编写
MODEL、SIGNAL、ROUTE - 编译为路由片段
providers与global保留在 YAML 中
DSL 编译器输出:
routing:
modelCards:
signals:
decisions:
不会发出 listeners、providers 或 global。
导入与迁移
引导远程导入
设置向导可从 URL 导入完整 canonical YAML 并应用完整配置(含 providers、routing、global)。
DSL 导入
DSL 编辑器可导入:
- 完整路由器配置 YAML
- 仅路由的 YAML 片段
两种情况下,仅 routing 节会被反编译为 DSL。
迁移旧配置
对较旧的扁平或混排配置使用 CLI:
vllm-sr config migrate --config old-config.yaml
可迁移的旧形态包括:
- 顶层
signals、扁平keyword_rules/categories/其他信号块,以及decisions - 顶层
model_config - 顶层
vllm_endpoints与provider_profiles providers.models[].endpoints- 内联
access_key
并收敛为 canonical providers/routing/global。