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