迁移模型资源
早期版本通过 system 行、模块的 model_id 和 model_ref、external[] 模型、模块 backend、分类器的 type/model 字段以及绑定契约来选择模型。这些形式仍可加载:Router 把每一种都读作有名称的部署和绑定,使用与之前相同的模型,并为每个字段报告一条 deprecated_model_field 警告。本页是唯一出现早期形式的地方;文档其余部分都使用每组示例中的第二种形式。为信号选择模型说明了它们迁移到的形式,发布说明概述了这次变更。
用 vllm-sr config validate --config config.yaml 查看这些警告,或者直接用 Router:router -validate-config -config config.yaml 输出一行 JSON:{"valid": true, "warnings": [{"code": "deprecated_model_field", "field": "...", "message": "..."}]}。每条警告都指明字段以及 Router 把它读作什么,例如:
{"code": "deprecated_model_field", "field": "global.model_catalog.system.prompt_guard", "message": "model paths are deprecated; read as bindings.jailbreak: Vela-1.0-Encoder-307M-Guard (model_runtime vllm-sr/Vela-1.0-Encoder-307M-Guard on cpu)"}
vllm-sr config migrate --config config.yaml 把较早的文件改写为 v0.3 布局,并请 Router 把本页列出的每个字段写成对应示例中的第二种形式;文件的其余部分保持原样。它需要能运行的 Router(VLLM_SR_ROUTER_BINARY 指向的 Router 二进制文件,或 Router 镜像);使用 --offline 时模型字段保持不变。直接写在配置里的密钥会移到环境变量中,输出会给出需要设置的变量名。如果某个已弃用字段包含任何部署字段都无法表达的设置,模型字段保持原样,输出会说明是哪个设置。
其他变化
systemone决策模型现在也回答内置信号。以前这些信号在本地的vela3-fast上运行。除非配置写出阈值,它们的阈值为 0.5,加载时警告uncalibrated_threshold。- 安全规则的 hazard 部分没有自己的模型时,在任何决策模型下都使用预先声明的
hazard部署(Vela 1.0 Hazard)。以前,含有这种 hazard 部分的配置在systemone决策模型下无法加载。 - 其他一切都解析到与之前相同的模型。
早期形式和新形式为同一个信号指定模型时,新形式优先,早期字段被忽略并给出警告。同时写了 deployment 和 model 或 model_path 的规则,或者同时以信号类型和早期名称写出的绑定,会被拒绝。
System 行
指向决策模型所用模型的 system 行直接删除;指向其他模型的 system 行变为一个部署和一个绑定。
global:
model_catalog:
system:
decision_model: {deployment: primary}
pii_classifier: models/vela3-fast
prompt_guard: models/Vela-1.0-Encoder-307M-Guard
modules:
prompt_guard: {enabled: true, model_ref: prompt_guard, use_cpu: true}
classifier:
pii: {model_ref: pii_classifier, use_cpu: true}
global:
model_catalog:
deployments:
vela-guard:
provider: model_runtime
artifact: vllm-sr/Vela-1.0-Encoder-307M-Guard
revision: 087f9e401012df839c83717b746967ac7aebfa3e
device: cpu
system:
decision_model: {deployment: primary}
bindings:
jailbreak: vela-guard
modules:
prompt_guard: {enabled: true}
模块的 model_id
global:
model_catalog:
modules:
classifier:
domain: {model_id: models/Vela-1.0-Encoder-307M-Domain, use_cpu: true}
global:
model_catalog:
deployments:
vela-domain:
provider: model_runtime
artifact: vllm-sr/Vela-1.0-Encoder-307M-Domain
revision: f6354f54adcf38770f635ad903be2b00577f6c11
device: cpu
bindings:
domain: vela-domain
model_ref: ""
空的 model_ref 表示该模块不运行任何模型。改为关闭该模块,或者删除该信号。
global:
model_catalog:
modules:
classifier:
domain: {model_ref: ""}
global:
model_catalog:
modules:
classifier:
domain: {enabled: false}
模块 backend 和 external[] 模型
模块的 backend 和它指向的 external[] 模型合并为一个部署,其 provider 就是该服务使用的 API。
global:
model_catalog:
external:
- name: guard-service
model_role: guardrail
llm_endpoint: {address: guard.example.com, port: 443, protocol: https}
llm_timeout_seconds: 5
modules:
prompt_guard:
enabled: true
jailbreak_mapping_path: models/guard/jailbreak_type_mapping.json
backend: {protocol: http_classify, model: guard-service, contract: label_distribution.v1}
global:
model_catalog:
deployments:
guard-service:
provider: classify
endpoint: https://guard.example.com:443
timeout_ms: 5000
bindings:
jailbreak: guard-service
modules:
prompt_guard:
enabled: true
jailbreak_mapping_path: models/guard/jailbreak_type_mapping.json
provider: http 部署和绑定契约
global:
model_catalog:
external:
- name: guard-service
model_role: guardrail
llm_endpoint: {address: guard.example.com, port: 443, protocol: https}
llm_timeout_seconds: 5
deployments:
guard-http: {provider: http, external_model: guard-service}
modules:
prompt_guard: {enabled: true, positive_labels: [INJECTION]}
routing:
model_bindings:
prompt_guard: {deployment: guard-http, contract: label_distribution.v1, adapter: http_classify}
global:
model_catalog:
deployments:
guard-http:
provider: classify
endpoint: https://guard.example.com:443
timeout_ms: 5000
modules:
prompt_guard: {enabled: true, positive_labels: [INJECTION]}
routing:
model_bindings:
jailbreak: guard-http
绑定键和绑定对象
绑定以信号类型为键,值是一个部署名称。信号决定契约,provider 决定适配器。
routing:
model_bindings:
domain_classifier: {deployment: kai, contract: label_distribution.v1, adapter: modernbert}
routing:
model_bindings:
domain: kai
分类器规则
type、model、model_path 和 use_cpu 变为规则的 deployment。provider 决定如何询问该规则。
global:
model_catalog:
external:
- name: judge
model_role: classification
llm_provider: openai
llm_endpoint: {address: llm.example.com, port: 443, protocol: https}
llm_model_name: gpt-4.1-mini
- name: risk-service
model_role: classification
llm_endpoint: {address: risk.example.com, port: 8080, protocol: http}
routing:
signals:
classifiers:
- {name: safety-head, type: local, model_path: models/Vela-1.0-Encoder-307M-Safety, use_cpu: true, labels: [safe, unsafe]}
- {name: tool-risk, type: llm, model: judge, labels: [SAFE, RISKY], instructions: Choose RISKY only for destructive operations.}
- {name: remote-risk, type: sequence_classifier, model: risk-service, labels: [SAFE, RISKY]}
global:
model_catalog:
deployments:
vela-safety:
provider: model_runtime
artifact: vllm-sr/Vela-1.0-Encoder-307M-Safety
revision: 6e70e725a5f4d86da10f5be5e4dfd1da0358bb85
device: cpu
judge: {provider: openai_chat, endpoint: https://llm.example.com:443/v1, model: gpt-4.1-mini}
risk-service: {provider: classify, endpoint: http://risk.example.com:8080}
routing:
signals:
classifiers:
- {name: safety-head, deployment: vela-safety, labels: [safe, unsafe]}
- {name: tool-risk, deployment: judge, labels: [SAFE, RISKY], instructions: Choose RISKY only for destructive operations.}
- {name: remote-risk, deployment: risk-service, labels: [SAFE, RISKY]}
安全规则
global:
model_catalog:
external:
- name: binary-service
model_role: classification
llm_endpoint: {address: safety.example.com, port: 8080, protocol: http}
- name: hazard-service
model_role: classification
llm_endpoint: {address: hazard.example.com, port: 8080, protocol: http}
routing:
signals:
safety:
- name: unsafe
model: binary-service
threshold: 0.5
hazard: {model: hazard-service, labels: [violence, privacy], categories: [privacy], threshold: 0.6}
global:
model_catalog:
deployments:
binary-service: {provider: classify, endpoint: http://safety.example.com:8080}
hazard-service: {provider: classify, endpoint: http://hazard.example.com:8080}
routing:
signals:
safety:
- name: unsafe
deployment: binary-service
threshold: 0.5
hazard: {deployment: hazard-service, labels: [violence, privacy], categories: [privacy], threshold: 0.6}
规则绑定
为单条规则或为所有 complexity 规则写的绑定,变为这些规则的 deployment。
routing:
model_bindings:
classifier.risk: {deployment: content-risk, contract: label_distribution.v1, adapter: http_classify}
complexity: {deployment: kai, contract: decision.v1}
signals:
classifiers:
- {name: risk, labels: [low, high]}
complexity:
- name: hard
threshold: 0.1
hard: {candidates: [prove this theorem]}
easy: {candidates: [say hello]}
routing:
signals:
classifiers:
- {name: risk, deployment: content-risk, labels: [low, high]}
complexity:
- name: hard
deployment: kai
threshold: 0.1
hard: {candidates: [prove this theorem]}
easy: {candidates: [say hello]}
远程 embedding
global:
model_catalog:
embeddings:
semantic:
embedding_config: {backend: openai_compatible, model_type: remote}
endpoint:
base_url: https://embedding.example.com/v1
model: BAAI/bge-m3
api_key_env: EMBEDDING_API_KEY
timeout_seconds: 5
max_retries: 2
dimensions: 1024
global:
model_catalog:
deployments:
remote-embed:
provider: openai_embeddings
endpoint: https://embedding.example.com/v1
model: BAAI/bge-m3
auth: {api_key_env: EMBEDDING_API_KEY}
timeout_ms: 5000
max_retries: 2
capabilities: {dimensions: 1024}
embeddings:
default: remote-embed
记忆查询改写模型
记忆检索以前按 model_role: memory_rewrite 找到结合对话改写查询的模型。现在它是 global.stores.memory.query_rewrite 指定的 openai_chat 部署。
global:
model_catalog:
external:
- name: rewriter
llm_provider: vllm
model_role: memory_rewrite
llm_endpoint: {address: llm.example.com, port: 8000, protocol: http}
llm_model_name: qwen3
llm_timeout_seconds: 30
global:
model_catalog:
deployments:
rewriter:
provider: openai_chat
endpoint: http://llm.example.com:8000/v1
model: qwen3
timeout_ms: 30000
stores:
memory:
query_rewrite: {deployment: rewriter}
RAG 重排序绑定
global:
model_catalog:
deployments:
document-ranker:
provider: model_runtime
artifact: vllm-sr/Vela-1.0-Encoder-307M-Reranker
revision: a388e41cbbd5dc5f16b6389fa76d0b8b8a38a8bf
device: cpu
input: {max_tokens: 4096, overflow: reject}
routing:
model_bindings:
rag.reranker:
deployment: document-ranker
contract: relevance_scores.v1
adapter: vela_reranker
pair_scorer: {layer: 22, dimension: 768}
decisions:
- name: rag
plugins:
- type: rag
configuration: {enabled: true, backend: vectorstore, rerank: {top_k: 3}}
global:
model_catalog:
deployments:
document-ranker:
provider: model_runtime
artifact: vllm-sr/Vela-1.0-Encoder-307M-Reranker
revision: a388e41cbbd5dc5f16b6389fa76d0b8b8a38a8bf
device: cpu
input: {max_tokens: 4096, overflow: reject}
routing:
decisions:
- name: rag
plugins:
- type: rag
configuration:
enabled: true
backend: vectorstore
rerank: {deployment: document-ranker, top_k: 3, layer: 22, dimension: 768}
部署字段
顶层的 question_types 移到 capabilities 下,served_name 改为 model,直接写在配置中的密钥(access_key、后端的 api_key)改为 auth.api_key_env;在部署上也可以改为 auth.api_key_file。
global:
model_catalog:
deployments:
d3-gateway:
provider: systemone
endpoint: https://gateway.example.com/Unified/v1/systemone
model: vllm-sr/d3-ultra
question_types: [choice, noul, score]
auth: {api_key_env: GATEWAY_KEY}
decision-kai:
provider: model_runtime
endpoint: https://decision-worker.example.com:8100
served_name: decision-kai
global:
model_catalog:
deployments:
d3-gateway:
provider: systemone
endpoint: https://gateway.example.com/Unified/v1/systemone
model: vllm-sr/d3-ultra
capabilities: {question_types: [choice, noul, score]}
auth: {api_key_env: GATEWAY_KEY}
decision-kai:
provider: model_runtime
endpoint: https://decision-worker.example.com:8100
model: decision-kai
请求后端
base_url、api_key_env、auth_header、auth_prefix 和 extra_headers 变为 endpoint、auth 和 headers,与部署使用的形式相同。
providers:
defaults: {model: claude}
models:
- name: claude
backend_refs:
- provider: anthropic
base_url: https://gateway.example.com/anthropic
api_key_env: ANTHROPIC_KEY
auth_header: x-api-key
auth_prefix: ""
extra_headers: {X-Org: acme}
providers:
defaults: {model: claude}
models:
- name: claude
backend_refs:
- provider: anthropic
endpoint: https://gateway.example.com/anthropic
auth: {header: x-api-key, prefix: "", api_key_env: ANTHROPIC_KEY}
headers: {X-Org: acme}
准入键
global:
model_catalog:
admission:
prompt_guard: {max_concurrency: 4, max_queue: 64, on_overflow: shed}
global:
model_catalog:
admission:
jailbreak: {max_concurrency: 4, max_queue: 64, on_overflow: shed}