@@ -346,13 +346,18 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
346346 options[google.Name] = parsed
347347 }
348348 case openaicompat.Name, hyper.Name:
349+ extraBody := make(map[string]any)
350+
349351 _, hasReasoningEffort := mergedOptions["reasoning_effort"]
350352 if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" {
351− mergedOptions["reasoning_effort"] = model.ModelCfg.ReasoningEffort
353+ switch providerCfg.ID {
354+ case string(catwalk.InferenceProviderIoNet):
355+ extraBody["reasoning"] = map[string]string{"effort": model.ModelCfg.ReasoningEffort}
356+ default:
357+ mergedOptions["reasoning_effort"] = model.ModelCfg.ReasoningEffort
358+ }
352359 }
353360
354− extraBody := make(map[string]any)
355−
356361 // "reasoning effort" is a standard OpenAI field, but "thinking" is not.
357362 // Setting it in the right way for each provider.
358363 // TODO: Abstract this in Fantasy somehow?
@@ -361,8 +366,12 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
361366 case hyper.Name:
362367 extraBody["thinking"] = model.ModelCfg.Think
363368 case string(catwalk.InferenceProviderIoNet):
364− extraBody["chat_template_kwargs"] = map[string]any{
365− "thinking": model.ModelCfg.Think,
369+ if _, ok := extraBody["reasoning"]; !ok && model.CatwalkCfg.CanReason {
370+ if model.ModelCfg.Think {
371+ extraBody["reasoning"] = map[string]string{"effort": "medium"}
372+ } else {
373+ extraBody["reasoning"] = map[string]string{"effort": "none"}
374+ }
366375 }
367376 case string(catwalk.InferenceProviderZAI), string(catwalk.InferenceProviderDeepSeek):
368377 if model.ModelCfg.Think {