跳到主要内容

🐍 Python 代码执行

概览​

OPL 数据空间提供两种执行 Python 代码的方式:

  1. 手动代码执行:在浏览器里点击代码块上的 “Run” 按钮执行 LLM 生成的 Python(基于 Pyodide / WebAssembly)
  2. Code Interpreter:让模型在回答过程中自动编写并执行 Python 代码(基于 Pyodide 或 Jupyter)

这两种方式都支持图表等可视化输出,例如 matplotlib 生成的图片可直接内联到聊天中。使用 Pyodide 时,系统还会提供一个持久化虚拟文件系统 /mnt/uploads/,其中的文件可跨执行、跨刷新保留;消息上传的附件也会自动放入该目录,供代码直接访问。

Code Interpreter 能力​

Code Interpreter 是模型能力之一,启用后模型可以在对话过程中自主编写并执行 Python 代码,用来:

  • 做计算和数据分析
  • 生成图表、图形和可视化
  • 动态处理数据
  • 执行多步骤计算任务

启用方式​

按模型启用(Admin):

  1. 进入 管理员面板 → Models
  2. 选择目标模型
  3. 在 Capabilities 中启用 Code Interpreter
  4. 保存

全局设置(管理员面板):

在 管理员面板 → 设置 → 代码执行 中可以配置:

  • 启用或禁用 code interpreter
  • 选择引擎:Pyodide(推荐)或 Jupyter(Legacy)
  • 配置 Jupyter 连接
  • 设置被禁止的模块

环境变量:

变量默认值说明
ENABLE_CODE_INTERPRETERtrue全局启用或禁用 Code Interpreter
CODE_INTERPRETER_ENGINEpyodide使用的执行引擎:pyodide 或 jupyter
CODE_INTERPRETER_PROMPT_TEMPLATE内建自定义 code interpreter 提示模板
CODE_INTERPRETER_BLACKLISTED_MODULES""逗号分隔的禁用 Python 模块列表

如需 Jupyter 配置,可参阅 Jupyter Notebook Integration。

文件系统提示注入

当选择 Pyodide 引擎时, OPL 数据空间会自动向 code interpreter 指令中追加有关 /mnt/uploads/ 的文件系统提示。使用 Jupyter 时不会追加这一段,因此你通常不需要在自定义 CODE_INTERPRETER_PROMPT_TEMPLATE 里手写这些说明。

Native Function Calling(Native Mode)​

当模型启用了 Native function calling,且具备较强推理能力(例如 GPT-5、Claude 4.5、MiniMax M2.5)时,Code Interpreter 会以内建工具 execute_code 的形式提供:

  • 不再依赖 XML 标签
  • 图片处理逻辑一致:代码输出中的 base64 图片会被替换成文件 URL,再由模型通过 markdown 嵌入

要求:

  1. 全局已启用 ENABLE_CODE_INTERPRETER
  2. 模型已启用 code_interpreter capability
  3. 模型在高级参数里把 Function Calling 设为 Native

更多工具细节见 Tool Development Guide。

图片内联显示(matplotlib 等)​

如果你希望图表直接显示在聊天里,代码需要把图片输出为 base64 data URL。

推荐写法​

import matplotlib.pyplot as plt
import io
import base64

plt.figure(figsize=(10, 6))
plt.bar(['A', 'B', 'C'], [4, 7, 5])
plt.title('Sample Chart')

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()

图片显示流程​

  1. 代码向 stdout 打印 data:image/png;base64,...
  2. OPL 数据空间检测到 base64 图片数据
  3. 系统自动把图片上传为文件
  4. base64 会被替换成文件 URL,例如 /api/v1/files/{id}/content
  5. 模型在后续响应中引用这个 URL
  6. 图片就在聊天中内联显示
工作原理

模型应该在代码里打印 base64 data URL,而不是把原始 base64 文本直接塞进自然语言回复。 OPL 数据空间会把它转换成永久文件 URL,模型应在响应中引用转换后的 URL。

常见问题​

