MentorAgent.Blazor 1.0.0-preview.3

This is a prerelease version of MentorAgent.Blazor.
dotnet add package MentorAgent.Blazor --version 1.0.0-preview.3
                    
NuGet\Install-Package MentorAgent.Blazor -Version 1.0.0-preview.3
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="MentorAgent.Blazor" Version="1.0.0-preview.3" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="MentorAgent.Blazor" Version="1.0.0-preview.3" />
                    
Directory.Packages.props
<PackageReference Include="MentorAgent.Blazor" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add MentorAgent.Blazor --version 1.0.0-preview.3
                    
#r "nuget: MentorAgent.Blazor, 1.0.0-preview.3"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package MentorAgent.Blazor@1.0.0-preview.3
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=MentorAgent.Blazor&version=1.0.0-preview.3&prerelease
                    
Install as a Cake Addin
#tool nuget:?package=MentorAgent.Blazor&version=1.0.0-preview.3&prerelease
                    
Install as a Cake Tool

MentorAgent.Blazor

Preview Release β€” MentorAgent is currently in public preview. APIs may change before the stable release.

Blazor WebAssembly client for MentorAgent. Install this in your Blazor WASM / Blazor Auto client project.

Connects to a MentorAgent.Server hub via SignalR and provides the same <ChatWidget /> experience as Blazor Server β€” same features, same API, no code changes needed when switching between render modes.

All AI processing happens server-side β€” configured in your server project with AddMentorAgent(). The client sends messages, registers page context and UI actions, and receives streaming events.

What MentorAgent can do

All features below are available. Configure them server-side in AddMentorAgent().

Feature Description
πŸ€– Multi-agent orchestration Coordinator + specialized agents via Handoff Workflow
πŸ‘₯ Group Chat teams Multiple agents collaborate before acting
πŸ› οΈ Tool discovery C# methods become AI tools via [Description] or [MentorAction]
🎯 UI Actions AI invokes page-level actions (highlight rows, open modals, pre-fill forms) as individually named tools with typed parameters and async support
πŸ“– Agent Skills Domain knowledge loaded on demand (load_skill) β€” progressive disclosure
🧠 Contextual memory Remembers user preferences across sessions
πŸ—ΊοΈ Page navigation AI navigates to pages decorated with [MentorPage]
πŸ“š RAG Inject relevant documents from any vector DB into every AI response
πŸ”Œ MCP Client Consume external MCP servers as additional tools
πŸ–₯️ MCP Server Expose [MentorAction] methods to Claude Desktop, VS Code, Cursor
🌐 A2A Consumer Connect to remote A2A agents in the Handoff workflow
πŸ“‘ A2A Server Expose as a federatable A2A agent
🎨 Customizable widget Themes, colors, position, avatar, bot name
🌍 Multi-language 10 languages for AI responses and widget UI
🎀 Voice input/output Browser Speech Recognition + Speech Synthesis
πŸ”’ Safety check AI-based prompt injection detection
⏱️ Rate limiting Per-user message limit
βœ… Confirmation dialogs Destructive actions ask for approval (HITL)
πŸ” Role-based actions Actions restricted by ASP.NET Core identity roles
πŸ’Έ Token & cost optimization Slim cache-friendly prompt, semantic tool filtering, history compaction, RAG/memory gating

Package Family

Package Install when
MentorAgent Blazor Server app
MentorAgent.Server Server project (Web API / Blazor Auto server)
MentorAgent.Blazor ← you are here Blazor WASM / Blazor Auto client project

Getting started

Installation

# Client project
dotnet add package MentorAgent.Blazor --prerelease

# Server project β€” MentorAgent is included automatically as a transitive dependency
dotnet add package MentorAgent.Server --prerelease

Server project setup

All AI behaviour is configured on the server (the transitive MentorAgent core): agents, RAG, memory, skills, MCP/A2A and the token/cost optimizations below. The client only renders the widget.

// Server/Program.cs
builder.Services.AddMentorAgent(options =>
{
    options.AppName        = "My App";
    options.AppDescription = "An order management application";
    options.ChatClient     = chatClient;
    options.ScanAssemblies = [typeof(Program).Assembly];

    // All features configured here: agents, RAG, MCP, A2A, memory, skills...
    options.UseMemoryContext = true;
    options.UseRag           = true;
    options.McpServerEnabled = true;
    options.A2AServerEnabled = true;
    options.EnableSkills     = true;
    options.RateLimitPerUser = 20;
});
builder.Services.AddMentorAgentServer();

