跳到主要内容

🐍 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使用的执行引擎:pyodidejupyter
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 标准库同样可用,例如 jsoncsvmathdatetimeosio 等。

无法运行时安装额外库

AI 不能安装上表之外的新库。凡是依赖 C 扩展、系统调用或原生二进制的包,例如 torchtensorflowopencvpsycopg2,都不能在 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 支持列表中

延伸阅读