title: AiPPT 智能生成业务逻辑 date: 2026-08-27 tags:
- AiPPT
- AI生成PPT
- SSE
- 业务逻辑 status: active
AiPPT 智能生成业务逻辑
快速认识
AiPPT页面负责创建生成任务、流式展示大纲、选择模板、导出PPTX,并把文件交给宿主打开或插入当前PPT。
主调用链:
用户输入
→ 创建taskId
→ SSE大纲
→ 编辑大纲和选择模板
→ 生成内容
→ 保存设计
→ 导出PPTX
→ 下载
→ 打开PPT或插入Slide核心页面:
pages/online/ai-agentAiPPTView有三个宿主:
| 入口 | 用法 |
|---|---|
ai-agent.html | 独立AI助手窗口 |
template-source-lib/views/AiPPT | 模板广场内嵌页面 |
desktop/views/AiAgent | 独立桌面端 |
三处共用PPTAgent、Store、Controller和HTTP接口。
当前入口状态:
| UI | 当前源码 |
|---|---|
| 智能生成 | 显示 |
| 文档生成 | 显示 |
| 选择模板生成 | 显示 |
| 单页生成 | 实现保留,入口注释 |
| 模型选择 | 组件保留,主页面未挂载 |
| 联网搜索 | Controller支持,输入区入口注释 |
| AI生图和AI文本 | 菜单未启用 |
1. 组件
AiPPTView
→ FunctionPanel
→ PPTAgent
├── MessageBox
├── MessageInput
├── AgentSelect
├── TemplateSelector
└── ConversationHistoryMessageInput包含:
- 文本输入;
- 参考文件;
- 生成模式下拉;
- 高级配置;
- 发送和停止。
模型选择器组件仍在源码中,但当前PPTAgent没有挂载,模型参数也没有随发送请求透传。
2. 生成模式
| 类型 | 处理方式 |
|---|---|
AiGenerate | 主题、预置词、参考文件或联网搜索生成多页PPT |
BaseDocGenerate | 导入文档,预处理后生成 |
BaseTemplateGenerate | 先选模板,再生成内容 |
SinglePageGenerate | 生成一页并插入当前PPT |
入口启用情况见第一屏的当前入口状态表。
智能生成
普通输入调用addChatText。参考文件调用addChatImport。联网搜索先取得search_id,再创建生成任务。
文档生成
Markdown、FreeMind和XMind可以直接作为大纲。Word、PDF和TXT先选择:
保持原文
适当扩写
润色美化模板生成
切换模式后打开TemplateSelector。模板写入curSelectedTemplate,后续大纲和内容生成复用智能生成链路。
单页生成
调用/user/ai/chat/editor/add_page,前端用mockAsyncChunk模拟流式显示。生成完成后调用Libraries.addSlide。
3. Store和Controller
Store:
components/PPTAgent/store.ts主要状态:
| 字段 | 用途 |
|---|---|
type | 当前生成模式 |
chatOptions/chatConfig | 高级配置 |
referenceFiles | 参考文件 |
promptData | 预置提示词 |
messageRecords | 对话、大纲和成品记录 |
templateSelectorConfig | 模板选择器 |
genPPTController | 生成状态机 |
Controller:
modules/gen-ppt-controller/
├── Core.ts
├── AiGenerate.ts
├── BaseDocGenerate.ts
├── BaseTemplateGenerate.ts
└── AiGenerateSinglePage.tsCore维护记录、生成锁、SSE、正文轮询和取消控制。
4. 任务和SSE
创建任务:
POST /plugin/aippt/ai/chat/v2/task返回taskId。
大纲通过EventSourcePolyfill读取,Token放在Authorization头中。不同模式使用不同URL:
/plugin/aippt/ai/chat/outline
/plugin/aippt/ai/chat/network
/plugin/aippt/ai/chat/refer
/plugin/aippt/ai/chat/v2/word
/user/ai/single/page/chat/outlineSSE消息中的content按字符写入Outline记录。data:[DONE]结束。返回msg或触发error时,Controller停止任务并写入失败记录。
5. 内容、设计和导出
纯智能生成和模板生成会额外请求完整正文:
GET /plugin/aippt/chat/content?task_id=<id>
→ ticket
→ GET /plugin/aippt/content/check?ticket=<ticket>
→ 每2秒轮询到status=2文档导入、参考文件和预置词链路直接使用大纲内容。
保存设计:
POST /plugin/aippt/design/v2/save参数包含task_id、template_id和template_type。模板市场为1,企业模板为2。
导出:
POST /plugin/aippt/download/export/file
→ taskKey
→ GET /plugin/aippt/download/export/file/result
→ 每500ms轮询PPTX URL6. 端到端时序
sequenceDiagram actor User as 用户 participant Page as PPTAgent participant Core as GenPPTController participant API as AiPPT API participant Client as Client.download participant Libraries as Libraries participant Host as PowerPoint或WPS User->>Page: 输入主题并发送 Page->>Core: startGenerateOutline Core->>API: 创建任务 API-->>Core: taskId Core->>API: SSE读取大纲 API-->>Core: content增量和DONE Core-->>Page: Outline记录 User->>Page: 编辑大纲并选择模板 Page->>Core: startGeneratePPT Core->>API: 生成正文和保存设计 Core->>API: 创建导出任务并轮询 API-->>Core: PPTX URL Core->>Client: 下载PPTX Client-->>Core: filePath Core->>Libraries: addPresentation或addSlide Libraries->>Host: 打开PPT或插入Slide
7. 下载和宿主写入
Windows和macOS
Client/impl/cpp.ts
→ postMessageToClient(client.download)
→ Native下载
→ completed回调
→ Libraries/impl/cpp.ts多页调用Libraries.AddPresentation,单页调用Libraries.AddSlide。
WPS
Client/impl/wps.ts
→ fetch
→ WPS FileSystem.writeAsBinaryString
→ Libraries/impl/wps.ts多页使用Presentations.Open,单页使用Slides.InsertFromFile。
8. 状态机
stateDiagram-v2 [*] --> Idle Idle --> GeneratingOutline: 发送 GeneratingOutline --> OutlineReady: SSE完成 GeneratingOutline --> Failed: SSE错误 OutlineReady --> GeneratingPPT: 保存并生成 GeneratingPPT --> Exporting: 设计保存完成 Exporting --> Downloading: 获得PPTX URL Downloading --> Inserting: 下载完成 Inserting --> Generated: 宿主处理完成 GeneratingOutline --> Canceled: 停止 GeneratingPPT --> Canceled: AbortController Exporting --> Canceled: AbortController Failed --> Idle: 手动重新生成 Canceled --> Idle
markGenerating保证同一时刻只有一个任务。
9. 取消和错误
| 阶段 | 取消方式 |
|---|---|
| 大纲SSE | sseClient.close() |
| 单页请求 | AbortController.abort() |
| 内容和导出 | AbortSignal中断请求和轮询 |
当前没有自动重试。失败后由用户点击“重新生成”。
10. 私有化差异
私有化版本中,checkGenerateCount、checkRisk和replaceRiskText不拦截生成。
WPS还存在以下差异:
- Token来自固定用户登录;
- 下载由前端和WPS FileSystem完成;
- 不打开PPT预览抽屉;
- 生成结果直接打开PPT或插入Slide。
登录见 私有化WPS总览 > 6. 固定用户登录。
11. 代码位置
pages/online/ai-agent/
common/http/AiAgent.ts
common/client-communication/Client/
common/client-communication/Libraries/
pages/online/template-source-lib/views/AiPPT/
pages/desktop/views/AiAgent/相关文档: