// Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.AI; namespace Microsoft.Agents.AI.Workflows; internal static class AIAgentsAbstractionsExtensions { public static ChatMessage ToChatMessage(this AgentResponseUpdate update) => new() { AuthorName = update.AuthorName, Contents = update.Contents, Role = update.Role ?? ChatRole.User, CreatedAt = update.CreatedAt, MessageId = update.MessageId, RawRepresentation = update.RawRepresentation ?? update, }; public static ChatMessage ChatAssistantToUserIfNotFromNamed(this ChatMessage message, string agentName) => message.ChatAssistantToUserIfNotFromNamed(agentName, out _, false); private static ChatMessage ChatAssistantToUserIfNotFromNamed(this ChatMessage message, string agentName, out bool changed, bool inplace = true) { changed = false; if (message.Role == ChatRole.Assistant && !StringComparer.Ordinal.Equals(message.AuthorName, agentName) && message.Contents.All(c => c is TextContent or DataContent or UriContent or UsageContent)) { if (!inplace) { message = message.Clone(); } message.Role = ChatRole.User; changed = true; } return message; } /// /// Iterates through looking for messages and swapping /// any that have a different from to /// . /// public static List? ChangeAssistantToUserForOtherParticipants(this List messages, string targetAgentName) { List? roleChanged = null; foreach (var m in messages) { m.ChatAssistantToUserIfNotFromNamed(targetAgentName, out bool changed); if (changed) { (roleChanged ??= []).Add(m); } } return roleChanged; } /// /// Undoes changes made by when passed the list of changes /// made by that method. /// public static void ResetUserToAssistantForChangedRoles(this List? roleChanged) { if (roleChanged is not null) { foreach (var m in roleChanged) { m.Role = ChatRole.Assistant; } } } }