@@ -136,7 +136,7 @@ pub fn canonical_model_id(model_id: &str) -> String {
136136 | "minimax/m2.5"
137137 | "minimax/m2-5"
138138 | "minimax/minimax-m2.5"
139- | "minimax/MiniMax-M2 .7" => "minimax/MiniMax-M2 .7" . to_string ( ) ,
139+ | "openrouter/ minimax/minimax-m2 .7" => "openrouter/ minimax/minimax-m2 .7" . to_string ( ) ,
140140 "minimax-m2.1"
141141 | "minimax-m2-1"
142142 | "minimax/m2.1"
@@ -207,7 +207,7 @@ pub fn default_model_specs() -> Vec<(String, String)> {
207207 ( "gemini-2.5-flash-lite" . to_string( ) , "gemini" . to_string( ) ) ,
208208 ( "gemini-3-pro" . to_string( ) , "gemini" . to_string( ) ) ,
209209 ( "gemini-3.1-pro-preview" . to_string( ) , "gemini" . to_string( ) ) ,
210- ( "minimax/MiniMax-M2 .7" . to_string( ) , "oai-runner" . to_string( ) ) ,
210+ ( "openrouter/ minimax/minimax-m2 .7" . to_string( ) , "oai-runner" . to_string( ) ) ,
211211 ( "zai-coding-plan/glm-5" . to_string( ) , "oai-runner" . to_string( ) ) ,
212212 ]
213213}
@@ -218,7 +218,7 @@ pub fn default_model_for_tool(tool_id: &str) -> Option<&'static str> {
218218 "codex" | "openai" => Some ( "gpt-5.4" ) ,
219219 "gemini" => Some ( "gemini-2.5-pro" ) ,
220220 "opencode" => Some ( "zai-coding-plan/glm-5" ) ,
221- "oai-runner" => Some ( "minimax/MiniMax-M2 .7" ) ,
221+ "oai-runner" => Some ( "openrouter/ minimax/minimax-m2 .7" ) ,
222222 _ => None ,
223223 }
224224}
@@ -286,105 +286,6 @@ impl PhaseCapabilities {
286286 }
287287}
288288
289- pub fn default_primary_model_for_phase (
290- complexity : Option < ModelRoutingComplexity > ,
291- caps : & PhaseCapabilities ,
292- ) -> & ' static str {
293- if caps. is_ui_ux {
294- return "gemini-3.1-pro-preview" ;
295- }
296-
297- if caps. is_research {
298- return "gemini-2.5-flash-lite" ;
299- }
300-
301- if caps. is_review {
302- return match complexity. unwrap_or ( ModelRoutingComplexity :: Medium ) {
303- ModelRoutingComplexity :: High => "claude-opus-4-6" ,
304- ModelRoutingComplexity :: Low | ModelRoutingComplexity :: Medium => "claude-sonnet-4-6" ,
305- } ;
306- }
307-
308- if caps. is_requirements {
309- return match complexity. unwrap_or ( ModelRoutingComplexity :: Medium ) {
310- ModelRoutingComplexity :: Low => "minimax/MiniMax-M2.7" ,
311- ModelRoutingComplexity :: Medium | ModelRoutingComplexity :: High => "claude-sonnet-4-6" ,
312- } ;
313- }
314-
315- if caps. is_testing {
316- return match complexity. unwrap_or ( ModelRoutingComplexity :: Medium ) {
317- ModelRoutingComplexity :: Low => "minimax/MiniMax-M2.7" ,
318- ModelRoutingComplexity :: Medium | ModelRoutingComplexity :: High => "claude-sonnet-4-6" ,
319- } ;
320- }
321-
322- match complexity. unwrap_or ( ModelRoutingComplexity :: Medium ) {
323- ModelRoutingComplexity :: Low => "zai-coding-plan/glm-5" ,
324- ModelRoutingComplexity :: Medium | ModelRoutingComplexity :: High => "claude-sonnet-4-6" ,
325- }
326- }
327-
328- pub fn default_fallback_models_for_phase (
329- complexity : Option < ModelRoutingComplexity > ,
330- caps : & PhaseCapabilities ,
331- ) -> Vec < & ' static str > {
332- if caps. is_ui_ux {
333- return vec ! [
334- "claude-sonnet-4-6" ,
335- "gemini-2.5-pro" ,
336- "zai-coding-plan/glm-5" ,
337- "minimax/MiniMax-M2.7" ,
338- "gpt-5.3-codex" ,
339- ] ;
340- }
341-
342- if caps. is_research {
343- return vec ! [
344- "gemini-2.5-flash" ,
345- "claude-sonnet-4-6" ,
346- "gemini-3.1-pro-preview" ,
347- "zai-coding-plan/glm-5" ,
348- "minimax/MiniMax-M2.7" ,
349- ] ;
350- }
351-
352- if caps. is_review {
353- return match complexity. unwrap_or ( ModelRoutingComplexity :: Medium ) {
354- ModelRoutingComplexity :: High => vec ! [
355- "claude-sonnet-4-6" ,
356- "gemini-3.1-pro-preview" ,
357- "zai-coding-plan/glm-5" ,
358- "minimax/MiniMax-M2.7" ,
359- "gpt-5.3-codex" ,
360- ] ,
361- ModelRoutingComplexity :: Low | ModelRoutingComplexity :: Medium => vec ! [
362- "gemini-3.1-pro-preview" ,
363- "zai-coding-plan/glm-5" ,
364- "minimax/MiniMax-M2.7" ,
365- "gpt-5.3-codex" ,
366- "claude-opus-4-6" ,
367- ] ,
368- } ;
369- }
370-
371- match complexity. unwrap_or ( ModelRoutingComplexity :: Medium ) {
372- ModelRoutingComplexity :: Low => {
373- vec ! [ "minimax/MiniMax-M2.7" , "claude-sonnet-4-6" , "gemini-3.1-pro-preview" , "gpt-5.3-codex" ]
374- }
375- ModelRoutingComplexity :: Medium => {
376- vec ! [ "zai-coding-plan/glm-5" , "minimax/MiniMax-M2.7" , "gemini-3.1-pro-preview" , "gpt-5.3-codex" ]
377- }
378- ModelRoutingComplexity :: High => vec ! [
379- "claude-opus-4-6" ,
380- "zai-coding-plan/glm-5" ,
381- "minimax/MiniMax-M2.7" ,
382- "gemini-3.1-pro-preview" ,
383- "gpt-5.3-codex" ,
384- ] ,
385- }
386- }
387-
388289#[ cfg( test) ]
389290mod tests {
390291 use super :: * ;
@@ -410,7 +311,7 @@ mod tests {
410311 assert_eq ! ( canonical_model_id( "gemini-flash-2.5-lite" ) , "gemini-2.5-flash-lite" ) ;
411312 assert_eq ! ( canonical_model_id( "glm-5" ) , "zai-coding-plan/glm-5" ) ;
412313 assert_eq ! ( canonical_model_id( "minimax-m2.1" ) , "minimax/MiniMax-M2.1" ) ;
413- assert_eq ! ( canonical_model_id( "minimax-m2.5" ) , "minimax/MiniMax-M2 .7" ) ;
314+ assert_eq ! ( canonical_model_id( "minimax-m2.5" ) , "openrouter/ minimax/minimax-m2 .7" ) ;
414315 }
415316
416317 #[ test]
@@ -419,83 +320,12 @@ mod tests {
419320 assert_eq ! ( tool_for_model_id( "claude-opus-4-6" ) , "claude" ) ;
420321 assert_eq ! ( tool_for_model_id( "openrouter/anthropic/claude-sonnet" ) , "claude" ) ;
421322 assert_eq ! ( tool_for_model_id( "zai-coding-plan/glm-5" ) , "oai-runner" ) ;
422- assert_eq ! ( tool_for_model_id( "minimax/MiniMax-M2 .7" ) , "oai-runner" ) ;
323+ assert_eq ! ( tool_for_model_id( "openrouter/ minimax/minimax-m2 .7" ) , "oai-runner" ) ;
423324 assert_eq ! ( tool_for_model_id( "gemini-2.5-pro" ) , "gemini" ) ;
424325 assert_eq ! ( tool_for_model_id( "gemini-2.5-flash-lite" ) , "gemini" ) ;
425326 assert_eq ! ( tool_for_model_id( "gpt-5.3-codex" ) , "codex" ) ;
426327 }
427328
428- #[ test]
429- fn complexity_policy_uses_opus_for_high_complexity_review ( ) {
430- let caps = PhaseCapabilities :: defaults_for_phase ( "code-review" ) ;
431- assert_eq ! ( default_primary_model_for_phase( Some ( ModelRoutingComplexity :: High ) , & caps) , "claude-opus-4-6" ) ;
432- assert_eq ! ( default_primary_model_for_phase( Some ( ModelRoutingComplexity :: Medium ) , & caps) , "claude-sonnet-4-6" ) ;
433- }
434-
435- #[ test]
436- fn low_complexity_routes_to_cheaper_models ( ) {
437- let impl_caps = PhaseCapabilities :: defaults_for_phase ( "implementation" ) ;
438- assert_eq ! (
439- default_primary_model_for_phase( Some ( ModelRoutingComplexity :: Low ) , & impl_caps) ,
440- "zai-coding-plan/glm-5"
441- ) ;
442- let req_caps = PhaseCapabilities :: defaults_for_phase ( "requirements" ) ;
443- assert_eq ! (
444- default_primary_model_for_phase( Some ( ModelRoutingComplexity :: Low ) , & req_caps) ,
445- "minimax/MiniMax-M2.7"
446- ) ;
447- let test_caps = PhaseCapabilities :: defaults_for_phase ( "testing" ) ;
448- assert_eq ! (
449- default_primary_model_for_phase( Some ( ModelRoutingComplexity :: Low ) , & test_caps) ,
450- "minimax/MiniMax-M2.7"
451- ) ;
452- }
453-
454- #[ test]
455- fn research_phases_route_to_flash_lite ( ) {
456- let research_caps = PhaseCapabilities :: defaults_for_phase ( "research" ) ;
457- assert_eq ! ( default_primary_model_for_phase( None , & research_caps) , "gemini-2.5-flash-lite" ) ;
458- assert_eq ! (
459- default_primary_model_for_phase( Some ( ModelRoutingComplexity :: Low ) , & research_caps) ,
460- "gemini-2.5-flash-lite"
461- ) ;
462- assert_eq ! (
463- default_primary_model_for_phase( Some ( ModelRoutingComplexity :: High ) , & research_caps) ,
464- "gemini-2.5-flash-lite"
465- ) ;
466- }
467-
468- #[ test]
469- fn ui_ux_phases_still_use_pro_preview ( ) {
470- let design_caps = PhaseCapabilities :: defaults_for_phase ( "design" ) ;
471- assert_eq ! ( default_primary_model_for_phase( None , & design_caps) , "gemini-3.1-pro-preview" ) ;
472- }
473-
474- #[ test]
475- fn research_fallbacks_include_flash_models ( ) {
476- let research_caps = PhaseCapabilities :: defaults_for_phase ( "research" ) ;
477- let fallbacks = default_fallback_models_for_phase ( None , & research_caps) ;
478- assert_eq ! ( fallbacks[ 0 ] , "gemini-2.5-flash" ) ;
479- }
480-
481- #[ test]
482- fn medium_complexity_defaults_to_claude_for_requirements_and_testing ( ) {
483- let req_caps = PhaseCapabilities :: defaults_for_phase ( "requirements" ) ;
484- assert_eq ! (
485- default_primary_model_for_phase( Some ( ModelRoutingComplexity :: Medium ) , & req_caps) ,
486- "claude-sonnet-4-6"
487- ) ;
488- let test_caps = PhaseCapabilities :: defaults_for_phase ( "testing" ) ;
489- assert_eq ! (
490- default_primary_model_for_phase( Some ( ModelRoutingComplexity :: Medium ) , & test_caps) ,
491- "claude-sonnet-4-6"
492- ) ;
493- let impl_caps = PhaseCapabilities :: defaults_for_phase ( "implementation" ) ;
494- assert_eq ! (
495- default_primary_model_for_phase( Some ( ModelRoutingComplexity :: Medium ) , & impl_caps) ,
496- "claude-sonnet-4-6"
497- ) ;
498- }
499329
500330 #[ test]
501331 fn phase_capabilities_defaults_are_correct ( ) {
@@ -544,7 +374,7 @@ mod tests {
544374 assert_eq ! ( default_model_for_tool( "codex" ) , Some ( "gpt-5.4" ) ) ;
545375 assert_eq ! ( default_model_for_tool( "gemini" ) , Some ( "gemini-2.5-pro" ) ) ;
546376 assert_eq ! ( default_model_for_tool( "opencode" ) , Some ( "zai-coding-plan/glm-5" ) ) ;
547- assert_eq ! ( default_model_for_tool( "oai-runner" ) , Some ( "minimax/MiniMax-M2 .7" ) ) ;
377+ assert_eq ! ( default_model_for_tool( "oai-runner" ) , Some ( "openrouter/ minimax/minimax-m2 .7" ) ) ;
548378 assert_eq ! ( default_model_for_tool( "unknown" ) , None ) ;
549379 }
550380
0 commit comments