use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProviderListResponse {
#[serde(default)]
pub all: Vec<Provider>,
#[serde(default)]
pub default: HashMap<String, String>,
#[serde(default)]
pub connected: Vec<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(rename_all = "lowercase")]
pub enum ProviderSource {
Env,
Config,
Custom,
Api,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Provider {
pub id: String,
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub source: Option<ProviderSource>,
#[serde(default)]
pub env: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub key: Option<String>,
#[serde(default)]
pub options: HashMap<String, serde_json::Value>,
#[serde(default)]
pub models: HashMap<String, Model>,
#[serde(flatten)]
pub extra: serde_json::Value,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Model {
pub id: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub capabilities: Option<ModelCapabilities>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ModelCapabilities {
#[serde(default)]
pub tool_use: bool,
#[serde(default)]
pub vision: bool,
#[serde(default)]
pub thinking: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ProviderAuth {
pub provider_id: String,
pub method: AuthMethod,
#[serde(default)]
pub configured: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "kebab-case")]
pub enum AuthMethod {
ApiKey {
#[serde(default, skip_serializing_if = "Option::is_none")]
env_var: Option<String>,
},
Oauth {
#[serde(default, skip_serializing_if = "Option::is_none")]
authorize_url: Option<String>,
},
None,
#[serde(other)]
Unknown,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct SetAuthRequest {
pub key: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OAuthAuthorizeResponse {
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct OAuthCallbackRequest {
pub code: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub state: Option<String>,
}