模型选择
wesgine 的模型选择策略与相关不变量。
核心原则
用户必须始终知道"我在和哪个模型对话"。
INV-MODEL-01:Model 必填
AppRunRequest.Model 为空时引擎拒绝执行(fail-closed),返回 ErrModelRequired。
- 隐式选择 = 结果不可复现 + 成本不透明 + 能力不确定
- 消费方负责在应用层确定默认模型后显式传入
INV-MODEL-02:所有可用模型对用户可见
引擎 resolver 能使用的所有 provider(Shared + Named + BYOK),前端模型选择器都必须展示。
- 禁止"幽灵 provider"(引擎能用但前端不显示)
- 按来源标注
模型市场数据
权威来源
LLM 模型市场化数据的唯一来源:weisyn.git/catalog.yaml
包含:
- 名称 / 上下文窗口 / 最大输出
- 能力声明(Vision、Tool Use 等)
- 价格信息
引擎不含模型知识(INV-DS-01)
引擎自身不硬编码任何模型信息。所有模型知识来自外部配置。
自动补齐
消费方通过 provider.NormalizeProvider() 自动从 catalog 补齐 ContextWindow:
catalog.yaml → weisyn.ProviderCatalog()
→ 各产品 boot:provider.SetCatalog(...)
→ NormalizeProvider() 自动补齐
→ CellSpec → Boot → CompressPipeline
未配上下文窗口时
- 引擎不猜测物理窗口
- 经济预算走
DefaultEconomicWindow并 Warn - 长会话仍可能触发 provider
context_length_exceeded
AllowedModels
Cell 级别可以声明允许使用的模型白名单:
cell, _ := hyp.Cells().GetOrCreate(ctx, wesgine.CellSpec{
AllowedModels: []string{"gpt-4o", "claude-sonnet-4-20250514"},
// ...
})
未在白名单中的模型将被拒绝。
LogicalModelGroups
同一模型在多个 Provider 中可用时,通过逻辑分组统一管理:
LogicalModelGroups: map[string][]string{
"default": {"azure-gpt4o", "openai-gpt4o"},
"fast": {"groq-llama", "together-llama"},
}
引擎按组内顺序尝试,实现 Provider 级别的 failover。