// Copyright (c) Microsoft. All rights reserved. using Microsoft.Extensions.AI; namespace Microsoft.AspNetCore.Components.AI; public partial class AgentInput : IComponent { private RenderHandle _renderHandle; private AgentBoundaryContext? _context; private string? _inputText; [CascadingParameter] public AgentBoundaryContext? AgentContext { get; set; } [Inject] private ILogger Logger { get; set; } = default!; [Parameter] public string Placeholder { get; set; } = "Type a message..."; public void Attach(RenderHandle renderHandle) { this._renderHandle = renderHandle; } public Task SetParametersAsync(ParameterView parameters) { parameters.SetParameterProperties(this); this._context = this.AgentContext; Log.AgentInputAttached(this.Logger); this.Render(); return Task.CompletedTask; } private void Render() { Log.AgentInputRendering(this.Logger); this._renderHandle.Render(builder => { builder.OpenElement(0, "div"); builder.AddAttribute(1, "class", "agent-input"); builder.OpenElement(2, "textarea"); builder.AddAttribute(3, "value", this._inputText); builder.AddAttribute(4, "oninput", EventCallback.Factory.Create(this, e => { this._inputText = e.Value?.ToString(); this.Render(); })); builder.AddAttribute(5, "placeholder", this.Placeholder); builder.AddAttribute(6, "rows", "1"); builder.CloseElement(); builder.OpenElement(7, "button"); builder.AddAttribute(8, "class", "send-button"); builder.AddAttribute(9, "onclick", EventCallback.Factory.Create(this, this.SendAsync)); builder.AddAttribute(10, "disabled", string.IsNullOrWhiteSpace(this._inputText)); builder.AddMarkupContent(11, """"""); builder.CloseElement(); // close button builder.CloseElement(); // close div }); } private async Task SendAsync() { if (!string.IsNullOrWhiteSpace(this._inputText) && this._context != null) { var text = this._inputText; Log.AgentInputSendingMessage(this.Logger, text.Length); this._inputText = ""; // Clear input immediately this.Render(); // Re-render to clear input await this._context.SendAsync(new ChatMessage(ChatRole.User, text)); Log.AgentInputMessageSent(this.Logger); } } private static partial class Log { [LoggerMessage(Level = LogLevel.Debug, Message = "AgentInput attached to render handle")] public static partial void AgentInputAttached(ILogger logger); [LoggerMessage(Level = LogLevel.Debug, Message = "AgentInput rendering")] public static partial void AgentInputRendering(ILogger logger); [LoggerMessage(Level = LogLevel.Debug, Message = "AgentInput sending message: {MessageLength} characters")] public static partial void AgentInputSendingMessage(ILogger logger, int messageLength); [LoggerMessage(Level = LogLevel.Debug, Message = "AgentInput message sent successfully")] public static partial void AgentInputMessageSent(ILogger logger); } }