diff --git a/dotnet/src/Agents/OpenAI/Extensions/ChatContentMessageExtensions.cs b/dotnet/src/Agents/OpenAI/Extensions/ChatContentMessageExtensions.cs index c627d9517c81..e1b61e64b7f9 100644 --- a/dotnet/src/Agents/OpenAI/Extensions/ChatContentMessageExtensions.cs +++ b/dotnet/src/Agents/OpenAI/Extensions/ChatContentMessageExtensions.cs @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using Microsoft.SemanticKernel.Agents.OpenAI.Internal; +using Microsoft.SemanticKernel.ChatCompletion; using OpenAI.Assistants; using OpenAI.Responses; @@ -44,7 +45,7 @@ public static IEnumerable ToThreadInitializationMes public static ResponseItem ToResponseItem(this ChatMessageContent message) { var items = message.Items; - IEnumerable contentParts = items.Select(item => item.ToResponseContentPart()); + IEnumerable contentParts = items.Select(item => item.ToResponseContentPart(message.Role)); return message.Role.Label.ToUpperInvariant() switch { "SYSTEM" => ResponseItem.CreateSystemMessageItem(contentParts), diff --git a/dotnet/src/Agents/OpenAI/Extensions/KernelContentExtensions.cs b/dotnet/src/Agents/OpenAI/Extensions/KernelContentExtensions.cs index 59f11f0f68cd..590d21a87523 100644 --- a/dotnet/src/Agents/OpenAI/Extensions/KernelContentExtensions.cs +++ b/dotnet/src/Agents/OpenAI/Extensions/KernelContentExtensions.cs @@ -1,6 +1,7 @@ // Copyright (c) Microsoft. All rights reserved. using System; +using Microsoft.SemanticKernel.ChatCompletion; using OpenAI.Responses; namespace Microsoft.SemanticKernel.Agents.OpenAI; @@ -10,11 +11,11 @@ namespace Microsoft.SemanticKernel.Agents.OpenAI; /// internal static class KernelContentExtensions { - internal static ResponseContentPart ToResponseContentPart(this KernelContent content) + internal static ResponseContentPart ToResponseContentPart(this KernelContent content, AuthorRole? role = null) { return content switch { - TextContent textContent => textContent.ToResponseContentPart(), + TextContent textContent => textContent.ToResponseContentPart(role), ImageContent imageContent => imageContent.ToResponseContentPart(), BinaryContent binaryContent => binaryContent.ToResponseContentPart(), FileReferenceContent fileReferenceContent => fileReferenceContent.ToResponseContentPart(), @@ -22,8 +23,12 @@ internal static ResponseContentPart ToResponseContentPart(this KernelContent con }; } - internal static ResponseContentPart ToResponseContentPart(this TextContent content) + internal static ResponseContentPart ToResponseContentPart(this TextContent content, AuthorRole? role = null) { + if (role is not null && role == AuthorRole.Assistant) + { + return ResponseContentPart.CreateOutputTextPart(content.Text, []); + } return ResponseContentPart.CreateInputTextPart(content.Text); } diff --git a/dotnet/src/Agents/UnitTests/OpenAI/Extensions/ChatContentMessageExtensionsTests.cs b/dotnet/src/Agents/UnitTests/OpenAI/Extensions/ChatContentMessageExtensionsTests.cs index 62c87daad7ed..e9d26a2daa02 100644 --- a/dotnet/src/Agents/UnitTests/OpenAI/Extensions/ChatContentMessageExtensionsTests.cs +++ b/dotnet/src/Agents/UnitTests/OpenAI/Extensions/ChatContentMessageExtensionsTests.cs @@ -44,10 +44,14 @@ public void VerifyToResponseItemWithUserChatMessageContent(string roleLabel) Assert.Equal(role.Label.ToUpperInvariant(), messageResponseItem.Role.ToString().ToUpperInvariant()); Assert.Equal(4, messageResponseItem.Content.Count); - // Validate TextContent conversion - should create InputText part - var textContent = messageResponseItem.Content.FirstOrDefault(p => p.Kind == ResponseContentPartKind.InputText); + // Determine expected kind for text content based on role + var expectedTextKind = roleLabel.Equals("assistant", StringComparison.OrdinalIgnoreCase) + ? ResponseContentPartKind.OutputText + : ResponseContentPartKind.InputText; + + // Validate TextContent conversion - should create appropriate Input/OutputText part + var textContent = messageResponseItem.Content.FirstOrDefault(p => p.Kind == expectedTextKind); Assert.NotNull(textContent); - //Assert.IsType<>(textContent); Assert.Equal("What is in this image?", textContent.Text); // Validate ImageContent conversion - should create InputImage part