Skip to content

Commit 961afca

Browse files
committed
Bump version to 0.2.33: remove hardcoded model routing defaults
Remove default_primary_model_for_phase and default_fallback_models_for_phase. AI phases must now have a model specified in YAML config — no silent compiled fallbacks. Model assignment is fully controlled by workflow YAML.
1 parent e91a88b commit 961afca

2 files changed

Lines changed: 7 additions & 177 deletions

File tree

crates/orchestrator-cli/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "orchestrator-cli"
3-
version = "0.2.32"
3+
version = "0.2.33"
44
edition = "2021"
55
license = "Elastic-2.0"
66

crates/protocol/src/model_routing.rs

Lines changed: 6 additions & 176 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
389290
mod 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

Comments
 (0)