use serde::{Deserialize, Serialize};
#[derive(
Debug,
Clone,
Copy,
PartialEq,
Eq,
PartialOrd,
Ord,
Hash,
Serialize,
Deserialize,
schemars::JsonSchema,
)]
#[serde(rename_all = "lowercase")]
pub enum ClientFamily {
Claude,
#[serde(rename = "openai")]
OpenAi,
Gemini,
}
impl ClientFamily {
pub const ALL: [Self; 3] = [Self::Claude, Self::OpenAi, Self::Gemini];
#[must_use]
pub const fn as_tag(self) -> &'static str {
match self {
Self::Claude => "claude",
Self::OpenAi => "openai",
Self::Gemini => "gemini",
}
}
#[must_use]
pub fn from_tag(tag: &str) -> Option<Self> {
Self::ALL.into_iter().find(|family| family.as_tag() == tag)
}
}
impl std::fmt::Display for ClientFamily {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str(self.as_tag())
}
}
pub const CONTEXT_VARIANT_SUFFIX: &str = "[1m]";
pub const LONG_CONTEXT_WINDOW: u32 = 1_000_000;
#[must_use]
pub fn without_context_variant(requested: &str) -> &str {
requested
.strip_suffix(CONTEXT_VARIANT_SUFFIX)
.unwrap_or(requested)
}
#[must_use]
pub fn has_context_variant(requested: &str) -> bool {
requested.ends_with(CONTEXT_VARIANT_SUFFIX)
}
#[must_use]
pub fn with_context_variant(model: &str) -> String {
format!("{}{CONTEXT_VARIANT_SUFFIX}", without_context_variant(model))
}