问题原因解决方法
聊天里出现原始 base64 文本模型把 base64 直接写进了回复提醒模型只在代码输出中打印 base64
图片不显示代码只用了 plt.show()改用上面的 base64 输出模式
“Analyzing...” 一直转圈代码执行超时或报错检查日志和代码输出

手动代码执行(Pyodide)​

OPL 数据空间内建基于 Pyodide 的浏览器端 Python 环境,无需服务端额外配置。

Pyodide worker 是持久的,会在同一会话中复用,因此变量、已导入模块和虚拟文件系统中的文件都可以跨多次执行保留。

如何手动运行​

  1. 让模型写出 Python 代码
  2. 代码块上会出现 Run
  3. 点击后由 Pyodide 执行
  4. 输出显示在代码块下方

支持的库​

Pyodide 会按 import 自动加载以下包:

包用途
micropip包安装器(内部用途)
requestsHTTP 请求
beautifulsoup4HTML / XML 解析
numpy数值计算
pandas数据分析
matplotlib图表绘制
seaborn统计可视化
scikit-learn机器学习
scipy科学计算
regex高级正则
sympy符号计算
tiktokenToken 计数
pytz时区处理

Python 标准库同样可用,例如 json、csv、math、datetime、os、io 等。

无法运行时安装额外库

AI 不能安装上表之外的新库。凡是依赖 C 扩展、系统调用或原生二进制的包,例如 torch、tensorflow、opencv、psycopg2,都不能在 Pyodide 中使用。
如果你需要完整包生态,建议改用 Open Terminal。

持久化文件系统​

Pyodide 模式下,系统会在 /mnt/uploads/ 挂载一个持久化虚拟文件系统,底层由浏览器 IndexedDB 支持,具备:

  • 跨执行持久化:一次执行写入的文件,下一次还能读到
  • 跨刷新持久化:刷新页面后仍保留
  • 自动挂载上传文件:消息附件会在执行前自动放到 /mnt/uploads/
  • 文件浏览器面板:启用 Code Interpreter 后,聊天侧栏可浏览、预览、上传、下载和删除文件

代码中如何使用文件​

import os
import pandas as pd

print(os.listdir('/mnt/uploads'))

df = pd.read_csv('/mnt/uploads/data.csv')
print(df.head())

df.to_csv('/mnt/uploads/result.csv', index=False)
print('Saved result.csv to /mnt/uploads/')
提示

如果你希望用户下载模型生成的文件,请让模型把结果写到 /mnt/uploads/。之后它会自动出现在文件浏览器中。

Jupyter 引擎说明

/mnt/uploads/ 和文件系统提示只适用于 Pyodide。使用 Jupyter 时,文件管理走的是 Jupyter 自身的文件系统,侧边栏文件浏览器也不会出现。

示例:生成图表​

提示词:

“请用 matplotlib 生成一个柱状图,展示:Acuity 4.1、Signify 7.2、Hubbell 5.6、Legrand 8.9,并把图片输出成 base64 data URL,以便内联显示。”

图像将被自动上传并显示在聊天中。

浏览器兼容性​

Microsoft Edge 中 Pyodide 崩溃​

如果在 Edge 中运行 Pyodide 导致 STATUS_ACCESS_VIOLATION 崩溃,通常与 Edge 的增强安全模式有关。

症状:

  • 一运行 Python 代码,浏览器标签页甚至整个浏览器直接崩溃

原因:

  • edge://settings/privacy/security 中的 Enhance your security on the web 会启用更严格的安全策略,而这些策略与基于 WebAssembly 的 Pyodide 不兼容

解决方案:

  1. 关闭 Edge 的增强安全模式
  2. 换用 Chrome 或 Firefox
  3. 把 CODE_INTERPRETER_ENGINE 改为 jupyter
备注

这是已知兼容性问题。在官方 Pyodide console 中也会出现类似现象。

提升效果的小技巧​

  • 在提示词里明确说明当前运行于 “Pyodide environment” 或 “code interpreter”
  • 生成图片时,明确要求输出 “base64 data URL”
  • 记得让代码 print 结果,否则不会显示在输出区
  • 在写复杂脚本前,先确认依赖库是否在 Pyodide 支持列表中

延伸阅读​