feat(agent): promote minimax m3 to full tier

A 3x2 A/B run (multi-screen mobile, dashboard, landing) at the
production thinking configuration showed the full-tier pipeline beating
the basic tier across the board for M3: geometry issues 5 to 1, total
wall clock 30 percent faster, fewer LLM calls, and the one permanent
subtask loss shifting from two core data elements to a single sidebar.
Scoped to the M3 generation like the kimi and glm entries; older
MiniMax models keep the basic profile. Thinking stays enabled through
the existing adapter exemption.
This commit is contained in:
Fini 2026-07-18 16:40:09 +08:00
parent 8518bac0d7
commit 3828215741
3 changed files with 20 additions and 8 deletions

View file

@ -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!(

View file

@ -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

View file

@ -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();