From e232feb51922ca197d37cc31fbba4e9aa3c6889a Mon Sep 17 00:00:00 2001 From: centdix <40307056+centdix@users.noreply.github.com> Date: Tue, 16 Dec 2025 14:21:55 +0100 Subject: [PATCH] fix structured output for anthropic (#7384) --- .../windmill-worker/src/ai/providers/openai.rs | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) 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