🐍 Python 代码执行
概览
Open WebUI 提供两种执行 Python 代码的方式:
- 手动代码执行:对 LLM 生成的 Python 代码块点击 “Run” 按钮,即可在浏览器中运行(基于 Pyodide / WebAssembly)
- Code Interpreter:一种 AI 能力,允许模型在回复过程中自动编写并执行 Python 代码(基于 Pyodide 或 Jupyter)
这两种方式都支持像 matplotlib 图表这样的可视化输出,并可直接在聊天中内联显示。使用 Pyodide 引擎时,还会提供一个位于 /mnt/uploads/ 的持久化虚拟文件系统——文件会在多次代码执行和页面刷新之间保留,并且附加到消息的文件会自动放入其中,供代码直接访问。
代码解释器能力
Code Interpreter 是一种模型能力,可让 LLM 在对话过程中自主编写并执行 Python 代码。启用后,模型可以:
- 执行计算与数据分析
- 生成可视化内容(图表、曲线、图形)
- 动态处理数据
- 执行多步骤计算任务
启用 Code Interpreter
按模型配置(管理员):
- 前往 Admin Panel → Models
- 选择你要配置的模型
- 在 Capabilities 下启 用 Code Interpreter
- 保存更改
全局配置(Admin Panel):
这些设置可以在 Admin Panel → Settings → Code Execution 中配置:
- 全局启用 / 禁用 code interpreter
- 选择引擎:Pyodide(推荐)或 Jupyter(旧版)
- 配置 Jupyter 连接设置
- 设置被禁用模块
全局配置(环境变量):
| 变量 | 默认值 | 说明 |
|---|---|---|
ENABLE_CODE_INTERPRETER | true | 全局启用 / 禁用代码解释器 |
CODE_INTERPRETER_ENGINE | pyodide | 使用的引擎:pyodide(浏览器,推荐)或 jupyter(服务器,旧版) |
CODE_INTERPRETER_PROMPT_TEMPLATE | (内置) | 自定义代码解释器提示模板 |
CODE_INTERPRETER_BLACKLISTED_MODULES | "" | 用逗号分隔的被禁用 Python 模块列表 |
有关 Jupyter 配置,请参阅 Jupyter Notebook 集成 教程。
当选择 Pyodide 引擎时,Open WebUI 会自动在代码解释器指令后附加一段与文件系统相关的提示,告知模型 /mnt/uploads/ 的存在以及如何发现用户上传的文件。使用 Jupyter 时,则不会附加这一段(因为 Jupyter 有自己的文件系统)。因此,你无需在自定义 CODE_INTERPRETER_PROMPT_TEMPLATE 中手动加入文件系统说明——系统会自动补上。
原生函数调用(Native Mode)
当你在支持的模型上启用 原生函数调用模式(例如 GPT-5、Claude 4.5、MiniMax M2.5)时,代码解释器会以一个名为 execute_code 的内置工具形式提供。这会带来更自然的集成体验:
- 无需 XML 标签:模型可以直接调用
execute_code(code) - 图像处理方式相同:输出中的 base64 图像 URL 会被替换为文件 URL;模型随后通过 markdown 嵌入
使用要求:
- 必须在全局启用
ENABLE_CODE_INTERPRETER - 模型必须启用
code_interpretercapability - 模型必须使用 Native 原生函数调用模式(在模型高级参数中设置)
有关 builtin tools 和 native mode 的详细说明,请参阅 工具开发指南。
在聊天中内联显示图像(matplotlib 等)
使用 matplotlib 或其他可视化库时,图像可以直接显示在聊天中。要让这一机制正常工作,代码必须将图像输出为 base64 data URL。
推荐的 matplotlib 模式
import matplotlib.pyplot as plt
import io
import base64
# Create your chart
plt.figure(figsize=(10, 6))
plt.bar(['A', 'B', 'C'], [4, 7, 5])
plt.title('Sample Chart')
# Output as base64 data URL (triggers automatic upload)
buf = io.BytesIO()
plt.savefig(buf, format='png', dpi=150, bbox_inches='tight')
buf.seek(0)
img_base64 = base64.b64encode(buf.read()).decode('utf-8')
print(f"data:image/png;base64,{img_base64}")
plt.close()图像显示机制
- 代码执行后,将
data:image/png;base64,...打印到 stdout - Open WebUI 的中间层检测到输出中的 base64 图像数据
- 图像会被自动上传并保存为文件
- base64 字符串会被替换为文件 URL(例如
/api/v1/files/{id}/content) - 模型会在代码输出中看到这个 URL,并可在回复中引用它
- 图像最终在聊天中内联渲染
模型编写的代码应打印 base64 data URL。Open WebUI 会拦截该输出,并将其转换为永久文件 URL。模型随后应在回复中使用这个转换后的 URL,例如以 markdown 形式写成 ——而不是直接把原始 base64 字符串粘贴到回复文本里。
如果你在聊天回复中看到原始 base64 文本,说明模型错误地回显了 base64,而不是使用代码输出中转换后的 URL。