use serde::{Deserialize, Serialize};
use crate::config::Provider;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum Api {
OpenaiResponses,
OpenaiChat,
Anthropic,
Gemini,
Codex,
}
impl From<Provider> for Api {
fn from(provider: Provider) -> Self {
match provider {
Provider::Openai => Self::OpenaiResponses,
Provider::Anthropic => Self::Anthropic,
Provider::Gemini => Self::Gemini,
Provider::Codex => Self::Codex,
}
}
}
impl From<EndpointApi> for Api {
fn from(api: EndpointApi) -> Self {
match api {
EndpointApi::OpenaiResponses => Self::OpenaiResponses,
EndpointApi::OpenaiChat => Self::OpenaiChat,
EndpointApi::Anthropic => Self::Anthropic,
EndpointApi::Gemini => Self::Gemini,
}
}
}
impl Api {
pub fn validate_reasoning(self, reasoning: &str) -> Result<(), String> {
let supported = match self {
Self::OpenaiResponses | Self::OpenaiChat | Self::Codex => matches!(
reasoning,
"none" | "minimal" | "low" | "medium" | "high" | "xhigh" | "max"
),
Self::Anthropic => matches!(reasoning, "low" | "medium" | "high" | "max"),
Self::Gemini => matches!(reasoning, "minimal" | "low" | "medium" | "high"),
};
if supported {
Ok(())
} else {
Err(format!(
"Unsupported reasoning {reasoning:?} for {self:?}; effort is never remapped."
))
}
}
pub(crate) fn openai_schema(self) -> bool {
matches!(self, Self::OpenaiResponses | Self::OpenaiChat | Self::Codex)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Serialize, Deserialize, clap::ValueEnum)]
#[serde(rename_all = "kebab-case")]
pub enum EndpointApi {
OpenaiResponses,
OpenaiChat,
Anthropic,
Gemini,
}