From 8fd7e18113e0acc2d41ff9863e9235d94efea285 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Peer=20Sch=C3=BCtt?= <20603780+peerschuett@users.noreply.github.com> Date: Thu, 11 Jun 2026 09:45:34 +0200 Subject: [PATCH] Responses API fix --- app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs | 8 ++++++-- .../Provider/OpenAI/ResponsesResponse.cs | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs index de764e2a..8c7624be 100644 --- a/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs +++ b/app/MindWork AI Studio/Provider/OpenAI/ProviderOpenAI.cs @@ -313,6 +313,10 @@ public sealed class ProviderOpenAI() : BaseProvider(LLMProviders.OPEN_AI, new Ur var providerTools = runnableTools .Select(x => (object)ProviderToolAdapters.ToResponsesTool(x.Definition)) .ToList(); + // Keep only the minimal safe continuation state across follow-up requests. + // The Responses API requires the original function_call item together with + // the later function_call_output, but replaying all response output would + // include server-side IDs that are unavailable when store=false. var internalItems = new List(); var toolCallCount = 0; @@ -369,8 +373,8 @@ public sealed class ProviderOpenAI() : BaseProvider(LLMProviders.OPEN_AI, new Ur await currentAssistantContent.StreamingEvent(); } - foreach (var outputItem in response.Output) - internalItems.Add(outputItem); + foreach (var functionCallItem in response.GetRawFunctionCallItems()) + internalItems.Add(functionCallItem); foreach (var functionCall in functionCalls) { diff --git a/app/MindWork AI Studio/Provider/OpenAI/ResponsesResponse.cs b/app/MindWork AI Studio/Provider/OpenAI/ResponsesResponse.cs index 69682e22..152e88cf 100644 --- a/app/MindWork AI Studio/Provider/OpenAI/ResponsesResponse.cs +++ b/app/MindWork AI Studio/Provider/OpenAI/ResponsesResponse.cs @@ -27,6 +27,10 @@ public sealed record ResponsesResponse .Where(x => !string.IsNullOrWhiteSpace(x.CallId) && !string.IsNullOrWhiteSpace(x.Name)) .ToList(); + public IReadOnlyList GetRawFunctionCallItems() => this.Output + .Where(x => ReadString(x, "type").Equals("function_call", StringComparison.Ordinal)) + .ToList(); + public string GetTextOutput() { if (!string.IsNullOrWhiteSpace(this.OutputText))