diff --git a/internal/ai/llm.go b/internal/ai/llm.go index 34a58da..8746669 100644 --- a/internal/ai/llm.go +++ b/internal/ai/llm.go @@ -59,7 +59,7 @@ func (s *llm) ChatWithConfig(ctx context.Context, config models.AIConfig, system if config.MaxOutputTokens > 0 { params.MaxCompletionTokens = openai.Int(int64(config.MaxOutputTokens)) } - applyProviderSpecificChatParams(params, config) + applyProviderSpecificChatParams(¶ms, config) client := newOpenAIClient(config) chatResp, err := client.Chat.Completions.New(ctx, params) @@ -80,7 +80,10 @@ func (s *llm) ChatWithConfig(ctx context.Context, config models.AIConfig, system }, nil } -func applyProviderSpecificChatParams(params openai.ChatCompletionNewParams, config models.AIConfig) { +func applyProviderSpecificChatParams(params *openai.ChatCompletionNewParams, config models.AIConfig) { + if params == nil { + return + } if isDashScopeQwenThinkingModel(config) { params.SetExtraFields(map[string]any{ "enable_thinking": false, diff --git a/internal/ai/llm_test.go b/internal/ai/llm_test.go new file mode 100644 index 0000000..4774f38 --- /dev/null +++ b/internal/ai/llm_test.go @@ -0,0 +1,43 @@ +package ai + +import ( + "encoding/json" + "testing" + + openai "github.com/openai/openai-go/v3" + "github.com/openai/openai-go/v3/shared" + + "agent-desk/internal/models" +) + +func TestApplyProviderSpecificChatParamsIncludesDashScopeThinkingFlag(t *testing.T) { + params := openai.ChatCompletionNewParams{ + Messages: []openai.ChatCompletionMessageParamUnion{ + { + OfUser: &openai.ChatCompletionUserMessageParam{ + Content: openai.ChatCompletionUserMessageParamContentUnion{ + OfString: openai.String("hello"), + }, + }, + }, + }, + Model: shared.ChatModel("qwen3.5-plus"), + } + + applyProviderSpecificChatParams(¶ms, models.AIConfig{ + BaseURL: "https://dashscope.aliyuncs.com/compatible-mode/v1", + ModelName: "qwen3.5-plus", + }) + + raw, err := json.Marshal(params) + if err != nil { + t.Fatalf("marshal params: %v", err) + } + var body map[string]any + if err := json.Unmarshal(raw, &body); err != nil { + t.Fatalf("unmarshal params: %v", err) + } + if got, ok := body["enable_thinking"].(bool); !ok || got { + t.Fatalf("expected enable_thinking=false in request body, got body=%s", raw) + } +}