内网环境下,Open WebUI v0.11.3 本身没有内置的 PPT 生成能力,需要通过「离线安装 python-pptx 到容器 + 加载一个基于该库的 Tool」来解决 。首选方案是社区开源的 openwebui-generate-slides 工具------它是单文件 Tool,直接在容器内用 python-pptx 生成真正的 .pptx(原生可编辑、含图表和 25 种版式),不依赖任何外部 API 或图标 CDN,适合完全断网的生产环境。
一、为什么不能直接在界面里生成 PPT
- Pyodide 代码解释器跑不了 python-pptx :v0.11.3 里默认的 Pyodide 引擎在浏览器里运行,不支持任何带 C 扩展的第三方包,
python-pptx无法通过它安装openwebui.com。 - 联网装包必然失败 :Open WebUI Tool 的 frontmatter 里声明的依赖(如
python-pptx)会在首次调用时由容器内 pip 拉取,内网断网直接报Temporary failure in name resolutionjuejin.cn。 - 容器重启丢包 :直接
docker exec进去pip install的包,一旦docker restart或升级镜像就消失,必须固化进镜像或挂载重装。
二、四套方案对比
| 方案 | 离线可行 | 生成效果 | 部署难度 | 说明 |
|---|---|---|---|---|
| A. Generate Slides Tool + 容器内装 python-pptx(推荐) | ✅ | 原生 .pptx,可编辑,含图表 | ★★ | 单文件 Tool,纯 Python 本地执行 |
| B. Jupyter 代码解释器 + 预装依赖 | ✅ | 灵活,模型自己写代码 | ★★★★ | 需另起 Jupyter 容器并在后台配置 |
| C. 让模型输出 Markdown 大纲 → 本地脚本转 PPT | ✅ | 看脚本质量 | ★ | 最稳,但需人工触发转换 |
| D. MCP 文件生成服务(MCPO-File-Generation-Tool) | ✅ | .pptx/.docx/.pdf/.xlsx | ★★★ |
三、推荐方案 A:完整离线落地步骤
步骤 1:在联网机上准备 wheel 包
在与内网容器同 Python 版本、同系统架构的联网机上执行(Open WebUI 官方镜像基于 Python 3.11):
bash
mkdir wheelhouse
pip download python-pptx pillow -d ./wheelhouse
# 如需图标/图片功能可选装 httpx
# pip download httpx -d ./wheelhouse
将 wheelhouse/ 打包后经 U 盘/内网传输工具送入内网宿主机。
步骤 2:把 wheel 拷入运行中的容器并离线安装
bash
# 找到容器
docker ps | grep open-webui
# 假设容器 ID 为 abc123
# 拷入 wheel 包
docker cp ./wheelhouse abc123:/tmp/
# 容器内离线安装(关键:--no-index --find-links,防止 pip 联网)
docker exec -it abc123 bash -c \
"pip install --no-index --find-links=/tmp/wheelhouse python-pptx pillow"
# 验证
docker exec abc123 python -c "import pptx, PIL; print('OK')"
这一步的流程与社区已验证过的 spaCy 离线安装完全一致。
步骤 3:导入 Generate Slides Tool
- 在联网机提前从 GitHub 下载
generate_slides.py(单文件,约几百 KB):https://github.com/ianustec/openwebui-generate-slides/blob/main/generate_slides.py - 通过内网共享或 U 盘传入。
- 在 Open WebUI 界面进入 工作空间 → 工具 → + ,把
generate_slides.py的全部内容粘贴进编辑器,保存。 - 因为
python-pptx和pillow已在容器里装好,Open WebUI 不会再去尝试联网拉包,首次调用即可成功。 - 在模型设置 → 工具 里给目标模型启用该 Tool(v0.11.x 里也可以在聊天输入框
+→ Tool Permissions 控制)。
步骤 4:模型侧的调用与提示词
Tool 暴露的函数是 generate_slides(content),content 是一段 JSON 字符串。模型会自动产出该 JSON。给模型的系统提示词可写:
css
当用户要求生成 PPT 时,请整理素材为符合 generate_slides 工具要求的 JSON 字符串。
结构示例:
{
"title": "...", "subtitle": "...", "author": "...",
"theme": "auto",
"slides": [
{"layout":"cover","title":"...","icon":"cpu"},
{"layout":"title_bullets","title":"...","bullets":["...","..."]},
{"layout":"kpi_row","stats":[{"value":"-40%","label":"..."}]},
{"layout":"chart","chart_type":"bar","labels":[...],"values":[...]}
]
}
所有数字必须来自用户素材,缺数据处填 [缺数据:需补xx],不要编造。
工具内置约 25 种版式(封面、章节页、要点、KPI、时间轴、表格、漏斗图、图表等),主题 auto 会根据内容自动配色,所有图标是 Lucide 风格、打包在文件内,不依赖外网图标库。
步骤 5:固化安装(避免容器重启丢包)
两种做法任选其一:
做法 1:自建镜像(推荐生产环境)
在联网机写一个 Dockerfile:
dockerfile
FROM ghcr.io/open-webui/open-webui:v0.11.3
COPY wheelhouse /tmp/wheelhouse
RUN pip install --no-index --find-links=/tmp/wheelhouse python-pptx pillow \
&& rm -rf /tmp/wheelhouse
构建并导出:
bash
docker build -t open-webui-ppt:v0.11.3 .
docker save open-webui-ppt:v0.11.3 -o open-webui-ppt.tar
内网侧 docker load -i open-webui-ppt.tar,之后用这个镜像替换原镜像启动。这与官方 Air-gapped 部署思路一致------镜像内自包含一切运行时依赖,启动后不再访问互联网。
做法 2:保持现有容器 + 启动脚本重装 把 wheelhouse 挂载进容器,每次容器启动时跑一遍安装命令,或在 docker-compose 的 entrypoint 里追加一条 pip install --no-index --find-links=/app/wheelhouse python-pptx pillow。
四、备选方案 B:Jupyter 代码解释器(适合需要更灵活代码生成)
如果你希望模型能"自己写 Python 代码"来生成 PPT(或更复杂的图表/分析),可以在内网再起一个 Jupyter 容器:
- 联网机拉取并导出镜像:
bash
docker pull jupyter/scipy-notebook:latest
docker save jupyter/scipy-notebook -o jupyter.tar
- 内网运行 Jupyter 容器,并在其中预先
pip install python-pptx pillow(同样走 wheelhouse 离线方式)。 - 在 Open WebUI 管理员面板 → 设置 → 代码执行里填入 Jupyter 的 URL 和 Token(v0.5.11 起支持,v0.11.3 完全可用)openwebui.com。
- 此后代码解释器走 Jupyter 而非 Pyodide,可以直接
import pptx生成 .pptx 文件。
注意 Pyodide 引擎即便联网也装不了 python-pptx,必须切到 Jupyter 引擎。
五、备选方案 C:模型只出大纲,脚本转 PPT
如果不想在容器里折腾依赖,可以让模型只输出 Markdown/JSON 大纲,然后用一台内网主机上的离线 Python 脚本(同样基于 python-pptx)把大纲渲染成 .pptx。优点是完全不侵入 Open WebUI;缺点是要人工复制粘贴或写一个简单的转换接口。大纲提示词建议参照以下结构------每页一个结论句标题、不超过 3 条要点、标注建议图表类型、缺数据处明确占位,避免模型编造。
六、几个容易踩的坑
- pip 千万别漏掉
--no-index --find-links=...,否则即使 wheel 已就位,pip 仍会先去访问 PyPI,超时报错。 - 镜像架构要匹配 :内网若是 ARM(如鲲鹏、树莓派),联网机下载 wheel 时必须用同架构机器或加
--platform参数。 - Tool 保存后不生效 :v0.11.x 的 Tool 依赖声明会在首次调用时安装;离线环境要确保容器内
pip list里能看到python-pptx,否则模型调用会直接报 ImportError。 - 升级版本会覆盖 :直接
docker pull新版镜像会把你 exec 安装的包全洗掉,所以自建 Dockerfile 方式最稳妥。 - Unsplash 图片、在线图标等 Valve :Generate Slides 里
unsplash_access_key、image_generation等依赖外网的功能直接关掉即可,不影响核心 PPT 生成。
整套链路跑通后,用户在聊天框里说"根据这份材料生成一份 10 页 PPT",模型会自动产出 JSON、调用 Tool,几秒后在聊天里返回可点击下载的原生 .pptx,全程数据不出内网。