app.MapMentorAgentServer();   // /mentor-hub + /mentor/chat
app.MapMentorAgentMcp();      // optional
app.MapMentorAgentA2A();      // optional
Token & cost optimization + reliable memory (server project)

These options cut the tokens sent per request and make memory reliable β€” all on the server. Full details: MentorAgent core README β†’ Token & cost optimization.

builder.Services.AddMentorAgent(options =>
{
    // ...ChatClient, ScanAssemblies as above...

    // Embedding model β€” powers semantic tool filtering AND semantic memory relevance.
    options.EmbeddingGenerator = new AzureOpenAIClient(endpoint, credential)
        .GetEmbeddingClient("text-embedding-3-small").AsIEmbeddingGenerator();

    // Send only the tools semantically relevant to the message (requires EmbeddingGenerator).
    options.EnableToolFiltering = true;
    options.ToolFilterMinScore  = 0.35f;

    // Compact long conversation history before each call.
    options.EnableCompaction         = true;
    options.CompactionTokenThreshold = 4000;

    // Memory: reliable post-turn fact capture (default true) + inject only relevant memories.
    options.UseMemoryContext         = true;
    options.MemoryAutoCapture        = true;   // default β€” reliable writer on Path A
    options.MemoryRelevanceFiltering = true;   // requires EmbeddingGenerator
});
Robustness, observability & cost dashboard (server project)

Also configured on the server β€” see the MentorAgent core README for full details.

builder.Services.AddMentorAgent(options =>
{
    // #7 middleware hooks
    options.OnException = ex => ex.Message.Contains("rate", StringComparison.OrdinalIgnoreCase)
        ? "The service is busy, please retry shortly." : null;
    options.ConfigureChatClientPipeline = b => b.UseLogging();

    // #8 observability (add an OpenTelemetry exporter to the app as usual)
    options.EnableObservability = true;

    // #9 dashboard cost pricing (supply your own; none built in)
    options.ModelPricing = new Dictionary<string, ModelPrice>(StringComparer.OrdinalIgnoreCase)
    {
        ["gpt-4o"] = new ModelPrice(2.50m, 10.00m), ["gpt-4o-mini"] = new ModelPrice(0.15m, 0.60m),
    };
});

The admin dashboard ships as a Blazor component. Drop it on a protected page (you own the authorization). On Blazor Server / Auto it reads IMentorMetrics in-process; on standalone WASM, fetch GET /mentor/admin/metrics from the server and pass the snapshot:

@* Blazor Server / Auto β€” in-process (the component reads IMentorMetrics itself) *@
@attribute [Authorize(Roles = "Admin")]
@using MentorAgent.Abstractions.Components
<MentorDashboard Currency="$" />
@* Standalone WASM β€” fetch the snapshot from the server and pass it in *@
@attribute [Authorize(Roles = "Admin")]
@using System.Net.Http.Json
@using MentorAgent.Abstractions.Components
@using MentorAgent.Abstractions.Models
@inject HttpClient Http

<MentorDashboard Snapshot="_snapshot" OnRefresh="LoadAsync" Currency="$" />

@code {
    private MentorMetricsSnapshot? _snapshot;
    protected override Task OnInitializedAsync() => LoadAsync();

    // HttpClient must target the server; the endpoint is gated by options.DashboardRole.
    private async Task LoadAsync() =>
        _snapshot = await Http.GetFromJsonAsync<MentorMetricsSnapshot>("mentor/admin/metrics");
}

