.NET 11 RC1 の Blazor にエージェント型 UI コンポーネントが登場: ChatPage、UIAgent、ツール承認
Microsoft.AspNetCore.Components.AI は .NET 11 RC1 の実験的な Blazor パッケージです。任意の IChatClient を、ツール承認、型付きツール表示、AG-UI 経由の共有状態を備えたストリーミングチャット UI に変換します。
2026年9月28日、Daniel Roth 氏が Build Agentic UI with the new Blazor AI components を公開しました。Microsoft.AspNetCore.Components.AI を本格的に解説した最初の記事です。このパッケージは .NET 11 RC1 でひっそりと出荷され、実験的扱いです。.NET 11 のサイクル全体を通してプレリリースのままです。提供されるのは、エージェントのフロントエンドを作るチームが毎回手作業で書き直してきた部分です。ストリーミングメッセージの表示、ツール呼び出しの表示、人間による承認ゲート、そしてエージェントが編集できる状態です。
IChatClient から動作するチャットページまで
すべては UIAgent を中心に構成されています。UIAgent は任意の Microsoft.Extensions.AI の IChatClient をラップし、ChatResponseUpdate ストリームを消費して、Razor コンポーネントが表示する監視可能な ContentBlock インスタンスに変換します。最短の手順は ChatPage です。メッセージ一覧、入力欄、ストリーミング状態、再試行を備えた完成済みのシェルです。
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);
}
}
シェルでは足りなくなったら、ChatPage を AgentBoundary、MessageList、MessageInput、BlockRenderer<TBlock> に分解できます。会話のレイアウトを自分で組み、ブロックの種類ごとに Razor のコンテンツを選べます。
承認フローと型付きツール表示
私が最も注目しているのは承認フローです。影響の大きいツールを ApprovalRequiredAIFunction で包むと、エージェントは FunctionApprovalBlock で一時停止し、ユーザーが判断するまで待ちます。
<BlockRenderer TBlock="FunctionApprovalBlock" Context="block">
@if (block.Status == ApprovalStatus.Pending)
{
<button @onclick="block.Approve">Approve</button>
<button @onclick="() => block.Reject()">Reject</button>
}
</BlockRenderer>
バックエンドのツールでは、ソースジェネレーターで生成されるブロックで呼び出しの表示方法を宣言し、options.AddGeneratedToolBlocks() で登録します。
[ToolBlock("get_weather")]
public partial class WeatherToolBlock : FunctionInvocationContentBlock
{
[ToolParameter(Name = "location")]
public string? Location { get; set; }
[ToolResult]
public WeatherInfo? Weather { get; set; }
}
フロントエンドのツールは、ChatOptions.Tools に追加する単純な AIFunctionFactory.Create のデリゲートです。これにより、モデルがコンポーネントを呼び戻せます (サンプルでは InvokeAsync を通じてページのアクセントカラーを設定しています)。
共有状態と AG-UI
UIAgent<TState> は、エージェントとユーザーが一緒に編集する、厳密に型付けされた状態オブジェクトを追加します。UIAgentOptions の StateMapper が受信した状態を適用します。予測状態 (predictive state) を使うと、エージェントが変更を仮に用意し、UI 側が AcceptPredictiveState() で確定するか、RejectPredictiveState() で破棄できます。
状態は AG-UI を介して送られます。STATE_SNAPSHOT は状態を置き換え、STATE_DELTA は RFC 6902 JSON Patch で更新し、REASONING_* イベントは折りたたみ可能な推論パネルとして表示されます。UI をリモートのエージェントに向けるには、モデルクライアントの代わりに AGUIChatClient を UIAgent に渡します。
HttpClient http = httpClientFactory.CreateClient("agentserver");
IChatClient client = new AGUIChatClient(new AGUIChatClientOptions(http, endpoint));
サーバー側は AddAGUIServer() と MapAGUIServer("/agentic_chat", agent) です。Microsoft.Agents.AI.Hosting.AGUI.AspNetCore か AGUI.Server のどちらでも使えます。後者は、私が AG-UI .NET SDK 1.0 で取り上げたスタンドアロンのパッケージです。
もう使うべきか
.NET 11 RC1 SDK が必要で、API は明示的にフィードバックを募集している段階なので、GA までに名前が変わることを想定してください。新しい社内向けエージェントツールであれば、IChatClient から承認ゲート付きの UI までの最短経路としてすでに有力です。シナリオの全体は AgenticUI サンプルリポジトリ にあります。
Comments
Sign in with GitHub to comment. Reactions and replies thread back to the comments repo.