# AI 写作前端改造清单 ## 1. 目标 在不新增第二套页面的前提下,基于现有 `open-canvas` 页面,把左侧从“单轮聊天输入框”升级为“多 Agent 写作工作台”,右侧继续沿用当前 `artifact` 编辑与流式预览能力。 当前核心文件: - [CanvasResizableLayout.tsx](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/components/layout/CanvasResizableLayout.tsx) - [CanvasChatPanel.tsx](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/components/chat/CanvasChatPanel.tsx) - [CanvasArtifactPanel.tsx](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/components/artifact/CanvasArtifactPanel.tsx) - [CanvasGraphContext.tsx](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/contexts/CanvasGraphContext.tsx) - [CanvasStreamContext.tsx](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/contexts/CanvasStreamContext.tsx) - [useCanvasThreadStream.ts](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/hooks/useCanvasThreadStream.ts) - [runs.ts](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/api/runs.ts) --- ## 2. 改造原则 - 不改右侧主编辑器交互心智 - 不复制新页面 - 不破坏现有普通 chat 模式 - 新增“写作工作流模式”时尽量以增量状态字段和新组件完成 - 所有 workflow 能力都应允许逐步灰度 --- ## 3. 推荐前端结构 建议在 `frontend-web/src/open-canvas` 下新增以下目录: ```text frontend-web/src/open-canvas/ workflow/ api/ writing-workflow.ts components/ WritingWorkflowEntryForm.tsx WritingWorkflowTimeline.tsx WritingWorkflowEventList.tsx WritingWorkflowArtifactDrawer.tsx WritingWorkflowConfirmCard.tsx WritingWorkflowHeader.tsx contexts/ WritingWorkflowContext.tsx hooks/ useWritingWorkflow.ts useWritingWorkflowEvents.ts types/ workflow.ts utils/ workflow-event.ts ``` 说明: - `open-canvas` 原有聊天、artifact、editor 目录不重构 - 以 `workflow/` 作为新能力边界,减少对既有文件的侵入 --- ## 4. 状态设计 ## 4.1 新增的核心状态 建议新增: - `workflowMode: "chat" | "writing_pipeline"` - `workflowRunId: string | null` - `workflowStage` - `workflowStatus: "idle" | "running" | "waiting_user" | "completed" | "failed"` - `workflowEvents: WritingWorkflowEvent[]` - `workflowArtifacts: WritingWorkflowArtifact[]` - `workflowPendingAction: WritingPendingAction | null` ## 4.2 推荐类型定义 建议在 `workflow/types/workflow.ts` 中先定义: ```ts export type WritingWorkflowStage = | "idle" | "collecting_materials" | "generating_outline" | "await_outline_confirmation" | "writing_draft" | "reviewing_draft" | "rewriting_draft" | "completed" | "failed"; export type WritingWorkflowEventType = | "workflow_started" | "stage_changed" | "agent_started" | "agent_output_chunk" | "artifact_generated" | "human_confirmation_required" | "retry_scheduled" | "workflow_completed" | "workflow_failed"; ``` 第一版把类型先收紧,后续再扩展。 --- ## 5. 组件拆分建议 ## 5.1 左侧主面板改造 当前 `CanvasChatPanel` 建议只承担“模式路由”和布局容器职责,不继续无限堆逻辑。 建议改造为: - `chat` 模式继续渲染现有消息列表 + 输入框 - `writing_pipeline` 模式渲染新的工作流视图 建议拆分出: - `CanvasChatConversation.tsx` - `CanvasChatInputBox.tsx` - `CanvasWorkflowPanel.tsx` 这样后续不会把 `CanvasChatPanel.tsx` 变成一个过大的组件。 ## 5.2 新增组件职责 ### `WritingWorkflowEntryForm.tsx` 负责采集: - 主题 - 文章类型 - 目标读者 - 语气风格 - 目标篇幅 - 是否需要引用资料 - 禁写项 - 补充说明 ### `WritingWorkflowTimeline.tsx` 负责显示阶段: - 研究中 - 提纲生成中 - 等待确认提纲 - 正在写初稿 - 正在审稿 - 正在重写 - 已完成 ### `WritingWorkflowEventList.tsx` 负责显示细粒度事件: - 哪个 Agent 开始执行 - 当前在处理哪一步 - 当前产生了什么中间结果 - 是否重试 ### `WritingWorkflowArtifactDrawer.tsx` 负责展示中间产物: - 素材卡片 - 提纲 - 初稿 - 编辑意见 - 重写稿 ### `WritingWorkflowConfirmCard.tsx` 负责展示用户确认点: - 确认提纲 - 驳回提纲并附带修改意见 - 继续写稿 - 指定重写章节 --- ## 6. Context 与 Hook 改造建议 ## 6.1 `CanvasGraphContext` 当前它只维护: - `messages` - `artifact` - `streamingArtifact` - `isStreaming` 建议不要把 workflow 状态直接塞进现有 `CanvasGraphContext`,否则会让语义过重。 推荐做法: - 保留 `CanvasGraphContext` 继续服务右侧 artifact 和通用流式状态 - 新增 `WritingWorkflowContext` ## 6.2 `WritingWorkflowContext` 建议承载: - 当前 workflow 运行状态 - 中间产物列表 - 待确认操作 - workflow 事件缓存 - 启动 / 取消 / 确认 / 重写等 action ## 6.3 `useCanvasThreadStream` 当前这个 hook 已经负责: - 创建 thread - 提交消息 - 接收 thread stream - 将 `update_artifact` 同步到右侧 建议不要把“多 Agent workflow 状态机”也硬塞进去。 推荐方案: - 保留 `useCanvasThreadStream` 给普通 chat 或兼容旧能力使用 - 新增 `useWritingWorkflow` - 新增 `useWritingWorkflowEvents` 分工如下: - `useCanvasThreadStream`:普通对话流 - `useWritingWorkflow`:创建 workflow、提交表单、触发确认动作 - `useWritingWorkflowEvents`:订阅 workflow 事件流 --- ## 7. API 接入建议 ## 7.1 前端 API 文件 新增: - `workflow/api/writing-workflow.ts` 建议暴露方法: - `createWorkflow(payload)` - `startWorkflow(id)` - `getWorkflow(id)` - `subscribeWorkflowEvents(id, handlers)` - `confirmOutline(id, payload)` - `rewriteSection(id, payload)` - `approveFinal(id)` ## 7.2 事件流形式 优先级建议: 1. `SSE` 2. 流式 HTTP chunk 3. 轮询兜底 理由: - 事件驱动比整段消息流更适合 workflow UI - 可以更方便映射到时间线和事件列表 --- ## 8. 与右侧 Artifact 的衔接 ## 8.1 现有优势 当前 `CanvasArtifactPanel` 已具备: - 流式展示内容 - 最终 artifact 渲染 - 右侧编辑体验成熟 这意味着多 Agent 工作流不需要再做第二套文章渲染,只要把最终阶段结果推成 artifact 即可。 ## 8.2 建议接法 工作流各阶段结果按两类处理: - 中间产物:进入左侧 `workflowArtifacts` - 可阅读正文:同步一份到右侧 `artifact` 推荐映射: - 提纲:可选同步到右侧,供用户预览 - 初稿:同步到右侧 - 重写稿:覆盖或新增版本到右侧 - 终稿:作为最终右侧主版本 ## 8.3 版本策略 建议右侧版本保留: - `outline` - `draft_v1` - `draft_v2` - `final` 如果现有 artifact 数据结构不方便承载完整版本树,第一版可先保留在 workflowArtifacts 中,右侧只展示当前激活版本。 --- ## 9. 页面交互流程 ## 9.1 用户首次进入 - 默认仍是现有 chat 模式 - 在左侧增加一个显眼切换入口:`普通对话` / `写作工作流` ## 9.2 启动写作工作流 - 用户填写写作任务表单 - 点击“开始生成” - 左侧切换到时间线 + 事件流视图 - 右侧进入 loading 或素材 / 提纲预览态 ## 9.3 等待提纲确认 - 时间线停在 `await_outline_confirmation` - 左侧出现确认卡片 - 用户可执行: - 通过提纲 - 要求调整提纲 - 追加要求 ## 9.4 生成初稿与审稿 - 左侧显示 Agent 事件 - 右侧展示初稿内容 - 审稿意见在左侧展示,同时高亮需要重写的章节 ## 9.5 完成 - 左侧显示“终稿已完成” - 右侧进入可继续局部 AI 编辑状态 --- ## 10. 分步开发清单 ## Step 1:类型与假数据 目标: - 先把 workflow 的类型、mock 数据、组件骨架搭好 任务: - 新建 `workflow/types/workflow.ts` - 新建 `workflow/components/*` - 用本地 mock 事件驱动时间线和事件流 验收: - 不接后端也能在页面中演示完整流程 ## Step 2:模式切换 目标: - 在 `CanvasChatPanel` 中接入 `chat / writing_pipeline` 双模式 任务: - 拆出 `CanvasWorkflowPanel` - 增加模式切换 UI - 保证旧 chat 不回归 验收: - 现有功能不受影响 - 新模式可进入表单页 ## Step 3:接入 workflow API 目标: - 从 mock 切到真实 API 任务: - 接 `create/start/get/events` - 实现基础错误态和重试态 验收: - 前后端可联调跑一条主链路 ## Step 4:接入确认节点 目标: - 支持提纲确认和指定章节重写 任务: - 做确认卡片 - 做动作回传 验收: - 用户能在流程中介入 ## Step 5:打通右侧版本 目标: - 让 workflow 产物稳定进入右侧编辑器 任务: - 约定 artifact 映射 - 接入版本切换或当前版本覆盖 验收: - 终稿稳定显示在右侧 --- ## 11. 建议修改点位 优先涉及文件: - [CanvasChatPanel.tsx](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/components/chat/CanvasChatPanel.tsx) - [CanvasGraphContext.tsx](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/contexts/CanvasGraphContext.tsx) - [useCanvasThreadStream.ts](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/hooks/useCanvasThreadStream.ts) - [CanvasArtifactPanel.tsx](/F:/react/deeflow-code/deerflow-server-master/frontend-web/src/open-canvas/components/artifact/CanvasArtifactPanel.tsx) 建议新增,不建议重写原有: - `open-canvas/workflow/api/writing-workflow.ts` - `open-canvas/workflow/contexts/WritingWorkflowContext.tsx` - `open-canvas/workflow/hooks/useWritingWorkflow.ts` - `open-canvas/workflow/hooks/useWritingWorkflowEvents.ts` - `open-canvas/workflow/components/*` --- ## 12. 联调约定 前后端需要尽早统一: - workflow id 命名 - stage 枚举 - event type 枚举 - artifact type 枚举 - user action payload - 错误码与可恢复动作 建议先由前端与后端共同确认一份 `workflow.ts` 契约文档,再开工。 --- ## 13. 最终建议 前端最重要的不是“把 Agent 结果展示出来”,而是把“工作流过程可视化并允许人工介入”做清楚。 第一版建议先保证三件事: 1. 左侧能看见阶段进展 2. 用户能确认提纲 3. 右侧能稳定收到初稿和终稿 只要这三件事稳定,后续再继续加章节重写、评分展示、素材卡片增强,风险会小很多。