<#@ template language="C#" inherits="ActionTemplate" visibility="internal" linePragmas="false" #> <#@ output extension=".cs" #> <#@ assembly name="System.Core" #> <#@ import namespace="Microsoft.Agents.AI.Workflows.Declarative.Extensions" #> <#@ import namespace="Microsoft.Agents.ObjectModel" #> <#@ include file="Snippets/AssignVariableTemplate.tt" once="true" #> <#@ include file="Snippets/EvaluateRecordExpressionTemplate.tt" once="true" #> <#@ include file="Snippets/EvaluateStringExpressionTemplate.tt" once="true" #> <#@ include file="Snippets/FormatMessageTemplate.tt" once="true" #> /// /// Adds a new message to the specified agent conversation /// internal sealed class <#= this.Name #>Executor(FormulaSession session, ResponseAgentProvider agentProvider) : ActionExecutor(id: "<#= this.Id #>", session) { // protected override async ValueTask ExecuteAsync(IWorkflowContext context, CancellationToken cancellationToken) {<# EvaluateStringExpression(this.Model.ConversationId, "conversationId", isNullable: true); #> if (string.IsNullOrWhiteSpace(conversationId)) { throw new DeclarativeActionException($"Conversation identifier must be defined: {this.Id}"); } ChatMessage newMessage = new(ChatRole.<#= FormatEnum(this.Model.Role, RoleMap) #>, await this.GetContentAsync(context).ConfigureAwait(false)) { AdditionalProperties = this.GetMetadata() }; newMessage = await agentProvider.CreateMessageAsync(conversationId, newMessage, cancellationToken).ConfigureAwait(false);<# AssignVariable(this.Message, "newMessage"); #> return default; } private async ValueTask> GetContentAsync(IWorkflowContext context) { List content = []; <# int index = 0; foreach (AddConversationMessageContent content in this.Model.Content) { ++index; EvaluateMessageTemplate(content.Value, $"contentValue{index}"); AgentMessageContentType contentType = content.Type.Value; if (contentType == AgentMessageContentType.ImageUrl) {#> content.Add(UriContent(contentValue<#= index #>, "image/*"));<# } else if (contentType == AgentMessageContentType.ImageFile) {#> content.Add(new HostedFileContent(contentValue<#= index #>));<# } else {#> content.Add(new TextContent(contentValue<#= index #>));<# } }#> return content; } private AdditionalPropertiesDictionary? GetMetadata() {<# EvaluateRecordExpression(this.Model.Metadata, "metadata"); #> if (metadata is null) { return null; } return new AdditionalPropertiesDictionary(metadata); } }