基于 CAMEL PPTXToolkit 与 Streamlit 构建 AI 驱动的 PPT 自动生成应用
本文围绕 CAMEL 仓库中的 pptx_toolkit_usecase 示例,完整讲解如何用 CAMEL 的 PPTXToolkit 搭配 OpenAI 与 Streamlit,在数秒内从任意主题自动生成结构完整、图文并茂的专业 PPTX 演示文稿。读者将掌握"LLM 生成结构化幻灯片 JSON → 工具包渲染 PPTX"的完整流水线,理解 PPTXToolkit 的 JSON 数据契约、步骤图/表格/图片渲染原理,并可直接运行一个可复用的 Streamlit 应用。
应用概览:一个"主题到 PPTX"的端到端 Demo
examples/usecases/pptx_toolkit_usecase/ 目录下存放着一个可直接运行的 AI PPT 生成器应用,其核心文件与资源包括:
- README.md:应用说明、安装与使用步骤、示例 Prompt 结构;
- app_pptx.py:基于 Streamlit 的应用主程序(约 200 行);
- requirements.txt:依赖清单;
- slides_templates/urban_monochrome.pptx:可选的 PPTX 模板文件;
- assets/CAMEL_logo.jpg:页面展示用 Logo。
根据 README 的说明,该应用具备以下特性:
- 即时生成:为任意主题生成包含多张幻灯片的 PPTX 文件;
- 内容智能生成:使用 OpenAI 模型生成要点(bullet)、步骤式(step-by-step,以五边形/箭头形状呈现)和表格(table)三种类型幻灯片;
- 可选图片支持:配置 Pexels API Key 后,可自动检索并插入配图;
- 100% 本地输出:所有生成结果都在本地完成并可直接下载。
整体技术栈为 CAMEL-AI(PPTXToolkit 模块)+ OpenAI + Streamlit。
环境准备与安装
README 给出了推荐的标准安装流程,核心命令如下:
# 1. 创建全新的虚拟环境(推荐)
python3 -m venv .venv
source .venv/bin/activate # Windows 下使用 .venv\Scripts\activate
# 2. 安装指定版本的 CAMEL-AI 及其依赖
pip install camel-ai[all]==0.2.62 streamlit openai
# 3. (可选)如果需要生成带图片的幻灯片,到 Pexels 申请 API Key
需要说明的是,示例目录下的 requirements.txt 记录的依赖版本为 camel-ai[all]==0.2.80,并额外显式声明了 python-pptx(PPTXToolkit 底层的 PPTX 操作库)。两者对 camel-ai 的版本约束不同,安装时以你使用的版本为准;python-pptx 是渲染 PPTX 的必需底层依赖。
运行前需要准备两个 API Key:
| Key | 用途 | 是否必须 |
|---|---|---|
| OpenAI API Key | 驱动 ChatAgent 生成幻灯片结构化内容 |
必须 |
| Pexels API Key | 通过 img_keywords 关键词自动检索并插入配图 |
可选(不填则无图) |
快速启动:五分钟跑通 Streamlit 应用
按照 README 的使用说明,启动流程如下:
-
获取 OpenAI API Key(https://platform.openai.com/account/api-keys);
-
(可选)获取 Pexels API Key;
-
克隆仓库并进入示例目录,或直接把 app_pptx.py 复制到自己的工作目录:
git clone https://github.com/camel-ai/camel cd examples/usecases/pptx_toolkit_usecase -
启动 Streamlit 应用:
streamlit run app_pptx.py -
浏览器打开默认地址 http://localhost:8501;
-
在侧边栏填入两个 API Key,输入主题、设定幻灯片数量,点击 Generate Presentation 按钮即可生成并下载 PPTX。
应用的交互界面由 app_pptx.py 中的 Streamlit 代码搭建:侧边栏(st.sidebar)提供 OpenAI Key 与 Pexels Key 两个密码输入框;主区域提供主题输入框(st.text_input)与幻灯片数量滑块(st.slider,取值范围 3~10,默认 5,不含标题页)。未填写 OpenAI Key 时应用会通过 st.info 提示并 st.stop() 终止,避免无效调用。生成成功后通过 st.download_button 提供 PPTX 文件的下载入口(MIME 类型为 application/vnd.openxmlformats-officedocument.presentationml.presentation)。
工作原理:两段式流水线
README 的 "How it Works" 一节概述了整体机制,结合 app_pptx.py 的实现可以拆解为两个阶段:
阶段一:LLM 生成结构化幻灯片内容。
用户提供主题(topic)与目标幻灯片数量后,应用构建一段严格的指令 Prompt(见 pptx_prompt 函数),要求模型输出符合 PPTXToolkit 约定的 JSON 结构。README 指出默认使用 GPT-4o 或 GPT-4(可在代码中修改模型),而当前示例代码中 ModelFactory.create 实际配置的是 ModelType.GPT_4_1,并将 temperature 设为 0.0 以降低随机性、保证输出格式稳定。
阶段二:PPTXToolkit 渲染成 .pptx 文件。
将阶段一生成的 JSON 传入 PPTXToolkit.create_presentation,工具包按 JSON 中的幻灯片类型分别渲染标题页、要点页、步骤图页、表格页与图片页,最终生成以主题命名的 .pptx 文件供下载。
README 还强调两条内容约束:至少包含一张步骤式幻灯片和一张表格幻灯片;若提供了 Pexels API Key,则至少两张幻灯片会带图片。这些约束通过 Prompt 中的强制要求(pptx_prompt 中的第 2、3、4 条)实现。
结构化输出:Pydantic Schema 与示例 Prompt 结构
README 提供了一个完整的示例 JSON 结构(见 "Example Prompt Structure" 折叠块),它定义了 PPTXToolkit 接受的数据契约:
[
{"title": "AI Agents", "subtitle": "Exploring the world of artificial intelligence agents"},
{"heading": "Types of AI Agents", "bullet_points": ["Intelligent Virtual Agents", "Autonomous Agents", "Collaborative Agents"], "img_keywords": "AI, technology"},
{"heading": "Creating an AI Agent", "bullet_points": [">> Step 1: Define the goal", ">> Step 2: Choose algorithms", ">> Step 3: Implement and test"], "img_keywords": "workflow, robotics"},
{"heading": "Comparison of AI Agents", "table": {"headers": ["Type", "Capabilities", "Examples"], "rows": [["Virtual", "Conversational AI", "Siri"], ["Autonomous", "Self-learning", "Robots"]]}, "img_keywords": "comparison chart, table"}
]
其中:
- 列表第一个元素是标题页,包含
title与subtitle; bullet_points中以>>开头的条目会被渲染为步骤式流程;table对象由headers(表头)与rows(行数据)组成,用于表格页;img_keywords是图片检索关键词(不是 URL),用于 Pexels 配图。
在应用实现层面,app_pptx.py 更进一步:用 Pydantic 定义了 TitleSlide、TableData、BulletSlide、TableSlide、PresentationSlides 五个模型来约束模型输出,并在 agent.step(full_prompt, response_format=PresentationSlides) 中通过结构化输出能力强制模型返回符合 Schema 的 JSON,随后用 PresentationSlides.model_validate_json 校验,再转换为上面展示的纯 JSON 列表交给 create_presentation。这比直接让模型输出自由 JSON 更可靠,可有效避免字段缺失或类型错误。
PPTXToolkit 源码级解析:JSON 到 PPTX 的渲染机制
PPTXToolkit 位于 camel/toolkits/pptx_toolkit.py,继承自 BaseToolkit,并用 @MCPServer() 装饰(意味着其能力可被包装为 MCP 工具服务)。get_tools() 返回一个 FunctionTool,暴露的唯一核心工具就是 create_presentation。
入口与参数
create_presentation(content: str, filename: str, template: Optional[str] = None) -> str:
content:JSON 字符串,必须是一个字典列表(结构如上文示例);filename:输出文件名或路径,相对路径会解析到工作目录下;template:可选的 PPTX 模板路径,用于复用既有版式。
工具会自动为文件名补上 .pptx 后缀(若缺失),并通过 _sanitize_filename 将空格与特殊字符替换为下划线。从源码结构看,若传入的 JSON 无法解析或不是列表,会返回错误提示字符串(如 "Failed to parse content as JSON" / "PPTX content must be a list of dictionaries"),而不是抛出异常——这一点由测试用例 test_create_presentation_invalid_content_type 直接验证。
工作目录解析
构造器 __init__(working_directory=None, timeout=None) 按优先级确定输出目录:
- 显式传入的
working_directory; CAMEL_WORKDIR环境变量;- 默认
./camel_working_dir。
目录不存在时会自动创建。注意示例应用 app_pptx.py 第 167 行调用的是 PPTXToolkit(output_dir="outputs"),这是该脚本编写时对应版本的历史 API 命名;当前仓库主分支源码中的参数名为 working_directory,使用时请与所安装的 camel-ai 版本保持一致。测试 test_pptx_toolkit.py 中的 pptx_toolkit fixture 使用临时目录验证了初始化行为,并断言 working_directory.exists()。
幻灯片类型分发
_write_pptx_file 按如下规则分发渲染(对应 README 描述的 bullet / step-by-step / table 三类幻灯片):
- 首元素固定为标题页,写入
title与subtitle; - 含
table键的字典 →_handle_table,在标题与正文占位符位置插入len(rows)+1行 ×len(headers)列的表格,表头加粗; - 含
bullet_points且任意条目以>>(常量STEP_BY_STEP_PROCESS_MARKER)开头 →_handle_step_by_step_process,渲染步骤图; - 含
bullet_points但无步骤标记 →_handle_default_display,渲染普通要点页。
要点页支持嵌套列表(_get_flat_list_of_contents 会递归展平为带层级 level 的条目,并设置段落缩进级别),还支持 Markdown 加粗 **bold** 与斜体 *italic*(由 BOLD_ITALICS_PATTERN 正则解析后按 run 拆分写入)。
步骤图的自动布局
_handle_step_by_step_process 根据步骤数量自动选择版式(代码可验证):
- 3~4 步:水平排列 CHEVRON(箭头/菱形) 形状,居中对齐、垂直居中;
- 5~6 步:垂直排列 PENTAGON(五边形) 形状,逐步向右下方错位排布。
这正是 README 中 "pentagon/chevron" 说法的实现来源。步骤条文案会通过 removeprefix('>> ') 去掉前缀后居中显示,字号固定为 14pt。
图片插入:URL 直取与 Pexels 检索
_handle_display_image__in_foreground 使用"图片与文字"布局(slide_layouts<a href="https://link.gitcode.com/i/ae49aa6a0d87186a92bdc7c85a6619ec" target="_blank">8],Picture with Caption)创建幻灯片,并由 @api_keys_required([("api_key", "PEXELS_API_KEY")]) 装饰器强制校验 Pexels Key 的存在性(该校验装饰器实现在 [camel/utils/commons.py)。图片来源有两种:
- 若
img_keywords以http://或https://开头,则视为图片 URL,直接下载插入; - 否则作为关键词调用 Pexels 搜索 API(
https://api.pexels.com/v1/search,参数query、size=medium、per_page=3),随机选取一张结果的大图(src.large或src.original)下载插入。
值得注意的实现细节:配图是概率性的。_handle_default_display 中只有当 random.random() < IMAGE_DISPLAY_PROBABILITY(常量 1/3)时才尝试走图片布局;图片插入失败(网络错误、图片无效等)时会优雅回退为纯文本要点页,不会导致整个生成流程中断——测试用例 test_create_presentation_invalid_image_url 专门验证了"无效图片 URL 依然成功生成文件"这一容错行为。README 中"至少两张幻灯片含图片"的约束主要由 Prompt 要求 img_keywords 非空来保证。
模板支持
create_presentation 的 template 参数允许传入一个已有的 .pptx 模板文件(如示例目录中的 urban_monochrome.pptx)。从 _write_pptx_file 的实现看,模板加载后会清空其全部现有幻灯片,仅继承母版、版式与主题样式;若模板文件不存在则回退到默认模板并记录 warning。
关键调用链与完整流程回顾
综合 README 与源码,一次完整的生成请求在应用内部经历以下调用链:
用户输入 topic + slide_count
│
▼
pptx_prompt() 构造严格指令 Prompt
│
▼
ChatAgent.step(prompt, response_format=PresentationSlides) # GPT-4.1, temperature=0
│
▼
PresentationSlides.model_validate_json() 校验并转换
│
▼
构建纯 JSON 列表(title / bullet / step / table 幻灯片)
│
▼
PPTXToolkit.create_presentation(json_str, out_name) # 输出到 outputs/
│
▼
_write_pptx_file() → _handle_table / _handle_step_by_step_process / _handle_default_display / _handle_display_image__in_foreground
│
▼
演示文稿保存为 .pptx → Streamlit 下载按钮
从源码结构还可以推断,PPTXToolkit 的 create_presentation 在渲染前会先 json.loads 解析内容、校验列表类型,随后才进入渲染,因此它既可以作为 Agent 的工具被调用,也可以像示例应用这样由上层 Python 代码直接驱动——这正是 test_all_exports.py 等测试所保证的公开 API 形态。
质量保障:测试覆盖的行为契约
test/toolkits/test_pptx_toolkit.py 为 PPTXToolkit 提供了 13 个测试用例,覆盖了 README 场景背后的关键行为契约:
test_get_tools:get_tools()恰好返回 1 个工具,名为create_presentation;test_create_presentation_basic:1 张标题页 + 2 张内容页 → 生成 3 张幻灯片的合法 PPTX;test_create_presentation_with_images:带图片 URL 的幻灯片在设置PEXELS_API_KEY后可成功生成;test_create_presentation_missing_fields:缺少subtitle、img_keywords等可选字段时依然成功;test_create_presentation_invalid_image_url:图片下载失败不影响文件生成;test_create_presentation_invalid_content_type:非法 JSON / 非列表 JSON 返回明确错误信息;test_create_presentation_auto_extension:自动补全.pptx后缀;test_sanitize_and_resolve_filepath:带空格与特殊字符的文件名被清理为下划线形式;test_create_presentation_empty_content:空内容列表也能生成合法文件(0 张幻灯片)。
这些测试从侧面印证了 README 所宣称的"即输即用、容错友好":即便内容字段不完整、图片链接失效或输入格式有误,工具都能给出明确反馈而不崩溃。
扩展方向
结合 README 与源码,可以低成本地对这个 Demo 做如下扩展:
- 更换模型:将 app_pptx.py 中
ModelFactory.create的model_platform/model_type替换为其他平台与模型(CAMEL 支持多平台模型工厂),即可接入不同 LLM; - 使用自定义模板:在调用
create_presentation时传入template参数指向自己的.pptx母版文件,即可批量产出统一品牌风格的演示文稿; - 调整图片策略:修改
camel/toolkits/pptx_toolkit.py中的IMAGE_DISPLAY_PROBABILITY常量可控制配图密度; - 接入 Agent 工作流:
PPTXToolkit以FunctionTool形式暴露工具,可将其注册到 CAMEL Agent 的 toolkits 列表,让 Agent 在对话中自主生成演示文稿,而非局限于 Streamlit 表单。
需要注意的是,README 所述 GPT-4o/GPT-4 与示例代码当前使用的 GPT-4.1 存在差异,这是示例随版本演进的正常现象;实际运行时以所安装 camel-ai 版本中的代码为准。本文所有实现细节均以当前仓库 camel/toolkits/pptx_toolkit.py 与 app_pptx.py 的源码为依据。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust4.24 K638- DDeepSeek-V4.1-FlashDeepSeek-V4.1-Flash 是一个多模态混合专家(MoE)模型,拥有 5520 亿骨干参数,并支持最多一百万 token 的上下文长度。该模型原生支持图像和文本输入,并以自回归方式生成文本Python650
SlideSCIPPT插件,支持素材库、AI助手、一键添加图片标题,复制粘贴位置、一键图片对齐、一键插入Markdown(加粗、超链接等行内样式、代码块、LaTeX等块级样式)、便捷导出图片!C#180
hello-agents📚 《从零开始构建智能体》——从零开始的智能体原理与实践教程Python52774
new-apiAI模型聚合管理中转分发系统,一个应用管理您的所有AI模型,支持将多种大模型转为统一格式调用,支持OpenAI、Claude、Gemini等格式,可供个人或者企业内部管理与分发渠道使用。🍥 A Unified AI Model Management & Distribution System. Aggregate all your LLMs into one app and access them via an OpenAI-compatible API, with native support for Claude (Messages) and Gemini formats.Go22545
JeecgBoot🔥企业级低代码平台集成了AI应用平台,帮助企业快速实现低代码开发和构建AI应用!前后端分离架构 SpringBoot,SpringCloud、Mybatis,Ant Design4、 Vue3.0、TS+vite!强大的代码生成器让前后端代码一键生成,无需写任何代码! 引领AI低代码开发模式: AI生成->OnlineCoding-> 代码生成-> 手工MERGE,显著的提高效率,又不失灵活~Java36351