cloud_model.rs

  1pub use anthropic::Model as AnthropicModel;
  2use anyhow::{anyhow, Result};
  3pub use ollama::Model as OllamaModel;
  4pub use open_ai::Model as OpenAiModel;
  5use schemars::JsonSchema;
  6use serde::{Deserialize, Serialize};
  7use strum::EnumIter;
  8
  9#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize, JsonSchema, EnumIter)]
 10pub enum CloudModel {
 11    #[serde(rename = "gpt-3.5-turbo")]
 12    Gpt3Point5Turbo,
 13    #[serde(rename = "gpt-4")]
 14    Gpt4,
 15    #[serde(rename = "gpt-4-turbo-preview")]
 16    Gpt4Turbo,
 17    #[serde(rename = "gpt-4o")]
 18    #[default]
 19    Gpt4Omni,
 20    #[serde(rename = "gpt-4o-mini")]
 21    Gpt4OmniMini,
 22    #[serde(rename = "claude-3-5-sonnet")]
 23    Claude3_5Sonnet,
 24    #[serde(rename = "claude-3-opus")]
 25    Claude3Opus,
 26    #[serde(rename = "claude-3-sonnet")]
 27    Claude3Sonnet,
 28    #[serde(rename = "claude-3-haiku")]
 29    Claude3Haiku,
 30    #[serde(rename = "gemini-1.5-pro")]
 31    Gemini15Pro,
 32    #[serde(rename = "gemini-1.5-flash")]
 33    Gemini15Flash,
 34    #[serde(rename = "custom")]
 35    Custom {
 36        name: String,
 37        max_tokens: Option<usize>,
 38    },
 39}
 40
 41impl CloudModel {
 42    pub fn from_id(value: &str) -> Result<Self> {
 43        match value {
 44            "gpt-3.5-turbo" => Ok(Self::Gpt3Point5Turbo),
 45            "gpt-4" => Ok(Self::Gpt4),
 46            "gpt-4-turbo-preview" => Ok(Self::Gpt4Turbo),
 47            "gpt-4o" => Ok(Self::Gpt4Omni),
 48            "gpt-4o-mini" => Ok(Self::Gpt4OmniMini),
 49            "claude-3-5-sonnet" => Ok(Self::Claude3_5Sonnet),
 50            "claude-3-opus" => Ok(Self::Claude3Opus),
 51            "claude-3-sonnet" => Ok(Self::Claude3Sonnet),
 52            "claude-3-haiku" => Ok(Self::Claude3Haiku),
 53            "gemini-1.5-pro" => Ok(Self::Gemini15Pro),
 54            "gemini-1.5-flash" => Ok(Self::Gemini15Flash),
 55            _ => Err(anyhow!("invalid model id")),
 56        }
 57    }
 58
 59    pub fn id(&self) -> &str {
 60        match self {
 61            Self::Gpt3Point5Turbo => "gpt-3.5-turbo",
 62            Self::Gpt4 => "gpt-4",
 63            Self::Gpt4Turbo => "gpt-4-turbo-preview",
 64            Self::Gpt4Omni => "gpt-4o",
 65            Self::Gpt4OmniMini => "gpt-4o-mini",
 66            Self::Claude3_5Sonnet => "claude-3-5-sonnet",
 67            Self::Claude3Opus => "claude-3-opus",
 68            Self::Claude3Sonnet => "claude-3-sonnet",
 69            Self::Claude3Haiku => "claude-3-haiku",
 70            Self::Gemini15Pro => "gemini-1.5-pro",
 71            Self::Gemini15Flash => "gemini-1.5-flash",
 72            Self::Custom { name, .. } => name,
 73        }
 74    }
 75
 76    pub fn display_name(&self) -> &str {
 77        match self {
 78            Self::Gpt3Point5Turbo => "GPT 3.5 Turbo",
 79            Self::Gpt4 => "GPT 4",
 80            Self::Gpt4Turbo => "GPT 4 Turbo",
 81            Self::Gpt4Omni => "GPT 4 Omni",
 82            Self::Gpt4OmniMini => "GPT 4 Omni Mini",
 83            Self::Claude3_5Sonnet => "Claude 3.5 Sonnet",
 84            Self::Claude3Opus => "Claude 3 Opus",
 85            Self::Claude3Sonnet => "Claude 3 Sonnet",
 86            Self::Claude3Haiku => "Claude 3 Haiku",
 87            Self::Gemini15Pro => "Gemini 1.5 Pro",
 88            Self::Gemini15Flash => "Gemini 1.5 Flash",
 89            Self::Custom { name, .. } => name,
 90        }
 91    }
 92
 93    pub fn max_token_count(&self) -> usize {
 94        match self {
 95            Self::Gpt3Point5Turbo => 2048,
 96            Self::Gpt4 => 4096,
 97            Self::Gpt4Turbo | Self::Gpt4Omni => 128000,
 98            Self::Gpt4OmniMini => 128000,
 99            Self::Claude3_5Sonnet
100            | Self::Claude3Opus
101            | Self::Claude3Sonnet
102            | Self::Claude3Haiku => 200000,
103            Self::Gemini15Pro => 128000,
104            Self::Gemini15Flash => 32000,
105            Self::Custom { max_tokens, .. } => max_tokens.unwrap_or(200_000),
106        }
107    }
108}