diff --git a/docs/agentscope-多智能体报告协作工作台-前端实施计划.md b/docs/agentscope-多智能体报告协作工作台-前端实施计划.md new file mode 100644 index 00000000..757c2dc6 --- /dev/null +++ b/docs/agentscope-多智能体报告协作工作台-前端实施计划.md @@ -0,0 +1,703 @@ +# AgentScope 2.0 多智能体报告协作工作台——前端实施计划 + +> 文档状态:待评审、尚未开始编码 +> 编写日期:2026-09-02 +> 目标项目:`F:\react01\deeflow-code\deerflow-server\frontend-web` +> 视觉与交互参考:`F:\react01\coze-frontend\frontend\apps\coze-studio` +> 参考页面:`http://localhost:3000/work_flow?space_id=1&workflow_id=wf_88cb9f4c6642` +> 配套后端计划:`docs/agentscope-多智能体报告协作工作台-后端实施计划.md` +> 本文只规划新增页面,不修改现有多智能体会商页面,不复用旧 Workflow Studio 执行状态。 + +## 1. 前端目标 + +新增独立的「报告协作」工作台。用户可以通过对话提出任意报告需求,查看系统生成的多个协作方案,点击方案卡片在流程图中预览协作结构,确认后观察多智能体执行,并在全过程通过统一对话框提出修改意见。 + +前端必须满足: + +1. 页面采用“左侧对话、右侧流程画布”的固定两栏布局,画布、工具栏、弹窗和抽屉参考 Coze Studio 页面风格。 +2. 消息列表必须复用 DeerFlow 现有 `MessageList`,不复制 Coze 的会话消息实现。 +3. 所有执行过程、AgentScope 团队消息、智能体回复、工具调用及其原始返回、错误、协助卡、返工和最终报告入口都通过现有消息协议按时间顺序显示在左侧对话区,不设置独立执行结果面板,也不另做“阶段摘要”替代实时消息。 +4. 候选方案、流程节点、对话进度和报告使用同一份后端事实,不各自推断状态。 +5. 用户可在规划中、运行中、等待输入和报告完成后继续对话。 +6. 用户协助卡的出现和提交都不能在前端被解释为“节点已经完成”。 +7. 页面刷新、SSE 断线重连、历史会话切换后能恢复到一致状态。 + +暂定: + +- 页面名称:`报告协作`。 +- 路由:`/page/workspace/report-collaboration`。 +- 会话路由:`/page/workspace/report-collaboration/:sessionId`。 +- 默认候选方案数量:3。 +- 点击画布节点时打开覆盖式节点说明抽屉;抽屉只展示节点职责和合同,不展示节点执行结果。 + +--- + +## 2. 范围与非目标 + +### 2.1 本期范围 + +- 新建、查看、重命名、删除协作报告会话。 +- 使用对话澄清报告需求。 +- 显示 2~3 个候选方案卡片。 +- 卡片与右侧流程图预览联动。 +- 节点说明抽屉:职责、所依据的信息类型、预期产出、工具、资料要求和验收条件。 +- 实时展示节点排队、运行、校验、等待用户、完成、返工、失败和取消。 +- 在左侧对话时间线中直接展示每个智能体的流式文本、团队对话、工具调用和工具返回,并展示审稿意见、报告文件和报告版本。 +- 并行阶段用横向的智能体选择器切换当前查看对象;选择器只控制同一份消息流的聚焦范围,不创建另一套执行结果视图。 +- 运行期间发送补充要求、重新检索、重新分析、节点重跑等指令。 +- 完成后进行报告问答、章节重写、全文润色和版本恢复。 +- 报告模板选择、Markdown 预览、Markdown/Word 下载。 +- 响应式布局、键盘操作、加载反馈和错误恢复。 + +### 2.2 明确不做 + +- 不引入 `@coze-workflow/playground` 或 `@coze-arch/coze-design`。 +- 不加载 Coze workflow definition、run 或 node run。 +- 不允许前端拖拽连线后直接改变执行逻辑。 +- 不新增第二套消息气泡、Markdown、引用和文件卡渲染器。 +- 不展示模型原始 chain-of-thought、系统/内部 prompt、密钥和被标记为内部控制信息的字段。 +- 不把用户有权查看的 AgentScope TeamSay、智能体文本、工具调用或工具返回压缩成“正在检索”等摘要卡;这些原始业务消息必须进入复用的 `MessageList`。敏感字段只能按统一脱敏策略替换,不能以摘要替代。 +- 不增加第三栏、常驻详情栏、节点执行结果栏或独立执行时间线。 +- 节点抽屉不展示节点生成正文、工具返回、证据列表、错误堆栈或 attempt 历史;这些过程统一在左侧 `MessageList` 的原生消息/工具步骤中查看。 +- 不改造现有圆桌、多智能体会商、深度研究和 AI 写作页面。 +- 不把浏览器状态作为业务事实源。 + +--- + +## 3. 参考页面行为映射 + +| 目标行为 | Coze 参考文件 | DeerFlow 目标组件 | 说明 | +|---|---|---|---| +| 两栏骨架 | `workflow-studio-layout.tsx` 的面板比例与分隔条 | `ReportCollaborationLayout.tsx` | 左对话、右画布;只保留一条可调整分隔线 | +| 顶栏 | `workflow-studio-header.tsx` | `ReportCollaborationHeader.tsx` | 替换为会话、模板、报告、停止等操作 | +| 候选卡片 | `workflow-proposal-cards.tsx` | `ReportPlanCards.tsx` | 点击预览,明确确认后才执行 | +| 右侧画布 | `workflow-canvas.tsx` | `ReportFlowCanvas.tsx` | 使用 `@xyflow/react` 重建,不引入 Coze Playground | +| 左侧消息区 | `run-conversation-panel.tsx` | `ReportConversationPanel.tsx` | 外层风格参考 Coze,内部复用 DeerFlow `MessageList` | +| 节点说明抽屉 | Coze 节点配置面板的视觉与抽屉行为 | `NodeInspectorDrawer.tsx` | 点击画布节点打开,只展示职责与输入输出合同 | +| 全程执行反馈 | 参考其进度和状态表达 | `AgentStageSelector` + DeerFlow `MessageList` | 选择智能体后直接显示其流式消息、TeamSay、工具调用与返回;不再合成为阶段摘要 | +| 状态栏 | `connection-status.tsx` | `ConnectionStatusBar.tsx` | 展示连接、重连和事件游标 | +| 对话历史 | `left-panel-tabs.tsx` | `ConversationSidebarTabs.tsx` | 对话与历史,不增加“节点资源”Tab | +| 异步反馈 | 规划进度、运行状态 | MessageList 步骤条 + 画布状态 | 操作超过 300ms 必须有反馈 | + +主要参考源: + +- `F:\react01\coze-frontend\frontend\apps\coze-studio\src\workflow-standalone\components\workflow-studio-layout.tsx` +- `F:\react01\coze-frontend\frontend\apps\coze-studio\src\workflow-standalone\components\workflow-studio-composition.tsx` +- `F:\react01\coze-frontend\frontend\apps\coze-studio\src\workflow-standalone\components\workflow-studio-header.tsx` +- `F:\react01\coze-frontend\frontend\apps\coze-studio\src\workflow-standalone\components\run-conversation\workflow-proposal-cards.tsx` +- `F:\react01\coze-frontend\frontend\apps\coze-studio\src\workflow-standalone\styles.module.less` + +若直接复制 Apache-2.0 源码片段或样式,必须保留版权头并维护来源说明;默认做行为映射和视觉重建。 + +--- + +## 4. 页面结构 + +```text +┌──────────────────────────────────────────────────────────────────────────┐ +│ 返回 报告协作 / 会话标题 保存状态 模板 报告 停止/继续 更多 │ +├────────────────────────────────┬─────────────────────────────────────────┤ +│ 对话 / 历史 │ 协作流程图 │ +│ │ │ +│ DeerFlow MessageList │ @xyflow/react │ +│ · 并行时:[协调者][市场][政策] │ · 节点状态与活动连线 │ +│ · 用户与协调者/成员消息 │ · 缩放、适配视图、小地图 │ +│ · 原生 ToolCall / ToolMessage │ · 点击节点打开覆盖式说明抽屉 │ +│ · 协助卡、报告文件和版本 │ │ +│ │ │ +│ 统一输入框 │ │ +├────────────────────────────────┴─────────────────────────────────────────┤ +│ 已连接 · run_xxx · 事件 128 │ +└──────────────────────────────────────────────────────────────────────────┘ +``` + +节点抽屉覆盖在右侧画布之上,不占用第三栏: + +```text +┌─────────────────────────────────────────┐ +│ 节点名称 关闭 × │ +│ 角色 / 当前状态 │ +├─────────────────────────────────────────┤ +│ 节点职责 │ +│ 要根据什么:所需输入、上游类型、资料要求 │ +│ 要产出什么:成果类型、格式、验收条件 │ +│ 可用工具与边界 │ +│ 上下游关系 │ +├─────────────────────────────────────────┤ +│ 在对话中对此节点提出意见 │ +└─────────────────────────────────────────┘ +``` + +抽屉明确不展示实际执行结果、生成正文、工具返回、来源明细、错误堆栈或 attempt 时间线;这些信息只在左侧原生消息流中展示。 + +布局默认值: + +- 顶栏高度:56px。 +- 左侧面板:默认 480px,最小 360px,最大 720px。 +- 右侧画布:最小 480px,使用剩余空间。 +- 节点说明抽屉:覆盖画布右侧,建议宽度 420px;关闭后完整归还画布空间。 +- 状态栏:24~28px。 +- 低于 960px:左侧对话和右侧画布改为顶部按钮切换的单面板模式;节点说明仍使用覆盖式 Drawer。 +- 两栏分隔条:支持 pointer 拖动、方向键、Home、End。 + +### 4.1 原生消息流与并行智能体切换 + +“复用 `MessageList`”在本页面的含义是复用它现有的 assistant 文本、`tool_calls`、`tool` 消息、引用、文件和协助卡渲染语义;不把 AgentScope 的运行过程先解析成专用步骤条、进度摘要或阶段结果卡。 + +单个智能体: + +- `agent.reply.started` 立即创建一条稳定的 assistant 消息;`message.delta` 持续更新同一 `messageId`,所以用户会先看到流式状态、再看到逐字回复,而不是等待节点结束。 +- 工具调用创建/更新该 assistant 消息的 `tool_calls`;工具返回创建匹配 `tool_call_id` 的原生 `tool` 消息。现有 `MessageGroup` 负责把两者配对显示,不再另写工具过程渲染器。 +- AgentScope TeamSay 作为带 `agentRunId` 的普通 assistant 消息进入同一流,按到达顺序显示。它不是节点完成的证据,节点状态仍由右侧画布和后端状态机决定。 + +并行智能体: + +```text +多角度并行研究 3/4 进行中 +[ 协调者 ] [ 市场规模 ✓ ] [ 品牌竞争 ● ] [ 海外市场 ● ] [ 政策风险 ! ] +└──────────────────── 当前选中智能体的原生 MessageList ────────────────────┘ +``` + +- `AgentStageSelector` 只在并行阶段出现,横向放置在左侧对话区顶部;使用现有图标体系的头像/角色图标、名称、状态文字和非纯颜色状态标识。默认选中第一位已开始运行的成员;用户手动切换后保持选择,不因其他成员返回而抢走阅读焦点。 +- 所有成员的事件都持续接收、按每个 `agentRunId` 持久化和更新,即使当前未选中;切回即可看到完整历史与正在更新的同一条消息,不丢 token、不重新请求、不把结果拼成摘要。 +- 当前选择只将共享用户消息、协调者广播消息和目标成员消息组成一个 `BaseStream` 交给同一个 `MessageList`。切换标签仅切换该视图的消息范围,不改变 run、节点或消息的后端事实。 +- 某成员请求用户协助时,其标签显示“待回复”徽标,选择器显示待处理数;点击徽标切到该成员,原生协助工具消息仍由现有 `MessageList` 协助卡渲染。其他成员可继续运行。 +- 节点抽屉打开某并行成员时,同步聚焦对应标签;抽屉仍只展示合同。用户从抽屉或输入框发送反馈时带 `targetNodeId`/`agentRunId`,后端在安全点生效。 + +这不是把完整日志另做成调试面板:对话区展示的是模型和工具的真实业务消息;只有 chain-of-thought、内部提示词及按权限必须脱敏的字段不进入该消息流。 + +### 4.2 页面主要状态 + +| 状态 | 左侧对话区 | 右侧流程画布 | 主要操作 | +|---|---|---|---| +| `empty` | 欢迎语和输入框 | 空态 | 输入需求、选模板 | +| `clarifying` | 澄清问题和协助卡 | 需求理解节点 | 回答或补充 | +| `planning` | 用户消息和规划进度 | 骨架或需求图 | 继续补充,等待安全点生效 | +| `proposal_ready` | 2~3 张方案卡 | 点击卡片预览对应图 | 切换、修改、采用 | +| `running` | 协调者与成员原生消息、工具过程和用户反馈 | 实时节点状态 | 干预、停止、在对话中要求重跑 | +| `awaiting_input` | 等待用户卡片、原因和影响 | 对应节点显示等待 | 回答、取消 | +| `reviewing` | 审稿意见和返工过程 | 评审/返工节点状态 | 接受或补充要求 | +| `completed` | 总结、报告文件卡、版本和后续对话 | 完整执行图 | 问答、改写、导出 | +| `failed` | 错误说明和恢复建议 | 失败节点 | 通过对话重试或取消 | +| `cancelled` | 已保留成果说明 | 未完成节点取消 | 从已有成果继续或新建方案 | + +--- + +## 5. 前端目录与组件边界 + +建议新增: + +```text +frontend-web/src/report-collaboration/ + api/ + client.ts + sessions.ts + plans.ts + runs.ts + reports.ts + types.ts + components/ + ReportCollaborationLayout.tsx + ReportCollaborationHeader.tsx + ConversationSidebarTabs.tsx + ReportConversationPanel.tsx + AgentStageSelector.tsx + ReportComposer.tsx + ReportPlanCards.tsx + ReportFlowCanvas.tsx + ReportFlowNode.tsx + NodeInspectorDrawer.tsx + ReportPreviewDialog.tsx + InterventionCard.tsx + SessionHistoryPanel.tsx + ConnectionStatusBar.tsx + hooks/ + useReportCollaborationSession.ts + useReportCollaborationStream.ts + useReportCollaborationMessages.ts + useReportPlanSelection.ts + useReportPanelLayout.ts + state/ + event-normalizer.ts + event-reducer.ts + selectors.ts + message-adapter.ts + pages/ + ReportCollaborationPage.tsx + styles/ + report-collaboration.css + tests/ +``` + +修改范围: + +- `frontend-web/src/pages/WorkspaceRoutes.tsx`:增加页面和会话路由。 +- `frontend-web/src/components/workspace/workspace-nav-chat-list.tsx`:增加导航入口。 +- `frontend-web/src/components/workspace/messages/message-list.tsx`:仅允许增加一个向后兼容的通用业务卡片插槽。 +- `frontend-web/src/core/messages/utils.ts`:如确需识别通用业务卡类型,只做集中式扩展。 + +不得把新功能放进: + +- `frontend-web/src/roundtable-planning/` +- `frontend-web/src/open-canvas/` +- Coze 项目的 `workflow-standalone/` + +--- + +## 6. 数据来源与前端状态 + +### 6.1 三层状态 + +前端状态分为: + +1. 服务器快照:session、原生 messages、plans、run、nodes、artifacts、report versions;每条消息带稳定的 `agentRunId`、`nodeRunId`、`phaseId` 和可见性标记,其中 artifacts 只用于生成左侧消息卡和报告文件,不形成独立结果面板。 +2. durable SSE reducer:从 `seq` 连续应用事件,更新服务器快照投影。 +3. 纯展示状态:预览中的方案、选中的节点、聚焦的并行 `agentRunId`、两栏宽度、节点抽屉开关、窄屏当前视图和画布位置。 + +纯展示状态不能改变执行结果。点击卡片只改变 `previewPlanId`;只有点击“采用方案”才改变服务器 `selectedPlanId`。 + +### 6.2 前端事件包 + +```ts +interface CollaborationEvent { + eventId: string; + sessionId: string; + runId?: string; + seq: number; + type: string; + timestamp: string; + data: T; +} +``` + +必须处理: + +- 快照先到、事件后到。 +- 事件重复。 +- 事件短暂乱序。 +- SSE 断线后从 `after_seq` 重放。 +- 页面切换时旧连接晚到事件。 +- token delta 多次更新同一消息。 +- TeamSay、assistant 文本、tool-call 参数 delta、tool 返回 delta 分别更新各自稳定消息,不得等节点完成后批量生成摘要。 +- 并行成员的消息可交错到达;Reducer 必须按 `agentRunId + messageId` 更新,而不是按当前被选中的标签丢弃未聚焦成员的事件。 +- 节点重新打开后出现新 attempt。 + +Reducer 以 `sessionId + runId + seq` 去重;消息行以 `messageId`、工具结果以 `toolCallId`、标签以 `agentRunId` 使用后端稳定 ID,禁止使用数组下标。 + +--- + +## 7. 分步实施计划 + +### FE-0:冻结参考视觉与行为基线 + +任务: + +1. 在 1440×900、1280×800、1024×768 打开参考页面。 +2. 保存初始态、方案态、运行态和节点说明抽屉四组截图。 +3. 记录顶栏、两栏比例、间距、圆角、边框、阴影、画布工具栏和状态色。 +4. 形成“参考组件—目标组件—允许差异”表。 +5. 明确消息列表保持 DeerFlow 原样,不纳入像素对齐。 + +交付物: + +- 视觉基线截图。 +- 视觉 token 表。 +- 页面行为清单。 + +验收:参考的每个用户可见状态都有截图或明确说明不存在。 + +### FE-1:路由、菜单和静态页面骨架 + +任务: + +1. 增加两个路由和菜单项。 +2. 创建 `ReportCollaborationPage`。 +3. 创建顶栏、左侧对话栏、右侧画布和底部连接栏。 +4. 实现可调整宽度的两栏布局,以及“专注对话/专注画布”切换。 +5. 实现窄屏单面板切换与覆盖式节点 Drawer。 + +验收: + +- 不连接后端也能呈现完整空态。 +- 375~1440px 不出现页面级横向滚动。 +- 对话/画布切换不会卸载会话状态或清空输入内容。 +- 键盘可以调整两栏分隔条。 + +### FE-2:页面设计系统与 Coze 风格重建 + +建立页面专用语义变量: + +```text +--rc-bg-page +--rc-bg-panel +--rc-bg-canvas +--rc-border +--rc-text-primary +--rc-text-secondary +--rc-accent +--rc-running +--rc-waiting +--rc-success +--rc-danger +--rc-panel-shadow +--rc-card-radius +``` + +规则: + +- 从 DeerFlow 主题 token 派生,不在组件中散落十六进制颜色。 +- 使用 Lucide SVG 图标,不使用 emoji。 +- hover/focus/展开动画控制在 150~300ms。 +- 支持 `prefers-reduced-motion`。 +- 交互状态不能只靠颜色表达。 +- 正文对比度达到 4.5:1。 +- 操作超过 300ms 显示 spinner、骨架或流式状态。 + +验收:除 MessageList 内部外,两栏布局、密度、卡片、画布工具栏、弹窗和节点抽屉达到参考基线。 + +### FE-3:API 类型和 TanStack Query 层 + +实现: + +- session CRUD。 +- messages 查询与发送。 +- plan request、plans 查询、select。 +- run 创建、查询、停止、重试。 +- command 创建、确认、取消。 +- artifacts、sources、reports、versions 查询。 + +每个写请求携带: + +- `idempotencyKey` +- `expectedRevision` + +冲突行为: + +- `409`:刷新当前快照并提示用户重新确认。 +- `422`:在对应操作附近显示具体错误。 +- `429`:显示预算/并发限制,不自动重试。 +- `5xx`:保留用户输入,允许使用同一幂等键重试。 + +验收:API 层不包含页面展示逻辑,类型与后端 OpenAPI 一致。 + +### FE-4:SSE、快照和事件 Reducer + +实现 `useReportCollaborationStream`: + +1. 先拉 session snapshot。 +2. 使用 snapshot 的 `lastSeq` 建立 SSE。 +3. 校验每个事件 session/run 身份。 +4. 按 seq 应用事件并去重。 +5. 出现序号缺口时暂停 live apply,补拉缺失事件。 +6. 断线指数退避并支持 `Last-Event-ID`。 +7. 终态后完成最后一次事件补拉再关闭连接。 + +Reducer 必须覆盖: + +- 消息流增量。 +- 计划候选和 revision。 +- node/node attempt 状态。 +- artifact 创建和校验。 +- command 分类和执行。 +- report delta 和正式版本。 +- 错误、取消、接管恢复。 +- AgentScope 原始可见消息和工具事件:`message.created/delta/completed`、`tool_call.created/delta/completed`、`tool_result.created/delta/completed`、`team_message.created/delta/completed`。 + +验收:重复事件、乱序事件和重连都不产生重复消息、重复节点或状态倒退。 + +### FE-5:复用 DeerFlow `MessageList` + +复用: + +- `frontend-web/src/components/workspace/messages/message-list.tsx` +- `frontend-web/src/components/workspace/messages/message-list-item.tsx` +- `frontend-web/src/components/workspace/messages/message-group.tsx` +- `frontend-web/src/components/workspace/messages/context.ts` + +实现无损协议适配 `message-adapter.ts`: + +1. 将已持久化的 `CollaborationMessage` 一对一映射为 LangGraph SDK `Message[]`,不将文本或工具结果二次概括。 +2. 构造最小 `BaseStream` 外观:`messages`、`isLoading`、`isThreadLoading`、`values`。 +3. 协调者、成员 AgentScope TeamSay 和成员回复都映射为普通 assistant 消息;保留 `messageId`、文本 chunk、角色/成员名称、`agentRunId`、`nodeRunId`、`phaseId`、来源事件 ID 和完成态。 +4. AgentScope 工具调用映射为该 assistant 消息的标准 `tool_calls`;调用结果映射为标准 `tool` 消息,并严格复用原有 `tool_call_id` 配对。工具参数、返回正文及增量保持原文,只有后端明确标注的脱敏字段被替换。 +5. 将来源、文件、报告 Markdown delta 和正式版本继续映射为既有引用、文件卡和普通 assistant 消息;规划卡、用户确认卡和报告替换卡仍通过一个通用业务卡片插槽渲染。 +6. 错误、恢复建议、命令影响范围和报告版本变化也必须进入同一时间线;错误堆栈以可读错误消息替代,但不能吞掉已发生的工具/成员消息。 +7. `selectMessagesForAgentRun(allMessages, focusedAgentRunId)` 只在客户端从已同步消息中选出共享消息与目标成员消息;并行选择器不得重新拉取、重新排序或改写消息。 + +约束: + +- 不使用 LangGraph `useThreadStream` 发送消息。 +- 新页面输入框调用报告协作 API。 +- 不增加多个页面专用 MessageList props。 +- 普通聊天、AI 写作、深度研究等未传插槽时必须零变化。 +- 不另建执行结果列表、节点结果面板或成果时间线。 +- 不用“运行中”“已检索 N 条”等专用摘要替代真实消息。`MessageList` 本身的流式状态和原生工具步骤是唯一过程视图。 + +验收: + +- 历史和流式消息使用同一行稳定更新。 +- 单成员首次开始回复、每次工具启动和工具返回均在 300ms 内出现可见的原生消息行或原生工具步骤;不允许持续数秒只有静态加载圈。 +- 并行标签切换后显示目标成员的完整已持久化消息和实时 delta;未选中成员持续接收,标签上的运行/待回复状态及时更新。 +- 用户上翻阅读时不强制滚底。 +- 用户发送新消息后滚到最新位置。 +- 卡片显示成功不改变后端节点状态。 + +### FE-6:需求澄清和候选方案卡片 + +`ReportPlanCards` 展示: + +- 推荐标签、策略、标题、摘要和推荐理由。 +- 分析角度和参与角色。 +- 关键步骤与质量门。 +- 预计时间、成本等级和资料范围。 +- 方案验证错误。 + +交互: + +- 点击卡片或“查看流程”只切换预览。 +- “采用此方案”调用 select API。 +- “开始协作”再次校验并创建 run。 +- 方案调整后显示新 revision;旧 revision 只读。 +- 过期 revision 返回 409 后不静默覆盖。 + +验收:连续快速切换三张卡时,画布最终显示最后一次选择,不闪回旧图。 + +### FE-7:协作流程画布 + +技术:`@xyflow/react`。可以借鉴但不直接耦合: + +- `frontend-web/src/components/ai-elements/canvas.tsx` +- `frontend-web/src/roundtable-planning/components/FlowGraphPanel.tsx` + +节点显示: + +- 节点名、角色名和分析角度。 +- 状态文字、图标和颜色。 +- 等待用户、返工、失败和 superseded 标记。 + +画布能力: + +- 自动布局。 +- 拖动节点只保存浏览器展示位置。 +- 缩放、适配视图、方向切换、小地图。 +- 活动边低强度流动动画。 +- 点击节点打开覆盖在画布上的节点说明抽屉。 +- 节点重跑、补充或纠偏一律通过左侧对话完成;抽屉只提供“在对话中对此节点提出意见”入口。 +- 方案切换后清理不属于新方案的本地坐标。 + +验收: + +- 30 个节点内流畅操作。 +- 单个 node event 不导致整个 React Flow 重挂。 +- `awaiting_input`、`reopened`、`superseded` 不与 `completed` 混淆。 + +### FE-8:节点说明抽屉与对话定位 + +点击画布节点打开 `NodeInspectorDrawer`。抽屉只展示计划合同: + +1. 节点名称、角色、分析角度和当前状态标签。 +2. 节点职责:负责解决什么问题。 +3. 要根据什么:所需输入类型、上游节点类型、资料范围和时效要求。 +4. 要产出什么:成果类型、结构要求和验收条件。 +5. 可用工具、禁止事项、预算上限。 +6. 上游与下游关系。 + +抽屉不展示: + +- 节点实际生成内容。 +- 工具调用返回值。 +- EvidenceBundle 或其他成果物正文。 +- attempt 执行时间线。 +- 错误堆栈和调试信息。 +- 报告正文。 + +交互: + +- “在对话中对此节点提出意见”关闭抽屉、聚焦左侧 Composer,并绑定 `targetNodeId` 上下文。 +- 若该节点对应正在并行运行的成员,同时绑定该成员的 `agentRunId` 并切换左侧选择器,使用户发送前能先看到该成员的真实对话与工具过程。 +- 用户仍需在对话区输入“重新检索”“重新分析”等要求;抽屉不直接发起业务变更。 +- 状态标签来自后端节点状态,但不加载节点结果接口。 +- 关闭抽屉不清空 selected node;再次点击同一节点可恢复说明。 + +报告预览不使用常驻第三栏。最终报告、章节候选和版本先作为左侧 MessageList 中的普通消息/文件卡出现;点击文件卡时复用 `ArtifactFileDetail` 或现有 Markdown 能力打开大尺寸 Dialog,关闭后回到两栏工作台。 + +验收: + +- 抽屉宽度不改变两栏布局,不挤压左侧对话区。 +- 抽屉只读取节点合同和图结构,不请求节点执行结果。 +- 所有原生成员消息、工具过程、错误和报告入口都能在左侧对话时间线找到。 + +### FE-9:全过程对话干预 + +`ReportComposer` 根据状态显示不同提示: + +- 空闲:输入报告需求。 +- 规划中:补充要求将在规划安全点应用。 +- 运行中:协调者正在判断影响范围。 +- 等待用户:优先回答等待问题。 +- 完成后:可问答、重写、润色或重新研究。 + +发送流程: + +1. 生成 idempotency key。 +2. 插入 pending 用户消息;带 `targetNodeId`/`agentRunId` 时在相关成员消息流和共享上下文中引用同一条用户消息,不重复持久化。 +3. 显示“正在识别修改范围”。 +4. `command.classified` 后展示意图和影响节点。 +5. 高成本或低置信度命令显示确认卡。 +6. `command.accepted` 后显示排队或等待安全点。 +7. 完成后关联新 node attempt 或 report version。 +8. 失败时保留原消息和重试入口。 + +典型映射: + +| 用户输入 | 预期操作 | +|---|---| +| “增加政策风险角度” | 新增角度节点和受影响下游 | +| “资料太旧,重新找” | 重新检索指定证据包 | +| “竞争格局分析不到位” | 复用证据,重新分析 | +| “重写第二章” | 只生成章节替换候选 | +| “语气更正式” | 新报告版本,不重新研究 | +| “为什么得出这个结论” | 只读问答,不修改报告 | + +验收: + +- 双击发送不创建重复命令。 +- 选中“品牌竞争分析师”后发送补充要求,只影响该成员及依赖分析,其他并行成员仍保持消息流和运行状态。 +- 运行中反馈不会让 run 或 node 误变 completed。 +- “重写第二章”不会触发全量检索。 +- “资料太旧”不会只做文字润色。 + +### FE-10:会话历史、报告版本与导出 + +- History Tab 显示标题、状态、更新时间、当前版本。 +- 新建会话不删除旧会话。 +- 会话切换时先关闭旧 SSE,再加载新快照。 +- 报告修改先生成候选,确认后创建新版本。 +- 版本恢复创建新的头版本,不删除历史。 +- 下载复用现有 Markdown/Word 能力。 +- 文件名来自报告标题,不暴露宿主机或沙箱路径。 + +验收:历史会话可完整恢复左侧消息流程、右侧节点状态和报告版本;不额外恢复节点结果面板。 + +### FE-11:测试、视觉回归和性能 + +单元测试: + +- event normalizer/reducer。 +- message adapter。 +- plan revision 和选择状态。 +- node status 和 available actions。 +- command pending/idempotency。 + +组件测试: + +- 空态、澄清、规划、候选、运行、等待、完成、失败、取消。 +- 卡片选择、节点点击、只读说明 Drawer、确认弹窗和报告预览 Dialog。 +- MessageList 通用业务卡插槽零回归。 +- 单成员流式文本、TeamSay、工具调用与工具返回的原样重放;并行成员交错到达、切换标签、切回后不中断 delta。 +- 非当前标签成员发起协助时显示待回复徽标,点击后使用原生协助卡回复到正确节点。 + +E2E: + +1. 新建会话并输入新能源汽车报告要求。 +2. 选择候选并开始。 +3. 运行中增加风险角度。 +4. 重新检索海外最新资料。 +5. 完成后重写第二章。 +6. 刷新、断网重连、切换会话。 +7. 停止和重试失败节点。 + +性能门: + +- 30 节点画布不卡顿。 +- 长消息列表使用现有优化策略。 +- SSE 高频 delta 合帧后再 setState。 +- 画布和消息区使用独立 selector,避免互相触发整树重渲染。 +- 节点抽屉只订阅节点合同和状态,不能因阶段产出更新而反复重渲染。 +- 只渲染当前聚焦成员和共享消息的可视窗口;非当前成员的消息仍写入 store,但不因 token delta 重渲染当前 `MessageList`。 + +--- + +## 8. 后端接口依赖 + +前端开发前,后端必须冻结以下接口: + +```text +POST /api/report-collaboration/sessions +GET /api/report-collaboration/sessions +GET /api/report-collaboration/sessions/{session_id} +PATCH /api/report-collaboration/sessions/{session_id} +DELETE /api/report-collaboration/sessions/{session_id} + +POST /api/report-collaboration/sessions/{session_id}/messages +GET /api/report-collaboration/sessions/{session_id}/messages +POST /api/report-collaboration/sessions/{session_id}/plan-requests +GET /api/report-collaboration/sessions/{session_id}/plans +POST /api/report-collaboration/sessions/{session_id}/plans/{plan_id}/select +POST /api/report-collaboration/sessions/{session_id}/runs + +GET /api/report-collaboration/runs/{run_id} +GET /api/report-collaboration/runs/{run_id}/events +GET /api/report-collaboration/runs/{run_id}/stream +POST /api/report-collaboration/runs/{run_id}/commands +POST /api/report-collaboration/runs/{run_id}/cancel +GET /api/report-collaboration/runs/{run_id}/nodes/{node_id}/contract + +GET /api/report-collaboration/sessions/{session_id}/reports +POST /api/report-collaboration/sessions/{session_id}/report-rewrites +POST /api/report-collaboration/sessions/{session_id}/report-rewrites/{id}/apply +``` + +前后端共享枚举: + +- session status。 +- run status。 +- node/node attempt status。 +- command intent/status。 +- event type/version。 +- artifact type/schema version。 +- report version/change type。 + +--- + +## 9. 前端开发顺序 + +1. `RC-FE-001`:视觉截图与行为基线。 +2. `RC-FE-002`:路由、菜单和左对话/右画布两栏空壳。 +3. `RC-FE-003`:页面 token、弹窗、抽屉和响应式。 +4. `RC-FE-004`:API 类型和 mock server。 +5. `RC-FE-005`:SSE reducer 与快照恢复。 +6. `RC-FE-006`:MessageList adapter 和通用卡片插槽。 +7. `RC-FE-007`:需求澄清与候选方案卡。 +8. `RC-FE-008`:流程画布和自定义节点。 +9. `RC-FE-009`:只读节点说明抽屉与对话目标定位。 +10. `RC-FE-010`:统一 Composer 和命令确认。 +11. `RC-FE-011`:报告预览、版本和导出。 +12. `RC-FE-012`:历史、重连和异常恢复。 +13. `RC-FE-013`:组件/E2E/视觉/性能验收。 + +依赖规则: + +- `RC-FE-004` 必须等待前后端契约冻结。 +- 页面骨架和视觉可与后端 BE-0~BE-3 并行。 +- 真实 SSE 联调必须等待后端 durable event store。 +- 报告版本操作必须等待后端候选应用语义完成。 + +--- + +## 10. 前端完成定义 + +前端只有同时满足以下条件才算完成: + +1. 页面结构与 Coze 参考页面逐状态验收通过。 +2. 消息区复用 DeerFlow `MessageList`,其他聊天页面无回归。 +3. 候选卡、左侧对话流程、右侧流程图和报告来自同一 session/run/event 状态。 +4. 点击候选只预览,明确确认后才执行。 +5. 用户可以在规划、运行、完成后三个阶段继续对话。 +6. 协助卡显示或提交不会导致前端误标完成。 +7. 节点点击只打开说明抽屉,可查看职责、所需输入、预期输出、工具和验收条件,不展示执行结果。 +8. 节点重开、返工和 superseded 状态表达正确。 +9. SSE 重连、刷新和历史切换无重复消息和状态倒退。 +10. 报告修改以候选和版本形式完成,不直接覆盖正式报告。 +11. 页面始终只有对话与画布两个常驻区域,所有执行过程和产出入口都能在对话时间线中找到。 +12. 响应式、键盘、对比度、加载反馈和错误恢复通过验收。 diff --git a/docs/agentscope-多智能体报告协作工作台-后端实施计划.md b/docs/agentscope-多智能体报告协作工作台-后端实施计划.md new file mode 100644 index 00000000..685d6cec --- /dev/null +++ b/docs/agentscope-多智能体报告协作工作台-后端实施计划.md @@ -0,0 +1,1098 @@ +# AgentScope 2.0 多智能体报告协作工作台——后端实施计划 + +> 文档状态:待评审、尚未开始编码 +> 编写日期:2026-09-02 +> 目标项目:`F:\react01\deeflow-code\deerflow-server\offline-backend-20260512\backend` +> 协作框架:[AgentScope 2.0](https://github.com/agentscope-ai/agentscope) +> 配套前端计划:`docs/agentscope-多智能体报告协作工作台-前端实施计划.md` +> 本文只规划新增的报告协作后端,不修改现有多智能体会商,不使用旧 Workflow Studio DAG 调度器。 + +## 1. 后端目标 + +新增一套基于 AgentScope 2.0 Core 的多智能体报告协作运行时,实现: + +1. 理解任意报告需求并在必要时澄清。 +2. 从当前用户可见的智能体、技能、模型和资料源中筛选能力。 +3. 生成 2~3 个真实有差异的候选协作计划。 +4. 将选定计划实例化为 AgentScope leader-worker 团队。 +5. 通过结构化成果物完成检索、核验、分析、综合、写作、审稿和返工。 +6. 接受全过程自然语言干预,并只重开受影响的任务和下游成果。 +7. 使用数据库租约、durable events、幂等命令和版本化报告保证恢复与一致性。 +8. 使用现有 DeerFlow 登录、权限、模型、工具、知识库、报告模板和导出能力。 +9. 将所有用户可见的规划、AgentScope 团队消息、智能体流式回复、工具调用及其原始返回、分析、核验、写作、审稿、返工、错误和报告变化一对一镜像到统一对话时间线;前端不建立节点执行结果面板,也不以阶段摘要替代实时消息。 + +框架能提供协作机制,不能单独保证报告质量。质量由证据合同、来源核验、独立审稿、定向返工、模板约束和真实评测集共同保证。 + +--- + +## 2. 关键架构决策 + +### 2.1 使用 AgentScope Core,不采用演示服务作为事实源 + +AgentScope 官方提供 Event System、Agent Team、任务规划和 Agent Service 示例,但团队可靠性与多进程/分布式服务仍在持续完善: + +- [AgentScope README](https://github.com/agentscope-ai/agentscope/blob/main/README.md) +- [Agent Service 示例](https://github.com/agentscope-ai/agentscope/blob/main/examples/agent_service/main.py) +- [Agent Team 可靠性跟踪](https://github.com/agentscope-ai/agentscope/issues/1802) +- [多进程与分布式能力跟踪](https://github.com/agentscope-ai/agentscope/issues/1722) + +因此采用: + +- AgentScope Core:Agent、Team、Tool、Event、Permission。 +- DeerFlow:身份、权限、配置、数据库、消息、命令、作业、租约、SSE、成果、文件、报告版本和审计。 +- AgentScope Event 既驱动运行状态,也通过无损 adapter 转为 DeerFlow 领域事件和 LangChain 兼容消息;其用户可见内容不能在 adapter 中被压缩为进度摘要。 +- 不运行 AgentScope `examples/web_ui`。 +- 不把 AgentScope Session、MessageBus 或内存对象作为恢复依据。 +- 节点公开接口只返回职责合同、图关系和状态,不返回节点实际输出;实际阶段消息、工具过程和成果仍从会话消息流以原生消息、工具步骤、引用和报告文件卡的形式呈现。 + +### 2.2 新功能独立,不进入旧运行内核 + +- API 前缀:`/api/report-collaboration`。 +- 独立 session、plan、run、node run、artifact、event、command、report version 表。 +- 不读写 Workflow Studio 的 `workflow_*` 业务表。 +- 不调用 Workflow Studio 自定义 DAG scheduler。 +- 不复用 roundtable draft/job 作为新会话。 +- 可复用 Deep Research/roundtable 的基础设施模式,但不能共享状态。 + +### 2.3 流程图不是执行器 + +候选图和运行图用于: + +- 描述角色和任务依赖。 +- 展示成果物传递关系。 +- 展示当前状态和返工范围。 +- 供用户理解和选择方案。 + +真正调度由 `Coordinator + TaskLedger + ArtifactBoard + QualityGate` 完成。协调者只能从服务端允许的动作中选择,不能返回任意 Python、任意图或数据库操作。 + +### 2.4 数据库是唯一事实源 + +- HTTP 只提交命令,不承载完整长任务。 +- SSE 只投影 durable events。 +- AgentScope Python 对象可随进程消失。 +- 恢复依赖 requirement snapshot、plan、task ledger、node runs、artifacts 和 report versions。 +- 成果物未落库并通过合同校验前,节点不能完成。 + +--- + +## 3. 总体架构 + +```mermaid +flowchart LR + UI[报告协作前端] --> API[Gateway Router] + UI <-->|SSE| API + + API --> SESS[Session/Message/Plan Store] + API --> CMD[Command Store] + API --> EVT[Event Store] + API --> REP[Report Version Store] + API --> DISP[Lease Dispatcher] + + DISP --> EXEC[Report Collaboration Executor] + EXEC --> AS[AgentScope Core] + AS --> LEAD[Coordinator] + AS --> TEAM[Research/Verify/Analyze/Write/Review Team] + + EXEC --> LEDGER[Task Ledger] + EXEC --> BOARD[Typed Artifact Board] + EXEC --> MODEL[DeerFlow Model Adapter] + EXEC --> TOOL[Allowlisted Tool Adapter] + + TOOL --> WEB[Web Search] + TOOL --> KB[Knowledge/Wiki] + TOOL --> SKILL[Approved Skills/MCP] + + BOARD --> EVT + BOARD --> REP + REP --> EXPORT[Existing Markdown/Word Export] +``` + +### 3.1 运行进程 + +开发阶段: + +- 可由 Gateway lifespan 启动单个 dispatcher/worker,便于本地联调。 +- 必须保留独立启动入口和 `worker_enabled` 开关。 + +生产阶段: + +- Gateway 仅提供 API、鉴权和 SSE。 +- 独立 worker 进程领取数据库租约并运行 AgentScope。 +- Gateway 和 worker 使用同一后端代码与数据库。 +- 多 worker 依赖数据库 claim/lease,不依赖进程内锁。 + +--- + +## 4. 包边界与目录 + +建议新增: + +```text +offline-backend-20260512/backend/app/report_collaboration/ + contracts/ + requirements.py + plans.py + nodes.py + artifacts.py + events.py + commands.py + agentscope_runtime/ + model_adapter.py + tool_adapter.py + event_adapter.py + permission_adapter.py + team_factory.py + coordinator.py + planning/ + requirement_resolver.py + agent_catalog.py + agent_selector.py + plan_controller.py + plan_assembler.py + plan_validator.py + execution/ + dispatcher.py + executor.py + cancellation.py + task_ledger.py + artifact_board.py + quality_gates.py + recovery.py + interventions/ + intent_router.py + impact_analyzer.py + command_handler.py + reporting/ + outline.py + writer.py + reviewer.py + versions.py + live_hub.py + service.py + +offline-backend-20260512/backend/app/gateway/routers/ + report_collaboration.py + +offline-backend-20260512/backend/packages/harness/deerflow/persistence/ + report_collaboration/ + model.py + base.py + sql.py + memory.py + __init__.py +``` + +依赖方向: + +- `app.report_collaboration` 可以导入 `deerflow.*` 和 `agentscope.*`。 +- `deerflow.*` 不能导入 `app.*`。 +- AgentScope 运行代码不放入 publishable harness。 +- `tests/test_harness_boundary.py` 必须继续通过。 +- AgentScope 依赖加入应用 `pyproject.toml`,不加入 Harness 公共依赖。 + +--- + +## 5. 核心领域合同 + +### 5.1 `ReportRequirementSnapshot` + +```text +topic +objective +audience +language +time_range +geography +required_angles[] +excluded_angles[] +source_constraints +report_structure_id +length_target +tone +deadline_hint +quality_priority +revision +``` + +改变研究范围的用户反馈必须创建新 revision。每个 node run 记录使用的 requirement revision,避免新旧要求混用。 + +### 5.2 `ReportPlanCandidate` + +```text +id +proposal_group_id +title +strategy +summary +rationale +estimated_duration_seconds +estimated_cost_level +requirement_revision +roles[] +nodes[] +edges[] +quality_gates[] +report_structure_id +validation +revision +``` + +模型不直接输出可执行图。模型输出 `RoleDemand`、角度和依赖建议;服务器绑定真实 agent、工具、预算、成果物类型和质量门后生成计划。 + +### 5.3 `CollaborationNodeContract` + +每个节点包含: + +- `mission` +- `input_artifact_types[]` +- `output_artifact_type` +- `allowed_tools[]` +- `source_policy` +- `acceptance_criteria[]` +- `max_attempts` +- `time_budget_seconds` +- `token_budget` +- `agent_profile_snapshot` +- `dependencies[]` + +### 5.4 强类型成果物 + +| 成果物 | 生产者 | 必要内容 | 主要消费者 | +|---|---|---|---| +| `EvidenceBundle` | Researcher | 事实、来源、日期、摘录、可信度、冲突 | Verifier、Analyst | +| `VerificationResult` | Verifier | 支持/反对证据、时效、冲突、可用结论 | Analyst、Reviewer | +| `AngleAnalysis` | Analyst | 观点、证据引用、假设、局限、缺口 | Synthesizer | +| `SynthesisOutline` | Synthesizer | 论证主线、章节、结论、证据分配 | Writer | +| `ReportSectionDraft` | Writer | 章节 Markdown、引用、证据 ID | Reviewer、总报告作者 | +| `ReviewDecision` | Reviewer | pass/revise、严重度、问题、返工目标 | Coordinator、Reviser | +| `ReportVersion` | Writer | Markdown、来源索引、模板与质量结果 | 用户、导出器 | + +TeamSay 用于协作协调,并且其用户可见文本必须原样镜像到会话消息流,便于用户实时查看各成员如何交接;影响下游和报告的内容仍必须写入成果物并通过 Pydantic/JSON Schema,不能因为一条 TeamSay 而视为节点完成。 + +### 5.5 节点状态机 + +```text +planned -> queued -> running -> validating -> completed + | | + | +-> failed + +-> awaiting_input -> queued + +-> cancel_requested -> cancelled + +-> superseded + +completed -> reopened -> queued +``` + +完成规则: + +- 产生一条 assistant 消息不等于完成。 +- 产生或提交用户协助卡不等于完成。 +- AgentScope 一次 reply 返回不等于完成。 +- 期望成果物落库、Schema 通过、验收器通过后才能完成。 +- 返工创建新 attempt,保留旧 attempt 和旧成果。 + +--- + +## 6. 数据库设计 + +| 表 | 用途 | 关键字段 | +|---|---|---| +| `report_collaboration_sessions` | 会话 | owner、title、status、requirement_revision、selected_plan_id、active_run_id、current_report_version_id | +| `report_collaboration_messages` | 对话原文镜像 | message_id、role、content、tool_calls_json、tool_call_id、agent_run_id、node_run_id、phase_id、visibility、metadata、command_id、created_at、completed_at | +| `report_collaboration_plans` | 候选及修订 | proposal_group_id、revision、status、graph_json、validation_json | +| `report_collaboration_runs` | 正式执行 | plan_id、status、lease_owner、lease_until、cancel_requested、next_event_seq | +| `report_collaboration_node_runs` | 节点尝试 | node_id、attempt、status、contract_json、agent_snapshot、error、started_at、ended_at | +| `report_collaboration_agent_runs` | 实际团队成员实例 | agent_run_id、node_run_id、phase_id、role、display_name、avatar_key、status、agent_snapshot、started_at、ended_at | +| `report_collaboration_artifacts` | 成果物 | artifact_type、producer_node_run_id、schema_version、content_json、validation_status | +| `report_collaboration_events` | durable SSE | run_id、seq、event_type、payload、created_at | +| `report_collaboration_commands` | 用户命令 | command_id、idempotency_key、intent、scope、status、expected_revision | +| `report_collaboration_report_versions` | 报告版本 | version、parent_version_id、markdown、source_index、change_summary | + +持久化要求: + +- SQL 和 memory store 共用抽象接口。 +- active run 使用数据库唯一键去重。 +- command 使用 idempotency key 去重。 +- session/run/node 命令使用行锁和 expected revision。 +- 事件 seq 在 run 行内原子分配。 +- 用户消息、协调者消息、成员 TeamSay、流式回复、工具调用和工具返回使用稳定 `message_id` 与 timeline/event seq;同一 `agentRunId` 内严格保持因果顺序,保证 `MessageList` 能以原生消息重建全过程。 +- 并行成员的消息分别归属 `agent_run_id`,同一事件流仍全量持久化;前端选择标签只能过滤/聚焦,不能影响事件写入或消息顺序。 +- 删除 session 显式删除子资源,不依赖 SQLite cascade pragma。 +- 写事务在 commit 前完成必要序列化。 +- 不使用跨连接 post-commit refresh。 +- SQLite、MySQL、PostgreSQL 都有迁移与测试。 + +--- + +## 7. Gateway API 与事件协议 + +### 7.1 REST API + +```text +POST /api/report-collaboration/sessions +GET /api/report-collaboration/sessions +GET /api/report-collaboration/sessions/{session_id} +PATCH /api/report-collaboration/sessions/{session_id} +DELETE /api/report-collaboration/sessions/{session_id} + +POST /api/report-collaboration/sessions/{session_id}/messages +GET /api/report-collaboration/sessions/{session_id}/messages +POST /api/report-collaboration/sessions/{session_id}/plan-requests +GET /api/report-collaboration/sessions/{session_id}/plans +POST /api/report-collaboration/sessions/{session_id}/plans/{plan_id}/select +POST /api/report-collaboration/sessions/{session_id}/runs + +GET /api/report-collaboration/runs/{run_id} +GET /api/report-collaboration/runs/{run_id}/events?after_seq={seq} +GET /api/report-collaboration/runs/{run_id}/stream?after_seq={seq} +POST /api/report-collaboration/runs/{run_id}/commands +POST /api/report-collaboration/runs/{run_id}/commands/{command_id}/confirm +POST /api/report-collaboration/runs/{run_id}/cancel +GET /api/report-collaboration/runs/{run_id}/nodes/{node_id}/contract + +GET /api/report-collaboration/runs/{run_id}/artifacts +GET /api/report-collaboration/runs/{run_id}/sources +GET /api/report-collaboration/sessions/{session_id}/reports +POST /api/report-collaboration/sessions/{session_id}/report-rewrites +POST /api/report-collaboration/sessions/{session_id}/report-rewrites/{id}/apply +POST /api/report-collaboration/sessions/{session_id}/report-versions/{id}/restore +``` + +写请求必须支持: + +- `idempotencyKey` +- `expectedRevision` + +计划请求和 run 请求只创建 durable command/job,不在请求生命周期中等待完整模型输出。 + +节点合同接口只返回: + +- 节点名称、角色和分析角度。 +- `mission`。 +- 所需输入类型和资料策略。 +- 预期输出类型、结构和验收条件。 +- 允许工具、禁止事项和预算。 +- 上下游节点 ID。 +- 当前状态标签。 + +它不得返回节点实际生成内容、工具返回、成果物正文、错误堆栈或 attempt 时间线。重新检索、重新分析和重跑节点统一通过 `POST /runs/{run_id}/commands` 提交自然语言命令。 + +### 7.2 SSE Event Envelope + +```json +{ + "eventId": "evt_xxx", + "sessionId": "session_xxx", + "runId": "run_xxx", + "seq": 128, + "type": "node.status.changed", + "timestamp": "2026-09-02T10:00:00Z", + "data": {} +} +``` + +事件类型: + +```text +session.snapshot +message.created +message.delta +message.completed +tool_call.created +tool_call.delta +tool_call.completed +tool_result.created +tool_result.delta +tool_result.completed +team_message.created +team_message.delta +team_message.completed +requirement.updated +clarification.requested +clarification.resolved +plan.progress +plan.proposed +plan.selected +run.status.changed +node.created +node.status.changed +node.progress +node.attempt.created +artifact.created +artifact.validated +artifact.rejected +source.added +command.classified +command.confirmation.required +command.accepted +command.completed +command.failed +report.delta +report.version.created +review.created +error +heartbeat +``` + +规则: + +- 历史与实时使用相同 envelope。 +- 支持 `Last-Event-ID` 和 `after_seq`。 +- token delta 可 live-only 合帧,但需周期性保存可恢复 checkpoint。 +- 不能每 token 写数据库。 +- 状态、成果、命令和报告版本必须 durable。 +- 读取事件暂时失败时保持连接并发送可恢复 warning。 + +`message.*` / `team_message.*` 的 `data` 必须携带 LangChain 兼容的消息字段和归属,而非仅有摘要: + +```json +{ + "message": { + "id": "msg_agent_01", + "type": "ai", + "content": "正在对销量口径做交叉核对……", + "tool_calls": [], + "name": "品牌竞争分析师", + "additional_kwargs": { + "report_collaboration": { + "agentRunId": "agent_run_brand", + "nodeRunId": "node_run_12", + "phaseId": "phase_parallel_research", + "sourceEventId": "as_evt_456" + } + } + } +} +``` + +工具调用先在同一条 `ai` 消息的 `tool_calls` 上创建/追加参数 delta;返回值随后以 `type: "tool"`、相同 `tool_call_id` 的独立消息传输。允许用户查看的正文、参数和返回必须保持原文以及原始增量边界;只有统一脱敏器标记的字段可替换,替换理由写入 metadata。每个成员在开始生成时先发送 `message.created`,因此即使首 token 尚未到达,前端也能立即显示该成员正在回复,而非静默等待。 + +--- + +## 8. 分步实施计划 + +### BE-0:AgentScope 兼容性尖峰 + +先写实验和测试,不接前端,不建正式业务表。 + +验证: + +1. 当前 Python 3.12 与稳定 AgentScope 2.x 兼容。 +2. 固定精确版本和 commit,不使用浮动 `main`。 +3. `uv lock` 后检查 Pydantic、SQLAlchemy、FastAPI、OpenAI SDK 冲突。 +4. 使用当前至少两个模型完成流式回复。 +5. leader + 2 workers 完成任务分配、TeamSay、并发和结构化输出。 +6. 主动取消、超时、工具异常和成员异常行为可控。 +7. AgentScope Event 可稳定关联 agent、task、message、tool call,并能一对一写出 LangChain 兼容的 assistant/tool 消息。 +8. 内存状态丢失后可由 DeerFlow task ledger/artifact 重建。 +9. 连续运行 20 次固定任务,统计早停、空输出、非法 JSON、事件缺失。 +10. 从首个 `REPLY_START`、TeamSay、tool-call start、tool result 到 token delta 的首个可见事件均在指定时限内到达 adapter;并行两个成员交错输出时不串 message ID 或 tool call ID。 + +交付: + +- `AGENTSCOPE_BASELINE.md`。 +- 最小 team/model/tool/event adapter 测试。 +- Go/No-Go 结论。 + +Go 条件: + +- 结构化输出达到 POC 阈值。 +- 取消在预算时间内生效。 +- AgentScope 异常不会把任务误标完成。 +- 业务恢复不依赖 AgentScope Python 对象。 + +### BE-1:配置、依赖和总开关 + +新增 `config.yaml -> report_collaboration`: + +```text +enabled +worker_enabled +planner_model +coordinator_model +research_model +writer_model +reviewer_model +max_team_members +max_parallel_tasks +max_repair_rounds +max_node_attempts +session_timeout_seconds +node_timeout_seconds +lease_seconds +heartbeat_seconds +event_retention_days +allowed_tools +source_policy +token_budget +cost_budget +``` + +要求: + +- 默认关闭。 +- 限制在服务端强制执行。 +- 模型必须来自 `AppConfig.models`。 +- 工具必须来自 allowlist。 +- AgentScope 依赖只加入应用 `pyproject.toml`。 +- 离线 wheelhouse 和镜像在 `knowledge-base-bj/deerflow-offline-deployment` 更新,不提交到本业务仓库。 + +### BE-2:领域合同和状态机 + +完成 Pydantic 合同: + +- requirement。 +- agent catalog projection。 +- role demand。 +- plan candidate/graph/validation。 +- node contract/status/attempt。 +- agent run(并行阶段的稳定成员身份、显示资料和状态)。 +- artifact schemas。 +- command intent/status。 +- event envelope。 +- report version/rewrite proposal。 + +测试所有非法状态迁移,尤其: + +- awaiting input 卡片出现后不能完成节点。 +- AgentScope reply 返回后无成果物不能完成节点。 +- cancelled 后晚到输出不能回写 completed。 +- completed 节点重开时必须产生新 attempt。 + +### BE-3:迁移和持久化 Store + +任务: + +1. 创建数据库迁移。 +2. 实现 memory stores。 +3. 实现 SQL repositories。 +4. 注册 ORM 模型与 `create_all`。 +5. 在 app lifespan 注入 store。 +6. 完成 SQLite/MySQL/PostgreSQL 测试。 + +并发测试: + +- 同一 idempotency key 只创建一条 command。 +- 同一 session 只允许一个 active run。 +- 两个 worker 不能同时领取同一 lease。 +- event seq 唯一且递增。 +- stale revision 返回 409。 + +### BE-4:会话、消息和计划 API 骨架 + +任务: + +- session CRUD 和用户隔离。 +- message 持久化:完整保存用户可见的 assistant、TeamSay、`tool_calls` 与 `tool` 返回,并保留 `agent_run_id`/`node_run_id`/`phase_id`;不只保存阶段摘要。 +- plan request 入队。 +- plan list/select。 +- run create/query。 +- OpenAPI 响应模型。 +- 路由注册顺序和统一错误模型。 + +安全: + +- 不返回 agent 私有 SOUL 全文。 +- 不返回模型密钥、base URL 和工具凭据。 +- 计划卡只返回用户可见职责、能力和选择理由。 + +### BE-5:需求解析和澄清 + +`RequirementResolver`: + +1. 读取会话消息和最新 requirement snapshot。 +2. 提取主题、目标、受众、范围、角度、模板和来源限制。 +3. 判断是否缺少影响方案选择的必要信息。 +4. 必要时产生一个或多个独立 clarification。 +5. 用户回答后创建新 requirement revision。 +6. 达到澄清上限后使用明确假设继续,不能无限追问。 + +验收: + +- 只有主题的输入会询问真正影响报告的缺口。 +- 用户明确说“直接开始”时记录默认假设。 +- clarification resolved 不等于 plan ready 或 node completed。 + +### BE-6:智能体目录、筛选和候选计划 + +五阶段: + +1. `AgentCatalogProjection`:读取用户可见且启用的 agent、技能和工具元数据。 +2. `AgentSelector`:规则初筛并用模型重排,输出选择理由。 +3. `PlanController`:生成 2~3 种策略的 RoleDemand 和角度。 +4. `PlanAssembler`:绑定真实 agent、工具、预算、成果合同和质量门。 +5. `PlanValidator`:校验 agent、tool、template、依赖、并发和预算。 + +默认策略: + +- `balanced_review`:完整研究、核验、分析、写作、审稿。 +- `parallel_depth`:更多并行角度和双重核验。 +- `focused_fast`:角色较少、范围较窄,但保留引用核验和审稿。 + +要求: + +- 三种方案必须真实影响角色、范围、预算或质量门。 +- 模型不能引用目录外 agent ID。 +- 每个节点必须有成果类型和验收标准。 +- 候选图无任意循环;返工由运行时台账表达。 +- 方案保存 revision,选择和执行是两个独立命令。 + +### BE-7:AgentScope 模型适配 + +目标:让 AgentScope 使用 DeerFlow 配置的模型,不再建立第二套 Provider 配置。 + +任务: + +- 从 `AppConfig.models` 解析模型。 +- 优先实现 AgentScope ChatModelBase adapter。 +- 复用现有 Provider 超时、代理和密钥管理。 +- 转换流式 text、tool call、usage 和错误。 +- 记录每个 node attempt 的 token/费用。 +- 模型不存在或能力不匹配时在 run 前失败。 + +约束: + +- prompt、事件和日志不出现密钥。 +- 一次 run 的角色模型快照冻结,运行中不静默换模型。 +- 模型 fallback 必须记录事件和审计。 + +### BE-8:工具与权限适配 + +第一版允许: + +- Web 检索和正文获取。 +- 用户有权限的知识库/Wiki 检索。 +- 明确批准的只读技能/MCP。 +- 成果物板读写工具。 +- AgentScope 团队通信与任务工具。 + +第一版默认禁止: + +- 宿主文件系统直接访问。 +- 任意代码执行。 +- 任意 HTTP。 +- 任意数据库写入。 +- 运行期安装包或技能。 + +角色权限: + +- Researcher 不能发布报告。 +- Writer 不能把未核验证据改成已核验。 +- Reviewer 只能输出 ReviewDecision,不能覆盖报告。 +- Coordinator 只能通过受控工具创建任务、分派、等待、返工和建议完成。 +- 所有成员获得本次 run 的最小权限快照。 + +验收: + +- 每个角色有 allow/deny 测试。 +- 工具结果携带 source ID。 +- 网页 prompt injection 不能提升权限。 +- AgentScope 工具异常被转换为 node/tool event,不泄露内部堆栈给用户。 + +### BE-9:AgentScope Team 运行器 + +基础角色: + +- `Coordinator` +- `Researcher` +- `Verifier` +- `Analyst` +- `Synthesizer` +- `Writer` +- `Reviewer` +- `Reviser` + +动态规则: + +- 计划决定 Researcher/Analyst 数量和角度。 +- 服务器限制团队人数、并发、attempt、返工和预算。 +- 每个成员上下文只包含当前任务、需求快照和必要上游成果。 +- Coordinator 不直接操作数据库,只调用 TaskLedger/ArtifactBoard 工具。 +- 任务完成由 QualityGate 判定,不接受文本声明。 + +事件映射: + +- AgentScope `REPLY_*` → 以原始文本 chunk 创建/更新协调者或成员的稳定 assistant 消息,保留 `agentRunId`;不得等待 reply 完成后再合成为进度摘要。 +- AgentScope TeamSay → 以成员身份创建/更新普通 assistant 消息,保留完整用户可见交接内容与因果顺序。 +- `MODEL_CALL_*` → 内部遥测,默认不下发原始 prompt。 +- `TOOL_CALL_*` → 原生 `ai.tool_calls` 参数事件;对应工具返回 → 原生 `tool` 消息和相同 `tool_call_id`。两者在 SSE 和持久化中一一对应,供现有 `MessageGroup` 直接渲染。 +- team task/update → node/task ledger 状态。 +- 成果工具 → artifact created/validated/rejected。 +- 每个用户可见阶段开始、进展、完成、等待、返工和失败都必须同步产生稳定的消息或状态事件,供左侧 DeerFlow `MessageList` 按原始消息顺序展示;不能要求前端读取节点结果后自行拼装过程,也不能用聚合卡替换 AgentScope 的实时可见消息。 + +验收: + +- 成员失败可定向重试或替换,不直接完成整个 run。 +- 空输出和非法 JSON 进入 repair attempt。 +- 超过上限时给出明确失败/部分完成,不无限循环。 + +### BE-10:成果物板与质量门 + +`ArtifactBoard`: + +- 按 run/node/attempt/type 保存成果。 +- 保存 schema version、需求 revision、来源引用和 validation status。 +- 只向下游提供 `validated` 成果。 +- 返工保留旧成果并标记 superseded。 + +`QualityGate`: + +- EvidenceBundle:来源数量、日期、URL/文档 ID、摘录和去重。 +- VerificationResult:支持与反对证据、冲突、时效。 +- AngleAnalysis:结论必须引用验证过的 evidence ID。 +- ReportSectionDraft:关键事实和数字必须有引用。 +- ReviewDecision:问题必须有目标、严重度和修复要求。 +- ReportVersion:模板覆盖、引用完整、章节一致、正式版本已持久化。 + +验收: + +- 无成果、空成果和不合 Schema 的成果不能完成节点。 +- 未验证来源不能直接进入最终事实陈述。 +- Reviewer 的返工目标可映射到具体节点和章节。 + +### BE-11:后台 Dispatcher、租约和恢复 + +复用现有成熟模式: + +- active-dedupe key。 +- dispatcher 原子 claim。 +- executor heartbeat。 +- cancel watcher。 +- 两阶段取消。 +- lease 失效接管。 +- durable event + live hub。 + +恢复: + +1. 读取 requirement、selected plan、task ledger。 +2. 保留已验证且未失效成果。 +3. 将遗留 `running` attempt 标为 interrupted。 +4. 为未完成任务创建新 attempt。 +5. 重建 AgentScope team。 +6. 注入必要成果和协调摘要。 +7. 从下一批 ready task 继续。 + +验收: + +- 杀死 worker 后可接管。 +- 已完成节点不重复检索和计费。 +- worker 丢失 lease 后停止本地模型与工具链。 +- cancel 后晚到结果只可保存为 superseded,不改变终态。 + +### BE-12:SSE 和 Live Hub + +任务: + +- 实现 event repository。 +- 实现 run-scoped live hub。 +- 实现历史分页和 SSE replay。 +- 支持 heartbeat、after_seq、Last-Event-ID。 +- 短暂存储读取异常时保持连接。 +- 将高频 token delta 合帧。 +- 建立 `ConversationReplica`:将 AgentScope 用户可见消息、TeamSay、assistant delta、`tool_calls`、`tool` 返回、协助请求、报告文件和领域状态写成可重放的统一消息事件。它是协议镜像而不是摘要生成器。 +- 对话镜像完整保留用户有权查看的 TeamSay、原始工具参数和返回;不包含 chain-of-thought、系统/内部 prompt、密钥、权限不可见内容和异常堆栈。脱敏在入库/下发前一次执行,不能由前端自行推断。 +- `agentRunId` 是并行消息流的稳定归属。Live Hub 始终发布所有成员事件;前端标签切换只在本地选择消息,不启动第二条运行流,也不取消未聚焦成员的 delta。 + +验收: + +- 重连不丢 durable event。 +- 重复连接不重复执行业务命令。 +- 终态前报告正式版本已写入并可读。 +- SSE 断开不取消后台 run。 +- 仅依靠会话快照和事件重放即可重建每个成员的完整原生消息、工具过程和左侧聚焦视图,不需要调用节点结果接口。 + +### BE-13:全过程命令与影响分析 + +`IntentRouter` 输入: + +- 用户文本。 +- session/run 状态。 +- requirement revision。 +- 当前选中节点或章节上下文。 +- 后端动作白名单。 + +输出: + +```text +intent +confidence +target_type +target_ids[] +normalized_instruction +requires_confirmation +cost_level +reason +``` + +命令类型: + +- `answer_question` +- `update_requirements` +- `add_angle` +- `research_again` +- `reanalyze` +- `rerun_node` +- `rewrite_section` +- `polish_report` +- `ask_report` +- `replan` +- `cancel` + +`ImpactAnalyzer`: + +- 重新检索:失效指定 EvidenceBundle 和引用它的下游。 +- 重新分析:保留 evidence,失效分析和对应章节。 +- 章节重写:保留研究/分析,只生成 replacement candidate。 +- 语气润色:创建新报告版本,不失效事实成果。 +- 全局改向:新建 plan revision,确认后创建 run branch。 + +Safe-point: + +- 可取消的当前工具调用先停止。 +- 不可立即取消的 attempt 继续到边界,command 状态为 `accepted_waiting_boundary`。 +- 晚到输出可保存但标记 superseded,不能进入下游。 +- 每条 command 有分类、影响范围、状态和结果。 + +验收: + +- 低置信度“改一下”必须追问。 +- 相同幂等键不重复创建返工任务。 +- 运行中命令不能造成 completed/cancelled 状态竞争。 + +### BE-14:报告模板、写作、审稿和版本 + +复用 `/api/report-structures`,run 开始时冻结模板快照: + +- 章节层级。 +- 每章目标与必答问题。 +- 必需表格/对比维度。 +- 语气、语言、篇幅。 +- 检索方向与允许技能。 +- 引用格式。 + +写作规则: + +- Writer 只能使用 validated artifacts。 +- 关键判断绑定 evidence ID。 +- 无法证实的内容明确标为分析、假设或局限。 +- 每章获得确定 evidence set。 +- 完整报告执行引用、模板、衔接和结论一致性检查。 +- Reviewer 输出结构化 ReviewDecision。 +- Reviser 只修改指定问题。 +- 达到返工上限后报告未解决问题,不无限循环。 + +版本规则: + +- 流式 Markdown 是临时草稿,不覆盖当前正式版本。 +- 正式版本落库并确认后 run 才能 completed。 +- 章节改写生成 replacement candidate。 +- 用户 apply 后创建新版本。 +- restore 也创建新头版本,不破坏历史。 + +### BE-15:安全、审计和预算 + +- 所有资源校验 owner 或明确授权。 +- agent snapshot 移除密钥和不可见 prompt。 +- 工具参数/结果完整镜像到用户消息流;只有密钥、令牌、隐私字段、越权内容和明确的异常堆栈由统一脱敏器替换并记录原因。不能以大小截断或摘要替代用户有权查看的返回;超大返回以可重放 chunk 传输和按需折叠展示,正文仍可完整读取。 +- 外部内容全部视为不可信资料。 +- 每用户 active run 上限。 +- 每 run 团队、并发、检索、来源正文、模型调用、token、费用和总时长上限。 +- 审计 agent 选择、工具调用、来源、用户命令、人工确认和报告版本。 +- 不持久化、不下发原始 chain-of-thought、系统/内部 prompt 或模型推理 token;这不影响用户可见 assistant 文本、TeamSay、工具调用与工具返回的完整镜像。 + +### BE-16:测试与质量评测 + +单元测试: + +- Pydantic 合同。 +- 计划装配和验证。 +- task ledger 状态机。 +- artifact validation。 +- dependency invalidation。 +- intent router 高成本闸门。 +- AgentScope event adapter。 +- 同一 `message_id` 的 token delta、同一 `tool_call_id` 的参数/结果 delta 以及脱敏字段替换;断线重放后消息正文不得被摘要化或重复。 +- 两个 `agentRunId` 并行交错输出、其中一员等待用户协助时,消息归属、工具配对、状态和命令目标均正确。 + +集成测试: + +- fake model 下完整研究、核验、分析、写作、审稿、返工。 +- 用户协助卡提交后仍需成果校验。 +- 早停、空输出、非法 JSON、无引用。 +- 模型和工具超时。 +- SSE replay、取消和 worker 崩溃接管。 +- 从 `REPLY_START` 到首条消息、从 `TOOL_CALL_START` 到原生工具步骤、从工具返回到 `tool` 消息的可见时延;不得等待节点完成才出现过程。 + +真实 AgentScope 冒烟: + +- 至少两个已配置模型。 +- leader + 多 worker。 +- 并发工具和 TeamSay。 +- 取消、超时、异常成员和结果修复。 + +质量评测集: + +- 不少于 20 个真实任务。 +- 覆盖政策影响、市场趋势、企业研究、事件研判、对比分析。 +- 每个任务记录必选角度、关键事实、禁止编造项、模板和评审规则。 +- 与现有多智能体会商进行盲评。 +- 指标:事实准确、来源质量、角度覆盖、逻辑一致、格式遵循、可修改性、耗时和成本。 + +--- + +## 9. 首个纵向 POC + +固定任务: + +> 撰写一份新能源汽车主要品牌市场趋势分析报告,覆盖 2024 年至今的市场份额、价格策略、技术路线、海外进展、政策环境和未来 12~24 个月风险与机会,面向企业战略决策人员,要求所有关键数字给出来源。 + +### POC-1:候选计划 + +- 生成 3 种真实有差异的方案。 +- 每个方案只引用有效 agent/tool/template。 +- 每个节点有职责、输入、输出和验收条件。 +- 选择方案不开始,显式 run 命令才开始。 + +### POC-2:三角色闭环 + +角色:Coordinator、Researcher、Writer。 + +- 完成真实 Web 检索。 +- 形成 EvidenceBundle。 +- 生成带来源报告。 +- durable event 可驱动前端流程图。 +- 每位成员的 TeamSay、流式文本、工具调用和工具返回可由同一 SSE 流重放,并能按 `agentRunId` 还原。 + +### POC-3:质量角色 + +加入 Verifier、Analyst、Reviewer、Reviser。 + +- 过期资料被识别。 +- 冲突资料被标记。 +- 缺失角度触发定向补充。 +- 报告未通过评审时只返工目标节点。 + +### POC-4:全过程干预 + +必须演示: + +1. “增加供应链与原材料风险角度”。 +2. “海外市场资料太旧,重新检索 2026 年最新信息”。 +3. “重写第二章,结论更谨慎,不要重新检索”。 +4. 刷新页面后继续。 +5. 取消时晚到输出不改变终态。 +6. worker 崩溃后租约接管。 + +--- + +## 10. 后端开发顺序 + +1. `RC-BE-000`:AgentScope 版本与兼容性尖峰。 +2. `RC-BE-001`:领域合同和状态机。 +3. `RC-BE-002`:配置、依赖和 feature flag。 +4. `RC-BE-003`:数据库迁移和 stores。 +5. `RC-BE-004`:session/message/plan API。 +6. `RC-BE-005`:需求解析与澄清。 +7. `RC-BE-006`:agent catalog、selector、plan assembler/validator。 +8. `RC-BE-007`:AgentScope model adapter。 +9. `RC-BE-008`:tool/permission adapter。 +10. `RC-BE-009`:三角色 team POC。 +11. `RC-BE-010`:task ledger、artifact board、quality gate。 +12. `RC-BE-011`:durable event、原生消息镜像、SSE 和 live hub。 +13. `RC-BE-012`:dispatcher、executor、lease、cancel、recovery。 +14. `RC-BE-013`:Verifier/Analyst/Reviewer/Reviser。 +15. `RC-BE-014`:intent router、impact analyzer、safe-point commands。 +16. `RC-BE-015`:report structures、report versions、rewrite candidates。 +17. `RC-BE-016`:安全、审计、预算、监控。 +18. `RC-BE-017`:并发、故障恢复和真实 AgentScope 测试。 +19. `RC-BE-018`:20 项质量评测和参数调优。 +20. `RC-BE-019`:灰度与离线发布接入。 + +前后端共同依赖:在 `RC-BE-001` 后冻结 OpenAPI、event envelope 和共享枚举,前端再开始真实 API 层开发。 + +--- + +## 11. 上线质量门 + +### 11.1 功能门 + +- 任一协助卡不会完成节点。 +- 任一 assistant 短消息不会完成 run。 +- 每个完成节点都有 validated artifact。 +- 每条用户反馈都有 durable command。 +- 每个正式报告都有已持久化版本。 + +### 11.2 质量门 + +- 关键事实引用覆盖率达到评测目标。 +- 引用可打开对应来源。 +- 过期、冲突、低可信来源可识别。 +- 必选角度覆盖。 +- Reviewer 问题可映射到返工节点。 +- 模板章节完整。 +- 不生成来源中不存在的数字、事件或观点归属。 + +### 11.3 可靠性门 + +- command、run create、cancel 幂等。 +- SSE 重连不丢事件。 +- worker 崩溃可接管。 +- cancelled 不被晚到结果改写。 +- 正式报告不被失败的流式草稿覆盖。 +- PostgreSQL/MySQL 并发测试通过。 + +### 11.4 决策门 + +质量盲评必须证明新方案相对现有会商在报告质量或交互效率上有明确提升。若没有提升,不以“AgentScope 已接入”作为上线理由。 + +--- + +## 12. 风险与应对 + +### 12.1 AgentScope API 快速变化 + +固定版本和 commit;所有上游对象通过 adapter;升级必须跑兼容性尖峰和真实任务评测。 + +### 12.2 Agent Team 可靠性不足 + +状态、完成条件、重试和恢复由 DeerFlow TaskLedger/ArtifactBoard 管理;AgentScope 负责协作,不决定业务终态。 + +### 12.3 多智能体成本高但质量不提升 + +按复杂度控制团队规模;快速方案也保留核验/审稿;以评测指标而不是 agent 数量验收。 + +### 12.4 智能体互相传话失真 + +TeamSay 不作为事实来源;报告事实只能引用 validated EvidenceBundle。 + +### 12.5 全过程对话产生状态竞争 + +反馈先落 durable command;使用 revision、幂等键、safe-point、依赖失效和 superseded 输出。 + +### 12.6 进程恢复后上下文不一致 + +不恢复 Python 对象;从需求、计划、台账、成果和协调摘要重建 AgentScope team。 + +### 12.7 离线依赖缺失 + +业务仓库只维护依赖锁与代码;wheelhouse、镜像和发布脚本统一进入离线发布仓库。 + +--- + +## 13. 后端完成定义 + +后端只有同时满足以下条件才算完成: + +1. 使用 AgentScope 2.0 Core 组织真实 leader-worker 团队。 +2. 不调用旧 Workflow Studio DAG scheduler。 +3. 不改变现有多智能体会商行为。 +4. DeerFlow 数据库是状态唯一事实源。 +5. 成果物校验而不是模型文本决定节点完成。 +6. 规划、检索、分析、核验、写作、审稿、返工、错误和报告变化均可由同一对话时间线完整重建。 +7. 节点公开接口只提供职责合同和状态,不向前端暴露执行结果面板所需数据。 +8. 全过程用户反馈能准确分类、定向失效和安全生效。 +9. 规划、运行、等待、返工、取消和报告版本均有 durable event。 +10. 刷新、断线、worker 崩溃和租约接管后可恢复。 +11. 模型、工具、资料、用户和报告权限不被 AgentScope 绕过。 +12. 报告完成前已持久化正式版本并通过质量门。 +13. 真实质量评测达到上线阈值。 +14. 离线依赖和部署验证在独立发布仓库完成。