用 Microsoft Agent Framework 1.0 搭企业级智能体(Python/.NET,原生 MCP+A2A)
如果你在微软技术栈(.NET / Azure)里干活,又想正经做多智能体系统,Microsoft Agent Framework(MAF)1.0 是 2026 年最值得关注的一站式框架。它在 2026 年 4 月 3 日 GA,把原本的 AutoGen(多智能体编排)和 Semantic Kernel(企业级 SDK)合并成一个开源框架,原生支持 MCP 与 A2A,还内置 OpenTelemetry 观测。本教程用 Python 带你从零跑通一个会调用工具、还能多智能体协作的 Agent。
先搞懂:MAF 1.0 解决了什么?
用一句话理解:MAF 是微软把"对话式多智能体(AutoGen)"和"企业级 LLM SDK(Semantic Kernel)"焊在一起的统一框架。它的几个关键能力,正好是企业落地最在意的:
| 能力 | 通俗解释 | 对你意味着什么 |
|---|---|---|
| 多供应商模型 | 一套代码调 OpenAI / Azure / Claude / Gemini / Bedrock / Ollama | 模型可随时替换,不被锁死 |
| 原生 MCP + A2A | 直接接入 MCP 工具服务器、与其它框架的 Agent 互操作 | 生态互通,省去自研适配 |
| 多智能体编排 | 顺序 / 并行 / 自定义工作流把多个 Agent 串起来 | 复杂任务拆解给不同专家 Agent |
| OpenTelemetry 观测 | 分布式追踪、日志、监控开箱即用 | 出问题时能定位到哪一步 |
| 长期支持承诺 | 1.0 起 API 稳定、向后兼容 | 生产环境敢用,不怕半夜 Breaking Change |
新手建议:先跑通单 Agent + 工具,再上多智能体工作流。MAF 概念比 LangChain 轻量、比手写循环省心,但比"纯 SDK 调一次"要重,适合"真要做产品"而非"随手试一下"。
Step 1:装环境与依赖
MAF 支持 Python 3.10+(Windows / macOS / Linux 均可)。最简单的方式是安装全家桶:
# 开发/本地探索:装全部子包,所有功能直接可用
pip install agent-framework
# 想更轻量,只装核心(含 Azure OpenAI / OpenAI + 工作流编排)
pip install agent-framework-core
# 接 Azure AI Foundry 时
pip install agent-framework-foundry
# 验证安装
python -c "import agent_framework; print(agent_framework.__version__)"
dotnet add package Microsoft.Agents.AI,API 一一对应。本教程以 Python 为例,思路完全相通。Step 2:配置模型 API Key
MAF 的客户端会按"显式参数 → 环境变量 → 配置文件"的顺序解析凭证。在项目根目录建一个 .env:
# 用 OpenAI
OPENAI_API_KEY=sk-xxxxxxxxxxxxxxxx
OPENAI_MODEL=gpt-4o
# 或接 Azure OpenAI
AZURE_OPENAI_API_KEY=xxxx
AZURE_OPENAI_ENDPOINT=https://your-resource.openai.azure.com/
AZURE_OPENAI_MODEL=gpt-4o
# 或接 Azure AI Foundry
FOUNDRY_PROJECT_ENDPOINT=https://your-project.services.ai.azure.com
FOUNDRY_MODEL=gpt-5.3
Key 别泄露!把 .env 加进 .gitignore,千万别提交到仓库。如果同时设了 OPENAI_API_KEY 和 Azure 变量,想强制走 Azure,要在代码里显式传 credential=AzureCliCredential()。
Step 3:创建你的第一个 Agent
用 OpenAIChatClient 当客户端,包一层 Agent,await agent.run(...) 即可:
import asyncio
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient
async def main():
agent = Agent(
client=OpenAIChatClient(), # 自动读 OPENAI_API_KEY
instructions="你是一个简洁友好的助手,回答不超过三句话。",
)
result = await agent.run("用一句话介绍 Microsoft Agent Framework。")
print(result)
asyncio.run(main())
Agent 就是"客户端 + 人设指令"的封装。instructions 决定了它的性格和职责——这和你在 Dify 里写的提示词是同一回事,只是现在用代码管理、可进版本库。Step 4:给 Agent 加工具(函数调用)
光会聊天不够,Agent 真正的价值是"动手"。给它注册一个普通 Python 函数当工具:
import asyncio
from typing import Annotated
from pydantic import Field
from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient
def get_weather(
location: Annotated[str, Field(description="要查询天气的城市")]
) -> str:
"""获取指定城市的天气。"""
# 真实场景这里调用天气 API;演示返回模拟值
return f"{location} 今天晴,最高 26°C,适合出门。"
async def main():
agent = Agent(
client=OpenAIChatClient(),
instructions="你是天气助手,需要时用 get_weather 工具查真实天气。",
)
agent.add_function_tool(get_weather) # 注册工具
print(await agent.run("北京今天适合跑步吗?"))
asyncio.run(main())
工具描述很重要!函数名下方的 docstring 和 Field(description=...) 是模型判断"要不要调用、怎么填参数"的唯一依据。写得含糊,模型就会瞎填或干脆不调。
Step 5:多智能体顺序工作流
真实任务常需要多个专家 Agent 协作。MAF 用 SequentialBuilder 把参与者串成流水线:
import asyncio
from agent_framework import Agent, Message
from agent_framework.openai import OpenAIChatClient
from agent_framework.orchestrations import SequentialBuilder
async def main():
client = OpenAIChatClient()
writer = Agent(client=client,
name="writer",
instructions="你是简洁的文案,只写一句有冲击力的标语。")
reviewer = Agent(client=client,
name="reviewer",
instructions="你是审稿人,对上一句给一句简短反馈。")
workflow = SequentialBuilder(participants=[writer, reviewer]).build()
async for event in workflow.run("给 Microsoft Agent Framework 1.0 写句标语", stream=True):
if event.type == "output":
for msg in event.data:
print(f"[{msg.author_name}]: {msg.text}")
asyncio.run(main())
workflow 托管到 Azure Functions / Durable Task / A2A 服务上运行。先做顺序,理解事件流后再扩展。Step 6:接入 MCP 工具与 A2A 互操作
MAF 1.0 的杀手锏是原生 MCP + A2A:你不必自己造工具,直接连现成的 MCP 服务器;也能让 MAF 的 Agent 和 LangGraph / CrewAI 的 Agent 通过 A2A 协议互相调用。
# 概念示意:把外部 MCP 服务器暴露的能力变成 Agent 可调用工具
# 1) 启动一个 MCP server(如 filesystem / fetch / 自定义)
# 2) 在 MAF 里用 MCP 连接器挂载:
# from agent_framework.mcp import McpConnection
# mcp = McpConnection(command="npx", args=["-y", "@modelcontextprotocol/server-fetch"])
# agent.add_mcp_server(mcp)
# A2A:让本框架 Agent 作为"客户端"发现并调用其它框架的 Agent
# from agent_framework.a2a import A2ACardResolver
# card = A2ACardResolver(url="https://other-agent.example/.well-known/agent.json").get()
MCP 让工具"即插即用":你之前在其它项目里写的 MCP server,MAF 直接复用,不用重写。A2A 则让"不同框架的 Agent 组队"成为现实——这对企业里多团队各自用不同框架的情况特别友好。
Step 7:观测、守卫与部署
上线前,三件事建议一次配齐:
1) 可观测性:内置 OpenTelemetry,分布式追踪一行开启
# 设置环境变量即可把 trace 导出到 Collector / Application Insights
OTEL_EXPORTER_OTLP_ENDPOINT=http://localhost:4317
2) 中间件守卫:用 middleware 管道做内容安全、合规、日志
# 在 Agent 上挂 middleware,不改动提示词就能加策略
3) 部署:Foundry 托管只需多加两行
# pip install agent-framework-foundry
# 把 Agent 用 FoundryChatClient + AzureCliCredential 包起来,
# 即可部署到 Foundry 托管基础设施,获得托管运行与计费
常见问题速查
| 现象 | 大概率原因 & 解决 |
|---|---|
| 报 "module not found" | 只装了 core,却用了 foundry/mcp 子模块 → 补装对应子包 |
| 走了 OpenAI 而非 Azure | 同时存在两套变量 → 显式传 credential=AzureCliCredential() |
| 工具没被调用 | 函数 docstring / Field 描述太含糊,或 instructions 没提要用工具 |
| 多 Agent 没输出 | 忘了 async for 消费 event 流,或 stream=True 漏写 |