Start Debugging

Blazor ganha componentes de UI agêntica no .NET 11 RC1: ChatPage, UIAgent e aprovações de ferramentas

Microsoft.AspNetCore.Components.AI é um pacote experimental do Blazor no .NET 11 RC1 que transforma qualquer IChatClient em uma UI de chat com streaming, aprovações de ferramentas, renderização tipada de ferramentas e estado compartilhado via AG-UI.

Em 2026-09-28, Daniel Roth publicou Build Agentic UI with the new Blazor AI components, o primeiro tutorial de verdade sobre Microsoft.AspNetCore.Components.AI. O pacote chegou discretamente com o .NET 11 RC1 e está marcado como experimental: ele continua em versão prévia durante todo o ciclo do .NET 11. O que ele entrega é a parte que toda equipe que constrói um frontend de agente vem reescrevendo à mão: renderização de mensagens em streaming, exibição de chamadas de ferramentas, etapas de aprovação humana e estado que o agente pode editar.

Do IChatClient a uma página de chat funcional

Tudo gira em torno de UIAgent, que envolve qualquer IChatClient do Microsoft.Extensions.AI, consome o stream de ChatResponseUpdate e o mapeia para instâncias observáveis de ContentBlock que os componentes Razor renderizam. O caminho mais rápido é o ChatPage, um shell completo com lista de mensagens, entrada de texto, status de streaming e nova tentativa:

dotnet add package Microsoft.AspNetCore.Components.AI --prerelease
<link rel="stylesheet" href="@Assets["_content/Microsoft.AspNetCore.Components.AI/ai-chat.css"]" />

<ChatPage Agent="_agent" Placeholder="Type a message...">
    <WelcomeContent>
        <p>Ask the agent a question.</p>
    </WelcomeContent>
</ChatPage>

@code {
    private UIAgent _agent = default!;

    protected override void OnInitialized()
    {
        IChatClient chatClient = GetChatClient();
        _agent = new UIAgent(chatClient);
    }
}

Quando o shell não for mais suficiente, o ChatPage se decompõe em AgentBoundary, MessageList, MessageInput e BlockRenderer<TBlock>, para que você monte o layout da conversa por conta própria e escolha o conteúdo Razor de cada tipo de bloco.

Aprovações e renderização tipada de ferramentas

A parte que mais me interessa é o fluxo de aprovação. Envolva uma ferramenta de consequências importantes em ApprovalRequiredAIFunction e o agente pausa em um FunctionApprovalBlock até que o usuário decida:

<BlockRenderer TBlock="FunctionApprovalBlock" Context="block">
    @if (block.Status == ApprovalStatus.Pending)
    {
        <button @onclick="block.Approve">Approve</button>
        <button @onclick="() => block.Reject()">Reject</button>
    }
</BlockRenderer>

Para ferramentas de backend, você declara como uma chamada é renderizada com um bloco gerado por source generator e depois o registra com options.AddGeneratedToolBlocks():

[ToolBlock("get_weather")]
public partial class WeatherToolBlock : FunctionInvocationContentBlock
{
    [ToolParameter(Name = "location")]
    public string? Location { get; set; }

    [ToolResult]
    public WeatherInfo? Weather { get; set; }
}

As ferramentas de frontend são simples delegates AIFunctionFactory.Create adicionados a ChatOptions.Tools, de modo que o modelo pode chamar de volta o componente (o exemplo define a cor de destaque da página por meio de InvokeAsync).

Estado compartilhado e AG-UI

UIAgent<TState> adiciona um objeto de estado fortemente tipado que o agente e o usuário editam juntos. Um StateMapper em UIAgentOptions aplica o estado recebido, e o estado preditivo permite que o agente prepare uma alteração que a UI confirma com AcceptPredictiveState() ou descarta com RejectPredictiveState().

O estado trafega pelo AG-UI: STATE_SNAPSHOT o substitui, STATE_DELTA o altera com JSON Patch (RFC 6902), e os eventos REASONING_* aparecem como painéis de raciocínio recolhíveis. Para apontar a UI para um agente remoto, entregue ao UIAgent um AGUIChatClient em vez de um cliente de modelo:

HttpClient http = httpClientFactory.CreateClient("agentserver");
IChatClient client = new AGUIChatClient(new AGUIChatClientOptions(http, endpoint));

O lado do servidor é AddAGUIServer() mais MapAGUIServer("/agentic_chat", agent), tanto de Microsoft.Agents.AI.Hosting.AGUI.AspNetCore quanto de AGUI.Server, o pacote independente que abordei em AG-UI .NET SDK 1.0.

Vale usar agora?

Ele exige o SDK do .NET 11 RC1 e a API está explicitamente aberta a feedback, então espere renomeações antes do GA. Para uma nova ferramenta interna com agente, já é o caminho mais curto de um IChatClient até uma UI com aprovações. O conjunto completo de cenários está no repositório de exemplo AgenticUI.

Comments

Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.

< Voltar