use serde::Deserialize;
#[derive(Debug, Deserialize)]
struct ModelsResponse {
data: Vec<ModelInfo>,
}
#[derive(Debug, Deserialize)]
struct ModelInfo {
id: String,
_owned_by: Option<String>,
}
pub fn fetch_models_blocking(base_url: &str, api_key: &str) -> Result<Vec<String>, String> {
let url = format!("{}/models", base_url.trim_end_matches('/'));
let client = reqwest::blocking::Client::builder()
.timeout(std::time::Duration::from_secs(10))
.build()
.map_err(|e| format!("failed to build HTTP client: {}", e))?;
let response = client
.get(&url)
.header("Authorization", format!("Bearer {}", api_key))
.send()
.map_err(|e| format!("request to {} failed: {}", url, e))?;
if !response.status().is_success() {
let status = response.status();
let body = response.text().unwrap_or_default();
return Err(format!("{} returned {}: {}", url, status, body.trim()));
}
let parsed: ModelsResponse = response
.json()
.map_err(|e| format!("failed to parse models response: {}", e))?;
Ok(parsed.data.into_iter().map(|m| m.id).collect())
}
pub async fn fetch_models_async(base_url: &str, api_key: &str) -> Result<Vec<String>, String> {
use super::shared_client;
let url = format!("{}/models", base_url.trim_end_matches('/'));
let client = shared_client();
let response = client
.get(&url)
.header("Authorization", format!("Bearer {}", api_key))
.timeout(std::time::Duration::from_secs(10))
.send()
.await
.map_err(|e| format!("request to {} failed: {}", url, e))?;
if !response.status().is_success() {
let status = response.status();
let body = response.text().await.unwrap_or_default();
return Err(format!("{} returned {}: {}", url, status, body.trim()));
}
let parsed: ModelsResponse = response
.json()
.await
.map_err(|e| format!("failed to parse models response: {}", e))?;
Ok(parsed.data.into_iter().map(|m| m.id).collect())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_fetch_models_blocking_bad_url() {
let result = fetch_models_blocking("http://0.0.0.0:1/v1", "test-key");
assert!(result.is_err());
}
}