use ai_profile::client::{ServiceConfig, Verifier};
use ai_profile::{preset_by_key, VerifyError};
#[tokio::main(flavor = "current_thread")]
async fn main() {
let key_name = std::env::args().nth(1).unwrap_or_else(|| "deepseek".into());
let p = preset_by_key(&key_name).unwrap_or_else(|| panic!("没有预置 {key_name}"));
let api_key = std::env::var("AI_PROFILE_KEY").unwrap_or_default();
let verifier = Verifier::new().expect("建 HTTP 客户端");
let cfg = ServiceConfig::new(p.protocol, p.base_url.unwrap_or(""))
.with_preset(p.key) .with_api_key(&api_key)
.with_model(p.model);
match verifier.verify(cfg).await {
Ok(ok) => {
println!(
"连通 · {}ms · 端点提供 {} 个对话模型",
ok.latency_ms,
ok.models.len()
);
if ok.dropped > 0 {
println!("(已滤掉 {} 个向量 / 重排 / 语音等非对话模型)", ok.dropped);
}
if !ok.model_in_list {
println!("⚠️ 当前模型 {} 不在端点清单里,让用户确认", p.model);
}
if let Some(l) = ok.limits {
println!(
"端点上报的限额:窗口 {:?} / 输出 {:?}",
l.context_window, l.max_output
);
}
}
Err(e) => {
let action = match &e {
VerifyError::AuthFailed { .. } => "高亮密钥输入框:密钥不对或已过期",
VerifyError::NotFound {
suggested_url: Some(_),
..
} => "显示「一键改用建议地址」按钮",
VerifyError::NotFound { .. } => "提示检查地址",
VerifyError::Unreachable { proxy_hint: true } => "提示「这家可能需要代理」",
VerifyError::Unreachable { .. } => "提示检查网络与地址",
VerifyError::ModelNotFound { .. } => "把端点给的可用模型列成下拉让用户选",
VerifyError::ProtocolMismatch { .. } => "提示「协议选错了」并给出正确协议",
VerifyError::MissingExtraField { .. } => "高亮缺少的专有字段(发请求前就能判出来)",
_ => "显示原始错误信息",
};
println!("失败:{e}");
println!("界面应该:{action}");
}
}
}