Also configured/available on the server (see the core README for full examples):

  • Rich responses β€” with options.EnableRichResponses (server, default on) the assistant formats structured data as Markdown; this widget renders the tables & lists automatically β€” no client wiring, XSS-safe, tables scroll horizontally on narrow screens.
  • Model routing (options.StrongChatClient + options.RoutingStrategy: Semantic/Classifier/Cascade/Custom) β€” cheap↔strong per turn.
  • Structured outputs β€” inject IMentorStructured (GenerateAsync<T>) for typed results / auto-filled forms.
  • Evaluation β€” inject MentorEvaluator (wraps the Agent Framework's native agent.EvaluateAsync) in tests to gate CI on token/quality regressions; plug FoundryEvals/MEAI evaluators for quality & safety.

Client project setup

// Client/Program.cs
using MentorAgent.Blazor.Extensions;

builder.Services.AddMentorAgentBlazor(options =>
{
    options.HubUrl       = "/mentor-hub";    // URL of MentorAgent.Server hub
    options.BotName      = "My Assistant";
    options.Language     = MentorLanguage.English;
    options.Theme        = MentorTheme.Default;
    options.PrimaryColor = "#2563eb";
});

⚠️ HubUrl β€” relative vs absolute.

  • Same origin (Blazor Auto hosted, or WASM served by the same ASP.NET Core host): use a relative path β€” options.HubUrl = "/mentor-hub".
  • Different origin (standalone WASM on :5001 connecting to a server on :5169): use the server's absolute URL β€” options.HubUrl = "http://localhost:5169/mentor-hub" β€” and configure CORS on the server (see the MentorAgent.Server README β†’ CORS). Without server-side CORS the SignalR handshake is silently blocked by the browser.
// Standalone WASM example β€” different origin
builder.Services.AddMentorAgentBlazor(options =>
{
    options.HubUrl = "http://localhost:5169/mentor-hub";   // absolute β€” server on a different port
    options.BotName = "My Assistant";
});

Add the widget

In MainLayout.razor or any page:

@using MentorAgent.Abstractions.Components

<ChatWidget />

Important β€” Blazor WASM requires manual CSS/JS links in index.html.

Unlike Blazor Server (where the widget injects CSS automatically via <HeadContent>), Blazor WASM uses a static index.html that is served before the .NET runtime starts. Add these two lines to your wwwroot/index.html:

<head>
    ...
    <link href="_content/MentorAgent.Abstractions/css/MentorAgent.css" rel="stylesheet" />
</head>
<body>
    ...
    <script src="_content/MentorAgent.Abstractions/js/MentorAgent.js"></script>
</body>

Without this, the widget will render unstyled until after WASM initializes (flash of unstyled content).

On Blazor Server, <ChatWidget /> injects its own CSS and JS automatically β€” no changes to _Host.cshtml or App.razor needed.


Widget customization

Theme and appearance

options.Theme        = MentorTheme.Minimal;   // Default | Dark | Minimal | Custom
options.PrimaryColor = "#7c3aed";             // any hex color
options.Position     = ChatPosition.BottomRight; // BottomRight | BottomLeft | TopRight | TopLeft | SideRight | SideLeft
options.AvatarUrl    = "/my-avatar.png";
options.BotName      = "ShopFlow Assistant";

Welcome message and input

options.WelcomeMessage    = "Hello! How can I help you today?";
options.InputPlaceholder  = "Ask anything...";
options.EnableSuggestions = true;   // show suggestion chips in the welcome panel

Language (10 supported)

options.Language = MentorLanguage.Italian;
// English | Italian | French | German | Spanish | Portuguese | Dutch | Polish | Japanese | Chinese

Voice

options.EnableVoiceInput  = true;   // microphone button (browser Speech Recognition)
options.EnableVoiceOutput = true;   // text-to-speech for AI responses

RAG citations

options.ShowRagSources = true;   // show citation chips below AI responses

MCP and A2A status badges

When the server has MCP client servers or remote A2A agents configured, the widget can display live status badges in the header. Because the WASM client doesn't read the server configuration directly, you must mirror the relevant settings:

// Client Program.cs
builder.Services.AddMentorAgentBlazor(options =>
{
    // MCP badge β€” mirror McpServers names from the server
    options.ShowMcpStatus  = true;
    options.HasMcpServers  = true;
    options.McpServerNames = ["time", "filesystem"];  // must match server McpServers[].Name

    // A2A badge β€” mirror RemoteAgents from the server
    options.ShowA2AStatus       = true;
    options.HasRemoteAgents     = true;
    options.RemoteAgentDisplays = [
        new AgentDisplayInfo { Name = "ShopFlow-B", AgentCardUrl = "http://localhost:5001" }
    ];
});

The MCP badge updates dynamically β€” when a server connects or disconnects the hub fires McpServerStatusChanged and the badge turns green/red. The A2A badge is static (shows configured agents, no live status).

Note: McpServerNames must match the Name fields in MentorMcpServer[] configured on the server. A mismatch shows a stale "connecting" badge.


Page context and UI actions

IMentorPageContext works identically to Blazor Server. Register context data and UI actions in any page β€” they are sent to the server as a snapshot before each AI message.

Inject page context

@inject IMentorPageContext PageContext
@implements IDisposable

@code {
    protected override void OnInitialized()
    {
        PageContext
            .SetPageName("Orders")
            .Set("ActiveFilter", "Pending")
            .Set("VisibleRows", _orders.Count);
    }

    public void Dispose() => PageContext.Clear();
}

Register UI actions (no parameter)

PageContext.RegisterUIAction(
    "open_create_modal",
    "Opens the modal to create a new order",
    _ => OpenCreateModal());

Register UI actions with typed parameter

// The AI calls highlight_row(42) β€” parameter deserialized automatically
PageContext.RegisterUIAction<int>(
    "highlight_row",
    "Highlights the specified order row",
    id => HighlightRow(id),
    parameterHint: "integer: order ID");

Async UI actions

PageContext.RegisterUIActionAsync<OrderModel>(
    "prefill_form",
    "Pre-fills the edit form with order data",
    async model => {
        _formModel = model;
        await InvokeAsync(StateHasChanged);
    },
    parameterHint: "JSON: { orderId, amount, status }");

Remove an action

PageContext.UnregisterUIAction("highlight_row");

Signal page ready (for pages with async UI actions)

Use OnInitializedAsync β€” not OnAfterRenderAsync. Calling SignalReady() from OnAfterRenderAsync silently breaks all UI actions because the AI may have already timed out waiting for the signal.

protected override async Task OnInitializedAsync()
{
    await LoadDataAsync();
    PageContext.SignalReady();   // must be last β€” tells AI that UI actions are ready
}

⚠️ [MentorPage] attributes are defined in the server project (scanned by ScanAssemblies), not in the client project.

// Server project β€” scanned via options.ScanAssemblies
[MentorPage("/orders", Name = "Orders", Description = "Order management")]
public class OrdersPage { }

[MentorPage("/products", Name = "Products", HasUIActions = true, ReadyTimeout = 3000)]
public class ProductsPage { }

The AI calls navigate_to("/orders") β€” the WASM widget handles navigation automatically via Blazor's NavigationManager.


UI Action overloads reference

Four overloads are available, from simple to fully typed and async:

Overload Parameter Execution Use when
RegisterUIAction(name, desc, Action<object?>) Raw object? Synchronous Simple no-param or legacy code
RegisterUIAction<TParam>(name, desc, Action<TParam>) Auto-deserialized from JSON Synchronous Typed param, sync handler
RegisterUIActionAsync(name, desc, Func<object?, Task>) Raw object? Async No-param async actions (e.g. async _ => { await LoadAsync(); })
RegisterUIActionAsync<TParam>(name, desc, Func<TParam, Task>) Auto-deserialized from JSON Async Typed param, async handler (recommended)
UnregisterUIAction(name) β€” β€” Remove a specific action dynamically

Automatic parameterHint generation

For typed overloads, parameterHint is auto-generated from the type when omitted:

TParam Auto-generated hint
int, long "integer"
float, double, decimal "number"
bool "boolean"
string "string"
Guid "string (GUID)"
DateTime "string (ISO 8601 date)"
Status (enum) "string (Active\|Inactive\|Pending)"
List<int> "array<integer>"
OrderFormModel (class) "{ customerId: integer, productName: string, ... }"

Override only when extra clarity is needed:

.RegisterUIAction<int>(
    "highlight_row", "Highlights an order row",
    id => HighlightRow(id),
    parameterHint: "integer: order ID")  // ← manual override

Async handlers are awaited β€” the AI waits for completion before continuing. This makes multi-action chains reliable.


[MentorPage] parameters (server project)

Parameter Required Description
Url βœ… Page URL (e.g. "/orders")
Name βœ… Human-readable page name injected into the system prompt
Description β€” Optional feature description
HasUIActions β€” If true, AI waits for PageContext.SignalReady() before UI actions. Default: false
ReadyTimeout β€” Timeout in ms for SignalReady(). Default: 2000

All AddMentorAgentBlazor() options

Option Type Default Description
HubUrl string "/mentor-hub" URL of the MentorAgent.Server SignalR hub
BotName string "Mentor AI" Bot name in the widget header
WelcomeMessage string? null Welcome message (HTML supported)
AvatarUrl string? null Custom avatar URL
InputPlaceholder string? null Input box placeholder
Theme MentorTheme Default Widget visual theme
Position ChatPosition BottomRight Widget position on screen
PrimaryColor string? null Custom hex accent color
Language MentorLanguage English Language for widget UI strings (10 languages supported)
EnableVoiceInput bool false Show microphone button (browser Speech Recognition)
EnableVoiceOutput bool false Text-to-speech for AI responses (browser Speech Synthesis)
EnableSuggestions bool false Suggestion chips in the welcome panel
ShowRagSources bool false Citation chips below AI responses
ShowMcpStatus bool false Show MCP server connection status badge in the widget header
HasMcpServers bool false Whether the server has MCP client servers configured (enables the MCP badge)
McpServerNames List<string> [] Names of MCP servers configured on the server β€” pre-populates the badge in "connecting" state at startup
ShowA2AStatus bool false Show A2A remote agent status badge in the widget header
HasRemoteAgents bool false Whether the server has remote A2A agents configured (enables the A2A badge)
RemoteAgentDisplays List<AgentDisplayInfo> [] Remote A2A agents to display in the A2A badge and detail bar

How it works

[Blazor WASM Browser]
  ChatWidget
    ↓ IMentorOrchestrator (WasmMentorOrchestrator)
    ↓ SignalR
[ASP.NET Core Server β€” MentorAgent.Server]
  MentorHub
    ↓ MentorOrchestrator (full AI pipeline)
    ↓ AI Provider (Azure OpenAI, OpenAI, Ollama...)
    ↑ Streaming events (chunks, confirmations, navigation, UI actions...)
    ↑ SignalR
  ChatWidget renders response
  • Page context (page name, data, UI action descriptions) is sent to the server before every message via UpdatePageContext.
  • UI action invocations arrive from the server as UIActionRequested and are executed locally in the browser by WasmMentorStateService.
  • Confirmation dialogs (HITL) are shown by ConfirmationBanner. The response is sent via POST /mentor/approve?actionId=...&approved=true|false (HTTP) β€” not via a hub method. SignalR processes hub messages sequentially per connection, so calling RespondToApproval via hub while SendMessage is awaiting would deadlock. WasmMentorStateService handles this automatically.
  • Navigation triggered by the AI arrives as NavigationRequested and is handled by Blazor's NavigationManager.

Events β€” IMentorStateService

ChatWidget handles all events automatically. If you need to subscribe to events directly in your own components, inject IMentorStateService:

@inject IMentorStateService State
@implements IDisposable

protected override void OnInitialized()
{
    State.OnStreamingChunk        += OnChunk;
    State.OnStreamingCompleted    += OnCompleted;
    State.OnBusyChanged           += OnBusy;
    State.OnError                 += OnError;
    State.OnActionExecuting       += OnActionExecuting;
    State.OnActionCompleted       += OnActionCompleted;
    State.OnActionFailed          += OnActionFailed;
    State.OnConfirmationRequired  += OnConfirmationRequired;
    State.OnNavigationRequested   += OnNavigation;
    State.OnRagSourcesReady       += OnRagSources;
    State.OnTeamMemberSpeaking    += OnTeamSpeaking;
    State.OnUIActionExecuting     += OnUIActionStart;
    State.OnUIActionCompleted     += OnUIActionEnd;
}

public void Dispose()
{
    State.OnStreamingChunk        -= OnChunk;
    // ... unsubscribe all
}

Complete event reference

Event Signature Fired when Typical use
OnStreamingChunk Action<string> Each streaming token Append text to a custom chat bubble
OnStreamingCompleted Action Full response received Finalize message, re-enable input
OnBusyChanged Action<bool> AI starts/stops processing Show/hide spinner
OnError Action<string> Critical error (rate limit, safety block) Show error banner
OnActionExecuting Action<string> Tool/agent is executing Show action feedback bar
OnActionCompleted Action<string> Tool execution succeeded Hide feedback bar
OnActionFailed Action<string> Tool execution failed Show error in feedback
OnConfirmationRequired Action<ConfirmationRequest> Destructive action needs user approval Show custom confirmation dialog
OnApprovalResponse Action<ConfirmationRequest, bool> User confirmed/rejected Internal β€” used by orchestrator
OnNavigationRequested Action<string> AI triggered navigation Custom routing logic
OnRagSourcesReady Action<IReadOnlyList<MentorRagResult>> RAG documents retrieved Show custom citation UI
OnTeamMemberSpeaking Action<string, string> GroupChat member speaking Show "Team Β· Role" feedback
OnUIActionExecuting Action<string> UI action started Custom feedback
OnUIActionCompleted Action<string> UI action completed Custom feedback
OnMcpServerStatusChanged Action<string, bool> MCP server connects (true) or disconnects (false) Update the MCP status badge β€” forwarded over the hub as McpServerStatusChanged

All events fire on a background thread from the SignalR connection. Always use InvokeAsync(StateHasChanged) when updating Blazor component state from these handlers.

Custom HITL confirmation dialog

By default, ChatWidget renders a built-in ConfirmationBanner. If you want to replace it with your own modal or dialog, subscribe to OnConfirmationRequired and call ConfirmAsync / Cancel yourself:

@inject IMentorStateService State
@implements IDisposable

@if (_pendingConfirmation is not null)
{
    <div class="my-confirm-dialog">
        <p>@_pendingConfirmation.Message</p>
        <button @onclick="Approve">Conferma</button>
        <button @onclick="Reject">Annulla</button>
    </div>
}

@code {
    private ConfirmationRequest? _pendingConfirmation;

    protected override void OnInitialized()
    {
        State.OnConfirmationRequired += OnConfirmationRequired;
        State.OnApprovalResponse     += OnApprovalResponse;
    }

    private void OnConfirmationRequired(ConfirmationRequest req)
        => InvokeAsync(() => { _pendingConfirmation = req; StateHasChanged(); });

    private void OnApprovalResponse(ConfirmationRequest req, bool approved)
        => InvokeAsync(() => { _pendingConfirmation = null; StateHasChanged(); });

    private async Task Approve()
    {
        if (_pendingConfirmation is null) return;
        await State.ConfirmAsync(_pendingConfirmation.ActionId);
    }

    private void Reject()
    {
        if (_pendingConfirmation is null) return;
        State.Cancel(_pendingConfirmation.ActionId);
    }

    public void Dispose()
    {
        State.OnConfirmationRequired -= OnConfirmationRequired;
        State.OnApprovalResponse     -= OnApprovalResponse;
    }
}

ConfirmationRequest has three properties: ActionId (Guid), ToolName (string), and Message (string). Use ToolName to customize the dialog copy per action type if needed.


Blazor Auto tip

In a Blazor Auto app, you can keep <ChatWidget /> with @rendermode="InteractiveServer" β€” it stays server-side with no changes to your existing MentorAgent setup. Use MentorAgent.Blazor only when you need the widget to run fully in WebAssembly.

@* Keep server-side in Blazor Auto β€” zero changes needed *@
<ChatWidget @rendermode="InteractiveServer" />

Requirements

  • .NET 10.0+
  • Server project must have MentorAgent + MentorAgent.Server installed and configured
  • Browser with WebAssembly support
Package Purpose
MentorAgent Blazor Server app β€” AI orchestration engine
MentorAgent.Server Any ASP.NET Core backend β€” SignalR hub + SSE + MCP + A2A
MentorAgent.Abstractions Shared UI components (transitive dep β€” no need to install directly)
Product Compatible and additional computed target framework versions.
.NET net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.

NuGet packages

This package is not used by any NuGet packages.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.0.0-preview.3 35 7/24/2026
1.0.0-preview.2 63 6/22/2026
1.0.0-preview 69 6/22/2026

1.0.0-preview.3
- Standalone-WASM cost dashboard now renders the Azure-style per-model view (model selector + temporal charts + per-model cost table) from GET /mentor/admin/metrics β€” pass the fetched MentorMetricsSnapshot to <MentorDashboard/> (set Language for localization; there is no MentorAgent DI in WASM).
- Picks up the MentorAgent.Abstractions fix that makes component event handlers actually fire (they previously compiled to literal attributes) β€” this is what restores the dashboard model selector / Refresh button and the welcome-suggestion chips in the widget.
- Model routing over the hub is now strategy-based (Semantic / Classifier / Cascade / Custom) β€” configured on the server project.
- Refreshed the package icon (new MentorAgent "MA" logo).
- README: corrected the OnMcpServerStatusChanged event docs β€” it is now forwarded over the SignalR hub and fires on the client.