// Copyright (c) Microsoft. All rights reserved. using System.Collections.Generic; using System.Threading.Tasks; using Microsoft.Agents.Core.Models; using Microsoft.Extensions.AI; using Microsoft.Extensions.Logging; namespace Microsoft.Agents.AI.CopilotStudio; /// /// Contains code to process responses from the Copilot Studio agent and convert them to objects. /// internal static class ActivityProcessor { public static async IAsyncEnumerable ProcessActivityAsync(IAsyncEnumerable activities, bool streaming, ILogger logger) { await foreach (IActivity activity in activities.ConfigureAwait(false)) { // TODO: Prototype a custom AIContent type for CardActions, where the user is instructed to // pick from a list of actions. // The activity text doesn't make sense without the actions, as the message // is often instructing the user to pick from the provided list of actions. if (!string.IsNullOrWhiteSpace(activity.Text)) { if ((activity.Type == "message" && !streaming) || (activity.Type == "typing" && streaming)) { yield return CreateChatMessageFromActivity(activity, [new TextContent(activity.Text)]); } else { logger.LogWarning("Unknown activity type '{ActivityType}' received.", activity.Type); } } } } private static ChatMessage CreateChatMessageFromActivity(IActivity activity, IEnumerable messageContent) => new(ChatRole.Assistant, [.. messageContent]) { AuthorName = activity.From?.Name, MessageId = activity.Id, RawRepresentation = activity }; }