Galosys.Foundation.Agents.AI
26.8.18.1
dotnet add package Galosys.Foundation.Agents.AI --version 26.8.18.1
NuGet\Install-Package Galosys.Foundation.Agents.AI -Version 26.8.18.1
<PackageReference Include="Galosys.Foundation.Agents.AI" Version="26.8.18.1" />
<PackageVersion Include="Galosys.Foundation.Agents.AI" Version="26.8.18.1" />
<PackageReference Include="Galosys.Foundation.Agents.AI" />
paket add Galosys.Foundation.Agents.AI --version 26.8.18.1
#r "nuget: Galosys.Foundation.Agents.AI, 26.8.18.1"
#:package Galosys.Foundation.Agents.AI@26.8.18.1
#addin nuget:?package=Galosys.Foundation.Agents.AI&version=26.8.18.1
#tool nuget:?package=Galosys.Foundation.Agents.AI&version=26.8.18.1
Galosys.Foundation.Agents.AI
Microsoft Agent Framework (MAF) v1.13 薄包装模块。提供模块自动发现和 AddAIAgent() DI 便利扩展,所有编排/中间件能力直接委托给 MAF。
快速入门
安装
确保 Directory.Packages.props 中已配置 MAF 包版本:
<PackageVersion Include="Microsoft.Agents.AI" Version="1.13.0" />
<PackageVersion Include="Microsoft.Agents.AI.OpenAI" Version="1.13.0" />
<PackageVersion Include="Microsoft.Agents.AI.Anthropic" Version="1.13.0-preview.260703.1" />
<PackageVersion Include="Microsoft.Agents.AI.Workflows" Version="1.13.0" />
注册 Agent
using Microsoft.Agents.AI;
using Microsoft.Extensions.AI;
using OpenAI;
// 编程式创建 AIAgent
var client = new OpenAIClient(new ApiKeyCredential("sk-xxx"),
new OpenAIClientOptions { Endpoint = new Uri("https://api.openai.com/v1") });
builder.Services.AddAIAgent(sp =>
client.GetChatClient("gpt-4o")
.AsAIAgent(name: "assistant", instructions: "You are a helpful assistant."));
使用 Agent
public class ChatService
{
private readonly AIAgent _agent;
public ChatService(AIAgent agent) => _agent = agent;
public async Task<string> Chat(string message)
{
var session = await _agent.CreateSessionAsync();
var response = await _agent.RunAsync(message, session, null);
return response.Text;
}
}
多 Agent 编排(使用 MAF Workflows)
using Microsoft.Agents.AI.Workflows;
// 顺序编排
var workflow = AgentWorkflowBuilder.BuildSequential(
writerAgent, reviewerAgent);
var result = await workflow.RunAsync("Write a blog post", ct);
// 并发编排
var concurrent = AgentWorkflowBuilder.BuildConcurrent(
new[] { agent1, agent2, agent3 });
var result = await concurrent.RunAsync("Research topic", ct);
// Handoff 模式
var handoffBuilder = AgentWorkflowBuilder
.CreateHandoffBuilderWith(triageAgent)
.HandoffTo(salesAgent, "sales")
.HandoffTo(supportAgent, "support");
var workflow = handoffBuilder.Build();
Middleware(替代旧的 Step 模式)
// MAF DelegatingAIAgent 实现自定义中间件
public class LoggingAgent : DelegatingAIAgent
{
private readonly ILogger _logger;
public LoggingAgent(AIAgent inner, ILogger<LoggingAgent> logger)
: base(inner) => _logger = logger;
public override async Task<AgentResponse> RunAsync(
string input, AgentSession? session, AgentRunOptions? options,
CancellationToken ct = default)
{
_logger.LogInformation("Request: {Input}", input);
var response = await base.RunAsync(input, session, options, ct);
_logger.LogInformation("Response: {Text}", response?.Text);
return response;
}
}
工具调用
MAF AIAgent.RunAsync() 原生支持 Function Calling。通过 ChatOptions.Tools 传入工具定义即可。
输出护栏(Output Guardrail)
已自本模块下沉至 Core chat 层(
Microsoft.Extensions.AI)。agent 级AddAgentOutputGuardrail/UseOutputGuardrail已移除,护栏统一改由 CoreOutputGuardrailChatClient承载。
配置创建的 IChatClient 经 AddAI 默认管线自动挂载(EnableOutputGuardrail=true)。也可在独立 ChatClient 上显式装配:
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
// 1. DI 注册默认评估器(TryAddSingleton,可被自定义实现覆盖)
services.AddOutputGuardrail(options =>
{
// 敏感词拦截
options.BlockedKeywords = ["机密", "内部资料"];
// 白名单覆盖(命中白名单不拦截)
options.Whitelist = ["机密档案室"];
});
// 2. 挂载到 ChatClient 管线
var sp = services.BuildServiceProvider();
var client = new ChatClientBuilder(chatClient).UseOutputGuardrail(sp).Build(sp);
var response = await client.GetResponseAsync([new ChatMessage(ChatRole.User, "帮我查一下机密项目")]);
// 命中敏感词时抛 OutputGuardrailException(携带评估结果),不返回被拦截文本
评估链由两缝构成:
- 识别缝
IPiiDetector:默认ParameterStatePiiDetector直接引用 CoreParameterState.Patterns常量(Email/ChineseMobile/IdCard/IpV4等),护栏内不复制正则字面量,保证单一事实来源。 - 处理缝
IPiiRedactor:默认PiiTypeRedactor由 DI 注入官方Redactor子类,PII 独立出现时脱敏(记录MaskedPii)而非拦截。
对话压缩(Compaction)
已自本模块下沉至 Core chat 层(
Microsoft.Extensions.AI)。MAFCompactionProvider薄挂载扩展(AddAgentCompaction/UseCompaction(provider))已移除,上下文层压缩统一改由 CoreCompactionChatClient承载。
配置创建的 IChatClient 经 AddAI 默认管线自动挂载(EnableCompaction=true)。也可在独立 ChatClient 上显式装配:
using Microsoft.Extensions.AI;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
// 1. DI 注册压缩选项(默认 MaxMessages=32,超限截断)
services.AddCompaction(o => o.MaxMessages = 32);
// 2. 挂载到 ChatClient 管线(Truncate 或 Summarize)
var sp = services.BuildServiceProvider();
var client = new ChatClientBuilder(chatClient)
.UseCompaction(o => o.Strategy = CompactionStrategy.Truncate)
.Build(sp);
两层压缩分工:存储层 IChatReducer(ChatHistoryProviderOptions.ChatReducer)负责确定性裁剪窗口(不耗 LLM);上下文层 CompactionChatClient 负责消息量超限时的截断/摘要压缩。两者独立可组合,避免同时用两个摘要型压缩。
工具级指标(OpenTelemetry)
为 Agent 的工具调用记录成功率/耗时/错误率指标(agent.tool.calls / agent.tool.duration),经 System.Diagnostics.Metrics 输出。
using Galosys.Foundation.Agents.AI;
using Microsoft.Agents.AI;
using Microsoft.Extensions.DependencyInjection;
var services = new ServiceCollection();
// 1. DI 注册工具级指标记录器(TryAddSingleton,可配置 MeterName/Enabled)
services.AddAgentsOpenTelemetry(o => o.MeterName = "Galosys.Foundation.Agents.AI");
// 2. 显式挂载到 Agent 管道(经 FunctionInvocationDelegatingAgentBuilderExtensions.Use 回调)
var sp = services.BuildServiceProvider();
var metrics = sp.GetRequiredService<AgentOpenTelemetryFunctionMetrics>();
var builder = new AIAgentBuilder(innerAgent).UseOpenTelemetryFunction(metrics);
var agent = builder.Build(sp);
- 指标维度:
agent.tool.calls(tagtool/result)、agent.tool.duration(tagtool)。 - 不含用户/租户 tag:MAF 1.13.0 函数回调无法访问
AgentSession.StateBag;用户/租户维度由成本报表端点(Hosting.AspNetCore的/agents/cost)承担。 Enabled=false时直接透传,不记录任何指标。- 默认 meter 名
Galosys.Foundation.Agents.AI已由AddOpenTelemetryCore默认注册,无需额外配置即可被采集。
事件契约
本模块定义 3 个 MessageBase 事件契约(Galosys.Foundation.Agents.AI.Events),仅定义类型、无生产者中间件:
| 事件 | 用途 | 关键字段 |
|---|---|---|
AgentAuditLogEvent |
审计日志 | AgentId / ConversationId / Action / ActorId / Outcome |
AgentApprovalRequestEvent |
工具调用审批 | AgentId / ToolName / ArgumentsJson / RequesterId |
AgentCostUsageEvent |
成本统计 | AgentId / ModelId / TokensInput / TokensOutput |
依赖
| 包 | 版本 | 说明 |
|---|---|---|
Microsoft.Agents.AI |
1.13.0 | MAF 核心 |
Microsoft.Agents.AI.OpenAI |
1.13.0 | OpenAI 兼容 Provider |
Microsoft.Agents.AI.Anthropic |
1.13.0-preview | Anthropic Provider |
Microsoft.Agents.AI.Workflows |
1.13.0 | Workflow 编排 |
Galosys.Foundation.Core |
中央包管理 | ParameterState.Patterns(PII 检测 SSOT)、官方 Redactor 子类 |
Provider 支持
| Provider | 配置方式 | 说明 |
|---|---|---|
| OpenAI | new OpenAIClient(...).GetChatClient(model).AsAIAgent(...) |
标准 OpenAI API |
| DeepSeek | 同上,endpoint 指向 https://api.deepseek.com |
OpenAI 兼容 |
| Ollama | 同上,endpoint 指向 http://localhost:11434 |
本地模型 |
| Anthropic | 使用 Microsoft.Agents.AI.Anthropic 包 |
需添加 NuGet 引用 |
| 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
- Galosys.Foundation.Core (>= 26.8.18.1)
- Microsoft.Agents.AI (>= 1.13.0)
- Microsoft.Agents.AI.Anthropic (>= 1.13.0-preview.260703.1)
- Microsoft.Agents.AI.OpenAI (>= 1.13.0)
- Microsoft.Agents.AI.Workflows (>= 1.13.0)
NuGet packages (4)
Showing the top 4 NuGet packages that depend on Galosys.Foundation.Agents.AI:
| Package | Downloads |
|---|---|
|
Galosys.Foundation.Agents.AI.Hosting
Galosys.Foundation快速开发库 |
|
|
Galosys.Foundation.Agents.AI.EntityFrameworkCore
Galosys.Foundation快速开发库 |
|
|
Galosys.Foundation.Agents.AI.Redis
Galosys.Foundation快速开发库 |
|
|
Galosys.Foundation.Agents.AI.Milvus
Galosys.Foundation快速开发库 |
GitHub repositories
This package is not used by any popular GitHub repositories.
| Version | Downloads | Last Updated |
|---|---|---|
| 26.8.18.1 | 56 | 8/18/2026 |
| 26.8.17.1 | 64 | 8/17/2026 |
| 26.8.13.2 | 83 | 8/13/2026 |
| 26.8.13.1 | 92 | 8/13/2026 |
| 26.8.12.2 | 87 | 8/12/2026 |
| 26.8.12.1 | 92 | 8/12/2026 |
| 26.8.10.1 | 101 | 8/10/2026 |
| 26.8.5.1 | 92 | 8/5/2026 |
| 26.8.4.1 | 71 | 8/4/2026 |
| 26.8.3.1 | 61 | 8/3/2026 |
| 26.7.31.1 | 63 | 7/31/2026 |
| 26.7.30.1 | 63 | 7/30/2026 |
| 26.7.29.1 | 59 | 7/29/2026 |
| 26.7.28.1 | 65 | 7/28/2026 |
| 26.7.26.2 | 61 | 7/26/2026 |
| 26.7.26.1 | 62 | 7/25/2026 |
| 26.7.25.1 | 62 | 7/25/2026 |
| 26.7.24.2 | 60 | 7/24/2026 |
| 26.7.24.1 | 59 | 7/24/2026 |
| 26.7.22.1 | 64 | 7/23/2026 |