open webui 在docker容器里跑,并且是在内网断绝互联网的环境下。生成ppt

内网环境下,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

  1. 在联网机提前从 GitHub 下载 generate_slides.py(单文件,约几百 KB):https://github.com/ianustec/openwebui-generate-slides/blob/main/generate_slides.py
  2. 通过内网共享或 U 盘传入。
  3. 在 Open WebUI 界面进入 工作空间 → 工具 → + ,把 generate_slides.py 的全部内容粘贴进编辑器,保存。
  4. 因为 python-pptx 和 pillow 已在容器里装好,Open WebUI 不会再去尝试联网拉包,首次调用即可成功。
  5. 在模型设置 → 工具 里给目标模型启用该 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 容器:

  1. 联网机拉取并导出镜像:
bash 复制代码
   docker pull jupyter/scipy-notebook:latest
   docker save jupyter/scipy-notebook -o jupyter.tar
  1. 内网运行 Jupyter 容器,并在其中预先 pip install python-pptx pillow(同样走 wheelhouse 离线方式)。
  2. 在 Open WebUI 管理员面板 → 设置 → 代码执行里填入 Jupyter 的 URL 和 Token(v0.5.11 起支持,v0.11.3 完全可用)openwebui.com。
  3. 此后代码解释器走 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,全程数据不出内网。

相关推荐
海边捡石子2 小时前
FreeSWITCH 入门:把电话系统接入语音客服机器人
人工智能·后端
桃西西呀2 小时前
我把网关限流配置成每秒 100 请求,大促一来照样被打挂,还把别人也拖垮了
人工智能·llm·ai编程
武子康2 小时前
Agent 偏好记忆怎样确认写入:范围、版本与撤销的一个最小例
人工智能·后端·agent
王中阳Go3 小时前
质保期第 90 天我翻了一遍日志目录:交付后真正会坏的 3 处
人工智能·后端·agent
桃西西呀3 小时前
我把整本接口文档塞进 system prompt,前 3 轮答得准,第 8 轮开始胡说,账单还翻了 4 倍
人工智能·llm·ai编程
天天代码码天天3 小时前
给孩子打印一本“数字连点画”!连出小鱼、火箭,画完还能涂色
人工智能
SL_staff4 小时前
规则联动:给工厂装上‘自动化神经反射弧’——JVS·物联网平台规则引擎实战教程
java·人工智能·物联网
众壹新能源科技5 小时前
逆变器自带无功不够用,加装5MVar SVG后功率因数从0.85回到0.99
运维·人工智能·自动化
king13598745505 小时前
LFM2.5-24B-A2B Mac 本地部署:内存估算、GGUF/MLX 与 Python 预检脚本
人工智能·macos