OpenAI Assistants API中,user_message中的三种模式:零代码、低代码、全代码
OpenAI Assistants API的code_interpreter功能支持三种PPT生成模式:无代码、低代码和全代码。无代码模式通过自然语言描述需求,云端直接生成PPT文件;低代码模式获取云端生成的Python代码,经本地修改后运行生成PPT;全代码模式直接提交完整代码在云端执行。三种方式分别适合不同技术水平的用户,无代码最简单,全代码最灵活。示例展示了无代码和低代码的具体实现,包括文件
OpenAI Assistants API中"code_interpreter "Assistant可以处理代码,因此,user_message中可以有三种模式:零代码、低代码、全代码
我们以三个例子来说明三种模式:
1、针对PPT格式无代码:user_message中以自然语言描述PPT的要求,在云端生成 PPT 文件,终端只需取回生成的文件。
2、针对PPT格式低代码:user_message中以自然语言描述PPT的要求,在云端生成 PPT 的python代码,终端取回python代码,对代码进行稍加修改(低代码),然后运行代码生成PPT文件。
3、针对PPT格式全代码:user_message中直接给出生成PPT的python全代码,在云端生成 PPT 文件,终端只需取回生成的文件。
前置说明
所有示例均基于 OpenAI Assistants API,需满足:
- 安装依赖:
pip install openai python-pptx requests(低代码版需额外安装python-pptx,无代码/全代码版终端仅需openai); - 替换代码中的
OPENAI_API_KEY为你的有效密钥; - 准备一张本地图片(如
company_logo.png),用于PPT封面(所有示例共用),也可以先用’dall-e-3’生成(略)。
示例1:PPT格式「无代码」版
核心逻辑
user_message 仅用自然语言描述PPT要求,助手通过 Code Interpreter 在云端生成PPT文件,终端仅需下载文件(全程无代码编写/执行)。
完整代码
import openai
import time
# 1. 初始化配置
OPENAI_API_KEY = "你的OpenAI API Key"
client = openai.OpenAI(api_key=OPENAI_API_KEY)
# 2. 上传本地封面图片(供云端使用)
def upload_file(file_path):
with open(file_path, "rb") as f:
file = client.files.create(file=f, purpose="assistants")
return file.id
cover_img_id = upload_file("company_logo.png")
print(f"封面图片上传成功,ID:{cover_img_id}")
# 3. 构造纯自然语言的user_message(无任何代码)
user_message = f"""请用Code Interpreter生成2页PPT文件(company_report.pptx),要求:
1. 第一页(封面):
- 标题:XX科技2024年报(36号加粗);
- 副标题:数据可视化分析(24号);
- 插入附件中ID为{cover_img_id}的图片作为背景,宽度8英寸;
2. 第二页:
- 标题:营收趋势(36号加粗);
- 生成折线图(x轴:1-6月,y轴:营收[100,120,110,130,140,150]万元);
- 下方添加项目符号:['营收增15%', '用户破100万'];
3. 生成后返回PPT文件的ID,仅返回ID,无其他内容。"""
# 4. 创建启用Code Interpreter的助手
assistant = client.beta.assistants.create(
name="无代码PPT助手",
instructions="仅用Code Interpreter生成PPT,返回文件ID,无多余文字",
model="gpt-3.5-turbo",
tools=[{"type": "code_interpreter"}]
)
# 5. 发送消息+执行任务
thread = client.beta.threads.create()
# 绑定图片附件发送消息
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content=user_message,
attachments=[{"file_id": cover_img_id, "tools": [{"type": "code_interpreter"}]}]
)
# 启动Run并等待完成
run = client.beta.threads.runs.create(thread_id=thread.id, assistant_id=assistant.id)
print("云端生成PPT中...")
while client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id).status != "succeeded":
time.sleep(3)
# 6. 下载PPT文件
messages = client.beta.threads.messages.list(thread_id=thread.id).data
ppt_file_id = [msg for msg in messages if msg.role == "assistant"][0].content[0].text.value.strip()
# 下载文件到本地
with open("无代码版_company_report.pptx", "wb") as f:
f.write(client.files.content(ppt_file_id).read())
print(f"无代码版PPT已下载:无代码版_company_report.pptx")
# 清理资源
client.beta.assistants.delete(assistant.id)
client.beta.threads.delete(thread.id)
client.files.delete(cover_img_id)
client.files.delete(ppt_file_id)
关键特点
- user_message 无任何代码,纯自然语言描述需求;
- 终端仅负责“发指令+下载文件”,无需编写/执行代码;
- 核心依赖 Code Interpreter 云端执行代码生成文件。
示例2:PPT格式「低代码」版
- 将助手返回的代码保存为本地
.py文件; - 程序化编辑该文件(修改公司名、字体大小等格式),或用编辑器编辑该文件(略);
- 通过
subprocess运行本地文件生成PPT(替代直接exec,更贴近实际开发场景)。
完整代码
import openai
import time
import re
import subprocess
import os
# ===================== 1. 基础配置 =====================
OPENAI_API_KEY = "你的OpenAI API Key"
client = openai.OpenAI(api_key=OPENAI_API_KEY)
# 本地代码文件路径
CODE_FILE_PATH = "ppt_generator.py"
# 最终PPT文件路径
PPT_OUTPUT_PATH = "低代码版_company_report.pptx"
# ===================== 2. 步骤1:获取助手生成的PPT代码 =====================
def get_ppt_code_from_assistant():
"""向助手发送指令,获取生成PPT的Python代码"""
# 1. 构造自然语言指令(无代码)
user_message = """请生成完整可运行的Python代码,实现以下PPT需求:
1. 使用python-pptx库生成2页PPT;
2. 第一页(封面):
- 标题:默认公司名称(36号字体,不加粗);
- 副标题:2024年度报告;
- 插入本地图片company_logo.png(宽度8英寸);
3. 第二页(数据页):
- 标题:营收趋势分析;
- 生成1-6月营收折线图(y轴数据:100,120,110,130,140,150);
- 下方添加项目符号列表:['默认项目1', '默认项目2'];
4. 代码需包含所有必要的导入语句和保存逻辑,用```python```包裹,仅返回代码,无其他解释。"""
# 2. 创建助手和线程
assistant = client.beta.assistants.create(
name="低代码PPT助手",
instructions="生成完整的Python PPT代码,仅返回Markdown代码块,无多余文字",
model="gpt-3.5-turbo"
)
thread = client.beta.threads.create()
# 3. 发送消息并等待Run完成
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content=user_message
)
run = client.beta.threads.runs.create(thread_id=thread.id, assistant_id=assistant.id)
print("正在生成PPT代码...")
while client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id).status != "succeeded":
time.sleep(3)
# 4. 提取代码
messages = client.beta.threads.messages.list(thread_id=thread.id).data
assistant_reply = [msg for msg in messages if msg.role == "assistant"][0].content[0].text.value
code = re.search(r"```python(.*?)```", assistant_reply, re.DOTALL).group(1).strip()
# 清理临时资源
client.beta.assistants.delete(assistant.id)
client.beta.threads.delete(thread.id)
return code
# ===================== 3. 步骤2:将代码保存为本地文件 =====================
def save_code_to_file(code, file_path):
"""将提取的代码保存为本地Python文件"""
with open(file_path, "w", encoding="utf-8") as f:
f.write(code)
print(f"代码已保存到本地文件:{file_path}")
# ================ 4. 步骤3:编辑本地代码文件(修改格式/公司名) 或用编辑器编辑该文件(略)================
def edit_ppt_code_file(file_path):
"""编辑本地代码文件,修改公司名、字体格式等"""
# 1. 读取原文件内容
with open(file_path, "r", encoding="utf-8") as f:
code_content = f.read()
# 2. 编辑内容(低代码修改)
edited_content = code_content.replace(
"默认公司名称", "XX科技有限公司" # 修改公司名
).replace(
"36号字体,不加粗", "36号字体,加粗" # 修改字体格式描述(同步改代码逻辑)
).replace(
"font.bold = False", "font.bold = True" # 实际修改代码中的加粗属性
).replace(
"默认项目1", "营收同比增长15%" # 修改项目符号内容
).replace(
"默认项目2", "用户数突破100万" # 修改项目符号内容
).replace(
"营收趋势分析", "2024年度营收趋势" # 修改第二页标题
)
# 3. 写入修改后的内容
with open(file_path, "w", encoding="utf-8") as f:
f.write(edited_content)
print(f"本地代码文件已编辑完成:{file_path}")
print("=== 主要修改内容 ===")
print("1. 公司名:默认公司名称 → XX科技有限公司")
print("2. 标题格式:36号不加粗 → 36号加粗")
print("3. 项目符号:默认项目1/2 → 营收同比增长15%/用户数突破100万")
print("4. 第二页标题:营收趋势分析 → 2024年度营收趋势")
# ===================== 5. 步骤4:运行本地代码文件生成PPT =====================
def run_ppt_code_file(file_path):
"""运行本地Python文件,生成PPT"""
try:
# 检查文件是否存在
if not os.path.exists(file_path):
raise FileNotFoundError(f"代码文件不存在:{file_path}")
# 运行本地代码文件(使用subprocess,模拟实际开发中运行脚本)
result = subprocess.run(
["python", file_path],
capture_output=True,
text=True,
encoding="utf-8"
)
# 输出运行结果
if result.returncode == 0:
print(f"\nPPT生成成功!文件路径:{PPT_OUTPUT_PATH}")
if result.stdout:
print(f"运行日志:{result.stdout}")
else:
print(f"运行代码出错:{result.stderr}")
except Exception as e:
print(f"运行文件失败:{str(e)}")
# ===================== 主流程执行 =====================
if __name__ == "__main__":
# 1. 获取助手生成的代码
ppt_code = get_ppt_code_from_assistant()
# 2. 保存代码到本地文件
save_code_to_file(ppt_code, CODE_FILE_PATH)
# 3. 编辑本地代码文件(修改格式/公司名)
edit_ppt_code_file(CODE_FILE_PATH)
# 4. 运行本地文件生成PPT
run_ppt_code_file(CODE_FILE_PATH)
关键修改点说明
| 原示例2逻辑 | 修改后逻辑 | 优势 |
|---|---|---|
提取代码后直接 exec 运行 |
先保存为本地 .py 文件 → 编辑文件 → 运行文件 |
1. 代码可可视化编辑(适合低代码场景);2. 避免 exec 执行字符串的安全风险;3. 符合实际开发中“保存-编辑-运行”的流程 |
| 简单字符串替换 | 程序化编辑文件(同时修改文字描述和代码逻辑) | 确保格式修改落地到实际代码(如改“不加粗”为“加粗”时,同步修改 font.bold = True) |
| 无文件操作 | 完整的文件读写+运行流程 | 贴近真实开发场景,便于后续手动二次编辑文件 |
运行流程与结果
-
执行代码后终端输出:
正在生成PPT代码... 代码已保存到本地文件:ppt_generator.py 本地代码文件已编辑完成:ppt_generator.py === 主要修改内容 === 1. 公司名:默认公司名称 → XX科技有限公司 2. 标题格式:36号不加粗 → 36号加粗 3. 项目符号:默认项目1/2 → 营收同比增长15%/用户数突破100万 4. 第二页标题:营收趋势分析 → 2024年度营收趋势 PPT生成成功!文件路径:低代码版_company_report.pptx -
生成的文件结构:
- 本地新增
ppt_generator.py(编辑后的代码文件,可手动打开再次修改); - 生成
低代码版_company_report.pptx(最终PPT文件)。
- 本地新增
拓展说明(手动编辑文件)
若需要手动编辑 ppt_generator.py(更灵活的低代码操作),可在步骤3后增加暂停,或注释掉 edit_ppt_code_file 函数调用,手动修改文件后再运行:
# 主流程中替换为手动编辑逻辑
if __name__ == "__main__":
ppt_code = get_ppt_code_from_assistant()
save_code_to_file(ppt_code, CODE_FILE_PATH)
input("请手动编辑 ppt_generator.py 文件,修改完成后按回车继续...") # 暂停等待手动编辑
run_ppt_code_file(CODE_FILE_PATH)
说明
- 流程优化:从“提取代码→直接运行”升级为“提取代码→存文件→编辑文件→运行文件”,完全贴合低代码开发流程;
- 编辑逻辑:不仅修改文字内容,还同步修改代码中的格式逻辑(如字体加粗),确保修改生效;
- 运行方式:使用
subprocess运行本地文件,替代exec,更安全、更贴近实际开发习惯; - 灵活性:支持程序化编辑+手动编辑两种方式,满足不同低代码定制需求。
示例3:PPT格式「全代码」版
核心逻辑
user_message 直接给出完整的Python代码,助手通过 Code Interpreter 在云端执行代码生成PPT,终端仅下载文件(全程无需编写/修改代码)。
完整代码
import openai
import time
# 1. 初始化配置
OPENAI_API_KEY = "你的OpenAI API Key"
client = openai.OpenAI(api_key=OPENAI_API_KEY)
# 2. 构造含全量Python代码的user_message
user_message = f"""请执行以下完整的Python代码生成PPT,生成后返回文件ID(仅返回ID):
```python
from pptx import Presentation
from pptx.util import Inches, Pt
from pptx.chart.data import ChartData
from pptx.enum.chart import XL_CHART_TYPE
# 创建PPT
prs = Presentation()
# 第一页:封面
slide1 = prs.slides.add_slide(prs.slide_layouts[5])
# 标题
title1 = slide1.shapes.add_textbox(Inches(1), Inches(1), Inches(8), Inches(1))
title1.text_frame.text = "XX科技2024年报"
title1.text_frame.paragraphs[0].font.size = Pt(36)
title1.text_frame.paragraphs[0].font.bold = True
# 副标题
sub1 = slide1.shapes.add_textbox(Inches(1), Inches(2.5), Inches(8), Inches(1))
sub1.text_frame.text = "数据可视化分析"
sub1.text_frame.paragraphs[0].font.size = Pt(24)
# 插入封面图片(云端路径,由Code Interpreter自动处理)
slide1.shapes.add_picture("company_logo.png", Inches(1), Inches(4), width=Inches(8))
# 第二页:营收趋势
slide2 = prs.slides.add_slide(prs.slide_layouts[5])
# 标题
title2 = slide2.shapes.add_textbox(Inches(1), Inches(1), Inches(8), Inches(1))
title2.text_frame.text = "营收趋势"
title2.text_frame.paragraphs[0].font.size = Pt(36)
title2.text_frame.paragraphs[0].font.bold = True
# 折线图
chart_data = ChartData()
chart_data.categories = ["1月", "2月", "3月", "4月", "5月", "6月"]
chart_data.add_series("营收(万元)", [100, 120, 110, 130, 140, 150])
x, y, cx, cy = Inches(1), Inches(2.5), Inches(6), Inches(3)
slide2.shapes.add_chart(XL_CHART_TYPE.LINE, x, y, cx, cy, chart_data)
# 项目符号
bullet = slide2.shapes.add_textbox(Inches(1), Inches(6), Inches(8), Inches(2))
bullet_frame = bullet.text_frame
bullet_frame.add_paragraph().text = "营收增15%"
bullet_frame.add_paragraph().text = "用户破100万"
bullet_frame.paragraphs[1].level = 0
# 保存PPT
prs.save("全代码版_company_report.pptx")
# 输出文件ID(Code Interpreter专用方法)
import os
from openai import files
file_id = files.create(file=open("全代码版_company_report.pptx", "rb"), purpose="assistants").id
print(file_id)
```"""
# 3. 上传封面图片到云端
def upload_file(file_path):
with open(file_path, "rb") as f:
file = client.files.create(file=f, purpose="assistants")
return file.id
cover_img_id = upload_file("company_logo.png")
print(f"封面图片上传成功,ID:{cover_img_id}")
# 4. 创建启用Code Interpreter的助手
assistant = client.beta.assistants.create(
name="全代码PPT助手",
instructions="执行用户提供的完整Python代码,生成PPT后返回文件ID,仅返回ID",
model="gpt-3.5-turbo",
tools=[{"type": "code_interpreter"}]
)
# 5. 发送含全代码的消息(绑定图片)
thread = client.beta.threads.create()
client.beta.threads.messages.create(
thread_id=thread.id,
role="user",
content=user_message,
attachments=[{"file_id": cover_img_id, "tools": [{"type": "code_interpreter"}]}]
)
# 6. 执行代码并下载PPT
run = client.beta.threads.runs.create(thread_id=thread.id, assistant_id=assistant.id)
print("云端执行全代码生成PPT中...")
while client.beta.threads.runs.retrieve(thread_id=thread.id, run_id=run.id).status != "succeeded":
time.sleep(3)
# 提取文件ID并下载
messages = client.beta.threads.messages.list(thread_id=thread.id).data
ppt_file_id = [msg for msg in messages if msg.role == "assistant"][0].content[0].text.value.strip()
with open("全代码版_company_report.pptx", "wb") as f:
f.write(client.files.content(ppt_file_id).read())
print(f"全代码版PPT已下载:全代码版_company_report.pptx")
# 清理资源
client.beta.assistants.delete(assistant.id)
client.beta.threads.delete(thread.id)
client.files.delete(cover_img_id)
client.files.delete(ppt_file_id)
特点
- user_message 包含完整可执行的Python代码,无需助手生成代码;
- 助手通过 Code Interpreter 云端执行代码,生成PPT文件;
- 终端仅下载文件,无需编写/修改/运行代码;
- 需确保代码适配 Code Interpreter 环境(如文件路径、依赖库)。
更多推荐



所有评论(0)