为信号选择模型
Router 询问的每个模型都在 global.model_catalog.deployments 下按名称声明一次。用到模型的地方都只写这个名称。本页说明这个名称写在哪里。模型目录参考列出了部署的全部字段。
规则
由哪个部署回答一个信号,在三个层级之一确定。最具体的层级优先。
| 层级 | 部署名称写在哪里 | 适用于 |
|---|---|---|
| 规则 | 规则上的 deployment: | 每条应用规则(domains、fact_check、user_feedbacks、jailbreak、safety、pii、hallucination、refusal、turn_relation、complexity、modality)、每条 systemone 规则,以及 System One 选择器 algorithm.systemone |
| 信号类型 | global.model_catalog.bindings.<type>,或配方中的 recipes[].model_bindings.<type> | 未指定部署的应用信号类型规则:domain、fact_check、user_feedback、jailbreak、safety、pii、hallucination、refusal、turn_relation、complexity、modality |
| 默认 | global.model_catalog.system.decision_model | 上面两个层级未覆盖的所有问题 |
recipes[].model_bindings 中的绑定只作用于该配方,并优先于同一信号类型的全局绑定。
Embedding 不提问,也不回答任何信号;它们只用于召回。它们在使用的地方指定:
| 资源 | 在哪里指定 | 默认值 |
|---|---|---|
| Embedding | global.model_catalog.embeddings.default | vela-embedding |
有两个部署始终已声明,只有当某处解析到其中一个时 Router 才会启动它:primary(CPU 上的 vllm-sr/vela3-fast,默认决策模型)和 vela-embedding(Vela 1.0 Embedding)。要更改其中一个,声明一个同名部署即可。
S1. 全部默认:什么都不写
global:
model_catalog:
system:
decision_model: {deployment: primary}
decision_model: {deployment: primary} 就是默认值,所以不写它也不会有任何变化。
| 对象 | 解析到 |
|---|---|
| 每个问题类信号和选择器 | primary(按名称) |
| Embedding | vela-embedding |
S2. 全部交给远程 System One 模型
global:
model_catalog:
deployments:
d3-remote:
provider: systemone
endpoint: https://app.vllm-sr.ai/v1/systemone
model: vllm-sr/d3-ultra
schema: vllm-sr/5.0
auth: {api_key_env: VSR_APP_KEY} # keys come from an env var or a file, never inline
timeout_ms: 1500
capabilities: {presets: [pii, halu]} # used if the API's /models lists none
system:
decision_model: {deployment: d3-remote}
- 每个内置问题类信号、自定义
systemone信号和选择器都询问d3-remote。Router 在加载时检查该部署能回答配置所提的每种问题类型。 - 在一个请求阶段内,发给同一部署的所有问题合并为一次调用。API 报告失败的问题会单独再问一次。
- 规则的默认 predicate 来自回答的模型:它的模型卡校准的阈值,或规则写的
predicate。没有校准阈值的模型(本地或远程)使用 0.5,加载时报告指明该规则的uncalibrated_preset警告。 - PII 和幻觉检测规则需要片段。
pii或hallucination规则解析到的部署,若其声明的capabilities既不回答 span 问题、也没有pii/halu预设,则加载失败(span_required)。masking 插件同样需要 PII 片段,因此也会拒绝这样的部署。 - Embedding 仍使用各自的本地部署。
S3. 混合:PII 在本地,其余在远程
global:
model_catalog:
deployments:
local-vela: {provider: model_runtime, artifact: vllm-sr/vela3-fast, device: cpu}
d3-remote:
provider: systemone
endpoint: https://app.vllm-sr.ai/v1/systemone
model: vllm-sr/d3-ultra
schema: vllm-sr/5.0
auth: {api_key_env: VSR_APP_KEY}
system:
decision_model: {deployment: d3-remote}
bindings:
pii: local-vela
pii 解析到 local-vela;其他所有信号解析到 d3-remote。绑定的键是信号类型,与 recipes[].signals 中的命名一致;值是部署名称。
S4. systemone 信号和 domain 信号共用默认值,再各改一个
global:
model_catalog:
deployments:
kai:
provider: model_runtime
artifact: vllm-sr/Decision-2.0-Kai-0.6B
revision: cd49ea3813fd8ba0928a9a23ef6c9a0f2f0cd764
device: auto
d3-remote:
provider: systemone
endpoint: https://app.vllm-sr.ai/v1/systemone
model: vllm-sr/d3-ultra
schema: vllm-sr/5.0
auth: {api_key_env: VSR_APP_KEY}
system:
decision_model: {deployment: kai}
recipes: # or recipes[], which affects only that recipe
- name: default
model_bindings:
domain: d3-remote # signal type: every domain rule shares one answer
signals:
domains: [{name: math, description: Mathematics, labels: [math]}]
systemone:
- name: needs_reasoning # no deployment: asks the default, kai
question: {type: noul, instructions: "Does answering need multi-step reasoning?"}
- name: support_team
deployment: d3-remote # rule: only this question goes remote
question:
type: choice
instructions: Which team?
choices: [{key: billing}, {key: engineering}]
domain 解析到 d3-remote,needs_reasoning 解析到 kai,support_team 解析到 d3-remote。同样的内容写在 recipes[] 下时,只改变该配方:
global:
model_catalog:
deployments:
kai:
provider: model_runtime
artifact: vllm-sr/Decision-2.0-Kai-0.6B
revision: cd49ea3813fd8ba0928a9a23ef6c9a0f2f0cd764
device: auto
d3-remote:
provider: systemone
endpoint: https://app.vllm-sr.ai/v1/systemone
model: vllm-sr/d3-ultra
schema: vllm-sr/5.0
auth: {api_key_env: VSR_APP_KEY}
system:
decision_model: {deployment: kai}
entrypoints:
- model_names: [vllm-sr/auto]
recipe: default
default: true
- {model_names: [vllm-sr/support], recipe: support}
recipes:
- name: default
- name: support
model_bindings:
domain: d3-remote # only the support recipe asks d3-remote about domains
signals:
domains: [{name: math, description: Mathematics, labels: [math]}]
在 support 配方中,domain 解析到 d3-remote;在其他地方解析到 kai。
S5. 自己指定部署的规则
recipes:
- name: default
signals:
domains:
- {name: math, labels: [math]}
- {name: law, labels: [law], deployment: kai}
safety:
- name: harmful
deployment: d3-remote
predicate: {gte: 0.5}
decisions:
- name: pick-model
modelRefs: [{model: general}, {model: small}]
algorithm: {type: systemone, systemone: {deployment: kai, instructions: Pick the cheapest capable model.}}
d3-remote 和 kai 是已声明的部署,这里分别是一个 System One API 和一个 Decision 模型。harmful 询问 d3-remote,law 和 pick-model 选择器询问 kai,math 询问默认部署 primary。同一类型、同一部署上的规则仍共享一个问题。
远程模型和挂接的模型
连接块(endpoint、model、auth、headers、timeout_ms、max_retries、tls、limits)对每个远程服务和 Router 挂接的模型运行时都相同。模型目录参考给出了远程 embedding 模型、远程 jailbreak 防护、使用自有认证请求头的 System One 网关、挂接的运行时以及请求后端的示例。
Router 在加载时检查什么
Router 在加载配置时检查每个名称和每一处对应关系;不会静默回退。vllm-sr config validate --config config.yaml 运行相同的检查。
| 错误 | Router 报告的内容 |
|---|---|
| 绑定或规则指向未声明的部署 | 该绑定或规则、未知名称以及已声明的名称 |
部署无法回答分配给它的信号,例如 bindings.pii: remote-embed,或不提供 embedding 的 embeddings.default | 该信号、该部署以及它能回答什么 |
绑定键不是信号类型,例如 bindings.piii | 该键以及最接近的信号类型 |
部署无法回答规则提出的问题,例如 domains 规则指向一个 openai_embeddings 部署 | 该规则、该部署以及能回答它的 provider |
在配置中直接写密钥,例如 auth.api_key 或 Authorization 请求头 | 密钥来自 api_key_env 或 api_key_file |
pii 或 hallucination 规则所在的部署不提供片段 | span_required;需要这些片段的 masking 插件同样被拒绝 |
问题类 型是其部署不回答的类型,例如 vela3-fast 上的 score 规则或评审 | 规则报 question_type_unsupported,并指出问题、部署及其能回答的类型;评审或选择器也会指出这些 |
Router 拒绝用早期形式写的配置,每个字段给出一行错误并指明 vllm-sr config migrate。迁移模型资源将每种早期形式与本页的形式并列展示。