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-agent

AiPPTView有三个宿主:

入口用法
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
   └── ConversationHistory

MessageInput包含:

  • 文本输入;
  • 参考文件;
  • 生成模式下拉;
  • 高级配置;
  • 发送和停止。

模型选择器组件仍在源码中,但当前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.ts

Core维护记录、生成锁、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/outline

SSE消息中的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_idtemplate_idtemplate_type。模板市场为1,企业模板为2。

导出:

POST /plugin/aippt/download/export/file
→ taskKey
→ GET /plugin/aippt/download/export/file/result
→ 每500ms轮询PPTX URL

6. 端到端时序

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. 取消和错误

阶段取消方式
大纲SSEsseClient.close()
单页请求AbortController.abort()
内容和导出AbortSignal中断请求和轮询

当前没有自动重试。失败后由用户点击“重新生成”。

10. 私有化差异

私有化版本中,checkGenerateCountcheckRiskreplaceRiskText不拦截生成。

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/

相关文档: