返回主报告
PIKE-RAG · AZ China MVR Smart Tool
APPENDIX THREE · MICROSOFT AGENT FRAMEWORK

Microsoft Agent Framework · 项目用了什么 · 能不能换

一句话:项目 .NET 后端的整个 Agent 层是搭在微软 2026 主推的官方 SDK Microsoft.Agents.AI 1.4.0 上,自己只写了一个 303 行的桥 把 SDK 连到内网 LMStudio。这份附录讲清楚:SDK 是啥、桥怎么搭、能不能换、踩过什么坑

📋 由浅入深 · 5 章
是什么 — 一图看懂
帮省了什么 — 7 类活儿
桥怎么搭 — 5 步 + 3 段关键代码
能不能换 — 同级开源方案对比
踩过什么坑 — 3 个真实事故
CHAPTER 1

是什么

Microsoft Agent Framework(MAF) = 微软 2026 主推的官方 Agent 开发框架 · 2026-04-03 发布 1.0 GA · 吸收合并了原来的 Semantic Kernel 和 AutoGen(两者进入维护模式)。

图 1 · 微软 Agent 框架演进 · 三合一
Semantic Kernel
2023 · 企业插件编排
⚠ 维护模式
AutoGen
2024 · 多 Agent 对话
⚠ 维护模式
MERGE
2026-04-03
Microsoft Agent Framework
v1.0 GA · 官方唯一
Python + .NET 双语言
A2A + MCP 内建
← 项目当前用的
图 2 · SDK 在项目里的分层
项目业务层
PIKE-RAG 自己写的
MVR 医药 Agent · 13 个内置 Agent · Skill/Tool 定义 · KB 检索 · Chat 端点
↓ 调用
Microsoft.Agents.AI 1.4.0
MAF 主包 · 微软
ChatClientAgent · AgentThread · 历史压缩 · Streaming loop · Workflows
↓ 依赖
Microsoft.Extensions.AI 10.5.0
底层抽象 · 微软
IChatClient 接口 · ChatMessage · ChatOptions · Tool schema
项目自己的 303 行
PoolRoutingChatClient : IChatClient
实现 IChatClient · 从 5 个 pool 里选一个 backend · 桥到 Azure / vLLM / LMStudio
↓ 走 HTTP
Azure OpenAI
生产可选
LMStudio · 223
当前用 · ornith 35B
vLLM / ollama
未来可选

读法:上层调用下层。项目业务代码 只认最上面两层的 SDK API · 底下换 provider 只需改配置,不改代码。303 行的桥 是唯一连接点。

8
NuGet 包
73
代码引用点
27
.cs 文件
303
项目自己写的行数
CHAPTER 2

帮项目省了什么

如果不用 SDK · 下面这些都得自己写。

不用 SDK 得手写 SDK 谁做
JSON 序列化(role / content / tool_calls)OpenAI SDK.AsIChatClient()
SSE 流累帧(拼 text · 拼 tool_call arguments)Microsoft.Extensions.AI.OpenAI
Tool 循环(tool_call → 执行 → 结果塞回 → 再问)UseFunctionInvocation()
C# 方法 → JSON schema 转换AIFunctionFactory.Create()
History 压缩(超 N 轮按策略缩)SlidingWindowCompactionStrategy
Token 用量统计UsageContent 自动填
Agent 主循环(system → user → tool → 最终答)ChatClientAgent.RunStreamingAsync

上面 7 类活儿 · 每一类拆开都是几百行代码。项目整层没写,只写了 303 行的路由桥。

CHAPTER 3

桥怎么搭 · 5 步

SDK 默认只认 Azure OpenAI · 项目要连内网 LMStudio + 5 pool 路由 · 靠 PoolRoutingChatClient.cs(303 行)。

Step 1 · 前端发消息 → API 收到 { agent:"mvr-pharma", msg:"..." }
Step 2 · AgentFactory 造 ChatOptions · 塞 poolId="lmstudio-chat" · kbId · runId
Step 3 · new ChatClientAgent(_chatClient, options) · SDK 一等公民 API
Step 4 · SDK 回调到 PoolRoutingChatClient · 从 options 读 poolId · PickBackend() 拿到 endpoint
Step 5 · 借 OpenAIClient.GetChatClient(x).AsIChatClient() 发真请求到 http://192.168.1.223:1234/v1

桥里最关键的 3 段代码

① 传业务上下文 · 不改 SDK

SDK 只认标准字段。项目的 poolId / kbId / runId 全塞进 AdditionalProperties(SDK 留的口子):

chatOptions.AdditionalProperties["poolId"] = "lmstudio-chat";
chatOptions.AdditionalProperties["kbId"]   = "kb_707811...";
chatOptions.AdditionalProperties["runId"]  = "run_a1b2c3";
② 借 OpenAI SDK 造真客户端 · 不手写 JSON/SSE
var openAiClient = new OpenAIClient(credential, new OpenAIClientOptions {
  Endpoint       = new Uri("http://192.168.1.223:1234/v1"),
  NetworkTimeout = TimeSpan.FromMinutes(40),  // 本地 GPU ~2 tok/s
});
return openAiClient.GetChatClient("ornith-1.0-35b-mtplx").AsIChatClient();
③ DI 注册 · 把桥当 SDK 的 IChatClient 灌进去
services.AddScoped<IChatClient, PoolRoutingChatClient>();
// 之后所有 SDK 需要 IChatClient 的地方都会自动拿到桥
CHAPTER 4

