使用Microsoft Agent框架的多Agent群聊
系统同时支持这两种功能 本地开发 和 云部署 作为上的托管工作流 Azure AI Foundry.
The multi-agent workflow running in Azure AI Foundry — the Orchestrator routes a user query to the JiraAgent, which returns matching Jira issues via MCP.
目录
- 本地模式 - Azure AI Foundry部署 -
建筑
该项目支持两种编排模式,它们共享相同的代理和MCP工具:
顺序(群聊)
一种中心轮辐模式,编排者委托给 一次一个代理人 在循环中:
┌──────────────┐
│ SlackAgent │
┌──>│ (MCP / SSE) │──> APIM ──> Slack
│ └──────────────┘
┌──────┐ ┌──────────────┐ │ ┌──────────────┐
│ User │───>│ Orchestrator │──┼──>│ JiraAgent │──> APIM ──> Jira
└──────┘ │ (GPT-4o) │ │ │ (MCP / SSE) │
└──────────────┘ │ └──────────────┘
│ ┌──────────────┐
└──>│ GitHubAgent │──> GitHub Copilot MCP
│ (MCP / SSE) │
└──────────────┘并联(扇出/扇入)
编排者选择 同时使用多个代理,它们都会执行,合成器会将它们的结果组合成一个最终答案:
┌──────────────┐
┌──>│ SlackAgent │──┐
│ └──────────────┘ │
┌──────┐ ┌─────────┐ │ ┌──────────────┐ │ ┌──────────────┐
│ User │───>│ Router │──┼──>│ JiraAgent │──┼──>│ Synthesizer │───> Final Answer
└──────┘ │(GPT-4o) │ │ └──────────────┘ │ │ (GPT-4o) │
└─────────┘ │ ┌──────────────┐ │ └──────────────┘
└──>│ GitHubAgent │──┘
└──────────────┘| 模式 | 入口点 | 代理如何连接到MCP服务器 |
|---|---|---|
| 本地(顺序) | main.py | 定制包装(RawMCPSseTool, RawMCPStdioTool)直接连接 |
| 本地(并行) | main_parallel.py | 相同的包装器,代理通过并发运行 asyncio.gather |
| 铸造厂(顺序) | pipeline/publish.py | 本地MCP工具定义(type: "mcp")--Foundry运行时代表代理进行连接 |
| 铸造厂(平行) | pipeline/publish_parallel.py | 相同的原生MCP工具,通过条件代理调用扇出 |
特性
- 两种编排模式 --顺序(群聊)用于迭代多回合路由,并行(扇出/扇入)用于并发多代理执行,并具有合成结果
- 基于意图的路由 --编排器分析每个用户消息并将其委托给正确的代理
- 三名专业代理 --Slack、Jira和GitHub,每个都有完整的MCP工具访问权限
- 双执行模式 --在本地运行以进行开发或部署到Azure AI Foundry进行生产
- 本地MCP集成 --Foundry托管代理使用本地MCP工具定义来执行服务器端工具
- 安全的凭证处理 --通过Foundry进行GitHub MCP认证 项目连接,不是内联秘密
- 声明性工作流 --Foundry部署使用具有条件路由的YAML工作流
MCP工具服务器
| 服务器 | 传输 | 端点 | 描述 |
|---|---|---|---|
| Slack | SSE通过APIM | https://.azure-api.net/slack-mcp-1/sse | 频道列表、消息历史、发布消息 |
| Jira | SSE通过APIM | https://.azure-api.net/jira-mcp-1/sse | 问题搜索、项目列表、冲刺管理 |
| GitHub | SSE(远程) | https://api.githubcopilot.com/mcp/ | 存储库浏览、文件访问、问题管理 |
Slack和Jira MCP服务器托管在 Azure API管理 作为远程MCP网关。有关设置自己的APIM托管MCP服务器,请参阅:
msftse/remote mcp-apim函数python --在具有OAuth 2.0身份验证的APIM网关后面的Azure Functions和容器应用程序上部署远程MCP服务器。
GitHub使用托管 直接通过Foundry项目连接进行身份验证。
项目结构
.
├── main.py # Local entrypoint — sequential group chat
├── main_parallel.py # Local entrypoint — parallel fan-out/fan-in
├── pyproject.toml # Project metadata and dependencies
├── .env.example # Environment variable template
│
├── .github/workflows/
│ └── ci-cd.yml # GitHub Actions: lint → deploy → evaluate
│
├── evaluation/ # Agent evaluation suite
│ ├── run_evaluation.py # Agent target evaluation runner
│ ├── agent_eval_data.jsonl # 40 query-only test cases for live eval
│ ├── evaluation_data.jsonl # Full test cases with expected agents & tools
│ └── tool_definitions.json # MCP tool schemas for all agents
│
├── pipeline/ # Azure AI Foundry deployment
│ ├── agents.py # Agent factories — sequential workflow
│ ├── publish.py # CLI: register/deploy/verify — sequential
│ ├── workflow.yaml # Declarative workflow — sequential routing
│ ├── parallel_agents.py # Agent factories — parallel workflow (Router + Synthesizer + 3 tool agents)
│ ├── publish_parallel.py # CLI: register/deploy/verify — parallel
│ └── parallel_workflow.yaml # Declarative workflow — fan-out via 3 ConditionGroups
│
└── src/ # Core application code
├── config.py # Centralized configuration from .env
├── workflow.py # GroupChat builder (sequential, local mode)
├── parallel_workflow.py # Fan-out/fan-in builder (parallel, local mode)
├── prompts/ # Agent names, instructions, and descriptions
│ ├── orchestrator.py # Sequential orchestrator prompt
│ ├── parallel_orchestrator.py # Router + Synthesizer prompts
│ ├── slack.py
│ ├── jira.py
│ └── github.py
├── agents/ # Local agent factories with MCP wrappers
│ ├── orchestrator.py # Sequential orchestrator factory
│ ├── parallel_orchestrator.py # Router + Synthesizer factories
│ ├── slack_agent.py
│ ├── jira_agent.py
│ └── github_agent.py
└── tools/ # MCP transport wrappers
├── raw_mcp_sse.py # SSE transport (Slack, Jira via APIM)
└── raw_mcp_stdio.py # Stdio transport (GitHub MCP server binary)先决条件
- Python 3.10+
- Azure OpenAI 资源与a
gpt-4o(或同等)模型部署 - MCP服务器 可通过APIM(Slack、Jira)或远程(GitHub)访问——请参阅 MCP工具服务器
- Azure AI Foundry项目 随着
DefaultAzureCredential访问 *(仅适用于云部署)*
入门指南
1.克隆存储库并安装依赖项
git clone https://github.com//multi-agents-poc-maf.git
cd multi-agents-poc-maf
pip install -e .2.配置环境变量
cp .env.example .env编辑 .env 并填写你的价值观。看 .env.example 查看完整列表。
必需变量
| 变量 | 描述 |
|---|---|
AZURE_OPENAI_ENDPOINT | 您的Azure OpenAI资源端点 |
AZURE_OPENAI_API_KEY | Azure OpenAI API密钥 |
SLACK_MCP_SSE_URL | APIM托管的Slack MCP SSE端点 |
JIRA_MCP_SSE_URL | APIM托管Jira MCP SSE端点 |
GITHUB_PERSONAL_ACCESS_TOKEN | 用于MCP身份验证的GitHub个人访问令牌 |
Foundry部署所需
| 变量 | 描述 |
|---|---|
AZURE_AI_PROJECT_ENDPOINT | Azure AI Foundry项目端点 |
AZURE_SUBSCRIPTION_ID | Azure订阅ID |
AZURE_AI_RESOURCE_GROUP | 包含Foundry项目的资源组 |
AZURE_AI_PROJECT_NAME | 铸造项目名称 |
用法
本地模式
在本地运行多代理系统。选择 顺序的 (群聊)或 平行 (扇出/扇入)模式。
顺序(群聊)
编排器在循环中将您的请求一次路由到一个代理:
# Interactive mode
python main.py
# Single task
python main.py "List my Slack channels"
python main.py "What Jira tickets are assigned to me?"
python main.py "List my GitHub repositories"并联(扇出/扇入)
路由器一次选择多个代理,它们并发执行,合成器组合结果:
# Interactive mode
python main_parallel.py
# Single task — multi-agent queries benefit most from parallel execution
python main_parallel.py "List Slack channels and Jira projects"
python main_parallel.py "Show my GitHub repos and recent Slack messages"Azure AI Foundry部署
注册代理并将工作流部署到Azure AI Foundry,作为Foundry UI中可见的托管代理。
顺序工作流
# Register agents and workflow
python -m pipeline.publish --register
# Deploy via ARM API
python -m pipeline.publish --deploy
# Verify the deployed workflow
python -m pipeline.publish --verify并行工作流
# Register agents (Router, Synthesizer, 3 tool agents) and workflow
python -m pipeline.publish_parallel --register
# Deploy via ARM API
python -m pipeline.publish_parallel --deploy
# Verify the deployed workflow
python -m pipeline.publish_parallel --verify您还可以在Foundry中注册代理,并通过Foundry提供商在本地运行任务:
# Sequential
python -m pipeline.publish --run "Show my recent Slack messages"
# Parallel
python -m pipeline.publish_parallel --run "List Slack channels and Jira projects"GitHub MCP连接设置
GitHub MCP服务器需要通过 铸造项目连接 (不是内联标头——Foundry拒绝这些标头)。创建一个 CustomKeys Foundry项目中的连接:
选项1:Azure门户
- 导航到您的AI Foundry项目 Azure 门户.
- 首选 互联资源 > +新建连接 > 自定义密钥.
- 集 凭证名称 到
Authorization和 凭证值 到Bearer. - 命名连接
github-mcp-pat.
选项2:Azure CLI
az rest --method put \
--url "https://management.azure.com//connections/github-mcp-pat?api-version=2025-04-01-preview" \
--body '{
"properties": {
"authType": "CustomKeys",
"category": "CustomKeys",
"target": "https://api.githubcopilot.com/mcp/",
"isSharedToAll": true,
"credentials": {
"keys": {
"Authorization": "Bearer "
}
}
}
}'注: 这project_connection_id本地MCP工具定义中的字段接受连接 名字 (例如。,github-mcp-pat),不是完整的ARM资源ID。
CI/CD
该存储库包括一个GitHub Actions管道(.github/workflows/ci-cd.yml)它自动化了linting、部署和评估:
Lint ──> Deploy to Foundry ──> Evaluate Workflow| 阶段 | 触发器 | 它的作用 |
|---|---|---|
| 棉绒 | 推送、PR、手动 | 运行 ruff check 和 ruff format --check |
| 部署 | 推到 main,manual | 在Foundry中注册代理和工作流程,通过ARM API部署,运行烟雾测试。部署步骤公开新注册的代理版本(例如。 MultiAgentGroupChat:21)作为工作输出。 |
| 评估 | 推到 main,手动 | 运行官方 microsoft/ai-agent-evals GitHub针对刚刚部署的版本采取行动。结果出现在两个地方:工作流程 评估 Foundry中的选项卡,以及 GitHub操作运行摘要 具有置信区间和(当传递多个代理版本时)成对统计比较。A. 质量门 然后,该步骤解析呈现的分数,当任何评估者低于生产阈值时,该步骤将失败 evaluation/quality_gate.py --因此回归剂阻断PR |
注: 在pull请求中,只有Lint阶段运行。部署和评估需要推动 main 或手动触发器。为什么是官方行动? 这microsoft/ai-agent-evalsAction是微软在CI/CD中评估Foundry代理的标准路径——它处理数据集上传、azure_ai_agent目标、评估器接线(包括自动映射tool_definitions用于工具调用评估器)、轮询和报告呈现。看 微软学习。
必需的GitHub机密
在中配置这些 设置>秘密和变量>操作:
| 机密 | 描述 |
|---|---|
AZURE_CREDENTIALS | 服务主体JSON(来自 az ad sp create-for-rbac --json-auth) |
AZURE_AI_PROJECT_ENDPOINT | 铸造项目终点(`https://.services.ai.azure.com/api/projects/ |
| `) | |
AZURE_OPENAI_ENDPOINT | Azure OpenAI资源端点 |
AZURE_OPENAI_API_KEY | Azure OpenAI API密钥 |
AZURE_OPENAI_CHAT_DEPLOYMENT_NAME | 模型部署名称(例如。 gpt-4o) |
AZURE_AI_MODEL_DEPLOYMENT_NAME | Foundry模型部署名称 |
AZURE_SUBSCRIPTION_ID | Azure订阅ID |
AZURE_RESOURCE_GROUP | 一般资源组 |
AZURE_AI_RESOURCE_GROUP | 包含Foundry项目的资源组 |
AZURE_AI_PROJECT_NAME | 铸造项目名称 |
SLACK_MCP_SSE_URL | APIM托管的Slack MCP SSE端点 |
JIRA_MCP_SSE_URL | APIM托管Jira MCP SSE端点 |
GH_PAT | 用于MCP身份验证的GitHub个人访问令牌 |
GH_MCP_URL | GitHub Copilot MCP端点 |
服务主要角色
用于CI/CD的服务主体需要在 认知服务帐户 支持您的Foundry项目:
| 角色 | 为什么 |
|---|---|
| 贡献者 | ARM级操作(部署工作流、管理资源) |
| 认知服务用户 | 数据平面操作(agents/write, agents/read).必需,因为代理CRUD在以下情况下使用数据操作 Microsoft.CognitiveServices/accounts/AIServices/*,这些不在贡献者或Azure AI开发人员的覆盖范围内。 |
为他们分配:
# Contributor on the subscription (or scope to resource group)
az role assignment create \
--assignee \
--role "Contributor" \
--scope /subscriptions/
# Cognitive Services User on the Cognitive Services account
az role assignment create \
--assignee \
--role "Cognitive Services User" \
--scope /subscriptions//resourceGroups//providers/Microsoft.CognitiveServices/accounts/手动触发
您可以通过以下方式手动触发管道 操作>CI/CD>运行工作流,可以选择跳过评估步骤。
评估
该项目提供了两种评估部署情况的方法 多代理群聊 工作流程。两者都通过 铸造云评估API 并将结果发布到工作流 评估 Foundry门户中的选项卡。
| 路径 | 何时使用 | 如何使用 |
|---|---|---|
| GitHub官方行动 (在CI/CD中推荐) | 在每个推送/PR/夜间时间表上运行评估 | microsoft/ai-agent-evals --驱动由 evaluation/agent-eval-dataset.json |
| Python SDK脚本 (建议本地开发人员使用) | 迭代评估器配置,探索云评估SDK | python -m evaluation.run_evaluation |
评估者
CI/CD数据集(evaluation/agent-eval-dataset.json)连接12个内置评估器,共同发出生产准备就绪信号:
| 类别 | 评估者 | 它衡量什么 |
|---|---|---|
| 代理人行为 | builtin.intent_resolution | 代理是否识别用户的意图? |
| 代理人行为 | builtin.task_adherence | 响应是否符合代理分配的任务? |
| 代理人行为 | builtin.task_completion | 代理是否端到端完成了任务? |
| 工具使用 | builtin.tool_call_accuracy | 客服是否使用正确的参数调用了正确的MCP工具? |
| 工具使用 | builtin.tool_selection | 客服是否选择了必要的工具? |
| 工具使用 | builtin.tool_call_success | 工具调用是否成功,没有出现技术错误? |
| 质量 | builtin.coherence | 反应在逻辑上是否连贯? |
| 质量 | builtin.fluency | 回复写得好吗? |
| 安全 | builtin.violence, builtin.hate_unfairness, builtin.self_harm, builtin.sexual | 该代理是否会释放不安全的内容? |
路径1——微软官方行动(CI/CD)
工作流已经将其连接起来。每次推 main 对刚刚部署的版本运行官方Action,并在GitHub Actions run中呈现摘要表:
- name: Run Microsoft AI Agent Evaluation
uses: microsoft/ai-agent-evals@v3-beta
with:
azure-ai-project-endpoint: ${{ secrets.AZURE_AI_PROJECT_ENDPOINT }}
deployment-name: ${{ secrets.AZURE_AI_MODEL_DEPLOYMENT_NAME }}
agent-ids: ${{ needs.deploy.outputs.agent_id }} # e.g. MultiAgentGroupChat:21
data-path: ${{ github.workspace }}/evaluation/agent-eval-dataset.jsonAction处理数据集上传、评估器连接(包括自动映射) tool_definitions 对于工具调用评估器)、轮询和呈现。要通过统计显著性测试并排比较两个版本,请用逗号分隔:
agent-ids: "MultiAgentGroupChat:20,MultiAgentGroupChat:21"质量门——块回归
The Action报告得分,但确实如此 不 以低分不及格。回购船 evaluation/quality_gate.py 它解析Action的GitHub步骤摘要,应用每个评估者的阈值,并在任何回归中退出非零。在操作后立即将其连接到工作流中:
- name: Quality gate
if: always()
run: python evaluation/quality_gate.py编辑 THRESHOLDS dict in quality_gate.py 以匹配您的生产标准(默认值:行为/工具评估员的通过率为70%,响应质量为80-90%,四名安全评估员为95%)。当关卡失败时,作业和PR检查也会失败,降价摘要会得到一个“质量关卡:失败”表,其中包含违规指标和增量,以便审阅者立即看到退化的内容。
路径2-Python SDK脚本(本地开发)
pip install -e ".[eval]"
python -m evaluation.run_evaluationevaluation/run_evaluation.py 是底层的一个独立示例 azure-ai-projects 云评估SDK --它创建了一个 azure_ai_target_completions 具有a的数据源 azure_ai_agent 目标,附三名评估员(intent_resolution, tool_call_accuracy, task_adherence),轮询完成情况,并将详细结果保存到 evaluation/agent_eval_results.json。当您需要Action不公开的细粒度控制时,请将其用作参考(自定义评估器参数、 azure_ai_responses 用于通过ID等评估过去响应的流程)。
查看结果
- 铸造门户 --在中打开您的工作流 铸造厂 然后前往 评估 选项卡。
- GitHub操作摘要 --该操作直接在工作流运行下发布了一个每个评估者的评分表,其中包含置信区间。
评估数据集
40个查询,分为四类:
| 类别 | 计数 | 路由目标 |
|---|---|---|
| Slack | 10 | SlackAgent |
| Jira | 12 | Jira代理 |
| GitHub | 12 | GitHubAgent |
| 多代理 | 6 | 多步查询测试第一跳路由 |
评估文件
| 文件 | 描述 |
|---|---|
evaluation/agent-eval-dataset.json | 由消耗的CI/CD数据集 microsoft/ai-agent-evals (查询+评估者列表) |
evaluation/agent_eval_data.jsonl | Python SDK脚本使用的仅查询数据集 |
evaluation/evaluation_data.jsonl | 包含预期代理、工具和参数的完整数据集(用于离线分析) |
evaluation/tool_definitions.json | 所有三个代理的MCP工具模式 |
evaluation/run_evaluation.py | 云评估SDK示例(路径2) |
关键设计决策
| 决定 | 理由 |
|---|---|
| Foundry的原生MCP工具字典 | 工具代理使用原始 type: "mcp" 字典(不是 FunctionTool 包装器),因此Foundry运行时在执行时连接到MCP服务器。这是必需的,因为Foundry拒绝包含敏感数据的内联身份验证标头。 |
| 双执行模式 | 本地模式使用自定义MCP包装器(RawMCPSseTool, RawMCPStdioTool)用于直接连接;Foundry模式使用本机MCP工具定义。两者共享相同的提示和配置。 |
| 身份验证的项目连接 | GitHub MCP认证使用Foundry CustomKeys 连接而不是内联标头,遵循Foundry的敏感凭据安全模型。 |
| 声明式工作流YAML | Foundry部署使用 ConditionGroup 用于基于意图的路由和 kind: If 随着 GotoAction 对于多循环,保持编排逻辑的声明性和版本控制。 |
| 平行扇出/扇入 | 并行工作流使用Router代理预先选择代理,并发调用它们(通过本地 asyncio.gather,在Foundry通过3独立 ConditionGroup 并且合成器将所有结果组合成单个综合答案。Foundry YAML缺少原生并行原语,因此独立 ConditionGroup 块模拟扇出。 |
| 集中式配置 | 所有设置都通过键入的 Config 数据类在 src/config.py,从加载 .env 通过 load_config(). |
已知限制
- 多步布线:循环机制(
GotoAction)在Foundry托管的工作流中第一个子代理完成后,不会可靠地启动。每个用户的单代理路由正常工作。 - SDK预览:此项目使用Microsoft Agent Framework SDK的预发布版本。API在未来的版本中可能会发生变化。
资源
- Microsoft代理框架 --用于构建和编排代理的SDK
- Azure AI Foundry --用于部署和管理AI代理的云平台
- 模型上下文协议(MCP) --用于将AI模型连接到外部工具的开放协议
- 带APIM的远程MCP服务器 --APIM托管MCP服务器的参考实现
- --GitHub托管的MCP端点
- Azure API管理 --MCP服务器后端的AI网关
