项目简介
Presenton 是一款开源AI幻灯片生成工具,支持多种AI提供商(如OpenAI、Gemini、Ollama)。可通过Docker自托管或桌面应用使用,支持从提示或文档生成演示文稿,导出为PPTX或PDF,完全掌控数据与模型。
README 预览
\n \n\n\n\n Quickstart ·\n Docs ·\n Youtube ·\n Discord\n\n\n\n \n \n \n\n\n# Open-Source AI Presentation Generator and API (Gamma, Beautiful AI, Decktopus Alternative)\n\n\n\n### ✨ Why Presenton\n\nNo SaaS lock-in · No forced subscriptions · Full control over models and data\n\nWhat makes Presenton different?\n\n- Use Fully **self-hosted** in Web through [Docker Package](https://docs.presenton.ai/v3/get-started/quickstart)\n- Or Download [Desktop App](https://presenton.ai/download) (Mac, Windows & Linux)\n- Works with OpenAI, Gemini, Vertex AI, Azure OpenAI, Amazon Bedrock, Fireworks, Together AI, Anthropic, LM Studio, Ollama, or custom models\n- Comes with AI Presentation Generation API\n- Fully open-source (Apache 2.0)\n- Works with your own design/templates\n- **Fully editable PPTX export**\n\n> [!TIP]\n> **Star us!** A ⭐ shows your support and encourages us to keep building! 😇\n\n\n \n\n\n#\n\n### 🎛 Features\n\n\n \n\n\n#\n\n### 💻 Presenton Desktop\n\nCreate AI-powered presentations using your own model provider (BYOK) or run everything locally on your own machine for full control and data privacy.\n\n\n \n \n \n\n\n**Available Platforms**\n\n\n\nPlatform\nArchitecture\nPackage\nDownload\n\n\n\nmacOS\nApple Silicon / Intel\n.dmg\nDownload ↗\n\n\n\nWindows\nx64\n.exe\nDownload ↗\n\n\n\nLinux\nx64\n .deb\nDownload ↗\n\n\n\n\n\n**Deploy to Cloud Providers**\n\n\n \n \n \n \n \n \n\n\n#\n\nPresenton gives you complete control over your AI presentation workflow. Choose your models, customize your experience, and keep your data private.\n\n- Custom Templates & Themes — Create unlimited presentation designs with HTML and Tailwind CSS\n- AI Template Generation — Create presentation templates from existing Powerpoint documents.\n- Flexible Generation — Build presentations from prompts or uploaded documents\n- Export Ready — Save as PowerPoint (PPTX) and PDF with professional formatting\n- Built-In MCP Server — Generate pr
常见问题 (5)
故障排除为什么Presenton中的slides_markdown生成总是返回一个500错误,错误信息为'to_string() got unexpected keyword argument with_schema'?
错误发生的原因是 get_messages_for_slides_markdown() 将 with_schema=True 传递给了 PresentationLayoutModel.to_string(),而该方法不接受该参数。临时解决方法:编辑 servers/fastapi/templates/presentation_layout.py,将方法签名改为 def to_string(self, with_schema: bool = False) -> str:。这样可以避免崩溃并允许生成幻灯片。或者,从 generate_presentation_structure.py 第129行的调用中移除 with_schema=True。永久修复应要么实现schema输出,要么对齐调用方式。
故障排除当AI代理编辑演示文稿时,如何获得实时UI更新?
升级到最新版 Presenton。最新版本在工具操作后自动刷新幻灯片、流式聊天状态、通过跟随模式高亮当前编辑的幻灯片,并包含用于选取幻灯片的缩略图面板。无需手动重新加载。
故障排除如何打开一个在macOS上显示“Apple无法验证...没有恶意软件”的应用?
发生这种情况是因为该应用未经过 Apple 公证。要绕过 Gatekeeper,请从 .dmg 文件安装应用(拖入“应用程序”文件夹)。然后,在 Finder → 应用程序中,右键(或按住 Control 键单击)该应用,选择“打开”。在对话框中确认“打开”。只需执行一次,后续启动即可正常。或者,前往系统设置 → 隐私与安全性,点击“仍要打开”。
故障排除为什么 Presenton 的操作执行器回执在幻灯片内容更新时总是返回空的 changedSlideIds?
这是 _apply_operations()(services/operation_executor.py)中的一个自我比较 diff bug。执行器会就地修改 current_slides 所引用的同一批 ORM SlideModel 实例,因此应用操作后的 diff 实际上是将每个 slide 对象与其自身进行比较,结果始终得到 changedSlideIds: []——尽管变更已正确应用(revision 递增、数据库和快照均已更新)。结构性操作(insert/duplicate/move)不受影响,因为它们会改变 slide 的 id/数量。修复方法:在应用操作之前先快照基线 slide 值,然后将 staged slides 与该快照进行 diff,而不是重新读取已被修改的 ORM 对象:
current = document_snapshot(presentation, current_slides)
baseline_slide_values = {str(slide.id): _slide_value(slide) for slide in current_slides}
# ... apply operations to staged_slides ...
changed_slide_ids = [
slide_id for slide_id in desired_slide_ids
if slide_id in existing_slide_ids
and _slide_value(next(s for s in staged_slides if str(s.id) == slide_id))
!= baseline_slide_values.get(slide_id)
]
修复后,就地变更(例如通过 UpdateSlide 设置 speaker_note)能正确地在操作结果和持久化的 receipt 中返回被修改 slide 的 id。经验证的修复已在 PR #913(分支 audit/r0-persistence-executor)中提供。
故障排除如何修复 MCP 客户端因 RFC3339 date-time schema 验证错误而拒绝 Presenton 任务状态时间戳的问题?
Presenton (v0.9.11-beta) 从 get_job_status 和模板列表端点返回不带时区信息(tz-naive)的时间戳,例如 2026-09-25T14:02:03.123456。这是因为尽管列定义为 DateTime(timezone=True),SQLite 并不会保留时区信息,导致严格的 MCP 客户端在根据声明的 format: date-time schema 进行校验时失败。修复方法:为 AsyncTaskModel(servers/fastapi/models/sql/async_task.py)和 TemplateListItem(servers/fastapi/api/v1/ppt/endpoints/template.py)各添加一个 UTC 感知的字段序列化器:
from datetime import datetime, timezone
from pydantic import field_serializer
@field_serializer("created_at", "updated_at")
def _serialize_timestamps(self, value: datetime | str) -> str:
if isinstance(value, str):
return value
if value.tzinfo is None:
value = value.replace(tzinfo=timezone.utc)
return value.isoformat()
这样可使时间戳符合 RFC3339 规范(例如 2026-09-25T14:02:03.123456+00:00),并在一处同时修复 REST/OpenAPI 和 MCP 工具的输出。