From b1bba4cabd8b7dcd47674afb4796c821c0684aec Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 5 May 2026 19:27:47 +0000 Subject: [PATCH 1/6] Initial plan From 980a124fb99d280ea9ba04c6f83f5a1e4bd28c74 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 5 May 2026 19:43:20 +0000 Subject: [PATCH 2/6] Update global.json to use available .NET SDK version 10.0.201 Agent-Logs-Url: https://github.com/dotnet/extensions/sessions/3fcca199-65c7-4765-a983-221f6047d7a5 Co-authored-by: ericstj <8918108+ericstj@users.noreply.github.com> --- NuGet.config | 3 ++- global.json | 4 ++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/NuGet.config b/NuGet.config index 0fedd015e82..015540ff3f5 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,4 +1,4 @@ - + @@ -17,6 +17,7 @@ + diff --git a/global.json b/global.json index 1c56673c1ec..07822004f17 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "10.0.106" + "version": "10.0.201" }, "tools": { - "dotnet": "10.0.106", + "dotnet": "10.0.201", "runtimes": { "dotnet": [ "8.0.0", From fc02fc2aa471bd6d71714fd2bd48b3951c6378e1 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 5 May 2026 20:09:41 +0000 Subject: [PATCH 3/6] Update OpenAI SDK to 2.10.0-alpha.700 and fix streaming MessageID for function calls Agent-Logs-Url: https://github.com/dotnet/extensions/sessions/3fcca199-65c7-4765-a983-221f6047d7a5 Co-authored-by: ericstj <8918108+ericstj@users.noreply.github.com> --- NuGet.config | 7 +++++- eng/packages/General.props | 2 +- .../OpenAIResponsesChatClient.cs | 14 +++++++---- .../OpenAIResponseClientTests.cs | 24 +++++++++++++------ 4 files changed, 34 insertions(+), 13 deletions(-) diff --git a/NuGet.config b/NuGet.config index 015540ff3f5..2aab6faa83e 100644 --- a/NuGet.config +++ b/NuGet.config @@ -1,4 +1,4 @@ - + @@ -17,6 +17,7 @@ + diff --git a/eng/packages/General.props b/eng/packages/General.props index d30eedcfefe..d8d453ee6f1 100644 --- a/eng/packages/General.props +++ b/eng/packages/General.props @@ -17,7 +17,7 @@ - + diff --git a/src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIResponsesChatClient.cs b/src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIResponsesChatClient.cs index 38695ae16f0..80ece797929 100644 --- a/src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIResponsesChatClient.cs +++ b/src/Libraries/Microsoft.Extensions.AI.OpenAI/OpenAIResponsesChatClient.cs @@ -17,7 +17,6 @@ using System.Threading.Tasks; using Microsoft.Shared.DiagnosticIds; using Microsoft.Shared.Diagnostics; -using OpenAI; using OpenAI.Responses; #pragma warning disable S1226 // Method parameters, caught exceptions and foreach variables' initial values should not be ignored @@ -464,6 +463,7 @@ ChatResponseUpdate CreateUpdate(AIContent? content = null) => case FunctionCallResponseItem fcri: anyFunctions = true; + lastMessageId = outputItemAddedUpdate.Item.Id; lastRole = ChatRole.Assistant; break; } @@ -735,7 +735,9 @@ private static bool IsStoredOutputDisabled(CreateResponseOptions? options, Respo case HostedToolSearchTool: // Workaround: The OpenAI .NET SDK doesn't yet expose a ToolSearchTool type. // See https://github.com/openai/openai-dotnet/issues/1053 - return ModelReaderWriter.Read(BinaryData.FromString("""{"type": "tool_search"}"""), ModelReaderWriterOptions.Json, OpenAIContext.Default)!; +#pragma warning disable OPENAI001 // OpenAIResponsesContext is experimental + return ModelReaderWriter.Read(BinaryData.FromString("""{"type": "tool_search"}"""), ModelReaderWriterOptions.Json, OpenAIResponsesContext.Default)!; +#pragma warning restore OPENAI001 case HostedWebSearchTool webSearchTool: return new WebSearchTool @@ -895,7 +897,9 @@ internal static ResponseTool ToNamespaceResponseTool(string name, string? descri writer.WriteStartArray("tools"u8); foreach (var namespacedTool in namespacedTools) { - var toolData = ModelReaderWriter.Write(namespacedTool, ModelReaderWriterOptions.Json, OpenAIContext.Default); +#pragma warning disable OPENAI001 // OpenAIResponsesContext is experimental + var toolData = ModelReaderWriter.Write(namespacedTool, ModelReaderWriterOptions.Json, OpenAIResponsesContext.Default); +#pragma warning restore OPENAI001 using var doc = JsonDocument.Parse(toolData); doc.RootElement.WriteTo(writer); } @@ -904,7 +908,9 @@ internal static ResponseTool ToNamespaceResponseTool(string name, string? descri writer.WriteEndObject(); } - return ModelReaderWriter.Read(BinaryData.FromBytes(stream.ToArray()), ModelReaderWriterOptions.Json, OpenAIContext.Default)!; +#pragma warning disable OPENAI001 // OpenAIResponsesContext is experimental + return ModelReaderWriter.Read(BinaryData.FromBytes(stream.ToArray()), ModelReaderWriterOptions.Json, OpenAIResponsesContext.Default)!; +#pragma warning restore OPENAI001 } /// Creates a from a . diff --git a/test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIResponseClientTests.cs b/test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIResponseClientTests.cs index 90f8343d8f0..73297dfad23 100644 --- a/test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIResponseClientTests.cs +++ b/test/Libraries/Microsoft.Extensions.AI.OpenAI.Tests/OpenAIResponseClientTests.cs @@ -5974,6 +5974,7 @@ public async Task StreamingResponseWithFunctionCallOutput_YieldsFunctionResultCo var functionCallUpdate = updates.FirstOrDefault(u => u.Contents.OfType().Any()); Assert.NotNull(functionCallUpdate); Assert.Equal(ChatRole.Assistant, functionCallUpdate.Role); + Assert.Equal("fc_001", functionCallUpdate.MessageId); // Verify MessageID is set for function calls (issue #7479) var fcc = functionCallUpdate.Contents.OfType().Single(); Assert.Equal("call_123", fcc.CallId); Assert.Equal("get_weather", fcc.Name); @@ -5994,14 +5995,23 @@ public async Task StreamingResponseWithFunctionCallOutput_YieldsFunctionResultCo var response = updates.ToChatResponse(); Assert.Equal("resp_001", response.ResponseId); Assert.Equal("gpt-4o-mini", response.ModelId); - Assert.Single(response.Messages); - var message = response.Messages[0]; - Assert.Equal(ChatRole.Assistant, message.Role); - // Message should contain: FunctionCallContent, FunctionResultContent, and TextContent - Assert.Single(message.Contents.OfType()); - Assert.Single(message.Contents.OfType()); - var textContent = Assert.Single(message.Contents.OfType()); + // With the MessageID fix, function calls now have their own MessageId ("fc_001") and + // the text message has a different MessageId ("msg_001"), resulting in 2 separate messages. + Assert.Equal(2, response.Messages.Count); + + // First message contains the function call and result items (MessageId="fc_001") + var functionMessage = response.Messages[0]; + Assert.Equal(ChatRole.Assistant, functionMessage.Role); + Assert.Equal("fc_001", functionMessage.MessageId); + Assert.Single(functionMessage.Contents.OfType()); + Assert.Single(functionMessage.Contents.OfType()); + + // Second message contains the text response (MessageId="msg_001") + var textMessage = response.Messages[1]; + Assert.Equal(ChatRole.Assistant, textMessage.Role); + Assert.Equal("msg_001", textMessage.MessageId); + var textContent = Assert.Single(textMessage.Contents.OfType()); Assert.Equal("It's 25°C and sunny in Paris.", textContent.Text); // Verify usage From d1710ca96c1826c5bf3d1d2efad6a03ea43c8d15 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Tue, 5 May 2026 22:23:43 +0000 Subject: [PATCH 4/6] Revert global.json SDK version change Agent-Logs-Url: https://github.com/dotnet/extensions/sessions/0a304a10-6f3a-4b97-9bb7-3d05731b62a4 Co-authored-by: ericstj <8918108+ericstj@users.noreply.github.com> --- global.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/global.json b/global.json index 07822004f17..1c56673c1ec 100644 --- a/global.json +++ b/global.json @@ -1,9 +1,9 @@ { "sdk": { - "version": "10.0.201" + "version": "10.0.106" }, "tools": { - "dotnet": "10.0.201", + "dotnet": "10.0.106", "runtimes": { "dotnet": [ "8.0.0", From 0cd6104d1a0672626909c76addb54c9624905331 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Thu, 7 May 2026 16:16:58 +0000 Subject: [PATCH 5/6] Update OpenAI package to 2.10.0-alpha.702 Agent-Logs-Url: https://github.com/dotnet/extensions/sessions/a78bbb1c-4d5e-4a70-b048-4956fcf1b3f9 Co-authored-by: ericstj <8918108+ericstj@users.noreply.github.com> --- eng/packages/General.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/packages/General.props b/eng/packages/General.props index d8d453ee6f1..253dff6bc0c 100644 --- a/eng/packages/General.props +++ b/eng/packages/General.props @@ -17,7 +17,7 @@ - + From 30ed7091e50a5e486b764e49edfb5171fe6ed641 Mon Sep 17 00:00:00 2001 From: "copilot-swe-agent[bot]" <198982749+Copilot@users.noreply.github.com> Date: Fri, 8 May 2026 16:11:43 +0000 Subject: [PATCH 6/6] Update OpenAI package to 2.10.0-alpha.703 Agent-Logs-Url: https://github.com/dotnet/extensions/sessions/de494f88-9828-450f-bee0-69af9cc2d89b Co-authored-by: ericstj <8918108+ericstj@users.noreply.github.com> --- eng/packages/General.props | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/eng/packages/General.props b/eng/packages/General.props index 253dff6bc0c..28206e5652b 100644 --- a/eng/packages/General.props +++ b/eng/packages/General.props @@ -17,7 +17,7 @@ - +