package helps import ( "testing" ) func TestResolveDevinChatModelUID(t *testing.T) { tests := []struct { name string rawModel string thinkingLevel string budgetTokens int want string }{ { name: "direct full UID unchanged", rawModel: "claude-fable-5-1-max", want: "claude-fable-5-1-max", }, { name: "direct swe-2-high unchanged", rawModel: "swe-2-high", want: "swe-2-high", }, { name: "swe-2 default to high when no effort", rawModel: "swe-2", thinkingLevel: "", want: "swe-2-high", }, { name: "swe-2 clamp minimal to medium", rawModel: "swe-2", thinkingLevel: "minimal", want: "swe-2-medium", }, { name: "swe-2 clamp low to medium", rawModel: "swe-2", thinkingLevel: "low", want: "swe-2-medium", }, { name: "swe-2 with xhigh maps to max", rawModel: "swe-2", thinkingLevel: "xhigh", want: "swe-2-max", }, { name: "swe-2 request max", rawModel: "swe-2", thinkingLevel: "max", want: "swe-2-max", }, { name: "swe-2 suffix overrides body thinkingLevel", rawModel: "swe-2(max)", thinkingLevel: "medium", want: "swe-2-max", }, { name: "fable-5-1 budget tokens maps to max", rawModel: "claude-fable-5-1", budgetTokens: 64000, want: "claude-fable-5-1-max", }, { name: "fable-5-1 budget tokens maps to low", rawModel: "claude-fable-5-1", budgetTokens: 2048, want: "claude-fable-5-1-low", }, { name: "fable-5-1 with xhigh", rawModel: "claude-fable-5-1", thinkingLevel: "xhigh", want: "claude-fable-5-1-xhigh", }, { name: "astra with suffix in parenthesis", rawModel: "gpt-6-astra(high)", thinkingLevel: "", want: "gpt-6-astra-high", }, { name: "glm-5-3 clamp medium to high", rawModel: "glm-5-3", thinkingLevel: "medium", want: "glm-5-3-high", }, { name: "glm-5-2 default maps to glm-5-2", rawModel: "devin/glm-5-2", thinkingLevel: "high", want: "glm-5-2", }, { name: "glm-5-2 with none effort maps to glm-5-2-none", rawModel: "devin/glm-5-2:none", thinkingLevel: "", want: "glm-5-2-none", }, { name: "glm-5-2 suffix max maps to default", rawModel: "devin/glm-5-2(max)", thinkingLevel: "", want: "glm-5-2", }, { name: "devin prefix lowercase swe-2", rawModel: "devin/swe-2", thinkingLevel: "", want: "swe-2-high", }, { name: "Devin prefix capitalized swe-2 with suffix", rawModel: "Devin/swe-2(max)", thinkingLevel: "", want: "swe-2-max", }, { name: "devin prefix claude-fable-5-1", rawModel: "devin/claude-fable-5-1", thinkingLevel: "", want: "claude-fable-5-1-medium", }, { name: "Devin prefix gpt-6-astra with suffix", rawModel: "Devin/gpt-6-astra(high)", thinkingLevel: "", want: "gpt-6-astra-high", }, { name: "devin prefix direct effort UID", rawModel: "devin/swe-2-high", thinkingLevel: "", want: "swe-2-high", }, { name: "devin prefix gemini-3-8-flash default high", rawModel: "devin/gemini-3-8-flash", thinkingLevel: "", want: "gemini-3-8-flash-high", }, { name: "devin prefix gemini-3.8-flash with low suffix", rawModel: "devin/gemini-3.8-flash(low)", thinkingLevel: "", want: "gemini-3-8-flash-low", }, { name: "devin prefix grok-4-6 default high", rawModel: "devin/grok-4-6", thinkingLevel: "", want: "grok-4-6-high", }, { name: "devin prefix grok-4.6 with xhigh suffix", rawModel: "devin/grok-4.6:xhigh", thinkingLevel: "", want: "grok-4-6-xhigh", }, { name: "devin prefix deepseek-v4-flash default high", rawModel: "devin/deepseek-v4-flash", thinkingLevel: "", want: "deepseek-v4-flash-high", }, { name: "devin prefix deepseek-v4.1-flash with max suffix", rawModel: "devin/deepseek-v4.1-flash(max)", 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 { t.Run(tt.name, func(t *testing.T) { got := ResolveDevinChatModelUID(tt.rawModel, tt.thinkingLevel, tt.budgetTokens) if got != tt.want { t.Errorf("ResolveDevinChatModelUID(%q, %q, %d) = %q, want %q", tt.rawModel, tt.thinkingLevel, tt.budgetTokens, got, tt.want) } }) } }