feat: 新增方案 C 的 Handoff 路由宿主,并让抽城市支持自然语言。

把图 JSON 编译成 CreateHandoffBuilderWith + WithHandoff;Agent 固定 Id 以免交接工具名错位;DeepSeek 关闭 thinking,避免多轮丢掉 reasoning_content 导致 400。
This commit is contained in:
2026-09-01 17:56:41 +08:00
parent 2c5c6fd118
commit b0e89b6092
25 changed files with 960 additions and 27 deletions
+32 -6
View File
@@ -3,7 +3,8 @@
MAF1 是一个基于 **.NET 10** 和 **Microsoft Agents AI** 的多智能体演示仓库。同一条「读文件抽城市 → 查天气」链路拆成两个可执行项目:
1. **MAF1**:命令行工作流。用 Microsoft Agents AI Workflows 对比「条件写在节点里」和「条件写在边上」。
2. **MAF1.Web**可视化编排器。浏览器里拖节点、连线、配条件,然后一键运行
2. **MAF1.Route**命令行路由。方案 C 的图编译成 `AgentWorkflowBuilder.CreateHandoffBuilderWith` + `WithHandoff`;专家仍是 Core 里的 Agent
3. **MAF1.Web**:可视化编排器。浏览器里拖节点、连线、配条件,然后一键运行。
内置 Agent 在 `MAF1.Core` 里;网页还可以把同一套能力以 **独立进程插件** 的形式画到画布上。LLM 的 endpoint / API Key / 模型由各宿主注入,**不会**画成节点端口,也不会写进流程图 JSON。
@@ -29,13 +30,13 @@ MAF1 是一个基于 **.NET 10** 和 **Microsoft Agents AI** 的多智能体演
| 部分 | 说明 |
|------|------|
| 运行时 | .NET 10`net10.0` |
| 控制台 | `MAF1`普通控制台,Microsoft Agents AI Workflows |
| 控制台 | `MAF1`工作流;`MAF1.Route`:方案 C 路由 |
| 网页 | `MAF1.Web`ASP.NET Core Minimal API + `wwwroot` |
| LLM | `Azure.AI.OpenAI` + `Microsoft.Agents.AI.OpenAI`(兼容 OpenAI / Azure OpenAI / DeepSeek 等) |
| 前端 | `MAF1.Web/wwwroot` 下原生 HTML / CSS / JS,无 npm 依赖 |
| 插件 | 独立控制台进程,协议见 `MAF1.Core/PluginContract`,由网页宿主扫描 |
解决方案文件:`MAF1.slnx``MAF1``MAF1.Web``MAF1.Core`、两个插件工程)。
解决方案文件:`MAF1.slnx``MAF1``MAF1.Route``MAF1.Web``MAF1.Core`、两个插件工程)。
---
@@ -59,6 +60,10 @@ MAF1 是一个基于 **.NET 10** 和 **Microsoft Agents AI** 的多智能体演
│ ├── wwwroot/ # 可视化界面
│ ├── Data/
│ └── appsettings.json
├── MAF1.Route/ # 控制台路由(方案 C)
│ ├── Graphs/ # 白名单图 JSON(有边 / 无边)
│ ├── Data/
│ └── appsettings.json
├── MAF1.Core/ # 共享:Agent、Tool、LLM、插件协议
└── plugins/
├── file-city/
@@ -167,6 +172,23 @@ dotnet run --project MAF1 -- edge Data/not-cities.txt
输入 `1` 或回车结束;输入 `2` 后再填城市名继续查天气;也可以直接输入 `成都`。等待秒数与网页相同,来自 `Workflow:DecisionTimeoutSeconds`
### 5. 命令行路由(方案 C
`MAF1.Route` 用 Microsoft Agents AI 的 **`WithHandoff`** 跑方案 C:图 JSON 是专家白名单,边是允许交接。主管是入口 Agent,框架给每条边注入 `handoff_to_*` 工具,控制权随对话转交。
- **节点** = 白名单。图上没有的类型不能调。
- **有边** = 只能沿边 `WithHandoff``Graphs/city-weather.json`:必须先抽城市再查天气)。
- **无边** = 主管可交接给名单内任一专家(`Graphs/nodes-only.json`:可以直接查「成都」天气)。
抽不到城市时,抽城市专家**不交接**,本轮结束(Handoff 不像工作流 CLI 那样弹确认框)。
```bash
dotnet run --project MAF1.Route
dotnet run --project MAF1.Route -- Graphs/city-weather.json
dotnet run --project MAF1.Route -- Graphs/city-weather.json Data/not-cities.txt
dotnet run --project MAF1.Route -- Graphs/nodes-only.json 请查询成都的天气
```
启动配置:
| 项目 | Profile | 作用 |
@@ -174,12 +196,14 @@ dotnet run --project MAF1 -- edge Data/not-cities.txt
| `MAF1.Web` | `designer` | 网页编排器 |
| `MAF1` | `node` | CLI,节点内判断 |
| `MAF1` | `edge` | CLI,边上判断 |
| `MAF1.Route` | `route` | CLI 路由,有边白名单 |
| `MAF1.Route` | `nodes-only` | CLI 路由,无边自选顺序 |
---
## 配置说明
`MAF1/appsettings.json``MAF1.Web/appsettings.json` 会分别复制到各自输出目录。网页项目额外包含 `Plugins` / `Credentials`。主要段落:
`MAF1/appsettings.json``MAF1.Route/appsettings.json``MAF1.Web/appsettings.json` 会分别复制到各自输出目录。网页项目额外包含 `Plugins` / `Credentials`。主要段落:
### Llm
@@ -413,7 +437,9 @@ AgentRuntime
`MAF1``CliHost``CityWeatherWorkflow`node / edge)→ `WorkflowOrchestration`。缺城市时走 `RequestPort`,与网页同一套默认方案 + 超时。
`MAF1.Core` 被控制台、网页与插件共用,避免两套 Agent 逻辑分叉。
`MAF1.Route``HandoffGraphBuilder``CreateHandoffBuilderWith` + `WithHandoff`)→ Core 里的 FileCity / Weather。图 JSON 决定白名单和允许交接;**原来的 workflow CLI 仍在 MAF1 里。**
`MAF1.Core` 被控制台、路由、网页与插件共用,避免两套 Agent 逻辑分叉。
---
@@ -454,7 +480,7 @@ AgentRuntime
当前 URL 写死为 `127.0.0.1:5288`。关掉占用进程,或临时改 `MAF1.Web/Program.cs` / `MAF1.Web/Properties/launchSettings.json`
**没有自动化测试 / Docker**
仓库目前没有测试项目和容器文件。验证方式:UI 示例图 + CLI `node` / `edge`
仓库目前没有测试项目和容器文件。验证方式:UI 示例图 + CLI `node` / `edge` + `MAF1.Route`
---