diff --git a/internal/runtime/executor/helps/devin_models.go b/internal/runtime/executor/helps/devin_models.go index 16629bf0b..0c29a9054 100644 --- a/internal/runtime/executor/helps/devin_models.go +++ b/internal/runtime/executor/helps/devin_models.go @@ -113,6 +113,12 @@ func ResolveDevinChatModelUID(rawModel string, thinkingLevel string, budgetToken clamped := clampEffort(effort, swe2Efforts, "high") return "swe-2-" + clamped + case strings.Contains(lowerBase, "swe-1-7") || strings.Contains(lowerBase, "swe-1.7"): + if effort == "medium" { + return "swe-1-7-medium" + } + return "swe-1-7" + case strings.Contains(lowerBase, "fable-5-1") || strings.Contains(lowerBase, "fable-5.1"): clamped := clampEffort(effort, fable51Efforts, "medium") return "claude-fable-5-1-" + clamped @@ -121,10 +127,22 @@ func ResolveDevinChatModelUID(rawModel string, thinkingLevel string, budgetToken clamped := clampEffort(effort, fable51Efforts, "medium") return "claude-5-fable-" + clamped + case strings.Contains(lowerBase, "claude-haiku-4-5") || strings.Contains(lowerBase, "claude-haiku-4.5") || strings.Contains(lowerBase, "haiku-4-5"): + return "MODEL_PRIVATE_11" + + case strings.Contains(lowerBase, "claude-sonnet-4-5") || strings.Contains(lowerBase, "claude-sonnet-4.5") || strings.Contains(lowerBase, "sonnet-4-5"): + if effort != "" && effort != "none" { + return "MODEL_PRIVATE_3" + } + return "MODEL_PRIVATE_2" + case strings.Contains(lowerBase, "astra"): clamped := clampEffort(effort, astraEfforts, "medium") return "gpt-6-astra-" + clamped + case strings.Contains(lowerBase, "gpt-4-1") || strings.Contains(lowerBase, "gpt-4.1"): + return "MODEL_CHAT_GPT_4_1_2025_04_14" + case strings.Contains(lowerBase, "glm-5-2") || strings.Contains(lowerBase, "glm-5.2"): if effort == "none" { return "glm-5-2-none" @@ -139,6 +157,10 @@ func ResolveDevinChatModelUID(rawModel string, thinkingLevel string, budgetToken clamped := clampEffort(effort, gemini38Efforts, "high") return "gemini-3-8-flash-" + clamped + case lowerBase == "gemini-3-flash": + clamped := clampEffort(effort, gemini38Efforts, "high") + return "gemini-3-8-flash-" + clamped + case strings.Contains(lowerBase, "grok-4-6") || strings.Contains(lowerBase, "grok-4.6"): clamped := clampEffort(effort, grok46Efforts, "high") return "grok-4-6-" + clamped diff --git a/internal/runtime/executor/helps/devin_models_test.go b/internal/runtime/executor/helps/devin_models_test.go index 35345845b..67beba9a0 100644 --- a/internal/runtime/executor/helps/devin_models_test.go +++ b/internal/runtime/executor/helps/devin_models_test.go @@ -172,6 +172,48 @@ func TestResolveDevinChatModelUID(t *testing.T) { thinkingLevel: "", want: "deepseek-v4-1-flash-max", }, + { + name: "swe-1-7 default maps to swe-1-7", + rawModel: "devin/swe-1-7", + thinkingLevel: "", + want: "swe-1-7", + }, + { + name: "swe-1-7 with medium maps to swe-1-7-medium", + rawModel: "devin/swe-1-7:medium", + thinkingLevel: "", + want: "swe-1-7-medium", + }, + { + name: "claude-haiku-4-5 maps to MODEL_PRIVATE_11", + rawModel: "devin/claude-haiku-4-5", + thinkingLevel: "", + want: "MODEL_PRIVATE_11", + }, + { + name: "claude-sonnet-4-5 non-thinking maps to MODEL_PRIVATE_2", + rawModel: "devin/claude-sonnet-4-5", + thinkingLevel: "", + want: "MODEL_PRIVATE_2", + }, + { + name: "claude-sonnet-4-5 thinking maps to MODEL_PRIVATE_3", + rawModel: "devin/claude-sonnet-4-5:high", + thinkingLevel: "", + want: "MODEL_PRIVATE_3", + }, + { + name: "gpt-4-1 maps to MODEL_CHAT_GPT_4_1_2025_04_14", + rawModel: "devin/gpt-4-1", + thinkingLevel: "", + want: "MODEL_CHAT_GPT_4_1_2025_04_14", + }, + { + name: "gemini-3-flash alias maps to gemini-3-8-flash-high", + rawModel: "devin/gemini-3-flash", + thinkingLevel: "", + want: "gemini-3-8-flash-high", + }, } for _, tt := range tests {