模型选择
wescode 的模型选择机制:单一数据源与显式选择原则。
核心原则
用户必须始终知道"我在和哪个模型对话"——隐式选择 = 结果不可复现 + 成本不透明 + 能力不确定。
INV-MODEL-01:Model 必填
AppRunRequest.Model 为空时引擎拒绝执行(fail-closed),返回 ErrModelRequired。
应用层(wescode)负责在发送前确定默认模型并显式传入。
INV-MODEL-02:所有可用模型对用户可见
引擎 resolver 能使用的所有 provider(Shared + Named + BYOK),前端模型选择器都必须展示。
禁止"幽灵 provider"(引擎能用但前端不显示)。
单一数据源
INV-PROVIDER-VIEW-01
模型列表通过单一 RPC sidebar/availableModels 统一返回:
- Chat 面板模型选择器只消费
availableModels - 不存在
listProviders+listWesProviders双 RPC 合并 authMe仅用于认证/欠费状态,不参与模型合并
GateGuard 判断
是否配置了 BYOK 也从 availableModels 派生:
const hasByok = availableModels.some(
m => m.source === 'byok' && m.status !== 'no_key'
)
LLM Catalog
模型市场数据的唯一权威来源是 weisyn.git/catalog.yaml:
catalog.yaml → weisyn.ProviderCatalog()
→ boot: provider.SetCatalog(...)
→ NormalizeProvider() 自动补齐 ContextWindow
规则
- 引擎不含 LLM 模型知识(INV-DS-01)
- 前端不硬编码模型列表(INV-DS-06)
- 本地部署平台(Ollama/vLLM)不列入 catalog
- catalog 没有的新模型 → 无压缩预算 → provider 报错
欠费处理
| 场景 | WES 模型 | BYOK 模型 | 发送 |
|---|---|---|---|
| 余额充足 | 可选 | 可选 | 正常 |
| WES 欠费 + 有 BYOK + 当前选 BYOK | disabled | 可选 | 正常 |
| WES 欠费 + 无 BYOK | disabled | — | 阻断 |
前端交互
- 发送按钮在
selectedModel == ""时 disabled - WES 欠费时标记
disabled+ error 文案 - 模型选择器展示所有可用模型按来源标注
相关文档
- Provider 体系 → engine
provider-system.md - Billing 契约 → engine
provider-system.md的 Billing 不变量段 - 欠费 UI → wesui
INV-CHAT-02/04