use bon::Builder;
use serde::{Deserialize, Serialize};
use std::str::FromStr;
use super::{LettaId, ProviderCategory};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Provider {
pub id: LettaId,
pub name: String,
pub provider_type: ProviderType,
pub provider_category: ProviderCategory,
#[serde(skip_serializing_if = "Option::is_none")]
pub api_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub base_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub access_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub secret_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
#[serde(skip_serializing_if = "Option::is_none")]
pub organization_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub updated_at: Option<String>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ProviderType {
Anthropic,
Openai,
Azure,
#[serde(rename = "google_ai")]
GoogleAi,
Groq,
Cohere,
Together,
Mistral,
Ollama,
#[serde(rename = "vllm")]
Vllm,
#[serde(rename = "lmstudio")]
LmStudio,
Kobold,
Replicate,
#[serde(rename = "openrouter")]
OpenRouter,
Perplexity,
Recursal,
Fireworks,
Anyscale,
Cloudflare,
Voyage,
Bedrock,
Other,
}
impl std::fmt::Display for ProviderType {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::Anthropic => write!(f, "anthropic"),
Self::Openai => write!(f, "openai"),
Self::Azure => write!(f, "azure"),
Self::GoogleAi => write!(f, "google_ai"),
Self::Groq => write!(f, "groq"),
Self::Cohere => write!(f, "cohere"),
Self::Together => write!(f, "together"),
Self::Mistral => write!(f, "mistral"),
Self::Ollama => write!(f, "ollama"),
Self::Vllm => write!(f, "vllm"),
Self::LmStudio => write!(f, "lmstudio"),
Self::Kobold => write!(f, "kobold"),
Self::Replicate => write!(f, "replicate"),
Self::OpenRouter => write!(f, "openrouter"),
Self::Perplexity => write!(f, "perplexity"),
Self::Recursal => write!(f, "recursal"),
Self::Fireworks => write!(f, "fireworks"),
Self::Anyscale => write!(f, "anyscale"),
Self::Cloudflare => write!(f, "cloudflare"),
Self::Voyage => write!(f, "voyage"),
Self::Bedrock => write!(f, "bedrock"),
Self::Other => write!(f, "other"),
}
}
}
impl std::str::FromStr for ProviderType {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s {
"anthropic" => Ok(Self::Anthropic),
"openai" => Ok(Self::Openai),
"azure" => Ok(Self::Azure),
"google_ai" => Ok(Self::GoogleAi),
"groq" => Ok(Self::Groq),
"cohere" => Ok(Self::Cohere),
"together" => Ok(Self::Together),
"mistral" => Ok(Self::Mistral),
"ollama" => Ok(Self::Ollama),
"vllm" => Ok(Self::Vllm),
"lmstudio" => Ok(Self::LmStudio),
"kobold" => Ok(Self::Kobold),
"replicate" => Ok(Self::Replicate),
"openrouter" => Ok(Self::OpenRouter),
"perplexity" => Ok(Self::Perplexity),
"recursal" => Ok(Self::Recursal),
"fireworks" => Ok(Self::Fireworks),
"anyscale" => Ok(Self::Anyscale),
"cloudflare" => Ok(Self::Cloudflare),
"voyage" => Ok(Self::Voyage),
"bedrock" => Ok(Self::Bedrock),
"other" => Ok(Self::Other),
_ => Err(format!("Unknown provider type: {}", s)),
}
}
}
impl<'a> TryFrom<&'a str> for ProviderType {
type Error = String;
fn try_from(value: &'a str) -> Result<Self, Self::Error> {
Self::from_str(value)
}
}
#[derive(Debug, Clone, Serialize, Deserialize, Builder)]
pub struct ProviderCreate {
pub name: String,
pub provider_type: ProviderType,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider_category: Option<ProviderCategory>,
pub api_key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub base_url: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub access_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub secret_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderUpdate {
pub api_key: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub access_key: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct ListProvidersParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub provider_category: Option<ProviderCategory>,
#[serde(skip_serializing_if = "Option::is_none")]
pub provider_type: Option<ProviderType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub after: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub limit: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderCheckResponse {
pub status: bool,
#[serde(skip_serializing_if = "Option::is_none")]
pub error: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ProviderDeleteResponse {
pub message: String,
}