diff --git a/CHANGELOG.md b/CHANGELOG.md index 95d0aeb..022afa4 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,37 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ## [Unreleased] +## [0.3.0] - 2026-02-14 + +### Added + +- Claude Opus 4.6 model (flagship, 200K context, 128K output) +- Claude Opus 4.1 model (200K context, 32K output) +- Nova 2 Sonic model (1M context, 65K output) +- Mistral Ministral 3B, 8B, 14B models +- Mistral Pixtral Large model +- Mistral Voxtral Mini 3B and Voxtral Small 24B models (speech+text input) +- Qwen3 32B, Qwen3 Coder 30B, Qwen3 Next 80B, Qwen3 VL 235B models +- Google Gemma 3 12B and 4B models +- DeepSeek V3.2 model +- Kimi K2.5 model +- Inference profile tests for models requiring `InferenceProfile::Global` +- `bedrock_provider_match!` macro in model_verification example to reduce boilerplate + +### Changed + +- **BREAKING**: Renamed `DeepSeekV3` to `DeepSeekV3_1` to match the model's actual version +- Split `pub use models::{...}` re-exports into per-vendor blocks to prevent `cargo fmt` from mixing vendor groupings +- Reordered Claude model definitions by family and version (Opus 4 → 4.1 → 4.5 → 4.6, then Sonnet, then Haiku) +- `mixtape-anthropic-sdk` now uses `version.workspace = true` instead of a hardcoded version + +### Fixed + +- Claude 3.7 Sonnet output token limit: 8,192 → 64,000 +- Claude Haiku 4.5 output token limit: 8,192 → 64,000 +- Claude Opus 4.5 output token limit: 32,000 → 64,000 +- Stale `--providers` CLI flag in model_verification example docs (correct flag is `--vendors`) + ## [0.1.1] - 2026-01-04 ### Added @@ -27,5 +58,6 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 - AWS SigV4 authenticated requests - **mixtape-cli**: Session storage and REPL utilities for interactive agents -[Unreleased]: https://github.com/adlio/mixtape/compare/v0.1.1...HEAD +[Unreleased]: https://github.com/adlio/mixtape/compare/v0.3.0...HEAD +[0.3.0]: https://github.com/adlio/mixtape/compare/v0.1.1...v0.3.0 [0.1.1]: https://github.com/adlio/mixtape/releases/tag/v0.1.1 diff --git a/Cargo.toml b/Cargo.toml index 8e56b4f..1245810 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,15 +3,15 @@ members = ["mixtape-core", "mixtape-anthropic-sdk", "mixtape-tools", "mixtape-cl resolver = "2" [workspace.package] -version = "0.2.1" +version = "0.3.0" edition = "2021" license = "MIT" repository = "https://github.com/adlio/mixtape" [workspace.dependencies] # Internal crates -mixtape-core = { version = "0.2.1", path = "./mixtape-core" } -mixtape-anthropic-sdk = { version = "0.2.1", path = "./mixtape-anthropic-sdk" } +mixtape-core = { version = "0.3.0", path = "./mixtape-core" } +mixtape-anthropic-sdk = { version = "0.3.0", path = "./mixtape-anthropic-sdk" } mixtape-tools = { path = "./mixtape-tools" } mixtape-cli = { path = "./mixtape-cli" } diff --git a/README.md b/README.md index d2b3eff..c9b17ed 100644 --- a/README.md +++ b/README.md @@ -37,7 +37,7 @@ leverage foundational agentic tools. # In your Cargo.toml [dependencies] -mixtape-core = { version = "0.1", features = ["bedrock"] } +mixtape-core = { version = "0.3", features = ["bedrock"] } ``` | Feature | Description | @@ -156,8 +156,8 @@ Save conversations to SQLite (requires `session` feature and `mixtape-cli` crate ```toml [dependencies] -mixtape = { version = "0.1", features = ["session"] } -mixtape-cli = "0.1" +mixtape = { version = "0.3", features = ["session"] } +mixtape-cli = "0.3" ``` ```rust @@ -332,7 +332,7 @@ Agent::builder().bedrock(NovaPro).build().await?; Agent::builder().anthropic(ClaudeSonnet4_5, api_key).build().await?; ``` -Bedrock supports Claude, Nova, Mistral, Llama, Cohere, DeepSeek, and others. +Bedrock supports Claude, Nova, Mistral, Llama, Cohere, DeepSeek, Qwen, Gemma, Kimi, and others. ## Examples diff --git a/mixtape-anthropic-sdk/Cargo.toml b/mixtape-anthropic-sdk/Cargo.toml index 265bc42..8522026 100644 --- a/mixtape-anthropic-sdk/Cargo.toml +++ b/mixtape-anthropic-sdk/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "mixtape-anthropic-sdk" -version = "0.2.1" +version.workspace = true edition.workspace = true license.workspace = true repository.workspace = true diff --git a/mixtape-core/examples/model_verification.rs b/mixtape-core/examples/model_verification.rs index bc27490..fa70365 100644 --- a/mixtape-core/examples/model_verification.rs +++ b/mixtape-core/examples/model_verification.rs @@ -9,14 +9,14 @@ //! # Run all models //! cargo run --example model_verification //! -//! # Run specific providers -//! cargo run --example model_verification -- --providers anthropic,amazon +//! # Run specific vendors +//! cargo run --example model_verification -- --vendors anthropic,amazon //! //! # Run specific models //! cargo run --example model_verification -- --models ClaudeSonnet4_5,NovaPro //! //! # Combine filters -//! cargo run --example model_verification -- --providers meta --models Llama3_3_70B +//! cargo run --example model_verification -- --vendors meta --models Llama3_3_70B //! ``` //! //! # Requirements @@ -171,6 +171,18 @@ const MODELS: &[ModelInfo] = &[ vendor: "anthropic", supports_tools: true, }, + ModelInfo { + key: "ClaudeOpus4_1", + name: "Claude Opus 4.1", + vendor: "anthropic", + supports_tools: true, + }, + ModelInfo { + key: "ClaudeOpus4_6", + name: "Claude Opus 4.6", + vendor: "anthropic", + supports_tools: true, + }, // Amazon Nova ModelInfo { key: "NovaMicro", @@ -202,6 +214,12 @@ const MODELS: &[ModelInfo] = &[ vendor: "amazon", supports_tools: true, }, + ModelInfo { + key: "Nova2Sonic", + name: "Nova 2 Sonic", + vendor: "amazon", + supports_tools: true, + }, // Mistral ModelInfo { key: "MistralLarge3", @@ -215,6 +233,42 @@ const MODELS: &[ModelInfo] = &[ vendor: "mistral", supports_tools: true, }, + ModelInfo { + key: "Ministral3B", + name: "Ministral 3B", + vendor: "mistral", + supports_tools: true, + }, + ModelInfo { + key: "Ministral8B", + name: "Ministral 8B", + vendor: "mistral", + supports_tools: true, + }, + ModelInfo { + key: "Ministral14B", + name: "Ministral 14B", + vendor: "mistral", + supports_tools: true, + }, + ModelInfo { + key: "PixtralLarge", + name: "Pixtral Large", + vendor: "mistral", + supports_tools: true, + }, + ModelInfo { + key: "VoxtralMini3B", + name: "Voxtral Mini 3B", + vendor: "mistral", + supports_tools: true, + }, + ModelInfo { + key: "VoxtralSmall24B", + name: "Voxtral Small 24B", + vendor: "mistral", + supports_tools: true, + }, // Cohere ModelInfo { key: "CohereCommandRPlus", @@ -235,6 +289,30 @@ const MODELS: &[ModelInfo] = &[ vendor: "qwen", supports_tools: true, }, + ModelInfo { + key: "Qwen3_32B", + name: "Qwen3 32B", + vendor: "qwen", + supports_tools: true, + }, + ModelInfo { + key: "Qwen3Coder30B", + name: "Qwen3 Coder 30B", + vendor: "qwen", + supports_tools: true, + }, + ModelInfo { + key: "Qwen3Next80B", + name: "Qwen3 Next 80B", + vendor: "qwen", + supports_tools: true, + }, + ModelInfo { + key: "Qwen3VL235B", + name: "Qwen3 VL 235B", + vendor: "qwen", + supports_tools: true, + }, // Google ModelInfo { key: "Gemma3_27B", @@ -242,6 +320,18 @@ const MODELS: &[ModelInfo] = &[ vendor: "google", supports_tools: false, // Gemma doesn't support tool use on Bedrock }, + ModelInfo { + key: "Gemma3_12B", + name: "Gemma 3 12B", + vendor: "google", + supports_tools: false, // Gemma doesn't support tool use on Bedrock + }, + ModelInfo { + key: "Gemma3_4B", + name: "Gemma 3 4B", + vendor: "google", + supports_tools: false, // Gemma doesn't support tool use on Bedrock + }, // DeepSeek ModelInfo { key: "DeepSeekR1", @@ -250,11 +340,17 @@ const MODELS: &[ModelInfo] = &[ supports_tools: false, // R1 is reasoning-focused, limited tool support }, ModelInfo { - key: "DeepSeekV3", + key: "DeepSeekV3_1", name: "DeepSeek V3.1", vendor: "deepseek", supports_tools: true, }, + ModelInfo { + key: "DeepSeekV3_2", + name: "DeepSeek V3.2", + vendor: "deepseek", + supports_tools: true, + }, // Moonshot ModelInfo { key: "KimiK2Thinking", @@ -262,6 +358,12 @@ const MODELS: &[ModelInfo] = &[ vendor: "moonshot", supports_tools: true, }, + ModelInfo { + key: "KimiK2_5", + name: "Kimi K2.5", + vendor: "moonshot", + supports_tools: true, + }, // Meta Llama 4 ModelInfo { key: "Llama4Scout17B", @@ -357,203 +459,81 @@ enum TestStatus { // Model Creation // ============================================================================= -/// Create a provider with US inference profile for cross-region failover reliability +/// Create a Bedrock provider for a model key, with US inference profile. +/// +/// Uses the `bedrock_provider_match!` macro since every arm is identical +/// except for the model type name. +macro_rules! bedrock_provider_match { + ($key:expr, $($name:ident),+ $(,)?) => { + match $key { + $(stringify!($name) => Some(Arc::new( + BedrockProvider::new($name).await.ok()?.with_inference_profile(InferenceProfile::US), + )),)+ + _ => None, + } + }; +} + async fn create_provider(key: &str) -> Option> { - match key { - // Anthropic - "Claude3_7Sonnet" => Some(Arc::new( - BedrockProvider::new(Claude3_7Sonnet) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "ClaudeOpus4" => Some(Arc::new( - BedrockProvider::new(ClaudeOpus4) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "ClaudeSonnet4" => Some(Arc::new( - BedrockProvider::new(ClaudeSonnet4) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "ClaudeSonnet4_5" => Some(Arc::new( - BedrockProvider::new(ClaudeSonnet4_5) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "ClaudeHaiku4_5" => Some(Arc::new( - BedrockProvider::new(ClaudeHaiku4_5) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "ClaudeOpus4_5" => Some(Arc::new( - BedrockProvider::new(ClaudeOpus4_5) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), + bedrock_provider_match!( + key, + // Anthropic Claude + Claude3_7Sonnet, + ClaudeOpus4, + ClaudeOpus4_1, + ClaudeOpus4_5, + ClaudeOpus4_6, + ClaudeSonnet4, + ClaudeSonnet4_5, + ClaudeHaiku4_5, // Amazon Nova - "NovaMicro" => Some(Arc::new( - BedrockProvider::new(NovaMicro) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "NovaLite" => Some(Arc::new( - BedrockProvider::new(NovaLite) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "Nova2Lite" => Some(Arc::new( - BedrockProvider::new(Nova2Lite) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "NovaPro" => Some(Arc::new( - BedrockProvider::new(NovaPro) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "NovaPremier" => Some(Arc::new( - BedrockProvider::new(NovaPremier) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), + NovaMicro, + NovaLite, + Nova2Lite, + NovaPro, + NovaPremier, + Nova2Sonic, // Mistral - "MistralLarge3" => Some(Arc::new( - BedrockProvider::new(MistralLarge3) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "MagistralSmall" => Some(Arc::new( - BedrockProvider::new(MagistralSmall) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), + MistralLarge3, + MagistralSmall, + Ministral3B, + Ministral8B, + Ministral14B, + PixtralLarge, + VoxtralMini3B, + VoxtralSmall24B, // Cohere - "CohereCommandRPlus" => Some(Arc::new( - BedrockProvider::new(CohereCommandRPlus) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - // Qwen - "Qwen3_235B" => Some(Arc::new( - BedrockProvider::new(Qwen3_235B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "Qwen3Coder480B" => Some(Arc::new( - BedrockProvider::new(Qwen3Coder480B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), + CohereCommandRPlus, + // Alibaba Qwen + Qwen3_235B, + Qwen3Coder480B, + Qwen3_32B, + Qwen3Coder30B, + Qwen3Next80B, + Qwen3VL235B, // Google - "Gemma3_27B" => Some(Arc::new( - BedrockProvider::new(Gemma3_27B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), + Gemma3_27B, + Gemma3_12B, + Gemma3_4B, // DeepSeek - "DeepSeekR1" => Some(Arc::new( - BedrockProvider::new(DeepSeekR1) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "DeepSeekV3" => Some(Arc::new( - BedrockProvider::new(DeepSeekV3) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), + DeepSeekR1, + DeepSeekV3_1, + DeepSeekV3_2, // Moonshot - "KimiK2Thinking" => Some(Arc::new( - BedrockProvider::new(KimiK2Thinking) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - // Meta Llama 4 - "Llama4Scout17B" => Some(Arc::new( - BedrockProvider::new(Llama4Scout17B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "Llama4Maverick17B" => Some(Arc::new( - BedrockProvider::new(Llama4Maverick17B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - // Meta Llama 3.3 - "Llama3_3_70B" => Some(Arc::new( - BedrockProvider::new(Llama3_3_70B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - // Meta Llama 3.2 - "Llama3_2_90B" => Some(Arc::new( - BedrockProvider::new(Llama3_2_90B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "Llama3_2_11B" => Some(Arc::new( - BedrockProvider::new(Llama3_2_11B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "Llama3_2_3B" => Some(Arc::new( - BedrockProvider::new(Llama3_2_3B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "Llama3_2_1B" => Some(Arc::new( - BedrockProvider::new(Llama3_2_1B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - // Meta Llama 3.1 - "Llama3_1_405B" => Some(Arc::new( - BedrockProvider::new(Llama3_1_405B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "Llama3_1_70B" => Some(Arc::new( - BedrockProvider::new(Llama3_1_70B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - "Llama3_1_8B" => Some(Arc::new( - BedrockProvider::new(Llama3_1_8B) - .await - .ok()? - .with_inference_profile(InferenceProfile::US), - )), - _ => None, - } + KimiK2Thinking, + KimiK2_5, + // Meta Llama + Llama4Scout17B, + Llama4Maverick17B, + Llama3_3_70B, + Llama3_2_90B, + Llama3_2_11B, + Llama3_2_3B, + Llama3_2_1B, + Llama3_1_405B, + Llama3_1_70B, + Llama3_1_8B, + ) } // ============================================================================= @@ -625,14 +605,16 @@ VENDORS (model creators, all accessed via AWS Bedrock): MODELS: Claude: Claude3_7Sonnet, ClaudeOpus4, ClaudeSonnet4, ClaudeSonnet4_5, - ClaudeHaiku4_5, ClaudeOpus4_5 - Nova: NovaMicro, NovaLite, Nova2Lite, NovaPro, NovaPremier - Mistral: MistralLarge3, MagistralSmall + ClaudeHaiku4_5, ClaudeOpus4_5, ClaudeOpus4_1, ClaudeOpus4_6 + Nova: NovaMicro, NovaLite, Nova2Lite, NovaPro, NovaPremier, Nova2Sonic + Mistral: MistralLarge3, MagistralSmall, Ministral3B, Ministral8B, + Ministral14B, PixtralLarge, VoxtralMini3B, VoxtralSmall24B Cohere: CohereCommandRPlus - Qwen: Qwen3_235B, Qwen3Coder480B - Google: Gemma3_27B - DeepSeek: DeepSeekR1, DeepSeekV3 - Moonshot: KimiK2Thinking + Qwen: Qwen3_235B, Qwen3Coder480B, Qwen3_32B, Qwen3Coder30B, + Qwen3Next80B, Qwen3VL235B + Google: Gemma3_27B, Gemma3_12B, Gemma3_4B + DeepSeek: DeepSeekR1, DeepSeekV3_1, DeepSeekV3_2 + Moonshot: KimiK2Thinking, KimiK2_5 Llama 4: Llama4Scout17B, Llama4Maverick17B Llama 3.3: Llama3_3_70B Llama 3.2: Llama3_2_90B, Llama3_2_11B, Llama3_2_3B, Llama3_2_1B diff --git a/mixtape-core/src/lib.rs b/mixtape-core/src/lib.rs index b42be55..6dcdf72 100644 --- a/mixtape-core/src/lib.rs +++ b/mixtape-core/src/lib.rs @@ -176,48 +176,36 @@ pub use provider::AnthropicProvider; #[cfg(feature = "bedrock")] pub use provider::BedrockProvider; -// Models (organized by vendor) +// Models — separate `pub use` blocks per vendor so cargo fmt sorts within each +// block independently rather than merging across vendor boundaries. + +// Anthropic Claude +pub use models::{ + Claude3_7Sonnet, ClaudeHaiku4_5, ClaudeOpus4, ClaudeOpus4_1, ClaudeOpus4_5, ClaudeOpus4_6, + ClaudeSonnet4, ClaudeSonnet4_5, +}; +// Amazon Nova +pub use models::{Nova2Lite, Nova2Sonic, NovaLite, NovaMicro, NovaPremier, NovaPro}; +// Cohere +pub use models::CohereCommandRPlus; +// DeepSeek +pub use models::{DeepSeekR1, DeepSeekV3_1, DeepSeekV3_2}; +// Google +pub use models::{Gemma3_12B, Gemma3_27B, Gemma3_4B}; +// Meta Llama +pub use models::{ + Llama3_1_405B, Llama3_1_70B, Llama3_1_8B, Llama3_2_11B, Llama3_2_1B, Llama3_2_3B, Llama3_2_90B, + Llama3_3_70B, Llama4Maverick17B, Llama4Scout17B, +}; +// Mistral pub use models::{ - // Anthropic Claude - Claude3_7Sonnet, - ClaudeHaiku4_5, - ClaudeOpus4, - ClaudeOpus4_5, - ClaudeSonnet4, - ClaudeSonnet4_5, - // Cohere - CohereCommandRPlus, - // DeepSeek - DeepSeekR1, - DeepSeekV3, - // Google - Gemma3_27B, - // Moonshot Kimi - KimiK2Thinking, - // Meta Llama - Llama3_1_405B, - Llama3_1_70B, - Llama3_1_8B, - Llama3_2_11B, - Llama3_2_1B, - Llama3_2_3B, - Llama3_2_90B, - Llama3_3_70B, - Llama4Maverick17B, - Llama4Scout17B, - // Mistral - MagistralSmall, - MistralLarge3, - // Amazon Nova - Nova2Lite, - NovaLite, - NovaMicro, - NovaPremier, - NovaPro, - // Alibaba Qwen - Qwen3Coder480B, - Qwen3_235B, + MagistralSmall, Ministral14B, Ministral3B, Ministral8B, MistralLarge3, PixtralLarge, + VoxtralMini3B, VoxtralSmall24B, }; +// Moonshot Kimi +pub use models::{KimiK2Thinking, KimiK2_5}; +// Alibaba Qwen +pub use models::{Qwen3Coder30B, Qwen3Coder480B, Qwen3Next80B, Qwen3VL235B, Qwen3_235B, Qwen3_32B}; pub use tokenizer::CharacterTokenizer; pub use tool::{box_tool, DocumentFormat, DynTool, ImageFormat, Tool, ToolError, ToolResult}; diff --git a/mixtape-core/src/models/claude.rs b/mixtape-core/src/models/claude.rs index 1dcbed3..6e546c3 100644 --- a/mixtape-core/src/models/claude.rs +++ b/mixtape-core/src/models/claude.rs @@ -9,7 +9,7 @@ define_model!( display_name: "Claude 3.7 Sonnet", bedrock_id: "anthropic.claude-3-7-sonnet-20250219-v1:0", context_tokens: 200_000, - output_tokens: 8_192, + output_tokens: 64_000, anthropic_id: "claude-3-7-sonnet-20250219" } ); @@ -26,6 +26,42 @@ define_model!( } ); +define_model!( + /// Claude Opus 4.1 - Advanced reasoning model + ClaudeOpus4_1 { + display_name: "Claude Opus 4.1", + bedrock_id: "anthropic.claude-opus-4-1-20250805-v1:0", + context_tokens: 200_000, + output_tokens: 32_000, + anthropic_id: "claude-opus-4-1-20250805", + default_inference_profile: InferenceProfile::Global + } +); + +define_model!( + /// Claude Opus 4.5 - High-capability reasoning and creative writing model + ClaudeOpus4_5 { + display_name: "Claude Opus 4.5", + bedrock_id: "anthropic.claude-opus-4-5-20251101-v1:0", + context_tokens: 200_000, + output_tokens: 64_000, + anthropic_id: "claude-opus-4-5-20251101", + default_inference_profile: InferenceProfile::Global + } +); + +define_model!( + /// Claude Opus 4.6 - Flagship Claude model with 128K output + ClaudeOpus4_6 { + display_name: "Claude Opus 4.6", + bedrock_id: "anthropic.claude-opus-4-6-v1", + context_tokens: 200_000, + output_tokens: 128_000, + anthropic_id: "claude-opus-4-6", + default_inference_profile: InferenceProfile::Global + } +); + define_model!( /// Claude Sonnet 4 - Balanced performance and cost ClaudeSonnet4 { @@ -56,20 +92,8 @@ define_model!( display_name: "Claude Haiku 4.5", bedrock_id: "anthropic.claude-haiku-4-5-20251001-v1:0", context_tokens: 200_000, - output_tokens: 8_192, + output_tokens: 64_000, anthropic_id: "claude-haiku-4-5-20251001", default_inference_profile: InferenceProfile::Global } ); - -define_model!( - /// Claude Opus 4.5 - Most capable Claude model - ClaudeOpus4_5 { - display_name: "Claude Opus 4.5", - bedrock_id: "anthropic.claude-opus-4-5-20251101-v1:0", - context_tokens: 200_000, - output_tokens: 32_000, - anthropic_id: "claude-opus-4-5-20251101", - default_inference_profile: InferenceProfile::Global - } -); diff --git a/mixtape-core/src/models/deepseek.rs b/mixtape-core/src/models/deepseek.rs index f2def9f..c736b0b 100644 --- a/mixtape-core/src/models/deepseek.rs +++ b/mixtape-core/src/models/deepseek.rs @@ -14,10 +14,20 @@ define_model!( define_model!( /// DeepSeek V3.1 - General purpose model - DeepSeekV3 { + DeepSeekV3_1 { display_name: "DeepSeek V3.1", bedrock_id: "deepseek.v3-v1:0", context_tokens: 128_000, output_tokens: 8_192 } ); + +define_model!( + /// DeepSeek V3.2 - Updated general purpose model + DeepSeekV3_2 { + display_name: "DeepSeek V3.2", + bedrock_id: "deepseek.v3.2", + context_tokens: 128_000, + output_tokens: 8_192 + } +); diff --git a/mixtape-core/src/models/google.rs b/mixtape-core/src/models/google.rs index 212dcd6..e550e6d 100644 --- a/mixtape-core/src/models/google.rs +++ b/mixtape-core/src/models/google.rs @@ -11,3 +11,23 @@ define_model!( output_tokens: 8_192 } ); + +define_model!( + /// Gemma 3 12B - Mid-size open model from Google + Gemma3_12B { + display_name: "Gemma 3 12B", + bedrock_id: "google.gemma-3-12b-it", + context_tokens: 128_000, + output_tokens: 8_192 + } +); + +define_model!( + /// Gemma 3 4B - Compact open model from Google + Gemma3_4B { + display_name: "Gemma 3 4B", + bedrock_id: "google.gemma-3-4b-it", + context_tokens: 128_000, + output_tokens: 8_192 + } +); diff --git a/mixtape-core/src/models/kimi.rs b/mixtape-core/src/models/kimi.rs index 305c944..e67a8ec 100644 --- a/mixtape-core/src/models/kimi.rs +++ b/mixtape-core/src/models/kimi.rs @@ -1,4 +1,7 @@ //! Moonshot Kimi models +//! +//! Note: Bedrock uses different vendor prefixes for these models — +//! `moonshot.` for K2 Thinking and `moonshotai.` for K2.5. use super::define_model; @@ -11,3 +14,13 @@ define_model!( output_tokens: 8_192 } ); + +define_model!( + /// Kimi K2.5 - Next-gen model from Moonshot AI + KimiK2_5 { + display_name: "Kimi K2.5", + bedrock_id: "moonshotai.kimi-k2.5", + context_tokens: 256_000, + output_tokens: 8_192 + } +); diff --git a/mixtape-core/src/models/mistral.rs b/mixtape-core/src/models/mistral.rs index 64fbbcf..577361d 100644 --- a/mixtape-core/src/models/mistral.rs +++ b/mixtape-core/src/models/mistral.rs @@ -21,3 +21,63 @@ define_model!( output_tokens: 8_192 } ); + +define_model!( + /// Ministral 3B - Compact 3B instruction model + Ministral3B { + display_name: "Ministral 3B", + bedrock_id: "mistral.ministral-3-3b-instruct", + context_tokens: 128_000, + output_tokens: 8_192 + } +); + +define_model!( + /// Ministral 8B - Efficient 8B instruction model + Ministral8B { + display_name: "Ministral 8B", + bedrock_id: "mistral.ministral-3-8b-instruct", + context_tokens: 128_000, + output_tokens: 8_192 + } +); + +define_model!( + /// Ministral 14B - Mid-size 14B instruction model + Ministral14B { + display_name: "Ministral 14B", + bedrock_id: "mistral.ministral-3-14b-instruct", + context_tokens: 128_000, + output_tokens: 8_192 + } +); + +define_model!( + /// Pixtral Large - Vision-capable large model + PixtralLarge { + display_name: "Pixtral Large", + bedrock_id: "mistral.pixtral-large-2502-v1:0", + context_tokens: 128_000, + output_tokens: 8_192 + } +); + +define_model!( + /// Voxtral Mini 3B - Speech and text input model + VoxtralMini3B { + display_name: "Voxtral Mini 3B", + bedrock_id: "mistral.voxtral-mini-3b-2507", + context_tokens: 128_000, + output_tokens: 8_192 + } +); + +define_model!( + /// Voxtral Small 24B - Speech and text input model + VoxtralSmall24B { + display_name: "Voxtral Small 24B", + bedrock_id: "mistral.voxtral-small-24b-2507", + context_tokens: 128_000, + output_tokens: 8_192 + } +); diff --git a/mixtape-core/src/models/mod.rs b/mixtape-core/src/models/mod.rs index d6df076..39e2060 100644 --- a/mixtape-core/src/models/mod.rs +++ b/mixtape-core/src/models/mod.rs @@ -115,7 +115,7 @@ pub(crate) use define_model; #[cfg(test)] mod tests { use super::*; - use crate::model::{AnthropicModel, BedrockModel, Model}; + use crate::model::{AnthropicModel, BedrockModel, InferenceProfile, Model}; #[test] fn test_claude_implements_both_traits() { @@ -163,20 +163,37 @@ mod tests { &ClaudeSonnet4_5, &ClaudeHaiku4_5, &ClaudeOpus4_5, + &ClaudeOpus4_1, + &ClaudeOpus4_6, &NovaMicro, &NovaLite, &Nova2Lite, &NovaPro, &NovaPremier, + &Nova2Sonic, &MistralLarge3, &MagistralSmall, + &Ministral3B, + &Ministral8B, + &Ministral14B, + &PixtralLarge, + &VoxtralMini3B, + &VoxtralSmall24B, &CohereCommandRPlus, &Qwen3_235B, &Qwen3Coder480B, + &Qwen3_32B, + &Qwen3Coder30B, + &Qwen3Next80B, + &Qwen3VL235B, &Gemma3_27B, + &Gemma3_12B, + &Gemma3_4B, &DeepSeekR1, - &DeepSeekV3, + &DeepSeekV3_1, + &DeepSeekV3_2, &KimiK2Thinking, + &KimiK2_5, &Llama4Scout17B, &Llama4Maverick17B, &Llama3_3_70B, @@ -203,4 +220,54 @@ mod tests { ); } } + + #[test] + fn test_global_inference_profile_models() { + // Models that require Global inference profile should return it + let global_models: Vec<&dyn BedrockModel> = vec![ + &ClaudeOpus4, + &ClaudeOpus4_1, + &ClaudeOpus4_5, + &ClaudeOpus4_6, + &ClaudeSonnet4, + &ClaudeSonnet4_5, + &ClaudeHaiku4_5, + &Nova2Lite, + &Nova2Sonic, + ]; + + for model in global_models { + assert_eq!( + model.default_inference_profile(), + InferenceProfile::Global, + "{} should have Global inference profile", + model.bedrock_id() + ); + } + } + + #[test] + fn test_default_inference_profile_models() { + // Models without an explicit profile should return None (the default) + let default_models: Vec<&dyn BedrockModel> = vec![ + &Claude3_7Sonnet, + &NovaMicro, + &NovaLite, + &NovaPro, + &NovaPremier, + &MistralLarge3, + &Gemma3_27B, + &DeepSeekR1, + &KimiK2Thinking, + ]; + + for model in default_models { + assert_eq!( + model.default_inference_profile(), + InferenceProfile::None, + "{} should have None (default) inference profile", + model.bedrock_id() + ); + } + } } diff --git a/mixtape-core/src/models/nova.rs b/mixtape-core/src/models/nova.rs index 6575a46..b2cd6a8 100644 --- a/mixtape-core/src/models/nova.rs +++ b/mixtape-core/src/models/nova.rs @@ -53,3 +53,14 @@ define_model!( output_tokens: 5_000 } ); + +define_model!( + /// Nova 2 Sonic - Next-gen Nova model with 1M context + Nova2Sonic { + display_name: "Nova 2 Sonic", + bedrock_id: "amazon.nova-2-sonic-v1:0", + context_tokens: 1_000_000, + output_tokens: 65_535, + default_inference_profile: InferenceProfile::Global + } +); diff --git a/mixtape-core/src/models/qwen.rs b/mixtape-core/src/models/qwen.rs index c7b161e..dde11e7 100644 --- a/mixtape-core/src/models/qwen.rs +++ b/mixtape-core/src/models/qwen.rs @@ -21,3 +21,43 @@ define_model!( output_tokens: 8_192 } ); + +define_model!( + /// Qwen3 32B - Dense 32B model + Qwen3_32B { + display_name: "Qwen3 32B", + bedrock_id: "qwen.qwen3-32b-v1:0", + context_tokens: 256_000, + output_tokens: 8_192 + } +); + +define_model!( + /// Qwen3 Coder 30B - Compact coding-focused MoE model + Qwen3Coder30B { + display_name: "Qwen3 Coder 30B", + bedrock_id: "qwen.qwen3-coder-30b-a3b-v1:0", + context_tokens: 256_000, + output_tokens: 8_192 + } +); + +define_model!( + /// Qwen3 Next 80B - Next-gen MoE model + Qwen3Next80B { + display_name: "Qwen3 Next 80B", + bedrock_id: "qwen.qwen3-next-80b-a3b", + context_tokens: 256_000, + output_tokens: 8_192 + } +); + +define_model!( + /// Qwen3 VL 235B - Vision-language MoE model + Qwen3VL235B { + display_name: "Qwen3 VL 235B", + bedrock_id: "qwen.qwen3-vl-235b-a22b", + context_tokens: 256_000, + output_tokens: 8_192 + } +);