on main help sign in
fix(reasoning): enforce can reason from catwalk before sending reasoning_effor
08c5c7dKieran Klukas
internal/agent/coordinator.go+3−3
@@ -268,7 +268,7 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
268 switch providerCfg.Type {
268 switch providerCfg.Type {
269 case openai.Name, azure.Name:
269 case openai.Name, azure.Name:
270 _, hasReasoningEffort := mergedOptions["reasoning_effort"]
270 _, hasReasoningEffort := mergedOptions["reasoning_effort"]
271− if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" {
271+ if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" && model.CatwalkCfg.CanReason {
272 mergedOptions["reasoning_effort"] = model.ModelCfg.ReasoningEffort
272 mergedOptions["reasoning_effort"] = model.ModelCfg.ReasoningEffort
273 }
273 }
274 if openai.IsResponsesModel(model.CatwalkCfg.ID) {
274 if openai.IsResponsesModel(model.CatwalkCfg.ID) {
@@ -292,7 +292,7 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
292 _, hasThink = mergedOptions["thinking"]
292 _, hasThink = mergedOptions["thinking"]
293 )
293 )
294 switch {
294 switch {
295− case !hasEffort && model.ModelCfg.ReasoningEffort != "":
295+ case !hasEffort && model.ModelCfg.ReasoningEffort != "" && model.CatwalkCfg.CanReason:
296 mergedOptions["effort"] = model.ModelCfg.ReasoningEffort
296 mergedOptions["effort"] = model.ModelCfg.ReasoningEffort
297 case !hasThink && model.ModelCfg.Think:
297 case !hasThink && model.ModelCfg.Think:
298 mergedOptions["thinking"] = map[string]any{"budget_tokens": 2000}
298 mergedOptions["thinking"] = map[string]any{"budget_tokens": 2000}
@@ -349,7 +349,7 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
349 extraBody := make(map[string]any)
349 extraBody := make(map[string]any)
350
350
351 _, hasReasoningEffort := mergedOptions["reasoning_effort"]
351 _, hasReasoningEffort := mergedOptions["reasoning_effort"]
352− if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" {
352+ if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" && model.CatwalkCfg.CanReason {
353 switch providerCfg.ID {
353 switch providerCfg.ID {
354 case string(catwalk.InferenceProviderIoNet):
354 case string(catwalk.InferenceProviderIoNet):
355 extraBody["reasoning"] = map[string]string{"effort": model.ModelCfg.ReasoningEffort}
355 extraBody["reasoning"] = map[string]string{"effort": model.ModelCfg.ReasoningEffort}
internal/agent/coordinator_test.go+1−1
@@ -399,7 +399,7 @@ func TestGetProviderOptionsReasoningEffort(t *testing.T) {
399 for _, tc := range tests {
399 for _, tc := range tests {
400 t.Run(tc.name, func(t *testing.T) {
400 t.Run(tc.name, func(t *testing.T) {
401 model := Model{
401 model := Model{
402− CatwalkCfg: catwalk.Model{ID: "claude-opus-4-7"},
402+ CatwalkCfg: catwalk.Model{ID: "claude-opus-4-7", CanReason: true},
403 ModelCfg: config.SelectedModel{
403 ModelCfg: config.SelectedModel{
404 Provider: "test",
404 Provider: "test",
405 ReasoningEffort: "max",
405 ReasoningEffort: "max",