Andes.Extensions.AI
0.2.0
See the version list below for details.
dotnet add package Andes.Extensions.AI --version 0.2.0
NuGet\Install-Package Andes.Extensions.AI -Version 0.2.0
<PackageReference Include="Andes.Extensions.AI" Version="0.2.0" />
<PackageVersion Include="Andes.Extensions.AI" Version="0.2.0" />
<PackageReference Include="Andes.Extensions.AI" />
paket add Andes.Extensions.AI --version 0.2.0
#r "nuget: Andes.Extensions.AI, 0.2.0"
#:package Andes.Extensions.AI@0.2.0
#addin nuget:?package=Andes.Extensions.AI&version=0.2.0
#tool nuget:?package=Andes.Extensions.AI&version=0.2.0
Andes.Extensions.AI
Middleware extensions for Microsoft.Extensions.AI: per-request and per-tool token usage tracking, and streaming status propagation for IChatClient pipelines.
Add one line to your pipeline and get:
- Token usage tracking — input/output/total tokens for the main assistant, per model turn, and attributed to each tool call (including LLM calls nested inside tools), rolled up into a
ChatUsageReport. - Streaming progress statuses — synthetic
ChatProgressContentupdates interleaved into the live stream so your UI can show "Calling GetWeather Tool", sub-statuses reported from inside the tool ("Extracting…", "Processing…"), and completion — while the model and tools are still working. - Out-of-band observers — implement
IChatProgressObserverto receive the same events and the final report without parsing the stream. - Privacy by default — progress events never carry prompt content, tool arguments, or tool results unless explicitly opted in.
Install
dotnet add package Andes.Extensions.AI
Quickstart
Register the middleware before UseFunctionInvocation() — the tracker must wrap the tools that the function-invoking client executes:
using Andes.Extensions.AI;
using Microsoft.Extensions.AI;
IChatClient client = innerClient // any IChatClient (Azure OpenAI, OpenAI, Ollama, ...)
.AsBuilder()
.UseToolTracking()
.UseFunctionInvocation()
.Build();
AIFunction weather = AIFunctionFactory.Create(
(string city) =>
{
ChatProgress.Report("Extracting..."); // sub-status under "Calling GetWeather Tool"
return $"Sunny in {city}";
},
"GetWeather");
await foreach (var update in client.GetStreamingResponseAsync(
"What's the weather in Quito?",
new ChatOptions { Tools = [weather] }))
{
foreach (var content in update.Contents)
{
switch (content)
{
case ChatProgressContent progress:
Console.WriteLine($"[{progress.Progress.Kind}] {progress.Progress.Message}");
break;
case UsageReportContent usage:
Console.WriteLine($"Total tokens: {usage.Report.TotalUsage.TotalTokenCount}");
break;
}
}
Console.Write(update.Text);
}
Tools that are themselves LLM-backed (for example, agents exposed as functions) can attribute their own usage to the calling scope with ChatProgress.ReportUsage(...) — or simply run their own UseToolTracking() pipeline, whose total rolls up automatically.
Before persisting responses into conversation history, remove the synthetic content:
ChatResponse response = updates.ToChatResponse().StripProgressContent();
MCP tools
First-class MCP support ships as a satellite package so the core stays dependency-lean:
dotnet add package Andes.Extensions.AI.Mcp
McpClientTool instances classify as ToolKind.McpTool and render as "Calling {Server} MCP", and the server's progress notifications are bridged into ToolProgress updates with numeric Progress/ProgressTotal values:
IList<McpClientTool> mcpTools = await mcpClient.ListToolsAsync();
IChatClient client = innerClient
.AsBuilder()
.UseToolTracking(options => options.UseMcpToolClassification())
.UseFunctionInvocation()
.Build();
var chatOptions = new ChatOptions { Tools = mcpTools.WithTracking(mcpClient) };
See MCP support for details.
Agent tools
Microsoft Agent Framework agents run as tracked tools through their own satellite package:
dotnet add package Andes.Extensions.AI.Agent
Agents wrapped with WithTracking() classify as ToolKind.Agent and render as "Calling {Agent} Agent", and each run's AgentResponse.Usage is attributed to the calling tool's scope — a plain agent.AsAIFunction() exposes neither:
AIAgent weatherAgent = weatherChatClient.AsAIAgent(
instructions: "You answer questions about the weather.",
name: "Weather Agent",
tools: [AIFunctionFactory.Create(GetWeather)]);
IChatClient client = innerClient
.AsBuilder()
.UseToolTracking(options => options.UseAgentToolClassification())
.UseFunctionInvocation()
.Build();
var chatOptions = new ChatOptions { Tools = [weatherAgent.WithTracking()] };
See Agent support for details.
Documentation
- Getting started
- Architecture
- MCP support
- Agent support
- Example: the Progress Board — every tool kind in one stream
License
MIT
| Product | Versions 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. |
-
net10.0
- Microsoft.Extensions.AI (>= 10.8.1)
- Microsoft.Extensions.AI.Abstractions (>= 10.8.1)
NuGet packages (3)
Showing the top 3 NuGet packages that depend on Andes.Extensions.AI:
| Package | Downloads |
|---|---|
|
Andes.Extensions.AI.Agent
Microsoft Agent Framework support for Andes.Extensions.AI tool tracking: classifies agents exposed as function tools as agent tools ("Calling {Agent} Agent"), attributes each agent run's token usage to the calling tool's scope, and optionally reports the agent's own function invocations as progress statuses. |
|
|
Andes.Extensions.AI.Mcp
Model Context Protocol (MCP) support for Andes.Extensions.AI tool tracking: classifies McpClientTool instances as MCP tools ("Calling {Server} MCP") and bridges MCP progress notifications into chat progress updates with numeric progress values. |
|
|
Andes.Extensions.AI.UI
UI status contract for Andes.Extensions.AI tool tracking: serializable records (and a matching TypeScript interface) that project the tracked chat stream into an assistant-activity hierarchy — the assistant's own functions, MCP tools, and agents, each with sub-statuses, nested children, and token usage — for rendering live progress in Blazor, a console, or any TypeScript SPA. |
GitHub repositories
This package is not used by any popular GitHub repositories.