use serde::{Deserialize, Serialize};use strum::EnumIter; #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]#[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq)]pub enum BedrockAdaptiveThinkingEffort { Low, Medium, #[default] High, XHigh, Max,} impl BedrockAdaptiveThinkingEffort { pub fn as_str(&self) -> &'static str { match self { Self::Low => "low", Self::Medium => "medium", Self::High => "high", Self::XHigh => "xhigh", Self::Max => "max", } }} #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]pub enum BedrockModelMode { #[default] Default, Thinking { budget_tokens: Option<u64>, }, AdaptiveThinking { effort: BedrockAdaptiveThinkingEffort, },} #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)]pub struct BedrockModelCacheConfiguration { pub max_cache_anchors: usize, pub min_total_token: u64,} #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]#[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, EnumIter)]pub enum ConverseModel { // Anthropic Claude 4+ models #[serde( rename = "claude-fable-5", alias = "claude-fable-5-latest", alias = "claude-fable-5-thinking", alias = "claude-fable-5-thinking-latest" )] ClaudeFable5, #[serde( rename = "claude-opus-5", alias = "claude-opus-5-latest", alias = "claude-opus-5-thinking", alias = "claude-opus-5-thinking-latest" )] ClaudeOpus5, #[serde( rename = "claude-opus-4-8", alias = "claude-opus-4-8-latest", alias = "claude-opus-4-8-thinking", alias = "claude-opus-4-8-thinking-latest" )] ClaudeOpus4_8, #[serde( rename = "claude-opus-4-7", alias = "claude-opus-4-7-latest", alias = "claude-opus-4-7-thinking", alias = "claude-opus-4-7-thinking-latest" )] ClaudeOpus4_7, #[serde( rename = "claude-opus-4-6", alias = "claude-opus-4-6-latest", alias = "claude-opus-4-6-thinking", alias = "claude-opus-4-6-thinking-latest" )] ClaudeOpus4_6, #[serde( rename = "claude-opus-4-5", alias = "claude-opus-4-5-latest", alias = "claude-opus-4-5-thinking", alias = "claude-opus-4-5-thinking-latest" )] ClaudeOpus4_5, #[serde( rename = "claude-opus-4-1", alias = "claude-opus-4-1-latest", alias = "claude-opus-4-1-thinking", alias = "claude-opus-4-1-thinking-latest" )] ClaudeOpus4_1, #[serde( rename = "claude-sonnet-5", alias = "claude-sonnet-5-latest", alias = "claude-sonnet-5-thinking", alias = "claude-sonnet-5-thinking-latest" )] ClaudeSonnet5, #[serde( rename = "claude-sonnet-4-6", alias = "claude-sonnet-4-6-latest", alias = "claude-sonnet-4-6-thinking", alias = "claude-sonnet-4-6-thinking-latest" )] ClaudeSonnet4_6, #[default] #[serde( rename = "claude-sonnet-4-5", alias = "claude-sonnet-4-5-latest", alias = "claude-sonnet-4-5-thinking", alias = "claude-sonnet-4-5-thinking-latest" )] ClaudeSonnet4_5, #[serde( rename = "claude-sonnet-4", alias = "claude-sonnet-4-latest", alias = "claude-sonnet-4-thinking", alias = "claude-sonnet-4-thinking-latest" )] ClaudeSonnet4, #[serde(rename = "claude-haiku-4-5", alias = "claude-haiku-4-5-latest")] ClaudeHaiku4_5, // Meta Llama 4 models #[serde(rename = "llama-4-scout-17b")] Llama4Scout17B, #[serde(rename = "llama-4-maverick-17b")] Llama4Maverick17B, // Google Gemma 3 models #[serde(rename = "gemma-3-4b")] Gemma3_4B, #[serde(rename = "gemma-3-12b")] Gemma3_12B, #[serde(rename = "gemma-3-27b")] Gemma3_27B, // Mistral models #[serde(rename = "magistral-small")] MagistralSmall, #[serde(rename = "mistral-large-3")] MistralLarge3, #[serde(rename = "pixtral-large")] PixtralLarge, #[serde(rename = "devstral-2-123b")] Devstral2_123B, #[serde(rename = "ministral-14b")] Ministral14B, // Qwen models #[serde(rename = "qwen3-32b")] Qwen3_32B, #[serde(rename = "qwen3-vl-235b")] Qwen3VL235B, #[serde(rename = "qwen3-235b")] Qwen3_235B, #[serde(rename = "qwen3-next-80b")] Qwen3Next80B, #[serde(rename = "qwen3-coder-30b")] Qwen3Coder30B, #[serde(rename = "qwen3-coder-next")] Qwen3CoderNext, #[serde(rename = "qwen3-coder-480b")] Qwen3Coder480B, // Amazon Nova models #[serde(rename = "nova-lite")] NovaLite, #[serde(rename = "nova-pro")] NovaPro, #[serde(rename = "nova-premier")] NovaPremier, #[serde(rename = "nova-2-lite")] Nova2Lite, // OpenAI GPT OSS models #[serde(rename = "gpt-oss-20b")] GptOss20B, #[serde(rename = "gpt-oss-120b")] GptOss120B, // NVIDIA Nemotron models #[serde(rename = "nemotron-super-3-120b")] NemotronSuper3_120B, #[serde(rename = "nemotron-nano-3-30b")] NemotronNano3_30B, // MiniMax models #[serde(rename = "minimax-m2")] MiniMaxM2, #[serde(rename = "minimax-m2-1")] MiniMaxM2_1, #[serde(rename = "minimax-m2-5")] MiniMaxM2_5, // Z.AI GLM models #[serde(rename = "glm-5")] GLM5, #[serde(rename = "glm-4-7")] GLM4_7, #[serde(rename = "glm-4-7-flash")] GLM4_7Flash, // Moonshot models #[serde(rename = "kimi-k2-thinking")] KimiK2Thinking, #[serde(rename = "kimi-k2-5")] KimiK2_5, // DeepSeek models #[serde(rename = "deepseek-r1")] DeepSeekR1, #[serde(rename = "deepseek-v3")] DeepSeekV3_1, #[serde(rename = "deepseek-v3-2")] DeepSeekV3_2, #[serde(rename = "custom")] Custom { name: String, max_tokens: u64, display_name: Option<String>, max_output_tokens: Option<u64>, default_temperature: Option<f32>, cache_configuration: Option<BedrockModelCacheConfiguration>, },} impl ConverseModel { pub fn default_fast(_region: &str) -> Self { Self::ClaudeHaiku4_5 } pub fn from_id(id: &str) -> anyhow::Result<Self> { if id.starts_with("claude-fable-5") { Ok(Self::ClaudeFable5) } else if id.starts_with("claude-opus-5") { Ok(Self::ClaudeOpus5) } else if id.starts_with("claude-opus-4-8") { Ok(Self::ClaudeOpus4_8) } else if id.starts_with("claude-opus-4-7") { Ok(Self::ClaudeOpus4_7) } else if id.starts_with("claude-opus-4-6") { Ok(Self::ClaudeOpus4_6) } else if id.starts_with("claude-opus-4-5") { Ok(Self::ClaudeOpus4_5) } else if id.starts_with("claude-opus-4-1") { Ok(Self::ClaudeOpus4_1) } else if id.starts_with("claude-sonnet-5") { Ok(Self::ClaudeSonnet5) } else if id.starts_with("claude-sonnet-4-6") { Ok(Self::ClaudeSonnet4_6) } else if id.starts_with("claude-sonnet-4-5") { Ok(Self::ClaudeSonnet4_5) } else if id.starts_with("claude-sonnet-4") { Ok(Self::ClaudeSonnet4) } else if id.starts_with("claude-haiku-4-5") { Ok(Self::ClaudeHaiku4_5) } else { anyhow::bail!("invalid model id {id}"); } } pub fn id(&self) -> &str { match self { Self::ClaudeFable5 => "claude-fable-5", Self::ClaudeOpus5 => "claude-opus-5", Self::ClaudeOpus4_8 => "claude-opus-4-8", Self::ClaudeOpus4_7 => "claude-opus-4-7", Self::ClaudeOpus4_6 => "claude-opus-4-6", Self::ClaudeOpus4_5 => "claude-opus-4-5", Self::ClaudeOpus4_1 => "claude-opus-4-1", Self::ClaudeSonnet5 => "claude-sonnet-5", Self::ClaudeSonnet4_6 => "claude-sonnet-4-6", Self::ClaudeSonnet4_5 => "claude-sonnet-4-5", Self::ClaudeSonnet4 => "claude-sonnet-4", Self::ClaudeHaiku4_5 => "claude-haiku-4-5", Self::Llama4Scout17B => "llama-4-scout-17b", Self::Llama4Maverick17B => "llama-4-maverick-17b", Self::Gemma3_4B => "gemma-3-4b", Self::Gemma3_12B => "gemma-3-12b", Self::Gemma3_27B => "gemma-3-27b", Self::MagistralSmall => "magistral-small", Self::MistralLarge3 => "mistral-large-3", Self::PixtralLarge => "pixtral-large", Self::Devstral2_123B => "devstral-2-123b", Self::Ministral14B => "ministral-14b", Self::Qwen3_32B => "qwen3-32b", Self::Qwen3VL235B => "qwen3-vl-235b", Self::Qwen3_235B => "qwen3-235b", Self::Qwen3Next80B => "qwen3-next-80b", Self::Qwen3Coder30B => "qwen3-coder-30b", Self::Qwen3CoderNext => "qwen3-coder-next", Self::Qwen3Coder480B => "qwen3-coder-480b", Self::NovaLite => "nova-lite", Self::NovaPro => "nova-pro", Self::NovaPremier => "nova-premier", Self::Nova2Lite => "nova-2-lite", Self::GptOss20B => "gpt-oss-20b", Self::GptOss120B => "gpt-oss-120b", Self::NemotronSuper3_120B => "nemotron-super-3-120b", Self::NemotronNano3_30B => "nemotron-nano-3-30b", Self::MiniMaxM2 => "minimax-m2", Self::MiniMaxM2_1 => "minimax-m2-1", Self::MiniMaxM2_5 => "minimax-m2-5", Self::GLM5 => "glm-5", Self::GLM4_7 => "glm-4-7", Self::GLM4_7Flash => "glm-4-7-flash", Self::KimiK2Thinking => "kimi-k2-thinking", Self::KimiK2_5 => "kimi-k2-5", Self::DeepSeekR1 => "deepseek-r1", Self::DeepSeekV3_1 => "deepseek-v3", Self::DeepSeekV3_2 => "deepseek-v3-2", Self::Custom { name, .. } => name, } } pub fn request_id(&self) -> &str { match self { Self::ClaudeFable5 => "anthropic.claude-fable-5", Self::ClaudeOpus5 => "anthropic.claude-opus-5", Self::ClaudeOpus4_8 => "anthropic.claude-opus-4-8", Self::ClaudeOpus4_7 => "anthropic.claude-opus-4-7", Self::ClaudeOpus4_6 => "anthropic.claude-opus-4-6-v1", Self::ClaudeOpus4_5 => "anthropic.claude-opus-4-5-20251101-v1:0", Self::ClaudeOpus4_1 => "anthropic.claude-opus-4-1-20250805-v1:0", Self::ClaudeSonnet5 => "anthropic.claude-sonnet-5", Self::ClaudeSonnet4_6 => "anthropic.claude-sonnet-4-6", Self::ClaudeSonnet4_5 => "anthropic.claude-sonnet-4-5-20250929-v1:0", Self::ClaudeSonnet4 => "anthropic.claude-sonnet-4-20250514-v1:0", Self::ClaudeHaiku4_5 => "anthropic.claude-haiku-4-5-20251001-v1:0", Self::Llama4Scout17B => "meta.llama4-scout-17b-instruct-v1:0", Self::Llama4Maverick17B => "meta.llama4-maverick-17b-instruct-v1:0", Self::Gemma3_4B => "google.gemma-3-4b-it", Self::Gemma3_12B => "google.gemma-3-12b-it", Self::Gemma3_27B => "google.gemma-3-27b-it", Self::MagistralSmall => "mistral.magistral-small-2509", Self::MistralLarge3 => "mistral.mistral-large-3-675b-instruct", Self::PixtralLarge => "mistral.pixtral-large-2502-v1:0", Self::Devstral2_123B => "mistral.devstral-2-123b", Self::Ministral14B => "mistral.ministral-3-14b-instruct", Self::Qwen3VL235B => "qwen.qwen3-vl-235b-a22b", Self::Qwen3_32B => "qwen.qwen3-32b-v1:0", Self::Qwen3_235B => "qwen.qwen3-235b-a22b-2507-v1:0", Self::Qwen3Next80B => "qwen.qwen3-next-80b-a3b", Self::Qwen3Coder30B => "qwen.qwen3-coder-30b-a3b-v1:0", Self::Qwen3CoderNext => "qwen.qwen3-coder-next", Self::Qwen3Coder480B => "qwen.qwen3-coder-480b-a35b-v1:0", Self::NovaLite => "amazon.nova-lite-v1:0", Self::NovaPro => "amazon.nova-pro-v1:0", Self::NovaPremier => "amazon.nova-premier-v1:0", Self::Nova2Lite => "amazon.nova-2-lite-v1:0", Self::GptOss20B => "openai.gpt-oss-20b-1:0", Self::GptOss120B => "openai.gpt-oss-120b-1:0", Self::NemotronSuper3_120B => "nvidia.nemotron-super-3-120b", Self::NemotronNano3_30B => "nvidia.nemotron-nano-3-30b", Self::MiniMaxM2 => "minimax.minimax-m2", Self::MiniMaxM2_1 => "minimax.minimax-m2.1", Self::MiniMaxM2_5 => "minimax.minimax-m2.5", Self::GLM5 => "zai.glm-5", Self::GLM4_7 => "zai.glm-4.7", Self::GLM4_7Flash => "zai.glm-4.7-flash", Self::KimiK2Thinking => "moonshot.kimi-k2-thinking", Self::KimiK2_5 => "moonshotai.kimi-k2.5", Self::DeepSeekR1 => "deepseek.r1-v1:0", Self::DeepSeekV3_1 => "deepseek.v3-v1:0", Self::DeepSeekV3_2 => "deepseek.v3.2", Self::Custom { name, .. } => name, } } pub fn display_name(&self) -> &str { match self { Self::ClaudeFable5 => "Claude Fable 5", Self::ClaudeOpus5 => "Claude Opus 5", Self::ClaudeOpus4_8 => "Claude Opus 4.8", Self::ClaudeOpus4_7 => "Claude Opus 4.7", Self::ClaudeOpus4_6 => "Claude Opus 4.6", Self::ClaudeOpus4_5 => "Claude Opus 4.5", Self::ClaudeOpus4_1 => "Claude Opus 4.1", Self::ClaudeSonnet5 => "Claude Sonnet 5", Self::ClaudeSonnet4_6 => "Claude Sonnet 4.6", Self::ClaudeSonnet4_5 => "Claude Sonnet 4.5", Self::ClaudeSonnet4 => "Claude Sonnet 4", Self::ClaudeHaiku4_5 => "Claude Haiku 4.5", Self::Llama4Scout17B => "Llama 4 Scout 17B", Self::Llama4Maverick17B => "Llama 4 Maverick 17B", Self::Gemma3_4B => "Gemma 3 4B", Self::Gemma3_12B => "Gemma 3 12B", Self::Gemma3_27B => "Gemma 3 27B", Self::MagistralSmall => "Magistral Small", Self::MistralLarge3 => "Mistral Large 3", Self::PixtralLarge => "Pixtral Large", Self::Devstral2_123B => "Devstral 2 123B", Self::Ministral14B => "Ministral 14B", Self::Qwen3VL235B => "Qwen3 VL 235B", Self::Qwen3_32B => "Qwen3 32B", Self::Qwen3_235B => "Qwen3 235B", Self::Qwen3Next80B => "Qwen3 Next 80B", Self::Qwen3Coder30B => "Qwen3 Coder 30B", Self::Qwen3CoderNext => "Qwen3 Coder Next", Self::Qwen3Coder480B => "Qwen3 Coder 480B", Self::NovaLite => "Amazon Nova Lite", Self::NovaPro => "Amazon Nova Pro", Self::NovaPremier => "Amazon Nova Premier", Self::Nova2Lite => "Amazon Nova 2 Lite", Self::GptOss20B => "GPT OSS 20B", Self::GptOss120B => "GPT OSS 120B", Self::NemotronSuper3_120B => "Nemotron Super 3 120B", Self::NemotronNano3_30B => "Nemotron Nano 3 30B", Self::MiniMaxM2 => "MiniMax M2", Self::MiniMaxM2_1 => "MiniMax M2.1", Self::MiniMaxM2_5 => "MiniMax M2.5", Self::GLM5 => "GLM 5", Self::GLM4_7 => "GLM 4.7", Self::GLM4_7Flash => "GLM 4.7 Flash", Self::KimiK2Thinking => "Kimi K2 Thinking", Self::KimiK2_5 => "Kimi K2.5", Self::DeepSeekR1 => "DeepSeek R1", Self::DeepSeekV3_1 => "DeepSeek V3.1", Self::DeepSeekV3_2 => "DeepSeek V3.2", Self::Custom { display_name, name, .. } => display_name.as_deref().unwrap_or(name.as_str()), } } pub fn max_token_count(&self) -> u64 { match self { Self::ClaudeFable5 | Self::ClaudeOpus5 | Self::ClaudeOpus4_8 | Self::ClaudeOpus4_7 | Self::ClaudeOpus4_6 | Self::ClaudeOpus4_5 | Self::ClaudeSonnet5 | Self::ClaudeSonnet4_6 | Self::ClaudeSonnet4_5 | Self::ClaudeSonnet4 | Self::ClaudeHaiku4_5 => 1_000_000, Self::ClaudeOpus4_1 => 200_000, Self::Llama4Scout17B | Self::Llama4Maverick17B => 128_000, Self::Gemma3_4B | Self::Gemma3_12B | Self::Gemma3_27B => 128_000, Self::MagistralSmall | Self::MistralLarge3 | Self::PixtralLarge => 128_000, Self::Devstral2_123B | Self::Ministral14B => 256_000, Self::Qwen3_32B | Self::Qwen3VL235B | Self::Qwen3_235B | Self::Qwen3Next80B | Self::Qwen3Coder30B | Self::Qwen3CoderNext | Self::Qwen3Coder480B => 128_000, Self::NovaLite | Self::NovaPro => 300_000, Self::NovaPremier => 1_000_000, Self::Nova2Lite => 300_000, Self::GptOss20B | Self::GptOss120B => 128_000, Self::NemotronSuper3_120B | Self::NemotronNano3_30B => 262_000, Self::MiniMaxM2 | Self::MiniMaxM2_1 | Self::MiniMaxM2_5 => 196_000, Self::GLM5 | Self::GLM4_7 | Self::GLM4_7Flash => 203_000, Self::KimiK2Thinking | Self::KimiK2_5 => 128_000, Self::DeepSeekR1 | Self::DeepSeekV3_1 | Self::DeepSeekV3_2 => 128_000, Self::Custom { max_tokens, .. } => *max_tokens, } } pub fn max_output_tokens(&self) -> u64 { match self { Self::ClaudeFable5 | Self::ClaudeOpus5 | Self::ClaudeOpus4_8 | Self::ClaudeOpus4_7 | Self::ClaudeOpus4_6 | Self::ClaudeSonnet5 => 128_000, Self::ClaudeOpus4_5 | Self::ClaudeSonnet4_6 | Self::ClaudeSonnet4_5 | Self::ClaudeSonnet4 | Self::ClaudeHaiku4_5 => 64_000, Self::ClaudeOpus4_1 => 32_000, Self::Llama4Scout17B | Self::Llama4Maverick17B | Self::Gemma3_4B | Self::Gemma3_12B | Self::Gemma3_27B | Self::MagistralSmall | Self::MistralLarge3 | Self::PixtralLarge => 8_192, Self::Devstral2_123B | Self::Ministral14B => 131_000, Self::Qwen3_32B | Self::Qwen3VL235B | Self::Qwen3_235B | Self::Qwen3Next80BLines 1–500 of 1559. Load more
use serde::{Deserialize, Serialize}; use strum::EnumIter; #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[derive(Clone, Copy, Debug, Default, Serialize, Deserialize, PartialEq)] pub enum BedrockAdaptiveThinkingEffort { Low, Medium, #[default] High, XHigh, Max, } impl BedrockAdaptiveThinkingEffort { pub fn as_str(&self) -> &'static str { match self { Self::Low => "low", Self::Medium => "medium", Self::High => "high", Self::XHigh => "xhigh", Self::Max => "max", } } } #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] pub enum BedrockModelMode { #[default] Default, Thinking { budget_tokens: Option<u64>, }, AdaptiveThinking { effort: BedrockAdaptiveThinkingEffort, }, } #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq)] pub struct BedrockModelCacheConfiguration { pub max_cache_anchors: usize, pub min_total_token: u64, } #[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))] #[derive(Clone, Debug, Default, Serialize, Deserialize, PartialEq, EnumIter)] pub enum ConverseModel { // Anthropic Claude 4+ models #[serde( rename = "claude-fable-5", alias = "claude-fable-5-latest", alias = "claude-fable-5-thinking", alias = "claude-fable-5-thinking-latest" )] ClaudeFable5, #[serde( rename = "claude-opus-5", alias = "claude-opus-5-latest", alias = "claude-opus-5-thinking", alias = "claude-opus-5-thinking-latest" )] ClaudeOpus5, #[serde( rename = "claude-opus-4-8", alias = "claude-opus-4-8-latest", alias = "claude-opus-4-8-thinking", alias = "claude-opus-4-8-thinking-latest" )] ClaudeOpus4_8, #[serde( rename = "claude-opus-4-7", alias = "claude-opus-4-7-latest", alias = "claude-opus-4-7-thinking", alias = "claude-opus-4-7-thinking-latest" )] ClaudeOpus4_7, #[serde( rename = "claude-opus-4-6", alias = "claude-opus-4-6-latest", alias = "claude-opus-4-6-thinking", alias = "claude-opus-4-6-thinking-latest" )] ClaudeOpus4_6, #[serde( rename = "claude-opus-4-5", alias = "claude-opus-4-5-latest", alias = "claude-opus-4-5-thinking", alias = "claude-opus-4-5-thinking-latest" )] ClaudeOpus4_5, #[serde( rename = "claude-opus-4-1", alias = "claude-opus-4-1-latest", alias = "claude-opus-4-1-thinking", alias = "claude-opus-4-1-thinking-latest" )] ClaudeOpus4_1, #[serde( rename = "claude-sonnet-5", alias = "claude-sonnet-5-latest", alias = "claude-sonnet-5-thinking", alias = "claude-sonnet-5-thinking-latest" )] ClaudeSonnet5, #[serde( rename = "claude-sonnet-4-6", alias = "claude-sonnet-4-6-latest", alias = "claude-sonnet-4-6-thinking", alias = "claude-sonnet-4-6-thinking-latest" )] ClaudeSonnet4_6, #[default] #[serde( rename = "claude-sonnet-4-5", alias = "claude-sonnet-4-5-latest", alias = "claude-sonnet-4-5-thinking", alias = "claude-sonnet-4-5-thinking-latest" )] ClaudeSonnet4_5, #[serde( rename = "claude-sonnet-4", alias = "claude-sonnet-4-latest", alias = "claude-sonnet-4-thinking", alias = "claude-sonnet-4-thinking-latest" )] ClaudeSonnet4, #[serde(rename = "claude-haiku-4-5", alias = "claude-haiku-4-5-latest")] ClaudeHaiku4_5, // Meta Llama 4 models #[serde(rename = "llama-4-scout-17b")] Llama4Scout17B, #[serde(rename = "llama-4-maverick-17b")] Llama4Maverick17B, // Google Gemma 3 models #[serde(rename = "gemma-3-4b")] Gemma3_4B, #[serde(rename = "gemma-3-12b")] Gemma3_12B, #[serde(rename = "gemma-3-27b")] Gemma3_27B, // Mistral models #[serde(rename = "magistral-small")] MagistralSmall, #[serde(rename = "mistral-large-3")] MistralLarge3, #[serde(rename = "pixtral-large")] PixtralLarge, #[serde(rename = "devstral-2-123b")] Devstral2_123B, #[serde(rename = "ministral-14b")] Ministral14B, // Qwen models #[serde(rename = "qwen3-32b")] Qwen3_32B, #[serde(rename = "qwen3-vl-235b")] Qwen3VL235B, #[serde(rename = "qwen3-235b")] Qwen3_235B, #[serde(rename = "qwen3-next-80b")] Qwen3Next80B, #[serde(rename = "qwen3-coder-30b")] Qwen3Coder30B, #[serde(rename = "qwen3-coder-next")] Qwen3CoderNext, #[serde(rename = "qwen3-coder-480b")] Qwen3Coder480B, // Amazon Nova models #[serde(rename = "nova-lite")] NovaLite, #[serde(rename = "nova-pro")] NovaPro, #[serde(rename = "nova-premier")] NovaPremier, #[serde(rename = "nova-2-lite")] Nova2Lite, // OpenAI GPT OSS models #[serde(rename = "gpt-oss-20b")] GptOss20B, #[serde(rename = "gpt-oss-120b")] GptOss120B, // NVIDIA Nemotron models #[serde(rename = "nemotron-super-3-120b")] NemotronSuper3_120B, #[serde(rename = "nemotron-nano-3-30b")] NemotronNano3_30B, // MiniMax models #[serde(rename = "minimax-m2")] MiniMaxM2, #[serde(rename = "minimax-m2-1")] MiniMaxM2_1, #[serde(rename = "minimax-m2-5")] MiniMaxM2_5, // Z.AI GLM models #[serde(rename = "glm-5")] GLM5, #[serde(rename = "glm-4-7")] GLM4_7, #[serde(rename = "glm-4-7-flash")] GLM4_7Flash, // Moonshot models #[serde(rename = "kimi-k2-thinking")] KimiK2Thinking, #[serde(rename = "kimi-k2-5")] KimiK2_5, // DeepSeek models #[serde(rename = "deepseek-r1")] DeepSeekR1, #[serde(rename = "deepseek-v3")] DeepSeekV3_1, #[serde(rename = "deepseek-v3-2")] DeepSeekV3_2, #[serde(rename = "custom")] Custom { name: String, max_tokens: u64, display_name: Option<String>, max_output_tokens: Option<u64>, default_temperature: Option<f32>, cache_configuration: Option<BedrockModelCacheConfiguration>, }, } impl ConverseModel { pub fn default_fast(_region: &str) -> Self { Self::ClaudeHaiku4_5 } pub fn from_id(id: &str) -> anyhow::Result<Self> { if id.starts_with("claude-fable-5") { Ok(Self::ClaudeFable5) } else if id.starts_with("claude-opus-5") { Ok(Self::ClaudeOpus5) } else if id.starts_with("claude-opus-4-8") { Ok(Self::ClaudeOpus4_8) } else if id.starts_with("claude-opus-4-7") { Ok(Self::ClaudeOpus4_7) } else if id.starts_with("claude-opus-4-6") { Ok(Self::ClaudeOpus4_6) } else if id.starts_with("claude-opus-4-5") { Ok(Self::ClaudeOpus4_5) } else if id.starts_with("claude-opus-4-1") { Ok(Self::ClaudeOpus4_1) } else if id.starts_with("claude-sonnet-5") { Ok(Self::ClaudeSonnet5) } else if id.starts_with("claude-sonnet-4-6") { Ok(Self::ClaudeSonnet4_6) } else if id.starts_with("claude-sonnet-4-5") { Ok(Self::ClaudeSonnet4_5) } else if id.starts_with("claude-sonnet-4") { Ok(Self::ClaudeSonnet4) } else if id.starts_with("claude-haiku-4-5") { Ok(Self::ClaudeHaiku4_5) } else { anyhow::bail!("invalid model id {id}"); } } pub fn id(&self) -> &str { match self { Self::ClaudeFable5 => "claude-fable-5", Self::ClaudeOpus5 => "claude-opus-5", Self::ClaudeOpus4_8 => "claude-opus-4-8", Self::ClaudeOpus4_7 => "claude-opus-4-7", Self::ClaudeOpus4_6 => "claude-opus-4-6", Self::ClaudeOpus4_5 => "claude-opus-4-5", Self::ClaudeOpus4_1 => "claude-opus-4-1", Self::ClaudeSonnet5 => "claude-sonnet-5", Self::ClaudeSonnet4_6 => "claude-sonnet-4-6", Self::ClaudeSonnet4_5 => "claude-sonnet-4-5", Self::ClaudeSonnet4 => "claude-sonnet-4", Self::ClaudeHaiku4_5 => "claude-haiku-4-5", Self::Llama4Scout17B => "llama-4-scout-17b", Self::Llama4Maverick17B => "llama-4-maverick-17b", Self::Gemma3_4B => "gemma-3-4b", Self::Gemma3_12B => "gemma-3-12b", Self::Gemma3_27B => "gemma-3-27b", Self::MagistralSmall => "magistral-small", Self::MistralLarge3 => "mistral-large-3", Self::PixtralLarge => "pixtral-large", Self::Devstral2_123B => "devstral-2-123b", Self::Ministral14B => "ministral-14b", Self::Qwen3_32B => "qwen3-32b", Self::Qwen3VL235B => "qwen3-vl-235b", Self::Qwen3_235B => "qwen3-235b", Self::Qwen3Next80B => "qwen3-next-80b", Self::Qwen3Coder30B => "qwen3-coder-30b", Self::Qwen3CoderNext => "qwen3-coder-next", Self::Qwen3Coder480B => "qwen3-coder-480b", Self::NovaLite => "nova-lite", Self::NovaPro => "nova-pro", Self::NovaPremier => "nova-premier", Self::Nova2Lite => "nova-2-lite", Self::GptOss20B => "gpt-oss-20b", Self::GptOss120B => "gpt-oss-120b", Self::NemotronSuper3_120B => "nemotron-super-3-120b", Self::NemotronNano3_30B => "nemotron-nano-3-30b", Self::MiniMaxM2 => "minimax-m2", Self::MiniMaxM2_1 => "minimax-m2-1", Self::MiniMaxM2_5 => "minimax-m2-5", Self::GLM5 => "glm-5", Self::GLM4_7 => "glm-4-7", Self::GLM4_7Flash => "glm-4-7-flash", Self::KimiK2Thinking => "kimi-k2-thinking", Self::KimiK2_5 => "kimi-k2-5", Self::DeepSeekR1 => "deepseek-r1", Self::DeepSeekV3_1 => "deepseek-v3", Self::DeepSeekV3_2 => "deepseek-v3-2", Self::Custom { name, .. } => name, } } pub fn request_id(&self) -> &str { match self { Self::ClaudeFable5 => "anthropic.claude-fable-5", Self::ClaudeOpus5 => "anthropic.claude-opus-5", Self::ClaudeOpus4_8 => "anthropic.claude-opus-4-8", Self::ClaudeOpus4_7 => "anthropic.claude-opus-4-7", Self::ClaudeOpus4_6 => "anthropic.claude-opus-4-6-v1", Self::ClaudeOpus4_5 => "anthropic.claude-opus-4-5-20251101-v1:0", Self::ClaudeOpus4_1 => "anthropic.claude-opus-4-1-20250805-v1:0", Self::ClaudeSonnet5 => "anthropic.claude-sonnet-5", Self::ClaudeSonnet4_6 => "anthropic.claude-sonnet-4-6", Self::ClaudeSonnet4_5 => "anthropic.claude-sonnet-4-5-20250929-v1:0", Self::ClaudeSonnet4 => "anthropic.claude-sonnet-4-20250514-v1:0", Self::ClaudeHaiku4_5 => "anthropic.claude-haiku-4-5-20251001-v1:0", Self::Llama4Scout17B => "meta.llama4-scout-17b-instruct-v1:0", Self::Llama4Maverick17B => "meta.llama4-maverick-17b-instruct-v1:0", Self::Gemma3_4B => "google.gemma-3-4b-it", Self::Gemma3_12B => "google.gemma-3-12b-it", Self::Gemma3_27B => "google.gemma-3-27b-it", Self::MagistralSmall => "mistral.magistral-small-2509", Self::MistralLarge3 => "mistral.mistral-large-3-675b-instruct", Self::PixtralLarge => "mistral.pixtral-large-2502-v1:0", Self::Devstral2_123B => "mistral.devstral-2-123b", Self::Ministral14B => "mistral.ministral-3-14b-instruct", Self::Qwen3VL235B => "qwen.qwen3-vl-235b-a22b", Self::Qwen3_32B => "qwen.qwen3-32b-v1:0", Self::Qwen3_235B => "qwen.qwen3-235b-a22b-2507-v1:0", Self::Qwen3Next80B => "qwen.qwen3-next-80b-a3b", Self::Qwen3Coder30B => "qwen.qwen3-coder-30b-a3b-v1:0", Self::Qwen3CoderNext => "qwen.qwen3-coder-next", Self::Qwen3Coder480B => "qwen.qwen3-coder-480b-a35b-v1:0", Self::NovaLite => "amazon.nova-lite-v1:0", Self::NovaPro => "amazon.nova-pro-v1:0", Self::NovaPremier => "amazon.nova-premier-v1:0", Self::Nova2Lite => "amazon.nova-2-lite-v1:0", Self::GptOss20B => "openai.gpt-oss-20b-1:0", Self::GptOss120B => "openai.gpt-oss-120b-1:0", Self::NemotronSuper3_120B => "nvidia.nemotron-super-3-120b", Self::NemotronNano3_30B => "nvidia.nemotron-nano-3-30b", Self::MiniMaxM2 => "minimax.minimax-m2", Self::MiniMaxM2_1 => "minimax.minimax-m2.1", Self::MiniMaxM2_5 => "minimax.minimax-m2.5", Self::GLM5 => "zai.glm-5", Self::GLM4_7 => "zai.glm-4.7", Self::GLM4_7Flash => "zai.glm-4.7-flash", Self::KimiK2Thinking => "moonshot.kimi-k2-thinking", Self::KimiK2_5 => "moonshotai.kimi-k2.5", Self::DeepSeekR1 => "deepseek.r1-v1:0", Self::DeepSeekV3_1 => "deepseek.v3-v1:0", Self::DeepSeekV3_2 => "deepseek.v3.2", Self::Custom { name, .. } => name, } } pub fn display_name(&self) -> &str { match self { Self::ClaudeFable5 => "Claude Fable 5", Self::ClaudeOpus5 => "Claude Opus 5", Self::ClaudeOpus4_8 => "Claude Opus 4.8", Self::ClaudeOpus4_7 => "Claude Opus 4.7", Self::ClaudeOpus4_6 => "Claude Opus 4.6", Self::ClaudeOpus4_5 => "Claude Opus 4.5", Self::ClaudeOpus4_1 => "Claude Opus 4.1", Self::ClaudeSonnet5 => "Claude Sonnet 5", Self::ClaudeSonnet4_6 => "Claude Sonnet 4.6", Self::ClaudeSonnet4_5 => "Claude Sonnet 4.5", Self::ClaudeSonnet4 => "Claude Sonnet 4", Self::ClaudeHaiku4_5 => "Claude Haiku 4.5", Self::Llama4Scout17B => "Llama 4 Scout 17B", Self::Llama4Maverick17B => "Llama 4 Maverick 17B", Self::Gemma3_4B => "Gemma 3 4B", Self::Gemma3_12B => "Gemma 3 12B", Self::Gemma3_27B => "Gemma 3 27B", Self::MagistralSmall => "Magistral Small", Self::MistralLarge3 => "Mistral Large 3", Self::PixtralLarge => "Pixtral Large", Self::Devstral2_123B => "Devstral 2 123B", Self::Ministral14B => "Ministral 14B", Self::Qwen3VL235B => "Qwen3 VL 235B", Self::Qwen3_32B => "Qwen3 32B", Self::Qwen3_235B => "Qwen3 235B", Self::Qwen3Next80B => "Qwen3 Next 80B", Self::Qwen3Coder30B => "Qwen3 Coder 30B", Self::Qwen3CoderNext => "Qwen3 Coder Next", Self::Qwen3Coder480B => "Qwen3 Coder 480B", Self::NovaLite => "Amazon Nova Lite", Self::NovaPro => "Amazon Nova Pro", Self::NovaPremier => "Amazon Nova Premier", Self::Nova2Lite => "Amazon Nova 2 Lite", Self::GptOss20B => "GPT OSS 20B", Self::GptOss120B => "GPT OSS 120B", Self::NemotronSuper3_120B => "Nemotron Super 3 120B", Self::NemotronNano3_30B => "Nemotron Nano 3 30B", Self::MiniMaxM2 => "MiniMax M2", Self::MiniMaxM2_1 => "MiniMax M2.1", Self::MiniMaxM2_5 => "MiniMax M2.5", Self::GLM5 => "GLM 5", Self::GLM4_7 => "GLM 4.7", Self::GLM4_7Flash => "GLM 4.7 Flash", Self::KimiK2Thinking => "Kimi K2 Thinking", Self::KimiK2_5 => "Kimi K2.5", Self::DeepSeekR1 => "DeepSeek R1", Self::DeepSeekV3_1 => "DeepSeek V3.1", Self::DeepSeekV3_2 => "DeepSeek V3.2", Self::Custom { display_name, name, .. } => display_name.as_deref().unwrap_or(name.as_str()), } } pub fn max_token_count(&self) -> u64 { match self { Self::ClaudeFable5 | Self::ClaudeOpus5 | Self::ClaudeOpus4_8 | Self::ClaudeOpus4_7 | Self::ClaudeOpus4_6 | Self::ClaudeOpus4_5 | Self::ClaudeSonnet5 | Self::ClaudeSonnet4_6 | Self::ClaudeSonnet4_5 | Self::ClaudeSonnet4 | Self::ClaudeHaiku4_5 => 1_000_000, Self::ClaudeOpus4_1 => 200_000, Self::Llama4Scout17B | Self::Llama4Maverick17B => 128_000, Self::Gemma3_4B | Self::Gemma3_12B | Self::Gemma3_27B => 128_000, Self::MagistralSmall | Self::MistralLarge3 | Self::PixtralLarge => 128_000, Self::Devstral2_123B | Self::Ministral14B => 256_000, Self::Qwen3_32B | Self::Qwen3VL235B | Self::Qwen3_235B | Self::Qwen3Next80B | Self::Qwen3Coder30B | Self::Qwen3CoderNext | Self::Qwen3Coder480B => 128_000, Self::NovaLite | Self::NovaPro => 300_000, Self::NovaPremier => 1_000_000, Self::Nova2Lite => 300_000, Self::GptOss20B | Self::GptOss120B => 128_000, Self::NemotronSuper3_120B | Self::NemotronNano3_30B => 262_000, Self::MiniMaxM2 | Self::MiniMaxM2_1 | Self::MiniMaxM2_5 => 196_000, Self::GLM5 | Self::GLM4_7 | Self::GLM4_7Flash => 203_000, Self::KimiK2Thinking | Self::KimiK2_5 => 128_000, Self::DeepSeekR1 | Self::DeepSeekV3_1 | Self::DeepSeekV3_2 => 128_000, Self::Custom { max_tokens, .. } => *max_tokens, } } pub fn max_output_tokens(&self) -> u64 { match self { Self::ClaudeFable5 | Self::ClaudeOpus5 | Self::ClaudeOpus4_8 | Self::ClaudeOpus4_7 | Self::ClaudeOpus4_6 | Self::ClaudeSonnet5 => 128_000, Self::ClaudeOpus4_5 | Self::ClaudeSonnet4_6 | Self::ClaudeSonnet4_5 | Self::ClaudeSonnet4 | Self::ClaudeHaiku4_5 => 64_000, Self::ClaudeOpus4_1 => 32_000, Self::Llama4Scout17B | Self::Llama4Maverick17B | Self::Gemma3_4B | Self::Gemma3_12B | Self::Gemma3_27B | Self::MagistralSmall | Self::MistralLarge3 | Self::PixtralLarge => 8_192, Self::Devstral2_123B | Self::Ministral14B => 131_000, Self::Qwen3_32B | Self::Qwen3VL235B | Self::Qwen3_235B | Self::Qwen3Next80B