diff --git a/crates/op-host-services/src/chat_agent_context.rs b/crates/op-host-services/src/chat_agent_context.rs index 3be9466ee..5ad07af52 100644 --- a/crates/op-host-services/src/chat_agent_context.rs +++ b/crates/op-host-services/src/chat_agent_context.rs @@ -292,7 +292,7 @@ mod tests { fn screenshot_budget_uses_model_tier_and_never_returns_invalid_truncation() { assert!( inline_screenshot_char_budget("claude-opus-4.8", 6_144) - > inline_screenshot_char_budget("minimax-m3", 6_144) + > inline_screenshot_char_budget("minimax-m2.7", 6_144) ); let tiny = "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAQAAAC1HAwCAAAAC0lEQVR42mNkYPhfDwAChwGA60e6kgAAAABJRU5ErkJggg=="; assert_eq!( diff --git a/crates/op-orchestrator/src/model_profile.rs b/crates/op-orchestrator/src/model_profile.rs index af95edc6c..987e9ae08 100644 --- a/crates/op-orchestrator/src/model_profile.rs +++ b/crates/op-orchestrator/src/model_profile.rs @@ -148,6 +148,12 @@ const MODEL_PROFILES: &[Entry] = &[ // Standard。与 GLM 同理是推理模型,关思考防烧 content;时长无实测数据,先 ×1, // 慢再调。未来 K4 等更高代际届时各加一条 matcher。 e(Match::Sub("kimi-k3"), ModelTier::Full, true, "Kimi K3"), + // MiniMax M3(及以后)—— 2026-07-18 3×2 A/B 实测(mobile 多屏/dashboard/ + // landing):Full 档几何 issue 5→1、总耗时快 30%、调用数更少、完整性更优, + // 全维度非边际胜出 → 升 Full。仅 M3 起算强(老 M 系/abab 落后面的泛 minimax + // Basic 条目)。thinking 由 ChatProviderLlmClient 的 m3_keeps_thinking 特判 + // 保留(Adaptive),此处 thinking_disabled 对 M3 实际不生效,仅作族内一致。 + e(Match::Sub("minimax-m3"), ModelTier::Full, true, "MiniMax M3"), e( Match::Sub("deepseek-v4-flash"), ModelTier::Standard, @@ -253,6 +259,12 @@ mod tests { resolve_model_profile("kimi-k2.5").tier, ModelTier::Standard ); + // M3 measured full-tier (2026-07-18 A/B); older MiniMax stays Basic. + assert_eq!(resolve_model_profile("MiniMax-M3").tier, ModelTier::Full); + assert_eq!( + resolve_model_profile("MiniMax-M2.7").tier, + ModelTier::Basic + ); assert_eq!( resolve_model_profile("claude-opus-4-1").tier, ModelTier::Full diff --git a/crates/op-orchestrator/src/prompt_tests.rs b/crates/op-orchestrator/src/prompt_tests.rs index fd7dbfe06..d6fa9b3ac 100644 --- a/crates/op-orchestrator/src/prompt_tests.rs +++ b/crates/op-orchestrator/src/prompt_tests.rs @@ -1473,14 +1473,14 @@ fn components_manifest_instruction_matches_active_protocol() { /// `ALLOWED` allow-set (DropReason::TierFiltered) even with budget room /// (`budget_used < budget_max`) — so a weak model saw the component list with /// no instruction on how to emit a `ref` node and built everything from -/// scratch (0 component instances). Reproduces the real smoke path: a MiniMax -/// (Basic-tier) mobile screen, whose 9200-token budget has room to spare. +/// scratch (0 component instances). Reproduces the real smoke path: a Basic-tier +/// MiniMax (M2.x; M3 is Full since 2026-07-18) mobile screen, whose 9200-token budget has room to spare. #[test] fn basic_tier_components_prompt_keeps_both_manifest_and_teaching() { // Sanity: the model classifies as Basic, the path that drops non-allowed // skills via the allow-set (the bug surface). assert_eq!( - resolve_model_profile("minimax-m3").tier, + resolve_model_profile("minimax-m2.7").tier, ModelTier::Basic, "test fixture must exercise the Basic tier" ); @@ -1492,7 +1492,7 @@ fn basic_tier_components_prompt_keeps_both_manifest_and_teaching() { prompt: "Design a 402x874 mobile shop home screen with product cards, \ search, and bottom navigation using the available components" .into(), - model: Some("minimax-m3".into()), + model: Some("minimax-m2.7".into()), ..req() }; let mut mobile_plan = plan(); @@ -1597,7 +1597,7 @@ fn tight_budget_dashboard_keeps_component_composition() { // Basic tier is the path that overrides the budget down to 5200 when the // plan is NOT a mobile full screen (the bug surface). assert_eq!( - resolve_model_profile("minimax-m3").tier, + resolve_model_profile("minimax-m2.7").tier, ModelTier::Basic, "fixture must exercise the Basic tier (5200 budget on non-mobile)" ); @@ -1608,7 +1608,7 @@ fn tight_budget_dashboard_keeps_component_composition() { prompt: "Design a 1280x800 analytics dashboard with metric cards, \ a chart panel, and a data table using the available components" .into(), - model: Some("minimax-m3".into()), + model: Some("minimax-m2.7".into()), ..req() }; let mut dash_plan = plan(); @@ -1709,7 +1709,7 @@ fn tight_budget_dashboard_without_library_does_not_pin_component_composition() { prompt: "Design a 1280x800 analytics dashboard with metric cards, \ a chart panel, and a data table" .into(), - model: Some("minimax-m3".into()), + model: Some("minimax-m2.7".into()), ..req() }; let mut dash_plan = plan();