Model Spec Resolution and Role Tags
最近审计:2026-05-15 状态:已实现(已迁移自 design/)
背景
内部任务,例如 memory dreaming、embedding、reranker、图片理解、摘要等,确实需要按用途选择模型。但当前 model_routing.<task>.prefer_tags/fallback 这层公开配置过早暴露了策略复杂度,并且和 provider model tags 的职责重叠。
更合适的当前设计是:
providers.*.models[].tags声明模型能力和用途。ModelRouter只负责解析一个 model spec 字符串。- 内部任务在代码中声明自己的默认 tag 和 fallback 行为。
- 各模块配置层只暴露一个可选 model spec 字符串;这个字符串可以是 tag,也可以是固定模型 ID。
Model Spec 语义
一个 model spec 是单个字符串,以下形式等价地进入同一个解析器:
text
embedding
vision
memory
siliconflow/Qwen/Qwen3.6-35B-A3B
Qwen/Qwen3.6-35B-A3B解析顺序:
provider_id/model_name- 裸模型名
- tag
模型名本身可以包含 /;只有第一段命中 provider id 时才按 provider/model 拆分。
推荐配置形态
yaml
providers:
siliconflow:
type: openai-compatible
models:
- name: Qwen/Qwen3.6-35B-A3B
tags: [primary, vision]
- name: Qwen/Qwen3-Embedding-8B
tags: [embedding]
- name: cheap-chat
tags: [memory, cheap]
memory:
embedding:
enabled: true
model: "" # 空 = 默认找 embedding tag
# model: embedding
# model: siliconflow/Qwen/Qwen3-Embedding-8B
scheduler:
memory_dreaming_model: "" # 空 = 默认找 memory tag
multimodal:
image_fallback_model: "" # 空 = 默认找 vision tag内部任务默认行为
memory_dreaming:显式 spec ->memorytag -> session provider fallback。embedding:显式 spec ->embeddingtag -> disabled。reranker:显式 spec ->rerankertag -> disabled。image_fallback:显式 spec ->visiontag -> disabled。
这些 fallback 是代码里的任务语义,不作为公开 model_routing 配置项暴露。未来如果真实需要多 tag 优先级或用户可配置 fallback 链,再新增高级配置。
迁移原则
- 废弃
model_routing配置项;保留字段兼容旧配置但不参与新解析。 - 废弃各模块的
provider_id + model双字段配置;新配置使用单个modelspec 字符串。 - 旧字段若仍存在,只作为兼容输入拼成一个 spec,并在文档中标为 legacy。
- 新代码不得绕过
ModelRouter.resolve()直接解析 tag 或 provider/model。
实施清单
当前实现备注
ProviderModelConfig.tags已接入配置解析和ProviderSlot.tags_by_model。ModelRouter.resolve()的解析顺序是 provider/model 或裸模型名优先,tag 兜底。resolve_for_task()支持 explicit -> default spec -> fallback policy,fallback 目前为代码级语义,不暴露公开配置链。memory.embedding.model、scheduler.memory_dreaming_model、multimodal.image_fallback_model都是单字符串 model spec。- legacy 双字段仍保留兼容:
memory.embedding.provider_id、scheduler.memory_dreaming_provider_id、multimodal.image_fallback_provider。 Settings.model_routing仍存在但标记为 legacy ignored,CLI config validator 也把它当旧字段处理。