From dd95f24980b047215bbe26c0d99ee3e2025af3d2 Mon Sep 17 00:00:00 2001 From: PR Bot Date: Thu, 19 Mar 2026 11:48:22 +0800 Subject: [PATCH] feat: add MiniMax-M2.7 as new flagship model and update default alias - Add MiniMax-M2.7 model entry (Frontier tier, 1M context, vision+tools) - Update default 'minimax' alias to resolve to MiniMax-M2.7 - Add 'minimax-m2.7' alias for explicit model selection - Add M2.7 pricing in metering (same as M2.5: $1.10/$4.40 per 1M tokens) - Update model catalog tests for M2.7 as new default - Increment MiniMax model count from 6 to 7 --- crates/openfang-kernel/src/metering.rs | 3 ++ crates/openfang-runtime/src/model_catalog.rs | 34 ++++++++++++++++---- 2 files changed, 31 insertions(+), 6 deletions(-) diff --git a/crates/openfang-kernel/src/metering.rs b/crates/openfang-kernel/src/metering.rs index 651de429..029eaddc 100644 --- a/crates/openfang-kernel/src/metering.rs +++ b/crates/openfang-kernel/src/metering.rs @@ -393,6 +393,9 @@ fn estimate_cost_rates(model: &str) -> (f64, f64) { // ── MiniMax ────────────────────────────────────────────────── if model.contains("minimax") || model.contains("abab") { + if model.contains("m2.7") { + return (1.10, 4.40); + } if model.contains("highspeed") { return (0.80, 3.20); } diff --git a/crates/openfang-runtime/src/model_catalog.rs b/crates/openfang-runtime/src/model_catalog.rs index 7ffe402a..e022ef06 100644 --- a/crates/openfang-runtime/src/model_catalog.rs +++ b/crates/openfang-runtime/src/model_catalog.rs @@ -849,7 +849,8 @@ fn builtin_aliases() -> HashMap { ("ernie", "ernie-4.5-8k"), ("kimi", "kimi-k2"), ("moonshot", "moonshot-v1-128k"), - ("minimax", "MiniMax-M2.5"), + ("minimax", "MiniMax-M2.7"), + ("minimax-m2.7", "MiniMax-M2.7"), ("minimax-m2.5", "MiniMax-M2.5"), ("minimax-m2.5-highspeed", "MiniMax-M2.5-highspeed"), ("minimax-highspeed", "MiniMax-M2.5-highspeed"), @@ -3010,8 +3011,22 @@ fn builtin_models() -> Vec { aliases: vec![], }, // ══════════════════════════════════════════════════════════════ - // MiniMax (6) + // MiniMax (7) // ══════════════════════════════════════════════════════════════ + ModelCatalogEntry { + id: "MiniMax-M2.7".into(), + display_name: "MiniMax M2.7".into(), + provider: "minimax".into(), + tier: ModelTier::Frontier, + context_window: 1_048_576, + max_output_tokens: 16_384, + input_cost_per_m: 1.10, + output_cost_per_m: 4.40, + supports_tools: true, + supports_vision: true, + supports_streaming: true, + aliases: vec!["minimax-m2.7".into()], + }, ModelCatalogEntry { id: "minimax-text-01".into(), display_name: "MiniMax Text 01".into(), @@ -3024,7 +3039,7 @@ fn builtin_models() -> Vec { supports_tools: true, supports_vision: false, supports_streaming: true, - aliases: vec!["minimax".into()], + aliases: vec![], }, ModelCatalogEntry { id: "MiniMax-M2.5".into(), @@ -4043,14 +4058,21 @@ mod tests { assert!(catalog.find_model("codegeex").is_some()); assert!(catalog.find_model("ernie").is_some()); assert!(catalog.find_model("minimax").is_some()); + // MiniMax M2.7 — new flagship model + let m27 = catalog.find_model("MiniMax-M2.7").unwrap(); + assert_eq!(m27.provider, "minimax"); + assert_eq!(m27.tier, ModelTier::Frontier); + assert!(m27.supports_vision); + assert!(m27.supports_tools); + assert!(catalog.find_model("minimax-m2.7").is_some()); + // Default "minimax" alias now points to M2.7 + let default = catalog.find_model("minimax").unwrap(); + assert_eq!(default.id, "MiniMax-M2.7"); // MiniMax M2.5 — by exact ID, alias, and case-insensitive let m25 = catalog.find_model("MiniMax-M2.5").unwrap(); assert_eq!(m25.provider, "minimax"); assert_eq!(m25.tier, ModelTier::Frontier); assert!(catalog.find_model("minimax-m2.5").is_some()); - // Default "minimax" alias now points to M2.5 - let default = catalog.find_model("minimax").unwrap(); - assert_eq!(default.id, "MiniMax-M2.5"); // MiniMax M2.5 Highspeed — by exact ID and aliases let hs = catalog.find_model("MiniMax-M2.5-highspeed").unwrap(); assert_eq!(hs.provider, "minimax");