前幾天已經完成 SubWise 的基礎建設:
到了今天,終於要開始加入整個 SubWise 最重要的核心能力——AI。今天的目標是讓 SubWise 不再只是「收到訊息 → 回覆訊息」的 LINE Bot,而是開始具備理解使用者語意的能力。
今天完成的內容不只是「API 有成功呼叫」,而是包含:安裝並確認 Gemini Python SDK、建立獨立的 Gemini 模組、製作 Interactive Chat 測試程式、建立 SubWise AI 身份與 System Prompt、驗證 AI 理解消費與訂閱情境、加入 API 錯誤處理並實際測試。也就是說,今天不只是「接上 Gemini」,而是開始建立真正屬於 SubWise 的 AI。
啟用虛擬環境後,確認 google-genai 是否已經安裝:
pip show google-genai
成功看到 Name: google-genai 與版本號,代表 Gemini Python SDK 已經可以使用。
建立 gemini_client.py,負責處理 Gemini API:
import os
from dotenv import load_dotenv
from google import genai
load_dotenv()
client = genai.Client(
api_key=os.getenv("GEMINI_API_KEY")
)
這裡的概念跟之前串接 Google Sheets 很像——不把 API Key 寫死在程式碼裡,而是從 .env 讀取 GEMINI_API_KEY,避免把金鑰直接寫進 GitHub。
建立呼叫函式:
def ask_gemini(prompt):
response = client.models.generate_content(
model="gemini-3.6-flash",
contents=prompt
)
return response.text
執行 ask_gemini("請用一句話介紹 SubWise 是什麼。"),資料流變成:
Python → Gemini Client → Gemini API → AI 回覆
這是 SubWise 第一次真正擁有 AI 能力。
如果每次都要修改程式才能測試問題太麻煩,因此另外建立 test_gemini.py,做成簡單的互動式聊天介面,可以連續輸入問題直到輸入 exit 才結束,讓 Prompt 測試變得非常方便。
單純串接 Gemini 還不夠,因為 Gemini 本身是通用型 AI,不會自動知道自己是 SubWise。因此加入 System Prompt:
SYSTEM_PROMPT = """
你是 SubWise,一個 AI 智慧記帳與訂閱管理管家。
你的主要工作是協助使用者:
1. 管理日常消費
2. 分析消費類別
3. 管理訂閱服務
4. 提醒即將發生的訂閱扣款
5. 提供簡單、實用的財務管理建議
"""
再把 Prompt 和使用者問題一起送給 Gemini:
response = client.models.generate_content(
model="gemini-3.6-flash",
contents=f"{SYSTEM_PROMPT}\n\n使用者問題:{prompt}"
)
這樣 Gemini 就開始知道「我是 SubWise」,是今天很重要的一個轉變。
除了身份之外,也加入了基本規則:使用繁體中文回答、回覆簡潔容易理解、協助判斷消費類別、優先判斷 Netflix / Spotify / ChatGPT 等服務是否屬於訂閱、不自行捏造使用者沒有提供的資訊、資訊不足時主動詢問。這些規則看起來簡單,但實際測試後效果很明顯。
完成 System Prompt 後,實際測試四種情境:
if "午餐" in text 這種規則式判斷,是 AI 自己理解自然語言的結果,這正是之後「AI 自動記帳」的基礎。SubWise 不只是回答問題,還能理解消費情境、判斷訂閱服務,甚至在資訊不足時主動反問——這些行為完全是靠 Prompt 設計出來的,沒有寫任何一行 if-else 判斷式:


把 API 呼叫包進 try/except,讓 SubWise 遇到 API 問題時不會直接噴出一大串 Python Traceback:
def ask_gemini(prompt):
try:
response = client.models.generate_content(
model="gemini-3.6-flash",
contents=f"{SYSTEM_PROMPT}\n\n使用者問題:{prompt}"
)
return response.text
except Exception as e:
print(f"❌ Gemini API 發生錯誤:{e}")
return (
"⚠️ SubWise AI 暫時無法回應。\n\n"
"可能原因:\n"
"• Gemini API 額度不足\n"
"• 網路連線異常\n"
"• AI 服務暫時忙碌\n\n"
"請稍後再試。"
)
為了確認錯誤處理真的有效,故意把模型名稱改成 gemini-invalid-test-model 再執行測試。API 確實回傳 404 NOT_FOUND,但這次 Python 沒有直接崩潰,而是顯示了設計好的友善提示訊息。這次驗證也讓我確認:錯誤處理不是「寫了就算完成」,而是真的要故意製造錯誤測試看看。
故意讓程式出錯,確認即使 Gemini API 發生問題,SubWise 也不會直接崩潰,而是給使用者看得懂的提示:
1.429 RESOURCE_EXHAUSTED(API 配額不足)
第一次正式串接 Gemini 時,API 回傳 429 RESOURCE_EXHAUSTED,錯誤訊息顯示已超過目前的配額限制。這次踩坑讓我發現:API 串接成功不代表永遠都能正常使用,實際開發還需要考慮 API 配額、RPM/TPM 限制、模型可用性、API Key 正確性、網路狀態等因素,這也讓「錯誤處理」變得非常重要。
2.404 NOT_FOUND(模型不存在)
後續確認模型設定時又遇到 404 NOT_FOUND,原因是當時使用的模型名稱無法提供給目前的 API 使用,最後改成測試成功的 gemini-3.6-flash 才解決。這也提醒我:不要看到網路文章上的模型名稱就直接複製,AI SDK 與模型版本都可能持續更新,實際使用時應該確認目前 API 所支援的模型。
3.API 錯誤不能直接丟給使用者
真正的產品需要把底層 API 錯誤轉換成使用者看得懂的訊息,這也是加入 try/except 錯誤處理的原因。
gemini_client.py)今天最大的成果不是「成功叫 AI 回答問題」,而是 SubWise 開始從一個普通的 LINE Bot,逐漸變成真正的 AI Agent:
使用者 → SubWise AI Layer → Gemini API → AI 理解使用者語意
而前幾天完成的 Google Sheets,也在另一端準備好了:
LINE Bot → SubWise AI → Google Sheets
接下來真正的挑戰,就是把這兩個部分接起來。
Day09 我會嘗試讓 Gemini 將「我今天午餐花了 120 元」這樣的自然語言,轉換成程式可以直接使用的結構化資料:
自然語言 → Gemini → 固定 JSON → Python → Google Sheets
這會是 SubWise 從「會聊天的 AI」進化成「真的可以幫我記帳的 AI」的重要一步。Day 08 完成,下一站,讓 AI 開始真正理解資料。我們明天見!