#[non_exhaustive]pub struct VerifyOk {
pub latency_ms: u32,
pub models: Vec<String>,
pub dropped: usize,
pub dropped_models: Vec<String>,
pub model_in_list: bool,
pub limits: Option<TokenLimits>,
pub model_limits: Vec<(String, TokenLimits)>,
}Expand description
验证成功的结果。
带 Serialize 是为了能直接从 Tauri Command 返回 —— 与 crate::VerifyError
成对,调用方的成功/失败两条路径都不必再写一遍 DTO。
字段名转 camelCase,与 crate::ProviderPreset 等喂给界面的类型保持一致。
Fields (Non-exhaustive)§
This struct is marked as non-exhaustive
Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.latency_ms: u32往返耗时 —— UI 显示「正常 · 320ms」,中转站慢不慢一眼看出
models: Vec<String>端点返回的可对话模型清单(已去重 + 清洗)
dropped: usize清洗时滤掉的条数(向量 / 重排 / 语音 / OCR 等非对话模型)。
用途是「已滤掉 N 个向量 / 重排 / 语音等」这类提示文案 —— 让用户知道 清单被处理过,而不是以为这个端点就这么几个模型。聚合平台上这个数字很大 (OpenRouter 实测 433 条里滤掉相当一部分),不说明会让人以为拉漏了。
全被滤光时本字段为 0 且 models 是未过滤的原始清单 —— 那说明特征词
在这个端点上判错了,此时宁可把原始清单摆给用户看,也不给他一个空下拉。
dropped_models: Vec<String>被滤掉的模型 id(端点顺序),len() == dropped。
只给「一个配置同时挂对话与生图 / 配音 / 向量模型」的调用方用 —— 把它们接在
models 后面,而不是丢掉。只做对话的调用方忽略它即可。
model_in_list: bool当前填的 model 是否在清单里;model 为空或端点没返回清单时为 true
limits: Option<TokenLimits>🔴 当前填的那个模型的限额,由端点上报(source: Endpoint)。
None 有两种情况,调用方处理方式相同 —— 回落到
ModelOption::preset_limits:
- 端点没报(OpenAI 规范里就没有 context 字段,是常态)
- 当前
model不在端点返回的清单里
model_limits: Vec<(String, TokenLimits)>端点上报了限额的全部模型,(id, 限额)。
给「切换模型时立刻显示新窗口」这类场景用 —— 不必为换个模型再打一次端点。 端点不报限额时是空表。