diff --git a/backend/windmill-worker/src/ai/providers/openai.rs b/backend/windmill-worker/src/ai/providers/openai.rs index 178f3b23a4..5cf745693a 100644 --- a/backend/windmill-worker/src/ai/providers/openai.rs +++ b/backend/windmill-worker/src/ai/providers/openai.rs @@ -147,7 +147,15 @@ impl OpenAIQueryBuilder { .map(|props| !props.is_empty()) .unwrap_or(false); - let response_format = if has_output_properties && args.output_schema.is_some() { + let should_use_structured_output_tool = + should_use_structured_output_tool(&self.provider_kind, args.model); + + // Only use response_format for providers that support it (not Claude/Anthropic) + // Claude models use a tool for structured output instead + let response_format = if has_output_properties + && args.output_schema.is_some() + && !should_use_structured_output_tool + { let schema = args.output_schema.unwrap(); let strict_schema = schema.clone().make_strict(); Some(ResponseFormat { @@ -162,10 +170,8 @@ impl OpenAIQueryBuilder { None }; - let should_use_structured_output_tool = - should_use_structured_output_tool(&self.provider_kind, args.model); - // Force usage of structured output tool for Claude models when structured output provided - let tool_choice = if should_use_structured_output_tool && response_format.is_some() { + // Force usage of structured output tool for Claude models when structured output is provided + let tool_choice = if should_use_structured_output_tool && has_output_properties { Some(ToolChoice::Required) } else { None