同级开源方案 · 能不能换

2026 年 Agent 框架格局:除 MAF 外还有 7 个主流方案 · 但都是 Python/TS · .NET 上 MAF 几乎唯一

2026 年主流 8 个 Agent 框架

框架 语言 一句话定位 .NET 支持
MAF
(项目当前用)
Python + .NET 微软官方 · 吸收了 SK/AutoGen · A2A + MCP 内建 ✓ 一等
LangGraph 1.0
生产化最强
Python · TS 图状态机 · PostgreSQL/Redis 持久化 · 人-在-环 · 最多生产战伤
LlamaIndex Workflows
RAG 最强
Python · TS 事件驱动 · 文档密集型 · 项目正是 RAG · 但已用 pikerag Python 层
CrewAI 1.14
上手最快
Python 角色/团队/任务抽象 · Fortune 500 大量在用 · 快速原型
OpenAI Agents SDK
最简
Python · TS 从 Swarm 演进 · handoff-first · OpenAI 主账户绑定
Google ADK Python GCP 生态 · 内置调试 UI + Vertex AI 集成
Pydantic AI V2 Python 类型安全 · schema 驱动 · harness-first · Python 团队友好
Mastra TypeScript 工作流 + 记忆 + Studio 一体 · TS 团队首选

数据来源:LangChain 官方评测(2026-06)· Turing.com 综述 · AliceLabs Production Ranking Q2 2026 · Speakeasy 2026 综述。

.NET 圈的现实

这是关键 —— 项目在 .NET 10 · 要换 = 要么离开 .NET 生态 · 要么在 .NET 圈里找 · 但选择极少:

.NET 侧候选 状态 能不能换过去
Semantic Kernel⚠️ 维护模式✗ 官方推荐迁到 MAF · 走回头路
AutoGen .NET⚠️ 维护模式✗ 同上 · 已合并进 MAF
Spectra10 stars · 单人✗ 玩具级 · 不适合生产
Aevatar AgentsOrleans-based · 小众⚠ 分布式 Actor · 侧重多 Agent · 不是 chat agent
Python 桥
(LangGraph via REST)
曲线救国⚠ Python 跑 LangGraph · .NET 前端 HTTP 调 · 增加运维层

结论 · 选型合理吗?

合理 · 且几乎唯一

  1. 技术栈锁:项目已在 .NET 10 · 除 MAF 外 .NET Agent 框架都不成熟
  2. 客户匹配:AZ = 微软战略客户 · Microsoft Industry Solutions 交付 · Azure 全家桶已绑定
  3. 官方战略对齐:MAF 明确取代 SK/AutoGen · 押它 = 押微软 2026-2028 路线图

已知负债:MAF 1.0 只有几个月 · 生产战伤远少于 LangGraph(2 年+)。这个负债项目自己也清楚。

如果哪天真要换

保守 · 不换

留在 MAF · 跟着微软路线图升级 1.5 / 2.0。推荐

激进 · 换 Python

改用 LangGraph 1.0(最稳)或 LlamaIndex Workflows(强化 RAG)。整套 .NET Agent 层重写。

折中 · Hybrid

项目本身已有 Python 后端跑 pikerag · Agent 编排可以留在 Python 侧上 LangGraph · .NET 侧继续 MAF。

CHAPTER 5

踩过 3 个坑

坑 1 · 2026-07-10

"No LLM backend available for pool 'default'"

症状:Playground 发消息就报这个错。
根因:MVR Agent 的 model_pool_id 应该是 lmstudio-chat · 被 docker compose stop → start 触发的 db-init 重置成了 default(不存在)。
:UPDATE agent SET model_pool_id='lmstudio-chat' WHERE id=12;

坑 2 · P2 · 待修

TokenUsageCollector 主键冲突 · 计费不准

症状:日志频繁 duplicate key value violates uq_token_bucket
根因:同秒并发调用相同 pool · INSERT 撞 unique 约束。
修(未做):改成 INSERT ... ON CONFLICT DO UPDATE SET tokens = tokens + EXCLUDED.tokens

坑 3 · 2026-07-09 · 已修

OpenAI SDK endpoint 少了 /v1 · LMStudio 404

症状:首次连 LMStudio 打到 /chat/completions(而非 /v1/chat/completions)· 404。
根因:OpenAI SDK 只会自动追加 /chat/completions · 不加 /v1。Azure 部署路径是 deployments/{name}/chat/completions · 社区 endpoint 都要手动加 /v1
:桥里 L199 加了 var suffix = protocol == "azure-inference" ? "" : "/v1";

返回主报告 · 附录一 · 团队与功能地图 · 附录二 · 实测记录
附录三 · Microsoft Agent Framework · v2 精简版 · 2026-07-10