diff --git a/go.mod b/go.mod index 09d28f36811be1b0a3aae33fcbbf5351f44749bb..fd89cbafafbe0c941c5b3c17c72728b574a471d9 100644 --- a/go.mod +++ b/go.mod @@ -5,9 +5,9 @@ go 1.26.2 require ( charm.land/bubbles/v2 v2.1.0 charm.land/bubbletea/v2 v2.0.6 - charm.land/catwalk v0.38.0 + charm.land/catwalk v0.39.1 charm.land/fang/v2 v2.0.1 - charm.land/fantasy v0.22.0 + charm.land/fantasy v0.23.0 charm.land/glamour/v2 v2.0.0 charm.land/lipgloss/v2 v2.0.3 charm.land/log/v2 v2.0.0 diff --git a/go.sum b/go.sum index 2379b92d39ed7bc29ae7ed2c7645aa94bf58c62f..cf435763718e45fe65a3fdf1ed44b30d33a60dd5 100644 --- a/go.sum +++ b/go.sum @@ -2,12 +2,12 @@ charm.land/bubbles/v2 v2.1.0 h1:YSnNh5cPYlYjPxRrzs5VEn3vwhtEn3jVGRBT3M7/I0g= charm.land/bubbles/v2 v2.1.0/go.mod h1:l97h4hym2hvWBVfmJDtrEHHCtkIKeTEb3TTJ4ZOB3wY= charm.land/bubbletea/v2 v2.0.6 h1:UHN/91OyuhaOFGSrBXQ/hMZD8IO1Uc4BvHlgHXL2WJo= charm.land/bubbletea/v2 v2.0.6/go.mod h1:MH/D8ZLlN3op37vQvijKuU29g3rqTp+aQapURFonF9g= -charm.land/catwalk v0.38.0 h1:GAceUURVv7o3DQFAiS5z+UbLP0Xwkr70QvDIfqC7pyw= -charm.land/catwalk v0.38.0/go.mod h1:IvMXm7qMKvYuWWlN5A4dA0bTgYg4clG1GAeU9/NlY0w= +charm.land/catwalk v0.39.1 h1:jhMgnJQzYULdxoU7jf+Ct+ickBfGrxVEaylonIKCLWE= +charm.land/catwalk v0.39.1/go.mod h1:IvMXm7qMKvYuWWlN5A4dA0bTgYg4clG1GAeU9/NlY0w= charm.land/fang/v2 v2.0.1 h1:zQCM8JQJ1JnQX/66B5jlCYBUxL2as5JXQZ2KJ6EL0mY= charm.land/fang/v2 v2.0.1/go.mod h1:S1GmkpcvK+OB5w9caywUnJcsMew45Ot8FXqoz8ALrII= -charm.land/fantasy v0.22.0 h1:5HrjUr+52o0DW90//Vx1wYg+qcxaN21c2PeYeGVTb4U= -charm.land/fantasy v0.22.0/go.mod h1:4yzSsd9XmFEVjRnF1P0LTEbLTmQX6OLnPkrHaf7iruo= +charm.land/fantasy v0.23.0 h1:pocjwC5CxfEg1Bpwb0raML2d5ijo3op33Mmd6hYJyo4= +charm.land/fantasy v0.23.0/go.mod h1:4yzSsd9XmFEVjRnF1P0LTEbLTmQX6OLnPkrHaf7iruo= charm.land/glamour/v2 v2.0.0 h1:IDBoqLEy7Hdpb9VOXN+khLP/XSxtJy1VsHuW/yF87+U= charm.land/glamour/v2 v2.0.0/go.mod h1:kjq9WB0s8vuUYZNYey2jp4Lgd9f4cKdzAw88FZtpj/w= charm.land/lipgloss/v2 v2.0.3 h1:yM2zJ4Cf5Y51b7RHIwioil4ApI/aypFXXVHSwlM6RzU= diff --git a/internal/agent/coordinator.go b/internal/agent/coordinator.go index 9062d62f51b162499a996eeeebbc1fe0c09064e8..0050299b8bef46d95a2ec4a5913043917f7b056f 100644 --- a/internal/agent/coordinator.go +++ b/internal/agent/coordinator.go @@ -361,11 +361,39 @@ func getProviderOptions(model Model, providerCfg config.ProviderConfig) fantasy. if err == nil { options[google.Name] = parsed } - case openaicompat.Name: + case openaicompat.Name, hyper.Name: _, hasReasoningEffort := mergedOptions["reasoning_effort"] if !hasReasoningEffort && model.ModelCfg.ReasoningEffort != "" { mergedOptions["reasoning_effort"] = model.ModelCfg.ReasoningEffort } + + extraBody := make(map[string]any) + + // "reasoning effort" is a standard OpenAI field, but "thinking" is not. + // Setting it in the right way for each provider. + // TODO: Abstract this in Fantasy somehow? + // TODO: Allow custom providers to specify how to set this? + switch providerCfg.ID { + case hyper.Name: + extraBody["thinking"] = model.ModelCfg.Think + case string(catwalk.InferenceProviderIoNet): + extraBody["chat_template_kwargs"] = map[string]any{ + "thinking": model.ModelCfg.Think, + } + case string(catwalk.InferenceProviderZAI): + if model.ModelCfg.Think { + extraBody["thinking"] = map[string]any{ + "type": "enabled", + } + } else { + extraBody["thinking"] = map[string]any{ + "type": "disabled", + } + } + } + + mergedOptions["extra_body"] = extraBody + parsed, err := openaicompat.ParseOptions(mergedOptions) if err == nil { options[openaicompat.Name] = parsed