sync update from LAN repo (source master @ ca48c4ec)

This commit is contained in:
gozeros committed 2026-11-05 10:53:54 +08:00
1 parent 8bc8b0e082
commit ea9dcff9c0
873 files changed
+107866 -14011

No files matched your search

+70
View File
@@ -0,0 +1,70 @@
# 我的项目
入口:全量与简洁导航中的「我的项目」,路由 `/page/strategy/qa/projects`。旧地址 `/page/workspace/projects` 仅保留兼容跳转,不再展示独立入口或旧页面。
## 使用流程
1. 新建项目,选择普通问答、策略优选或方案生成。三类项目独立保存和展示,方案生成不会复用或标记策略优选项目。
2. 选择项目默认智能体,填写目标、约束等项目说明。新建项目对话时仍可换用另一个可访问的智能体。
3. 创建后进入项目工作区。普通问答项目可包含多条独立问答;方案项目可包含多条方案记录。最近对话根据 `analysis_project_mode` 回到普通问答分组或方案项目。
4. 方案生成可从「工作流配置 · 报告结构」选择、启停、编辑、删除结构,选择后自动填充项目报告结构配置;也可直接编辑大纲及固定/弹性约束。
5. 策略智能项目保存默认 Strategy Lens;每轮依次进行问题重构、各 Lens 独立分析、策略辩论和方案生成,并分为「意图理解」「多视角策略分析」「完整策略方案」三栏。右栏以文档形式给出执行摘要、目标原则、分阶段行动、资源配置、风险应对、评估复盘、形成依据与备选策略切换条件;原始对话和引用仍可切换查看。
6. 策略智能对话底部提供改变约束、增删视角、重新推演和挑战当前策略快捷动作;项目主页面可直接添加或删除 Lens。
模式在创建后不可修改,前后端都不提供修改入口。项目、对话归属和智能体访问权限在服务端校验;方案结构及每条对话所选智能体也以服务端配置为准。
## 普通问答跨会话记忆
- 仅普通问答项目显示「跨会话项目记忆」。它只受项目自身开关控制,与系统「问答记忆」总开关相互独立;成功完成的会话会在后台整理,状态包括等待沉淀、整理中、已就绪和异常。
- 新会话提问时会召回同一账号、同一项目中其他会话的事实、决策、约束、偏好、术语与未决事项。不会读取其他项目或其他账号,也不会混用普通聊天/智能体的通用记忆。
- 项目设置和问答页头部均可打开「项目记忆」面板,查看精简快照、条目可信度/重要度和来源对话;支持手工新增、编辑、固定、删除、清空以及从当前项目历史对话重建。项目暂停后仍可清空已有数据,但不能重建。
- 编辑、删除或清空原对话时,服务端先让对应记忆失效,再修改消息;重建期间不注入旧快照。固定或手工条目在重建时保留,自动条目按来源 checkpoint 时间判断新旧,较早会话不会因后台任务晚完成而覆盖新的纠正。
- 交互问答在首包前使用有界关键词召回,避免等待远程向量编码;后台整理仍可写入向量供显式或离线检索使用,编码不可用不影响跨会话记忆。输入提示块有条数与 token 上限,历史内容只作为非指令资料,当前消息优先。
## 代码与运行
- `src/pages/AnalysisProjectsPage.tsx`:普通问答与方案项目的新建、设置、历史和工作台布局。
- `src/strategy-selection/StrategyProjectsPage.tsx`:「我的项目」三类项目列表及创建入口。
- `src/pages/analysis-projects/ProjectConversation.tsx`:现有聊天、研究进度、方案画布的项目级组合。
- `src/core/analysis-projects/api.ts`:Gateway 项目 API 与按账号隔离的缓存。
- `src/pages/analysis-projects/ProjectMemoryPanel.tsx`:项目记忆状态、快照、来源和管理操作。
- `src/core/analysis-projects/memory-status.ts`:总开关/项目开关、状态和按钮可用性映射。
- 后端:`/api/analysis-projects`,对话仍通过现有 `/api/threads/{thread_id}/runs/*` 流式接口发送;服务端从不可变归属读取项目配置。
启动新版 Gateway 后自动创建项目表。生产持久化依赖已配置的数据库;memory 模式中的项目随服务重启丢失。前端沿用仓库的 Vite 开发与构建命令。
## 验证范围
后端回归命令:在 `offline-backend-20260512/backend` 执行
```shell
python -m pytest tests/test_analysis_projects.py tests/test_deep_research_report_tool.py tests/test_writing_mode_report_middleware.py -q
```
涵盖内存与 SQLite 存储、跨用户隔离、禁止修改模式、运行时覆盖伪造模式与知识库、更新配置、对话归属与失败清理、固定方案模板及知识库资料进入研究管线。
跨会话记忆专项:
```shell
python -m pytest tests/test_analysis_project_memory.py tests/test_analysis_project_memory_store.py tests/test_analysis_project_memory_runtime.py tests/test_analysis_project_memory_integration.py tests/test_analysis_projects.py -q
```
前端专项:`node --experimental-strip-types --test src/core/analysis-projects/memory-status.test.ts`,并执行 `pnpm build`。
部署前还需使用实际知识库和模型验证三类问答、流式断线续接及方案后续修改。接口模拟与单元测试不能替代真实模型联调。
## 2026-09-14 我的项目与知识库验收修复
日常使用复查:我的项目侧栏历史保持 `qa/projects/groups` 上下文,官方侧栏同样识别项目归属;手机选择历史后收起菜单;项目表单不重复显示侧栏按钮。设置保存后默认智能体同步到新对话选择器。读取项目对话失败提供重试,项目列表失败可原地重试。助手知识检索隔离过期响应,清空输入时禁用检索,无结果提供目录入口。ScrollArea 固定为包含 React 19 引用回调修复的 1.2.18。详细记录见 `docs/daily-usage-audit-20260914.md`。
- 简洁模式的「我的项目」列表、策略工作台和普通问答项目恢复工作区功能导航;窄屏提供展开菜单按钮。
- 普通问答先创建具名项目,再在项目内创建多个对话。列表读取 `/api/analysis-projects` 的 `qa` 项目,不再读取、标记或自动归入全局普通聊天。
- 项目设置更新保留既有知识库绑定。旧「项目空间」入口已移除并跳转「我的项目」;普通问答路由为 `qa/projects/groups/*`,方案生成路由为 `qa/projects/solutions/*`。
- 策略生成卡片统一先显示思考/执行过程,再显示正文;评判、方案及展开视图沿用相同顺序。
- 策略优选工作台拆为三步:意图与任务定义、策略生成与智能评判、综合方案生成。第二步不重复展示问答记录,突出当前任务并扩大策略回答、评判正文;第三步将生成过程默认收起并为方案正文保留固定可视空间,集中完成方案生成、Markdown 编辑、项目保存以及 Markdown/Word 直接下载。保存后的项目卡也提供 Markdown/Word 下载;`?module=solution` 直接进入第三步,历史方案即使任务已修改仍可查看下载。
- 资料库把已完成的策略优选综合方案作为独立「策略生成」来源展示,并标注具体策略项目名称;条目可回到策略项目第三步,也可直接下载 Markdown/Word。普通策略项目线程生成的文件沿用原文件下载链路并显示同类来源标识。
- 方案生成使用独立项目和固定报告结构,通过 `deep_research_report` 直接生成并打开方案画布;策略优选项目不再出现在方案生成分类中。
- 知识库管理页读取上游最新目录,避免远端删除后命中旧缓存;检索调用仍共享短期目录缓存。
- 普通用户访问尚未初始化的助手知识库时显示明确空态及刷新按钮。
验证:后端相关回归 273 项、前端策略/项目回归 31 项通过;真实 BAAI/bge-m3 编码、指定库向量检索与草稿隔离通过;本地隔离服务的问答项目创建/分组、真实问答、方案整理、助手库创建/编辑/文件入库/向量检索/详情均通过。完整验收记录见仓库 `docs/ji-knowledge-projects-acceptance.md`。不在源码或文档中保存接口密钥。
@@ -16,7 +16,7 @@
| 事实 | 位置 |
|------|------|
| Step2 编排循环(leader → 顺序派 special → leader … 直到 `dispatched===[]` 共识 / `MAX_CYCLES=8`)**完全由前端 hook 驱动** | `src/roundtable-planning/hooks/useStep2Orchestration.ts:992-1204`(recommend)、`1228-1439`(chain) |
| Step2 编排循环(leader → special → leader …;到全局 `roundtable_room_limit.max_cycles` 配置轮次进入无工具的总控正文收口)**完全由前端 hook 驱动** | `src/roundtable-planning/hooks/useStep2Orchestration.ts`(recommend / chain / dag) |
| 循环由 `currentStep===2` 的 `useEffect` 启停;离开 Step2 的 cleanup 会 `orchestrationCancelRef.current=true` + `abortAllInFlight()` 中断 | `useStep2Orchestration.ts:1468-1541`(尤其 cleanup `1534-1537`、`1471-1477`) |
| 共识判定:`leaderRes.dispatched.length===0` → `setHasConsensus(true)` | `useStep2Orchestration.ts:1091-1099` |
| 进入 Step3:手动点按钮,前置 `hasConsensus===true` | `Step2Panel.tsx:370-381`、`RoundtablePlanningPage.tsx:586-595` |
@@ -456,7 +456,7 @@ checkpoint,一路跑到 Step3 绘制完成。
只有「查看」进去才能回答(或在弹窗里直接给一个回答框,调用 `resumeJob`)。
3. **取消**:流程图弹窗/Step2 提供「停止后台」→ `cancelJob`,`status→cancelled`,前端可恢复本地编辑。
4. **错误恢复**:`error` 事件展示 detail;允许「重试」= 重新 `startJob`(沿用已建 threadIds)。
5. **MAX_CYCLES / 预算**:后台图内兜底(对齐前端 `MAX_CYCLES=8`),到顶强制收敛并照常进 Step3。
5. **max_cycles / 预算**:后台与前端统一读取全局 `roundtable_room_limit.max_cycles`(默认 8,2..100),一次会商启动时锁定;到达配置轮次调用 `finalize_only=True`,关闭全部工具并要求总控输出最终总结正文。不能把到顶表现成“已停止”,也不能跳过总结直接进入 Step3。
6. **多 worker**:严格遵守 Phase 3 的「状态进 DB+checkpointer、SSE 走 loopback」;部署若多 worker
需 sticky 或全靠 DB 态(推荐后者)。
7. **清理**:`roundtable_jobs` cleanup cron(活跃保护、先删 CP 再删 DB),与 draft 生命周期对齐。
@@ -311,13 +311,13 @@ chain 模式的 Step 2 init **完全复用** `initMultiAgent`:`agentNames = ch
### 阶段 3 · 业务链条选择卡片列表(1.5 天) ✅ 已完成
**目标**:弹窗「业务链条」面板里选链条。新增 `components/BusinessChainPicker.tsx`,替换阶段 2 的占位。
- [x] 进入该 Tab 时 `listChains()` 拉本人链条 + `listAgents()` 取存活 id/名称,渲染**卡片列表**:
- [x] 进入该 Tab 时 `listChains()` 拉本人链条渲染**卡片列表**(席位存活/名称用链条响应自带的读时计算富化字段 `seat.available`/`seat.live_name`,**不再实时拉 `listAgents()`**,见 §11):
- [x] 卡片标题(链条 title)+ 「N 席」徽章 + 选中 ✓;描述行。
- [x] 标题下一排**智能体名 tag**:按链条顺序**从左到右**、不同颜色(`getAvatarTypeFor`→`chainTagClasses`),tag 之间插 `→`(`ArrowRightIcon`)箭头连接(`seats[0]` 最左、先发言)。
- [x] 底部「配置链条」按钮(跳 `roundtable/chains`)。
- [x] 空态:无链条时引导「去配置页面创建第一条业务链条」+ 按钮。
- [x] 选中一条 → 高亮(`ring-primary`);底部「进入研讨」`onConfirm({ agents: 存活席位有序, mode:"chain", chain:{id,title} })`。
- [x] 链条里有 agent 已不存在(被删)→ 该 tag 置灰删除线 + `title` 提示 + 卡片下方 amber 警告;confirm 按**存活席位**过滤;存活 < `CHAIN_MIN_SEATS` 则禁用「进入研讨」并提示。agent 列表加载失败时 `existingIds=null` → 不误判删除。
- [x] 链条里有 agent 已不存在(被删)→ 该 tag 置灰删除线 + `title` 提示 + 卡片下方 amber 警告;confirm 按**存活席位**过滤;存活 < `CHAIN_MIN_SEATS` 则禁用「进入研讨」并提示。存活判定改读 `seat.available`(undefined = 旧后端未标注 → 不误判删除)。
- **验收**:✅ typecheck 0 新增错误(总数仍 76)。卡片渲染标题 + 彩色 tag + ← 箭头;选链 → `onConfirm(mode:"chain")` → `handleConfirmAgents` 按链条顺序 `setSelectedAgents` → Step 2 左侧「参与角色」顺序 = 链条顺序(**按顺序派活在阶段 4**)。**人工 UI 验收待跑**。
- **箭头方向**(已确认):tag 左→右排列、`→`(`ArrowRightIcon`)连接,`seats[0]` 最左、先发言,箭头顺读即链条研讨顺序。
@@ -396,5 +396,42 @@ chain 模式的 Step 2 init **完全复用** `initMultiAgent`:`agentNames = ch
| 后端链条持久化 | `offline-backend-20260512/backend/packages/harness/deerflow/persistence/roundtable_chains/` | 新增 |
| 后端链条路由 | `offline-backend-20260512/backend/app/gateway/routers/roundtable_chains.py` | 新增 |
| 后端 store 接线 | `offline-backend-20260512/backend/app/gateway/deps.py`(`app.state.roundtable_chain_store`)+ `app.py` | 改 |
---
## 11. 席位富化:选链不再实时拉智能体列表(2026-10-23)
**背景**:选链全链路(弹窗打开 / 左栏点选 / 深链自动选链)此前每次都额外全量拉
`GET /api/agents`,只为两件事——席位**存活判断**(existingIds)与**最新改名**
(nameById)。慢网下这个大请求严重拖慢选链体验。
**方案**:席位展示所需信息(name 快照本就随链条落库、编辑器保存时刷新)之外,
「存活 + 最新名」由**后端在返回链条时读时计算**:
- `GET /api/roundtable-chains`(list/get/update 等)对每条链每个 seat 附带两个
**只读计算字段**(`ChainSeatResponseSchema`,不落库、create/update 请求 schema
不收,存量 seats JSON 零迁移):
- `available: bool` —— 席位智能体当前对请求用户可见(本人/内置/已发布、非私享、
非管理员隐藏,`agent_store.list_by_ids` 一次批量 SQL)且不是功能型内置
(`roundtable-intent/recommender/coordinator/report` + `roundtable-coordinator-*`
前缀,与前端 `filterRecommendCandidates` 排除集逐字对齐);
- `live_name: string | null` —— 智能体当前名称,查不到为 null。
- best-effort:agent store 不可用时跳过富化(字段缺省),前端按存活处理。
- 前端 `ChainSeat` 增加可选 `available` / `live_name`;`buildChainSeatSelection(chain,
candidates?)` 的 `candidates` 变为可选——不传时存活 = `seat.available !== false`
(undefined = 旧后端 → 视为存活,与旧版「拉取失败不判删」降级语义一致)、名称 =
`live_name ?? name ?? agent_id`。
- 去掉选链路径上的全部 `listAgents()`:`BusinessChainPicker`(打开只剩 1 个
`listChains` 请求)、`BusinessChainListDialog`(列表弹窗)、主页左栏点选
(**零网络请求**)、固定链(8BF 等)与深链自动选链。
- 「智能推荐」Tab 与链条编辑器的智能体池**保留** `listAgents()`——那两处真的需要
完整候选列表。
**兜底**:智能体在选链之后、进 Step 2 之前被删,`/api/multi-agent/init` 的后端
404 硬校验照旧兜底(现状即有,非本次引入)。
**测试**:后端 `tests/test_roundtable_chain_seat_enrichment.py`(纯函数 + schema
不落库 + store 往返);前端 `src/roundtable-planning/lib/business-chain.test.ts`
(`pnpm run test:business-chain`,esbuild 打包后 node:test)。
</content>
</invoke>
@@ -394,8 +394,8 @@ while !cancelled && cycles < MAX_CYCLES:
setConsensusPercentage(prev => min(95, prev + 8))
nextLeaderTask = "各子智能体已就上一轮派活完成交付,请你结合最新结论..."
if cycles >= MAX_CYCLES:
toast("⏱️ 已达到最大研讨轮次,自动停止以避免循环")
if cycles == configuredMaxCycles:
leader(finalizeOnly: true, tools: [], prompt: "直接综合已有交付并输出最终正文")
clearAllStreamingSpeakers()
isOrchestrating = false
@@ -695,7 +695,7 @@ window.__MULTI_AGENT_DEBUG__ = true; // stream 帧计数(默认开)
### 12.3 调整 Step 2 编排上限
`RoundtablePlanningPage.tsx` 内 `MAX_CYCLES = 8`,超出会 toast「⏱️ 已达到最大研讨轮次,自动停止以避免循环」。若放宽:注意 `step2RoundtableDialogues` 数组会线性增长,超长讨论需要考虑虚拟滚动。
收口轮数来自全局设置 `roundtable_room_limit.max_cycles`(管理员设置弹窗「会商并发与收口」,默认 8、范围 2..100),旧服务端或读取失败时回退 `DEFAULT_MAX_CYCLES=8`。一次编排启动时锁定当时值;到达该轮不是停止,而是切换为 `finalizeOnly` 纯正文收口:总控禁用全部工具,综合已经取得的席位交付并输出最终方案;个别席位失败时如实标明缺口。前后台执行路径必须保持一致。
### 12.4 把 special 改回并行
@@ -1,5 +1,7 @@
# 技能知识归纳与“知识梳理”助手知识库
助手知识库的目录、正文、来源和任务记录读取已提交快照,不等待后台导入的全局写锁,也不重复统计整库内容。导入仍在提交前完成实体及 Wiki 对齐,旧数据在检索、导出时保留兼容对齐。页面和展示权限的读取支持取消及 30 秒超时,失败显示可重试错误,避免一直加载;大目录分页失败后停止自动续页并保留已加载正文。来源列表仅在打开「来源与同步」或「导入 / 导出记录」时请求。
管理员在「技能管理 → 技能知识归纳」中选择一个或多个技能、一个或多个目标,系统按“技能 × 目标”创建后台任务。界面提供总体进度、单项失败重试、实体/关系审核、绑定重归纳、自动同步和两种解绑动作。技能列表通过一次 bindings 查询展示归纳目标,避免逐技能请求。
扫描仅处理知识资料。代码、脚本、锁文件、密钥文件以及 Markdown 代码块不会进入上传、摘要、提示词或知识指纹;ZIP 只读取逐项验证通过的知识成员。自动监听只比较该知识指纹,所以纯代码改动不会产生 stale 状态。
@@ -0,0 +1,977 @@
# 多智能体会商功能与接口梳理
## 1. 文档范围与入口
本文梳理的是常规「多智能体会商 / 圆桌规划」页面 `RoundtablePlanningPage` 的完整三步流程:
1. 任务意图理解
2. 多智能体研讨
3. 方案结果展示
主入口为 `/page/workspace/qa/multi-agent-roundtable`。它也可由任务深链 `3qfx-A`、`rwfx-A`、`xdfx-A` 打开,分别挂载在任务管理下的三情、任务、行动业务路由中;另有 `#/embed/roundtable` 嵌入入口。
任务深链会预填任务名称、任务目标、业务编码和任务 ID,并自动选择对应业务链:
| 深链 | 业务编码 | 嵌入路由 |
| --- | --- | --- |
| `3qfx-A` | `3Q` | `/page/strategy/task-management/plan-task-sentiment/roundtable` |
| `rwfx-A` | `6BF` | `/page/strategy/task-management/plan-task/plan-task-fx/roundtable` |
| `xdfx-A` | `7BF` | `/page/strategy/task-management/plan-task/plan-task-action/roundtable` |
> 本文不展开独立的阵位会商,以及仅展示报告的 8BF 变体。8BF 复用了部分组件,但其第三步为 `report-only`,不属于常规三步会商主路径。
## 2. 公共机制
### 2.1 会商记录与保存
功能:
- 保存任务意图、研讨过程、会商结论、第三步报告及当前已完成步骤。
- 支持新建会商、历史记录切换、重命名、删除和从已有记录继续。
- 普通入口按当前用户隔离;任务深链按任务共享,进入同一任务的用户看到同一批会商和后台任务。
- 更新使用乐观锁;版本不一致时后端返回 `409`,前端应以服务端最新记录为准后再处理。
接口:
| 场景 | 接口 | 调用方式与参数 |
| --- | --- | --- |
| 普通会商列表 | `GET /api/roundtable-drafts` | 无请求体,按当前用户返回。 |
| 新建普通会商 | `POST /api/roundtable-drafts` | JSON:`{ id?, title, furthest_step, step1, step2, step3 }`。 |
| 读取/更新/删除普通会商 | `GET/PUT/DELETE /api/roundtable-drafts/{draftId}` | `PUT` 传需更新字段及 `expected_version`。 |
| 任务会商列表 | `GET /api/roundtable-task-drafts/by-task/{taskId}` | `taskId` 为任务 ID。 |
| 读取最新任务会商 | `GET /api/roundtable-task-drafts/by-task/{taskId}/latest` | 用于任务进入后恢复最近一次会商。 |
| 新建任务会商 | `POST /api/roundtable-task-drafts` | JSON:`{ id?, task_id, title, furthest_step, step1, step2, step3 }`。 |
| 读取/更新/删除任务会商 | `GET/PUT/DELETE /api/roundtable-task-drafts/{draftId}` | `PUT` 为局部更新并携带 `expected_version`。 |
参数说明:
- `step1`、`step2`、`step3` 保存的是各步骤可恢复的完整页面状态,而不是单一文本。
- `furthest_step` 记录用户历史上到达的最远步骤,用于恢复导航可用性。
- `xdfx-A` 的页面记录和后台任务分区使用 URL 原始行动 ID;任务正文及任务详情仍使用解析后的实际任务 ID。
### 2.2 流式调用与附件
功能:
- 大模型回复、意图澄清、推荐、研讨、报告和流程图均通过 SSE 增量返回。
- 用户可停止当前流;前端按事件逐段追加正文、思考、工具调用、澄清卡片和错误信息。
- 有文件时先上传到对应线程,再将后端返回的虚拟路径传给后续流式接口。
附件接口:
```http
POST /api/threads/{threadId}/uploads
Content-Type: multipart/form-data
files: <file> # 可重复,支持多文件
```
响应中的 `{ filename, size, virtual_path }` 应转换后传入流式请求:
```json
{
"files": [
{
"filename": "任务材料.docx",
"size": 10240,
"path": "/mnt/user-data/uploads/任务材料.docx",
"status": "uploaded"
}
]
}
```
所有 JSON 接口经前端 `apiFetch` 调用,自动携带当前登录态;流式接口使用 `ReadableStream` 解析 SSE。
---
# 第一步:任务意图理解
## 1. 功能
第一步将用户的自然语言任务转成可供多个智能体研讨的结构化意图,并确定后续参会智能体来源。
- 创建内置「任务意图理解」智能体会话,接收任务描述、补充材料和多轮追问。
- 流式展示智能体回复、思考过程和工具型澄清问题。
- 澄清卡支持单选、多选、自定义填写、跳过和继续追问;同一轮可返回多张澄清卡。
- 意图完成后生成可编辑的结构化摘要:目标(`objective`)、约束(`constraints`)、可选假设(`assumptions`)。
- 支持手工修改意图摘要后再进入下一步。
- 智能体选择有两条路径:
- **智能体推荐**:依据意图,在可用智能体候选池中推荐参会人及理由。
- **业务链条**:选择已配置的业务链条,带入席位、阶段、阶段目标、协调人提示词和席位模型策略。
- 任务深链模式自动加载任务卡片、预填任务上下文并自动选择业务链;普通模式在“选择参会智能体”弹窗中手工选择“我的”或“公共”业务链。
步骤流转:
```text
输入任务 / 上传材料
↓
意图智能体澄清(可多轮)
↓
结构化意图完成并可编辑
↓
智能体推荐 或 选择业务链
↓
进入第二步
```
### 1.1 业务链功能与两个弹窗
业务链是可命名、可复用、可保存的“智能体编排模板”,不是单纯的智能体名单。一条链定义了谁参会、谁先后执行、哪些席位并行、每阶段应产出什么,以及协调人如何派发和汇总。
第一步中有两个职责不同的业务链入口:
| 入口 | 弹窗/页面 | 作用 | 是否直接开始研讨 |
| --- | --- | --- | --- |
| 页面顶栏“业务链条” | BusinessChainListDialog | 浏览、筛选、启停、发布、进入配置页编辑业务链。 | 否,它是管理入口。 |
| 意图完成后点击“选择参会智能体 / 进入研讨” | RecommendAgentsDialog 的“业务链条”页签,内部为 BusinessChainPicker | 从可用链中选择一条,校验席位后把编排结果带入第二步。 | 是,确认“进入研讨”后开始第二步。 |
#### A. 选择参会智能体弹窗中的“业务链条”页签
功能:
- 弹窗有“智能体推荐”和“业务链条”两个页签;切换到业务链条后不会调用推荐模型,而是读取已保存的链条。
- 可在“我的 / 公共”之间筛选:
- **我的**:当前用户创建的业务链。
- **公共**:已发布、所有账号都可查看和选用的业务链。
- 每张链条卡展示链条名称、描述、席位数和席位编排流:
- 线性链用“智能体 A → 智能体 B → 智能体 C”表示顺序。
- 同一阶段有多个席位时显示“并行 N”分组;阶段之间仍用箭头表示串行依赖。
- 实时智能体名称优先于链条保存时的名称快照;已删除智能体会置灰并提示。
- 仅启用的链条可进入选择列表;选中链条后,至少保留 **2 个仍存在的可用席位** 才能点击“进入研讨”。
- 如果链条配置了默认执行模式,弹窗顶部的执行模式会自动带入该值,用户仍可临时改为:
- flash:快速,不开启思考。
- thinking:思考,低推理强度。
- pro:专业问答,思考 + 中等推理强度。
- ultra:多智能体问答,思考 + 高推理强度,并允许席位调用子代理。
- 如果链条含有有效分层、阶段目标或协调人提示词,选择后按 dag 编排;否则按 chain 线性编排。
- DAG 链在弹窗底部额外选择执行方式:
- **快速 · 双列禁写**:同阶段席位并行,主区双列展示,并行席位不写文件。
- **沙箱 · 单列可写**:同阶段仍并行,但主区单列展示,允许文件产出,右侧沙箱随当前席位切换。
- “配置链条”按钮跳转到业务链编辑页;没有链条时也会显示“去配置业务链条”引导。
确认后传给第二步的运行结果可概括为:
~~~json
{
"agents": [
{
"agent_id": "agent-001",
"name": "态势专家",
"model": "该席位模型覆盖,可为空",
"seat_skill_directive": true,
"human_validation": false,
"seatMode": "该席位推理深度覆盖,可为空"
}
],
"mode": "chain | dag",
"chain": {
"id": "chain-id",
"title": "任务综合研判链"
},
"plan": {
"stages": "仅 dag 时携带的分层执行计划"
},
"dagExecMode": "fast | sandbox",
"seatMode": "本次会商的链条级执行模式",
"gatherFirst": true
}
~~~
其中,席位数组的顺序就是线性链执行顺序;DAG 时按阶段展平。单席位的 seatMode、模型覆盖、技能识别强化和人工校验会一并继承到第二步。
#### B. 顶部“业务链条”管理弹窗
功能:
- 顶栏点击“业务链条”打开,定位为“浏览和管理”,不直接选择参会人。
- 支持按 **我的 / 公共 / 全部(仅管理员)** 筛选,再按 **全部状态 / 启用 / 停用** 过滤。
- 每张卡片展示:
- 名称、描述、席位数量;
- 公共、待审核、已停用等状态;
- 配置人和最后修改时间;
- 智能体编排流:同 Stage 的席位用“并行 N”分组,Stage 之间以箭头连接。
- 本人链条或管理员可在卡片上:
- 启用 / 停用;
- 发布为公共、取消发布;
- 草稿链提交审核,审核中可撤回;
- 点击“设置”跳转到该链条的编辑页。
- 新建和编辑页面包含:
- **基本信息**:标题、描述、默认执行模式、研讨前并行取数开关、总控提示词。
- **链条编排**:从候选智能体池拖拽到 Stage;可新建、删除、上下移动 Stage,移动/拆分/合并席位。
- **阶段目标**:每个 Stage 可填写目标,并可使用 AI 优化;阶段目标会指导协调人该阶段产出什么、如何承接前一阶段结果。
- **总控提示词**:说明协调人如何派发、汇总、收口,支持 Markdown 和 AI 优化。
- **席位级配置**:模型覆盖、推理深度覆盖、会商技能识别强化、人工校验;岗位协同专用入口还可配置岗位归属和产物位置。
- **编排预览**:以流程图检查“同层并行、层间串行”的最终结构。
两个业务链弹窗的页面结构:
~~~text
顶部“业务链条”管理弹窗
┌ 标题和说明 ───────────────────────────────────────────────────────────┐
│ 筛选:我的 / 公共 / 全部(管理员) | 全部状态 / 启用 / 停用 │
├ 业务链卡片列表 ───────────────────────────────────────────────────────┤
│ 名称、席位数、公共/待审核/停用状态、配置人、更新时间、说明 │
│ 智能体 A → [并行:智能体 B、智能体 C] → 智能体 D │
│ 操作:启停 / 发布或撤回 / 设置 │
├───────────────────────────────────────────────────────────────────────┤
│ 底部:配置(新建或跳转到业务链编辑页) │
└───────────────────────────────────────────────────────────────────────┘
“选择参会智能体”弹窗的业务链页签
┌ 顶部:智能体推荐 | 业务链条 | 本次执行模式(快速/思考/专业/多智能体)┐
│ 筛选:我的 / 公共 │
├ 链条选择卡片 ─────────────────────────────────────────────────────────┤
│ 名称、描述、席位数、线性/分层编排、已删除席位告警 │
├───────────────────────────────────────────────────────────────────────┤
│ DAG 链:快速·双列禁写 | 沙箱·单列可写 │
│ 底部:配置链条 | 取消 | 进入研讨 │
└───────────────────────────────────────────────────────────────────────┘
~~~
## 2. 接口、调用时机与传参
### 2.1 初始化意图会话
```http
POST /api/intent/init
Content-Type: application/json
```
```json
{
"model": "模型标识,可选,使用页面当前模型",
"task_context": {
"task_id": "任务深链时的任务 ID",
"task_name": "任务名称",
"task_goal": "任务目标",
"business_code": "3Q | 6BF | 7BF"
},
"intent_agent_id": "roundtable-intent"
}
```
说明:
- 普通会商一般省略 `task_context`,`intent_agent_id` 也可省略并由后端使用内置 `roundtable-intent`。
- 返回 `{ status, agent_id, thread_id }`;后续上传与流式对话都使用此 `thread_id`。
### 2.2 发送任务或回答澄清问题
```http
POST /api/intent/stream
Accept: text/event-stream
```
```json
{
"thread_id": "意图会话线程 ID",
"message": "用户任务描述,或对澄清问题的答案",
"model": "页面当前模型,可选",
"intent_agent_id": "roundtable-intent",
"task_context": {
"task_id": "任务 ID",
"task_name": "任务名称",
"task_goal": "任务目标",
"business_code": "业务编码"
},
"client_turn_id": "前端生成的幂等 ID",
"files": [
{
"filename": "材料.pdf",
"size": 10240,
"path": "/mnt/user-data/uploads/材料.pdf",
"status": "uploaded"
}
]
}
```
主要 SSE 完成帧字段:
```json
{
"status": "asking | clarification | done | error",
"content": "本轮可见回答",
"summary": {
"objective": "任务目标",
"constraints": ["约束 1"],
"assumptions": ["可选假设"]
},
"question": "单个澄清问题",
"clarifications": ["多个澄清问题"],
"clarification_type": "single | multiple | text",
"clarification_context": {},
"options": ["选项 A", "选项 B"],
"allow_custom": true,
"allow_multiple": false,
"error_detail": "失败原因"
}
```
调用要点:
- `client_turn_id` 用于避免重试或网络抖动造成同一用户轮次重复执行。
- 用户选项、填写的自定义答案、点击“继续/跳过”后,仍通过本接口的 `message` 继续同一 `thread_id`。
- 上传接口必须先于本接口调用;流式接口只传上传成功后的虚拟路径。
### 2.3 获取候选智能体和执行推荐
```http
GET /api/agents
```
前端从返回列表中排除内置工具型智能体,将可参会的候选人整理成:
```json
{
"agent_id": "agent-001",
"name": "态势研判专家",
"description": "负责态势信息研判"
}
```
```http
POST /api/recommend/stream
Accept: text/event-stream
```
```json
{
"intent": {
"objective": "形成处置建议",
"constraints": ["时限 24 小时"],
"assumptions": ["数据可访问"]
},
"candidates": [
{
"agent_id": "agent-001",
"name": "态势研判专家",
"description": "负责态势信息研判"
}
],
"model": "页面当前模型"
}
```
推荐完成帧可得到:
```json
{
"status": "done",
"content": "推荐过程说明",
"picks": [
{
"agent_id": "agent-001",
"reason": "与任务目标的匹配理由"
}
]
}
```
普通会商会额外保存推荐记录,便于恢复和审计:
| 接口 | 参数 |
| --- | --- |
| `GET /api/roundtable-drafts/{draftId}/recommendations` | 无请求体,读取该草稿的推荐历史。 |
| `POST /api/roundtable-drafts/{draftId}/recommendations` | `{ objective, status, model?, rationale?, picks, candidates }`。 |
### 2.4 读取、选择和管理业务链
| 接口 | 调用方式与参数 |
| --- | --- |
| `GET /api/roundtable-chains?scope=public\|mine\|pending\|all` | 获取业务链列表;入口页通常读取公开链。 |
| `GET /api/roundtable-chains/{id}` | 获取某条业务链完整定义。 |
| `POST /api/roundtable-chains` | 新建业务链。 |
| `PUT /api/roundtable-chains/{id}` | 更新业务链。 |
| `DELETE /api/roundtable-chains/{id}` | 删除业务链。 |
| `POST /api/roundtable-chains/optimize-prompt` | 使用模型优化总控提示词或阶段目标。 |
读取与弹窗行为:
- “选择参会智能体”弹窗调用 GET /api/roundtable-chains(我的)或 GET /api/roundtable-chains?scope=public(公共),并同时调用 GET /api/agents 校验每个席位是否仍存在。
- 顶部管理弹窗在管理员身份下还可调用 scope=all;scope=pending 用于待审核链的管理场景。非管理员请求 all/pending 时后端会退化为当前用户范围。
- 启用状态为 false 的链条仍可在管理弹窗查看,但不会出现在“选择参会智能体”弹窗中。
创建或更新业务链的核心参数示例:
```json
{
"title": "任务综合研判链",
"description": "先收集信息,再由专家研讨",
"seats": [
{
"agent_id": "agent-001",
"name": "态势专家",
"description": "分析外部态势",
"model": "模型标识",
"seat_skill_directive": true,
"human_validation": true,
"seat_mode": "flash"
}
],
"stages": [["agent-001", "agent-002"], ["agent-003"]],
"stage_goals": ["平行收集信息", "汇总形成判断"],
"coordinator_prompt": "协调人需要按风险、机会、建议汇总",
"seat_mode": "flash",
"gather_first": true
}
```
其中:
- 链条创建时前端使用驼峰字段 stageGoals、coordinatorPrompt、seatMode、gatherFirst;请求发送前映射为接口字段 stage_goals、coordinator_prompt、seat_mode、gather_first。更新时传 null 可清除分层、阶段目标、总控提示词或默认执行模式。
- `stages` 表示 DAG 分层:同层可并行,不同层按顺序执行。
- `seat_mode` / 席位 `seat_mode` 可取 `flash`、`thinking`、`pro`、`ultra`。
- model 为空时,该席位跟随第二步页面的全局模型;有值时仅覆盖该席位。
- seat_skill_directive: true 会在该席位运行时强化其技能识别和使用指令;它与智能体自身同名开关任一开启即可生效。
- `human_validation: true` 表示该席位输出后需要人工确认才可继续。
- `gather_first: true` 表示先让全部席位平行收集信息,再进入正式研讨。
发布、审核和启停均通过更新接口发送局部字段:
| 操作 | PUT /api/roundtable-chains/{id} 请求体 |
| --- | --- |
| 启用 / 停用 | { "enabled": true } / { "enabled": false } |
| 直接发布 / 取消发布 | { "is_public": true } / { "is_public": false } |
| 提交审核 / 撤回审核 | { "pending_review": true } / { "pending_review": false } |
| 管理员审核发布 | { "is_public": true, "pending_review": false } |
提示词优化接口的请求示例:
~~~json
{
"prompt_text": "当前总控提示词或阶段目标原文",
"kind": "coordinator | stage_goal",
"context": "链条标题、各阶段席位及已有阶段目标组成的上下文",
"model_name": "可选模型标识"
}
~~~
返回:
~~~json
{
"optimized": "可直接回填到总控提示词或阶段目标编辑框的文本"
}
~~~
## 3. 页面结构
```text
┌──────────────────────────────── 页面顶部 ────────────────────────────────┐
│ 三步导航:①任务意图理解 ②多智能体研讨 ③方案结果展示 │
│ 业务链 / 新建或重新分析 / 保存草稿 / 历史记录 / 模型选择 / 设置 │
└───────────────────────────────────────────────────────────────────────┘
┌──────────── 左侧入口栏 ───────────┬──────────── 中间工作区 ────────────┬──── 右侧摘要栏 ────┐
│ 任务卡(仅任务深链) │ Step1 对话面板 │ 当前模型选择 │
│ 业务链列表与展开关系 │ - 意图智能体消息 │ 结构化意图摘要 │
│ 会商/分析历史记录 │ - 思考、工具、澄清卡 │ - 目标 │
│ │ - 输入框、附件、发送/停止/继续 │ - 约束 │
│ │ │ - 假设,均可编辑 │
└───────────────────────────────────┴────────────────────────────────────┴────────────────────┘
```
任务深链还会显示任务目的入口和底部 `TaskJumpBar` 快捷跳转栏;任务模式隐藏手工选择业务链的入口,以深链业务编码自动选择链条。
---
# 第二步:多智能体研讨
## 1. 功能
第二步以第一步意图和选定智能体/业务链为输入,创建协调人与多个席位智能体,进行可观察、可干预、可恢复的会商。
- 为每位参会智能体和协调人创建独立线程。
- 支持三种编排模式:
- **推荐模式(recommend)**:协调人自由决定调度哪些推荐智能体。
- **链条模式(chain)**:按业务链指定的席位顺序执行。
- **DAG 模式(dag)**:同阶段并行、跨阶段串行;可传入阶段目标和协调人提示词。
- DAG 支持 `fast` 与 `sandbox` 执行视图。快速模式会限制并行席位写文件;沙箱模式可产出和预览文件。
- 可选“先收集后研讨”:全部席位先并行收集资料,再将有效交付共享给正式研讨。
- 协调人可继续派发、发起人工澄清,或在不再派发时形成共识。
- 用户可暂停/继续本地编排,回答协调人的澄清问题,向协调人追加文字或附件。
- 席位可配置人工验证点;达到验证点后需人工确认。
- 支持打开角色画像抽屉,在下一次运行前调整单席位模型和运行策略。
- 实时展示角色状态、对话、思考、工具调用、阶段流图、并行席位、文件产物和人工参与记录。
- 每次重新推荐或选择链条都会创建独立“研讨运行快照”;历史运行互不覆盖,可在左侧切换查看。
- 支持将长时间会商转入后台任务。后台任务可被同一任务的其他用户看到、跟踪、继续回答或接管。
步骤门槛:
- 只有第一步的 `intentReady` 为真时,第二步可进入。
- 协调人形成共识(`hasConsensus`)后,第三步才可进入。
## 2. 接口、调用时机与传参
### 2.1 初始化所有参会线程
```http
POST /api/multi-agent/init
Accept: text/event-stream
```
```json
{
"agent_names": ["agent-001", "agent-002"],
"main_agent_name": "coordinator",
"model": "页面当前模型,可选"
}
```
说明:
- `agent_names` 为选中的席位智能体标识。
- `main_agent_name` 为协调人标识。
- SSE 依次返回席位就绪、协调人就绪和初始化完成事件,最终得到线程映射:
```json
{
"thread_ids": {
"agent-001": "席位线程 ID",
"agent-002": "席位线程 ID",
"coordinator": "协调人线程 ID"
}
}
```
### 2.2 驱动协调人和席位研讨
```http
POST /api/multi-agent/run/stream
Accept: text/event-stream
```
基础请求:
```json
{
"agent_type": "leader | special",
"agent_name": "coordinator 或席位 agent ID",
"display_name": "页面展示名称",
"d_agent_thread_id": {
"coordinator": "协调人线程 ID",
"agent-001": "席位线程 ID"
},
"new_message": "给协调人或席位的本轮提示词",
"model": "模型标识",
"business_code": "3Q | 6BF | 7BF",
"files": []
}
```
关键参数:
| 参数 | 适用对象 | 用途 |
| --- | --- | --- |
| `agent_type: "leader"` | 协调人 | 由协调人分析现状、派发席位或形成共识。 |
| `agent_type: "special"` | 席位、总结/报告等专用智能体 | 执行专业分析、总结或文件生成。 |
| `d_agent_thread_id` | 全部 | 是“智能体 ID → 线程 ID”的映射,不是单一线程 ID。 |
| `thinking_enabled?` | 席位 | 是否启用思考。 |
| `reasoning_effort?` | 席位 | 推理强度。 |
| `subagent_enabled?` | 席位 | 是否允许席位再调用子智能体。 |
| `seat_skill_directive?` | 席位 | 席位特定的技能使用指令。 |
| `parallel_no_file?` | 并行席位 | 快速并行时限制文件写入。 |
| `peer_deliveries?` | 后续席位/协调人 | 传递前序席位可见交付物。 |
| `synthesis_mode?` | 协调人 | 指示汇总类执行。 |
| `suppress_pre_broadcast?` | 协调人 | 控制汇总前广播。 |
| `skill_stop_names?` | 全部 | 指定需要拦截/停止的技能名称。 |
流式完成后前端重点读取:
```json
{
"dispatched": ["agent-001"],
"content": "可见回答或结论",
"agentName": "本次完成者",
"modelUsed": "实际使用模型",
"clarification": {
"question": "需要用户回答的问题",
"options": ["选项 A"]
},
"invalidDelivery": false
}
```
编排规则:
- 协调人先运行并决定需调度的席位。
- 每个席位完成后,将其“可见回答”作为交付物回传,思考内容不作为席位交付。
- 链条模式按链定义的顺序运行;DAG 模式同层并行、阶段间串行。
- 协调人返回不再派发且无待答澄清时,前端将结果标记为共识。
### 2.3 产物查看与下载
| 接口 | 调用方式 |
| --- | --- |
| `GET /api/threads/{threadId}/artifacts` | 查询指定协调人或席位线程的文件产物。 |
| `GET /api/threads/{threadId}/artifacts/{path}` | 预览或下载文件;下载时前端附加 `?download=true`。 |
### 2.4 后台会商任务
开始后台任务:
```http
POST /api/roundtable-jobs
Content-Type: application/json
```
```json
{
"requestId": "前端请求 ID",
"draftId": "会商草稿 ID",
"taskId": "任务深链时的任务 ID",
"intent": {
"objective": "任务目标",
"constraints": ["约束"],
"assumptions": ["假设"]
},
"agents": [
{
"agentId": "agent-001",
"name": "态势专家"
}
],
"model": "当前模型",
"orchestrationMode": "recommend | chain | dag",
"chain": {
"id": "chain-id",
"title": "业务链名称"
},
"orchestrationPlan": {},
"seedMessage": "首次给协调人的提示",
"threadIds": {
"coordinator": "线程 ID",
"agent-001": "线程 ID"
},
"coordinatorName": "协调人名称",
"seat_skill_directives": {
"agent-001": true
},
"seat_modes": {
"agent-001": "thinking"
},
"gather_first": true,
"business_code": "3Q",
"thinking_enabled": true,
"reasoning_effort": "medium",
"subagent_enabled": false
}
```
后台任务接口:
| 接口 | 调用方式与参数 |
| --- | --- |
| `GET /api/roundtable-jobs?draft_id={draftId}&task_id={taskId}` | 获取草稿/任务关联的后台任务列表。任务模式需带 `task_id`。 |
| `GET /api/roundtable-jobs/{jobId}?task_id={taskId}` | 获取任务快照。 |
| `GET /api/roundtable-jobs/{jobId}/stream?task_id={taskId}` | SSE 跟踪后台任务完整进度。 |
| `POST /api/roundtable-jobs/{jobId}/resume?task_id={taskId}` | JSON:`{ answer }`,用于回答后台任务等待的人工问题。 |
| `POST /api/roundtable-jobs/{jobId}/cancel?task_id={taskId}` | 取消后台任务;前台接管时也会先结束后台执行。 |
状态和阶段:
| 分类 | 枚举 |
| --- | --- |
| 任务状态 | `queued`、`running`、`awaiting_input`、`done`、`error`、`cancelled` |
| 执行阶段 | `initializing`、`leader_thinking`、`dispatching`、`consensus`、`summary_writing`、`report_drawing`、`report_done` |
## 3. 页面结构
```text
┌──────────────────────────────── 页面顶部 ────────────────────────────────┐
│ 三步导航 / 会商记录 / 模型选择 │
└───────────────────────────────────────────────────────────────────────┘
┌──────────── 可收起左栏 ───────────┬──────────── 中间研讨区 ─────────────┬──── 右侧沙箱区 ────┐
│ 意图摘要 │ 顶部:模型、暂停/继续、转后台 │ Step2SandboxLayout │
│ 角色列表与席位筛选 │ DAG 流程缩略图、并行席位切换 │ 文件/网页预览 │
│ 人工参与/验证状态 │ 对话时间线:协调人、席位、工具、思考 │ 产物查看和下载 │
│ 多次研讨运行快照切换 │ 澄清问题卡、人工确认卡 │ 打开时左栏自动收起 │
│ 任务概览(任务深链) │ 底部:追加消息、附件、发送 │ │
└───────────────────────────────────┴─────────────────────────────────────┴────────────────────┘
```
页面展示规则:
- 角色卡显示席位状态、当前轮次、模型和是否等待人工确认。
- 对话区可按角色筛选,思考内容默认折叠,工具调用和交付物以步骤卡展示。
- DAG 研讨可打开流程面板观察阶段、依赖和并行关系。
- 打开沙箱/产物预览后,优先保证产物可读区域,左侧栏自动收起。
---
# 第三步:方案结果展示
## 1. 功能
第三步基于第一步意图、第二步席位交付和协调人共识,生成可阅读、可修改、可下载、可继续加工的最终方案。
- 首次进入常规会商第三步时,启动三个相互独立的产出流:
- **方案总结报告**:生成 Markdown 方案,是默认主界面。
- **经典可视化报告**:生成 HTML 风格报告/仪表盘。
- **结构化仪表盘**:生成 `report-json`,由前端 `DashboardApp` 渲染。
- 三条流以约 0 / 300 / 600 ms 错峰启动,减少瞬间请求峰值,但互不等待。
- 已保存草稿再次打开时优先恢复既有结果,不重复生成;切换到新会商运行时会终止旧运行的活跃流。
- Markdown 报告完成后,常规模式自动调用流程图提取,生成 `flow-json` 结构化流程图。
- 用户可对报告提问、要求重写、修改流程图、重新生成流程图或报告。
- 任务深链可根据业务链层次和业务编码生成任务 → 目的 → 行为体等结构;行动业务会使用行动名称作为根节点。
- 若任务和技能条件满足,可选择“现在导入 / 稍后导入 / 不再导入”,把报告和流程结构交给 `roundtable-structure` 进行任务结构化入库。
- 左侧汇集协调人共识、各席位交付和文件;右侧可预览 Markdown、流程图及沙箱产物。
- 支持下载会商文档和智能体产物。任务模式还可将选定产物提交到任务交付接口。
## 2. 接口、调用时机与传参
### 2.1 初始化第三步专用智能体
| 目标 | 接口 | 返回 |
| --- | --- | --- |
| Markdown 方案总结 | `POST /api/multi-agent/summary/init` | `{ agent_name, thread_id }` |
| 经典可视化报告 | `POST /api/multi-agent/report/init` | `{ agent_name, thread_id }` |
| 结构化仪表盘 | `POST /api/multi-agent/dashboard/init` | `{ agent_name, thread_id }` |
| 任务结构化入库 | `POST /api/multi-agent/structure/init` | `{ agent_name, thread_id }` |
初始化请求体均为:
```json
{}
```
各专用智能体初始化后,均继续通过统一接口 `POST /api/multi-agent/run/stream` 运行。
### 2.2 生成或修改 Markdown 方案总结
```json
{
"agent_type": "special",
"agent_name": "roundtable-summary",
"display_name": "方案总结报告",
"d_agent_thread_id": {
"roundtable-summary": "总结线程 ID"
},
"new_message": "包含结构化意图、席位交付、协调人共识、链条提示词的生成或修改指令",
"model": "当前模型",
"business_code": "3Q",
"files": []
}
```
功能覆盖:
- 首次生成 Markdown 报告。
- 在报告下方继续问答或下达修改指令。
- 支持暂停、继续、重新生成和生成后下载 Docx。
- 上述问答与修改沿用同一总结线程,保证上下文连续。
### 2.3 生成经典报告和仪表盘
经典报告请求使用 `roundtable-report`:
```json
{
"agent_type": "special",
"agent_name": "roundtable-report",
"d_agent_thread_id": {
"roundtable-report": "报告线程 ID"
},
"new_message": "包含意图、席位交付、共识、主题模式、修订要求和已有 HTML 的提示词",
"model": "当前模型"
}
```
结构化仪表盘请求使用 `roundtable-dashboard`:
```json
{
"agent_type": "special",
"agent_name": "roundtable-dashboard",
"d_agent_thread_id": {
"roundtable-dashboard": "仪表盘线程 ID"
},
"new_message": "包含意图、席位交付、共识,或对已有仪表盘的修订要求",
"model": "当前模型"
}
```
前端依据返回的 HTML 或 `report-json` 分别渲染经典报告和 `DashboardApp`,并提供全屏、在新窗口打开、继续优化以及切回经典报告的操作。
### 2.4 自动提取和修改流程图
```http
POST /api/flow-extract/stream
Accept: text/event-stream
```
```json
{
"report_md": "Markdown 完整报告",
"seat_deliveries": [
{
"sender": "态势专家",
"content": "席位可见交付"
}
],
"chain_levels": [["信息收集"], ["研判决策"]],
"coordinator_prompt": "协调人对结构层次的要求",
"business_code": "3Q",
"root_label": "任务根节点名称",
"model": "当前模型",
"current_graph": {
"nodes": [],
"edges": []
},
"instruction": "用户对当前流程图的修改要求"
}
```
参数使用规则:
- 首次自动提取可不传 `current_graph` 和 `instruction`。
- 修改现有图时传当前图和用户要求。
- 任务模式的 `chain_levels` 由业务链阶段目标推导;若 `coordinator_prompt` 明确规定层次,则优先使用该要求。
流中包含提取增量、校验过程、模型切换和最终图数据,最终形成前端 `FlowGraphPanel` 使用的 `flow-json`。
### 2.5 判断用户在第三步的意图
| 接口 | 请求体 | 返回用途 |
| --- | --- | --- |
| `POST /api/flow-extract/intent` | `{ message, has_report, has_flow, can_ingest, model? }` | 分类为 `regenerate_report`、`modify_flow`、`regenerate_flow`、`ingest`、`qa`、`unclear`,决定继续调用哪一条流。 |
| `POST /api/flow-extract/ingest-intent` | `{ message, model? }` | 在已提示导入或稍后导入时,判断 `start_ingest`、`add_data`、`other`、`unclear`。 |
### 2.6 任务结构化入库
先检查是否可入库:
```http
POST /api/flow-extract/ingest-eligibility
```
```json
{
"task_id": "任务 ID",
"business_code": "3Q",
"chain_name": "业务链名称",
"coordinator_prompt": "协调人提示词",
"report_title": "报告标题",
"model": "当前模型"
}
```
返回:
```json
{
"can_ingest": true,
"skill": "命中的入库技能",
"reason": "是否可入库的原因"
}
```
符合条件且用户确认后,初始化 `roundtable-structure` 线程,并调用统一研讨流:
```json
{
"agent_type": "special",
"agent_name": "roundtable-structure",
"d_agent_thread_id": {
"roundtable-structure": "结构化入库线程 ID"
},
"new_message": "包含 taskId、业务编码/链条/技能提示、最新 Markdown 报告、flow-json 和用户补充说明的指令",
"model": "当前模型",
"business_code": "3Q"
}
```
注意:前端不会直接调用某个入库技能,而是交给 `roundtable-structure` 智能体在具备完整报告和流程图上下文后执行。
### 2.7 任务交付物提交
任务深链启用交付配置时,第三步可以查询和更新任务产物提交状态。
| 接口 | 调用方式与参数 |
| --- | --- |
| `GET /api/roundtable/tasks/{taskId}/artifacts?submitted=true\|false` | 获取任务已提交或待提交产物。 |
| `PUT /api/roundtable/tasks/{taskId}/artifacts/submission` | 更新某个产物的提交状态。 |
```json
{
"taskId": "任务 ID",
"submitted": true,
"registerOnly": false,
"submissionId": "已有提交记录 ID,可选",
"taskDeliveryId": "外部交付 ID,可选",
"expectedVersion": 3,
"artifact": {
"sessionId": "会商会话 ID",
"threadId": "产物所属线程 ID",
"nodeKey": "流程节点标识,可选",
"sourceKey": "来源标识",
"path": "/mnt/user-data/outputs/report.md",
"name": "会商报告.md",
"mimeType": "text/markdown",
"revision": 1
}
}
```
## 3. 页面结构
默认的“方案总结”视图:
```text
┌──────────────────────────────── 页面顶部 ────────────────────────────────┐
│ 步骤导航 / 报告标题 / 模型 / 总结报告、流程图、最终方案等视图切换 │
└───────────────────────────────────────────────────────────────────────┘
┌──────────── 可收起左栏 ───────────┬──────────── 中间主内容 ─────────────┬──── 右侧结果区 ────┐
│ 协调人共识 │ Markdown 总结报告对话流 │ Markdown 预览 │
│ 各席位交付 │ 报告问答、修改、重生成入口 │ 或 FlowGraphPanel │
│ 各线程文件/产物 │ 输入框与附件 │ 文件/沙箱预览 │
│ │ │ │
└───────────────────────────────────┴─────────────────────────────────────┴────────────────────┘
```
其他结果视图:
| 视图 | 中央区域 | 右侧/扩展区域 |
| --- | --- | --- |
| 最终方案 | 汇总后的静态方案和文件清单 | 可查看来源与下载产物。 |
| 经典可视化报告 | 报告生成对话、修订指令 | HTML/沙箱预览,支持全屏和下载。 |
| 结构化仪表盘 | 仪表盘优化对话 | `DashboardApp` 或 HTML 视图,可新窗口打开。 |
| 流程图 | 报告问答和流程图修改指令 | `FlowGraphPanel` 显示节点、关系和层级。 |
常规第三步会隐藏外层研讨左导航,以扩大结果阅读区域;任务深链保留任务环境相关的交付与跳转能力。
## 4. 三步数据衔接
```text
第一步
结构化意图 + 已选智能体/业务链 + 意图线程
│
▼
第二步
席位线程 + 协调人线程 + 对话/交付 + 共识 + 研讨运行快照
│
▼
第三步
Markdown 报告 + HTML 报告 + report-json 仪表盘 + flow-json 流程图 + 任务入库/交付
```
关键约束:
- 第一步未形成有效意图,不能开始第二步。
- 第二步未形成协调人共识,不能进入第三步。
- 第三步的所有产出都应绑定对应的第二步研讨运行快照,避免新一轮会商覆盖历史结果。
- 后端发生模型降级/切换时,前端应保留已收到的流内容并显示实际使用模型或切换提示。
## 5. 主要前端模块索引
| 范围 | 主要文件/目录 |
| --- | --- |
| 页面编排 | `src/roundtable-planning/pages/RoundtablePlanningPage.tsx` |
| 第一步 | `components/Step1Panel.tsx`、`hooks/useStep1Intent.ts`、`api/intent.ts` |
| 推荐与业务链 | `api/recommend.ts`、`components/RecommendAgentsDialog.tsx`、`api/chains.ts` |
| 第二步 | `components/Step2Panel.tsx`、`components/Step2SandboxLayout.tsx`、`hooks/useStep2Orchestration.ts` |
| 多智能体与后台任务 API | `api/multi-agent.ts`、`api/roundtable-jobs.ts` |
| 第三步 | `components/Step3Panel.tsx`、`components/HighFidelityReport.tsx`、`hooks/useStep3Summary.ts`、`hooks/useStep3Report.ts`、`hooks/useStep3Dashboard.ts` |
| 流程图与任务入库 | `api/flow-extract.ts`、`api/ingest.ts` |
| 草稿持久化 | `api/drafts.ts`、`api/task-drafts.ts`、相关草稿 hooks |