@@ -361,11 +361,39 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy.
361 if err == nil {
361 if err == nil {
362 options[google.Name] = parsed
362 options[google.Name] = parsed
364− case openaicompat.Name:
364+ case openaicompat.Name, hyper.Name:
365 _, hasReasoningEffort := mergedOptions["reasoning_effort"]
365 _, hasReasoningEffort := mergedOptions["reasoning_effort"]
366 if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" {
366 if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" {
367 mergedOptions["reasoning_effort"] = model.ModelCfg.ReasoningEffort
367 mergedOptions["reasoning_effort"] = model.ModelCfg.ReasoningEffort
370+ extraBody := make(map[string]any)
372+ // "reasoning effort" is a standard OpenAI field, but "thinking" is not.
373+ // Setting it in the right way for each provider.
374+ // TODO: Abstract this in Fantasy somehow?
375+ // TODO: Allow custom providers to specify how to set this?
376+ switch providerCfg.ID {
378+ extraBody["thinking"] = model.ModelCfg.Think
379+ case string(catwalk.InferenceProviderIoNet):
380+ extraBody["chat_template_kwargs"] = map[string]any{
381+ "thinking": model.ModelCfg.Think,
383+ case string(catwalk.InferenceProviderZAI):
384+ if model.ModelCfg.Think {
385+ extraBody["thinking"] = map[string]any{
389+ extraBody["thinking"] = map[string]any{
395+ mergedOptions["extra_body"] = extraBody
369 parsed, err := openaicompat.ParseOptions(mergedOptions)
397 parsed, err := openaicompat.ParseOptions(mergedOptions)
370 if err == nil {
398 if err == nil {
371 options[openaicompat.Name] = parsed
399 options[openaicompat.Name] = parsed