feat(config): 为 anthropic、kimi、deepseek 添加 list_models 支持

This commit is contained in:
2026-02-02 06:40:41 +00:00
parent 2e43a5e396
commit 5638315031
6 changed files with 278 additions and 45 deletions

View File

@@ -82,10 +82,10 @@ impl OpenRouterClient {
Ok(self)
}
/// Validate API key
pub async fn validate_key(&self) -> Result<bool> {
/// List available models
pub async fn list_models(&self) -> Result<Vec<String>> {
let url = format!("{}/models", self.base_url);
let response = self.client
.get(&url)
.header("Authorization", format!("Bearer {}", self.api_key))
@@ -93,16 +93,44 @@ impl OpenRouterClient {
.header("X-Title", "QuiCommit")
.send()
.await
.context("Failed to validate OpenRouter API key")?;
if response.status().is_success() {
Ok(true)
} else if response.status().as_u16() == 401 {
Ok(false)
} else {
.context("Failed to list OpenRouter models")?;
if !response.status().is_success() {
let status = response.status();
let text = response.text().await.unwrap_or_default();
bail!("OpenRouter API error: {} - {}", status, text)
bail!("OpenRouter API error: {} - {}", status, text);
}
#[derive(Deserialize)]
struct ModelsResponse {
data: Vec<Model>,
}
#[derive(Deserialize)]
struct Model {
id: String,
}
let result: ModelsResponse = response
.json()
.await
.context("Failed to parse OpenRouter response")?;
Ok(result.data.into_iter().map(|m| m.id).collect())
}
/// Validate API key
pub async fn validate_key(&self) -> Result<bool> {
match self.list_models().await {
Ok(_) => Ok(true),
Err(e) => {
let err_str = e.to_string();
if err_str.contains("401") || err_str.contains("Unauthorized") {
Ok(false)
} else {
Err(e)
}
}
}
}
}