@@ -16,45 +16,83 @@ const (
1616
1717// ReasoningAdapter handles reasoning content capability
1818// - Manages reasoning_effort parameter (o1, GPT-5)
19+ // - Manages temperature parameter constraints (reasoning models typically require temperature=1)
1920// - Extracts reasoning_tokens from usage
2021// - Parses visible reasoning content (DeepSeek R1)
2122type ReasoningAdapter struct {
2223 * BaseAdapter
23- format ReasoningFormat
24- supportsEffort bool // Whether the model supports reasoning_effort parameter
24+ format ReasoningFormat
25+ supportsEffort bool // Whether the model supports reasoning_effort parameter
26+ supportsTemperature bool // Whether the model supports temperature adjustment
2527}
2628
2729// NewReasoningAdapter creates a new reasoning adapter
28- func NewReasoningAdapter (format ReasoningFormat ) * ReasoningAdapter {
30+ // If cap.TemperatureAdjustable is provided, it overrides the default behavior
31+ func NewReasoningAdapter (format ReasoningFormat , cap * context.ModelCapabilities ) * ReasoningAdapter {
2932 supportsEffort := false
33+ supportsTemperature := true
3034
31- // Only OpenAI o1 and GPT-5 support reasoning_effort parameter
32- if format == ReasoningFormatOpenAI || format == ReasoningFormatGPT5 {
35+ // Set defaults based on reasoning format
36+ switch format {
37+ case ReasoningFormatOpenAI , ReasoningFormatGPT5 :
38+ // OpenAI o1 and GPT-5: support reasoning_effort, but NOT temperature adjustment
3339 supportsEffort = true
40+ supportsTemperature = false
41+ case ReasoningFormatDeepSeek :
42+ // DeepSeek R1: no reasoning_effort, no temperature adjustment
43+ supportsEffort = false
44+ supportsTemperature = false
45+ case ReasoningFormatNone :
46+ // Non-reasoning models: no reasoning_effort, but support temperature
47+ supportsEffort = false
48+ supportsTemperature = true
49+ }
50+
51+ // Override with explicit capability if provided
52+ if cap != nil && cap .TemperatureAdjustable != nil {
53+ supportsTemperature = * cap .TemperatureAdjustable
3454 }
3555
3656 return & ReasoningAdapter {
37- BaseAdapter : NewBaseAdapter ("ReasoningAdapter" ),
38- format : format ,
39- supportsEffort : supportsEffort ,
57+ BaseAdapter : NewBaseAdapter ("ReasoningAdapter" ),
58+ format : format ,
59+ supportsEffort : supportsEffort ,
60+ supportsTemperature : supportsTemperature ,
4061 }
4162}
4263
43- // PreprocessOptions handles reasoning_effort parameter
64+ // PreprocessOptions handles reasoning_effort and temperature parameters
4465func (a * ReasoningAdapter ) PreprocessOptions (options * context.CompletionOptions ) (* context.CompletionOptions , error ) {
4566 if options == nil {
4667 return options , nil
4768 }
4869
49- // If model doesn't support reasoning_effort, remove it
50- if ! a .supportsEffort && options .ReasoningEffort != nil {
70+ newOptions := * options
71+ modified := false
72+
73+ // 1. Handle reasoning_effort parameter
74+ if ! a .supportsEffort && newOptions .ReasoningEffort != nil {
5175 // Model doesn't support reasoning_effort, remove the parameter
52- newOptions := * options
5376 newOptions .ReasoningEffort = nil
77+ modified = true
78+ }
79+
80+ // 2. Handle temperature parameter
81+ if ! a .supportsTemperature && newOptions .Temperature != nil {
82+ currentTemp := * newOptions .Temperature
83+ if currentTemp != 1.0 {
84+ // Model doesn't support temperature adjustment, reset to default (1.0)
85+ defaultTemp := 1.0
86+ newOptions .Temperature = & defaultTemp
87+ modified = true
88+ }
89+ }
90+
91+ if modified {
5492 return & newOptions , nil
5593 }
5694
57- // If model supports reasoning_effort, keep it as-is (user can set "low", "medium", or "high")
95+ // No modifications needed
5896 return options , nil
5997}
6098
0 commit comments