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,需满足:

  1. 安装依赖:pip install openai python-pptx requests(低代码版需额外安装 python-pptx,无代码/全代码版终端仅需 openai);
  2. 替换代码中的 OPENAI_API_KEY 为你的有效密钥;
  3. 准备一张本地图片(如 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格式「低代码」版

  1. 将助手返回的代码保存为本地 .py 文件;
  2. 程序化编辑该文件(修改公司名、字体大小等格式),或用编辑器编辑该文件(略);
  3. 通过 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
无文件操作 完整的文件读写+运行流程 贴近真实开发场景,便于后续手动二次编辑文件
运行流程与结果
  1. 执行代码后终端输出

    正在生成PPT代码...
    代码已保存到本地文件:ppt_generator.py
    本地代码文件已编辑完成:ppt_generator.py
    === 主要修改内容 ===
    1. 公司名:默认公司名称 → XX科技有限公司
    2. 标题格式:36号不加粗 → 36号加粗
    3. 项目符号:默认项目1/2 → 营收同比增长15%/用户数突破100万
    4. 第二页标题:营收趋势分析 → 2024年度营收趋势
    
    PPT生成成功!文件路径:低代码版_company_report.pptx
    
  2. 生成的文件结构

    • 本地新增 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)

说明

  1. 流程优化:从“提取代码→直接运行”升级为“提取代码→存文件→编辑文件→运行文件”,完全贴合低代码开发流程;
  2. 编辑逻辑:不仅修改文字内容,还同步修改代码中的格式逻辑(如字体加粗),确保修改生效;
  3. 运行方式:使用 subprocess 运行本地文件,替代 exec,更安全、更贴近实际开发习惯;
  4. 灵活性:支持程序化编辑+手动编辑两种方式,满足不同低代码定制需求。

示例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 环境(如文件路径、依赖库)。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