From 0e7294835c6cde0034a7b2710acaff3f9df9c1a1 Mon Sep 17 00:00:00 2001 From: fl-sean03 <80604385+fl-sean03@users.noreply.github.com> Date: Wed, 11 Feb 2026 07:15:23 -0700 Subject: [PATCH] fix: ensure assistant messages with tool_calls include content field (#7076) Signed-off-by: fl-sean03 Co-authored-by: fl-sean03 Co-authored-by: Claude Opus 4.6 Co-authored-by: OpSpawn --- crates/goose/src/providers/formats/openai.rs | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/crates/goose/src/providers/formats/openai.rs b/crates/goose/src/providers/formats/openai.rs index fd2dbd6f..618b8d8f 100644 --- a/crates/goose/src/providers/formats/openai.rs +++ b/crates/goose/src/providers/formats/openai.rs @@ -247,6 +247,15 @@ pub fn format_messages(messages: &[Message], image_format: &ImageFormat) -> Vec< converted["content"] = json!(text_array.join("\n")); } + // Some strict OpenAI-compatible providers require "content" to be present + // (even as null) when tool_calls are provided. See #6717. + if message.role == Role::Assistant + && converted.get("tool_calls").is_some() + && converted.get("content").is_none() + { + converted["content"] = json!(null); + } + if converted.get("content").is_some() || converted.get("tool_calls").is_some() { output.insert(0, converted); }