昨天把 line-notion-bot 的骨架講完,今天換一條線,來聊第二個專案:kid-english-ig-carousel。這是我拿來幫小孩準備英文學習內容、自動排成 IG 輪播圖卡的工具。跟 LINE Bot 不一樣,它沒有 webhook,沒有即時互動,就是一支從頭跑到尾、跑完就結束的批次任務,骨架自然也長得不太一樣,值得單獨拉出來講。
整個流程我切成七段:先讀教材決定角色跟受眾,再讓 AI 寫腳本內容,接著把內容整理成一份 deck.json,然後做詞彙分級跟內容把關,套模板把 deck.json 轉成圖卡,丟上圖床,最後呼叫 IG API 發布、拿到 permalink 再回頭清圖床。這七步之後每一步都會拆成單獨一天講(Day 21 到 Day 29),今天只講骨架,還有中間那個看起來最不起眼、其實整條線能不能穩全靠它的東西:deck.json。
一開始我沒有這個中間格式,AI 產完文字就直接丟給排版的程式。結果三不五時出包:AI 漏欄位、字數超出模板放得下的範圍,偶爾中英文混在同一句裡沒切乾淨。排版那段程式拿到什麼就排什麼,出包了往往是最後一步才發現,然後整條要重跑一次,前面 AI 那段的時間跟額度全部白花。
deck.json 做的事情很單純:把「AI 決定內容」跟「程式決定排版」這兩件事切開。AI 只管想出角色、受眾、每一頁要講什麼,最後輸出成固定格式的 JSON,大概長這樣:
{
"audience": "國小中年級",
"cards": [
{
"title": "What's your favorite animal?",
"body": "...",
"vocab": ["animal", "favorite"]
}
]
}
程式那邊完全不管內容怎麼想出來的,只認這份 JSON 合不合規格,合規格就照模板把每個欄位塞進版位。
這樣切開之後,中間多了一個可以停下來檢查的點。deck.json 產出來,我可以先驗證格式對不對、字數有沒有超、詞彙分級有沒有照規則來,不合格打回去重寫,不用等圖卡都排完才發現問題。這份 JSON 也是純資料,換模板、調版型的時候完全不用碰到 AI 那段,兩邊可以各自迭代,不會互相拖累。
這跟 line-notion-bot 裡「先回 200 再說」那個骨架設計,邏輯上有點像:都是把一個容易出錯、耗時的步驟,跟後面穩定確定的步驟切開,中間留一個能驗證、能重來的緩衝點。一個是為了不讓 LINE 一直重送 webhook,一個是為了不讓 AI 亂寫的東西直接搞壞排版。
七個階段跟 deck.json 先講到這,細節留到 Day 21 之後慢慢拆。明天換個話題,聊聊這整個系列選的技術棧——Cloudflare Workers、OpenRouter、Notion、Jina——這幾個服務的免費額度到底夠不夠用,還有為了全免費付出了哪些取捨。