@@ -283,10 +283,13 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
return options
}
+ shouldSetEffort := model.CatwalkCfg.CanReason &&
+ slices.Contains(model.CatwalkCfg.ReasoningLevels, model.ModelCfg.ReasoningEffort)
+
switch providerCfg.Type {
case openai.Name, azure.Name:
_, hasReasoningEffort := mergedOptions["reasoning_effort"]
- if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" && model.CatwalkCfg.CanReason {
+ if !hasReasoningEffort && shouldSetEffort {
mergedOptions["reasoning_effort"] = model.ModelCfg.ReasoningEffort
}
if openai.IsResponsesModel(model.CatwalkCfg.ID) {
@@ -310,7 +313,7 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
_, hasThink = mergedOptions["thinking"]
)
switch {
- case !hasEffort && model.ModelCfg.ReasoningEffort != "" && model.CatwalkCfg.CanReason:
+ case !hasEffort && shouldSetEffort:
mergedOptions["effort"] = model.ModelCfg.ReasoningEffort
case !hasThink && model.ModelCfg.Think:
mergedOptions["thinking"] = map[string]any{"budget_tokens": 2000}
@@ -322,7 +325,7 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
case openrouter.Name:
_, hasReasoning := mergedOptions["reasoning"]
- if !hasReasoning && model.ModelCfg.ReasoningEffort != "" {
+ if !hasReasoning && shouldSetEffort {
mergedOptions["reasoning"] = map[string]any{
"enabled": true,
"effort": model.ModelCfg.ReasoningEffort,
@@ -334,7 +337,7 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
}
case vercel.Name:
_, hasReasoning := mergedOptions["reasoning"]
- if !hasReasoning && model.ModelCfg.ReasoningEffort != "" {
+ if !hasReasoning && shouldSetEffort {
mergedOptions["reasoning"] = map[string]any{
"enabled": true,
"effort": model.ModelCfg.ReasoningEffort,
@@ -367,7 +370,7 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
extraBody := make(map[string]any)
_, hasReasoningEffort := mergedOptions["reasoning_effort"]
- if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" && model.CatwalkCfg.CanReason {
+ if !hasReasoningEffort && shouldSetEffort {
switch providerCfg.ID {
case string(catwalk.InferenceProviderIoNet):
extraBody["reasoning"] = map[string]string{"effort": model.ModelCfg.ReasoningEffort}
@@ -399,7 +399,11 @@ func TestGetProviderOptionsReasoningEffort(t *testing.T) {
for _, tc := range tests {
t.Run(tc.name, func(t *testing.T) {
model := Model{
- CatwalkCfg: catwalk.Model{ID: "claude-opus-4-7", CanReason: true},
+ CatwalkCfg: catwalk.Model{
+ ID: "claude-opus-4-7",
+ CanReason: true,
+ ReasoningLevels: []string{"max"},
+ },
ModelCfg: config.SelectedModel{
Provider: "test",
ReasoningEffort: "max",