diff --git a/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Services/OpenAIChatCompletionServiceTests.cs b/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Services/OpenAIChatCompletionServiceTests.cs index 397c9bb0e39d..385880b21322 100644 --- a/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Services/OpenAIChatCompletionServiceTests.cs +++ b/dotnet/src/Connectors/Connectors.OpenAI.UnitTests/Services/OpenAIChatCompletionServiceTests.cs @@ -916,6 +916,34 @@ public async Task FunctionResultsCanBeProvidedToLLMAsOneResultPerChatMessageAsyn Assert.Equal("2", assistantMessage2.GetProperty("tool_call_id").GetString()); } + [Fact] + public async Task FunctionResultsWithoutCallIdThrowsClearExceptionAsync() + { + // Arrange + this._messageHandlerStub.ResponseToReturn = new HttpResponseMessage(System.Net.HttpStatusCode.OK) + { + Content = new StringContent(ChatCompletionResponse) + }; + + var sut = new OpenAIChatCompletionService(modelId: "gpt-3.5-turbo", apiKey: "NOKEY", httpClient: this._httpClient); + + var chatHistory = new ChatHistory + { + new ChatMessageContent(AuthorRole.Tool, + [ + new FunctionResultContent(functionName: "GetCurrentWeather", pluginName: "MyPlugin", callId: null, result: "rainy") + ]) + }; + + var settings = new OpenAIPromptExecutionSettings() { ToolCallBehavior = ToolCallBehavior.EnableKernelFunctions }; + + // Act + var exception = await Assert.ThrowsAsync(() => sut.GetChatMessageContentAsync(chatHistory, settings)); + + // Assert + Assert.Contains("missing a tool call id", exception.Message, StringComparison.OrdinalIgnoreCase); + } + [Fact] public async Task FunctionResultsCanBeProvidedToLLMAsManyResultsInOneChatMessageAsync() { diff --git a/dotnet/src/Connectors/Connectors.OpenAI/Core/ClientCore.ChatCompletion.cs b/dotnet/src/Connectors/Connectors.OpenAI/Core/ClientCore.ChatCompletion.cs index 7f8dfa41a2d9..87fa8932e1c6 100644 --- a/dotnet/src/Connectors/Connectors.OpenAI/Core/ClientCore.ChatCompletion.cs +++ b/dotnet/src/Connectors/Connectors.OpenAI/Core/ClientCore.ChatCompletion.cs @@ -759,6 +759,13 @@ private static List CreateRequestMessages(ChatMessageContent messag continue; } + if (string.IsNullOrWhiteSpace(resultContent.CallId)) + { + throw new ArgumentException( + $"Function result message is missing a tool call ID. Provide {nameof(FunctionResultContent.CallId)} when sending tool results to OpenAI.", + nameof(message)); + } + toolMessages ??= []; if (resultContent.Result is Exception ex)