// Copyright (c) Microsoft. All rights reserved. using System; using System.Collections.Generic; using System.Linq; using Microsoft.Extensions.AI; namespace Microsoft.Agents.AI.Workflows.UnitTests; internal static class TextMessageStreamingExtensions { public static IEnumerable ToContentStream(this string? message) { if (string.IsNullOrEmpty(message)) { return []; } string[] splits = message.Split(' '); for (int i = 0; i < splits.Length - 1; i++) { splits[i] += " "; } return splits.Select(text => (AIContent)new TextContent(text) { RawRepresentation = text }); } public static AgentResponseUpdate ToResponseUpdate(this AIContent content, string? messageId = null, DateTimeOffset? createdAt = null, string? responseId = null, string? agentId = null, string? authorName = null) => new() { Role = ChatRole.Assistant, CreatedAt = createdAt ?? DateTimeOffset.UtcNow, MessageId = messageId ?? Guid.NewGuid().ToString("N"), ResponseId = responseId, AgentId = agentId, AuthorName = authorName, Contents = [content], }; public static IEnumerable ToAgentRunStream(this string message, DateTimeOffset? createdAt = null, string? messageId = null, string? responseId = null, string? agentId = null, string? authorName = null) { messageId ??= Guid.NewGuid().ToString("N"); IEnumerable contents = message.ToContentStream(); return contents.Select(content => content.ToResponseUpdate(messageId, createdAt, responseId, agentId, authorName)); } public static ChatMessage ToChatMessage(this IEnumerable contents, string? messageId = null, DateTimeOffset? createdAt = null, string? responseId = null, string? agentId = null, string? authorName = null, string? rawRepresentation = null) => new(ChatRole.Assistant, contents is List contentsList ? contentsList : contents.ToList()) { AuthorName = authorName, CreatedAt = createdAt ?? DateTimeOffset.UtcNow, MessageId = messageId ?? Guid.NewGuid().ToString("N"), RawRepresentation = rawRepresentation, }; public static IEnumerable StreamMessage(this ChatMessage message, string? responseId = null, string? agentId = null) { responseId ??= Guid.NewGuid().ToString("N"); string messageId = message.MessageId ?? Guid.NewGuid().ToString("N"); return message.Contents.Select(content => content.ToResponseUpdate(messageId, message.CreatedAt, responseId: responseId, agentId: agentId, authorName: message.AuthorName)); } public static IEnumerable StreamMessages(this List messages, string? agentId = null) => messages.SelectMany(message => message.StreamMessage(agentId)); public static List ToChatMessages(this IEnumerable messages, string? authorName = null) { List result = messages.Select(ToMessage).ToList(); ChatMessage ToMessage(string text) { return new(ChatRole.Assistant, text.ToContentStream().ToList()) { AuthorName = authorName, MessageId = Guid.NewGuid().ToString("N"), RawRepresentation = text, CreatedAt = DateTimeOffset.UtcNow, }; } return result; } }