iT邦幫忙

2025 iThome 鐵人賽

DAY 21
0
生成式 AI

AI 三十天,哎呀每天都很難:OpenAI API 生存指南系列 第 21

Day 21:變成 API 了!用 FastAPI 打造 OpenAI 智能簡報服務

  • 分享至 

  • xImage
  •  

昨天我們讓 AI 自動生成簡報檔(PPTX)。
今天,我們要把它變成一個可以隨時呼叫的 API 服務
這樣你就能在任何前端、網頁、甚至其他系統裡

import os
import json
from fastapi import FastAPI, Form
from fastapi.responses import FileResponse
from dotenv import load_dotenv
from openai import OpenAI

from pptx import Presentation
from pptx.util import Pt
from pptx.enum.text import PP_ALIGN
from pptx.oxml.ns import qn
client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
app = FastAPI(title="AI PowerPoint Generator", version="1.0")

# 字型設定(避免亂碼)
FONT_NAME = "PingFang TC" 

def set_run_font(run, size_pt: int):
    run.font.name = FONT_NAME
    run.font.size = Pt(size_pt)
    r = run._r
    rPr = r.get_or_add_rPr()
    rPr.rFonts.set(qn("a:ea"), FONT_NAME)  # East Asia
    rPr.rFonts.set(qn("a:cs"), FONT_NAME)  # Complex Script

def make_outline_json(raw_content: str) -> dict:
    prompt = f"""
請將以下內容整理成簡報大綱(繁體中文)。
只回傳合法 JSON,格式:
{{
  "title": "主題",
  "slides": [
    {{"title": "投影片標題", "bullets": ["要點1","要點2","要點3"]}}
  ]
}}
內容:
{raw_content}
"""
    resp = client.chat.completions.create(
        model="gpt-4o-mini",
        messages=[
            {"role": "system", "content": "你是專業簡報顧問,只回傳 JSON。"},
            {"role": "user", "content": prompt},
        ],
        temperature=0.5,
        max_tokens=800,
    )
    text = resp.choices[0].message.content.strip()
    try:
        return json.loads(text)
    except Exception:
        return {"title": "AI 自動簡報", "slides": [{"title": "解析失敗", "bullets": [text]}]}

def build_ppt(outline: dict, output_path: str):
    prs = Presentation()

    slide = prs.slides.add_slide(prs.slide_layouts[0])
    slide.shapes.title.text = outline.get("title", "AI 自動產生簡報")
    for run in slide.shapes.title.text_frame.paragraphs[0].runs:
        set_run_font(run, 40)
    sub = slide.placeholders[1]
    sub.text = "由 OpenAI + FastAPI 自動生成"
    p = sub.text_frame.paragraphs[0]
    # 以新增 run 的方式確保字型套用
    p.clear()
    r = p.add_run()
    r.text = "由 OpenAI + FastAPI 自動生成"
    set_run_font(r, 18)
    p.alignment = PP_ALIGN.CENTER

    for s in outline.get("slides", []):
        slide = prs.slides.add_slide(prs.slide_layouts[1])
        slide.shapes.title.text = s.get("title", "未命名")
        for r in slide.shapes.title.text_frame.paragraphs[0].runs:
            set_run_font(r, 32)

        body = slide.placeholders[1].text_frame
        body.clear()
        for i, b in enumerate(s.get("bullets", [])):
            para = body.add_paragraph() if i > 0 else body.paragraphs[0]
            para.clear()
            rr = para.add_run()
            rr.text = b
            set_run_font(rr, 20)

    prs.save(output_path)

@app.post("/generate_ppt")
async def generate_ppt(content: str = Form(...)):
    """輸入文字 → 回傳簡報檔案"""
    outline = make_outline_json(content)
    output_path = "result.pptx"
    build_ppt(outline, output_path)
    return FileResponse(output_path, filename="AI_Presentation.pptx")

@app.get("/")
async def root():
    return {"message": "Success"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run("openai_test:app", host="127.0.0.1", port=8000, reload=True)

我們來看看:
https://ithelp.ithome.com.tw/upload/images/20251005/20169376bHmx8SyQWG.png

https://ithelp.ithome.com.tw/upload/images/20251005/20169376bjJowL7F1M.png
https://ithelp.ithome.com.tw/upload/images/20251005/201693765oqfxlR5AL.pnghttps://ithelp.ithome.com.tw/upload/images/20251005/20169376crR4liGars.png

今天我們讓 AI 自動簡報功能變成 API 服務!
使用 FastAPI 包裝 GPT 生成流程並且自動產出 PPT 檔並下載.可以與前端、Line Bot、Notion、內部系統整合
明天我們要讓這個 API 支援「圖片 + 文字」輸入,自動分析圖片內容,並把它變成簡報頁面!


上一篇
Day 20:簡報都自動了!AI 產生 PPT
系列文
AI 三十天,哎呀每天都很難:OpenAI API 生存指南21
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言