// 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;
}
}
}
}