前幾天完成消費分析功能後,SubWise 已經可以透過 Gemini 判斷使用者的需求,再交給 analysis_service 從 Google Sheets 取得資料並分析。但實際使用時,發現一個問題:
功能雖然很多,但使用者還是得自己記住指令。
例如想分析消費,必須自己輸入「幫我分析這個月的消費」。如果未來功能越來越多,使用者很容易不知道「到底要輸入什麼」。因此 Day 19 不再增加新的分析公式,而是把重點放在:讓 SubWise 從「能回答」進一步變成「可以操作」。
目前 SubWise 已經逐漸具備四個主要功能:💰 記帳、📊 消費分析、📷 發票辨識、🔔 訂閱管理。因此先建立一個比較接近正式產品的主選單:
🤖 SubWise 智慧記帳管家
請選擇你想使用的功能:
💰 記帳
📊 消費分析
📷 發票辨識
🔔 訂閱管理
你也可以直接告訴我想做什麼。
這裡有一個重要的設計:主選單不代表所有功能都已經完成。 發票辨識與訂閱管理目前仍然可以先作為入口,讓使用者知道未來會有哪些能力,也讓整個產品架構提前成形。
為了避免所有 UI 文字都塞在 app.py,新增 menu_service.py 負責提供主選單內容,app.py 只需要 from menu_service import get_main_menu 即可取用。這也是這次開發過程中一個很重要的體會:功能開始變多後,不只是「能不能跑」重要,程式的責任分離也開始變重要。
在 app.py 加入 process_feature_command(text),讓使用者不需要輸入完全一致的文字也能觸發功能——例如「記帳」「帳目」「新增記帳」都能進入記帳功能,「分析」「消費分析」「支出分析」都能進入分析功能,發票辨識與訂閱管理也各自支援多種同義詞。
這是 Day 19 最主要的新功能。原本使用者輸入「消費分析」後會直接進入某個分析流程,現在改成先讓使用者選期間:
📊 SubWise 消費分析
請選擇你想分析的期間:
📅 今天
📆 本週
🗓️ 本月
你也可以直接輸入:「今天」「本週」「本月」
使用者選擇「消費分析」後,SubWise 會提供「今天/本週/本月」三種分析期間,透過 LINE Quick Reply 降低輸入成本,也讓互動流程更加接近真正的聊天式應用:
先確認目前使用的 LINE SDK 是否支援 QuickReply、QuickReplyItem、MessageAction,測試後確認可以使用,接著建立 create_analysis_quick_reply(),讓 LINE 產生三個快速選項按鈕(📅 今天 / 📆 本週 / 🗓️ 本月)。
這裡有一個很重要的設計:每個按鈕按下後其實只是送出對應的文字(例如「今天」),因此使用者按下按鈕後,仍然會進入原本既有的訊息處理流程:
Quick Reply → 送出文字 → 原本的 process_command() → 既有分析流程
也就是說:UI 是新增的,但核心商業邏輯完全重複利用,沒有重新實作消費分析。
先在 Python 層測試 python -m py_compile app.py 確認沒有語法錯誤,並確認 get_quick_reply("消費分析") 能正確回傳三個 QuickReplyItem 物件,接著才部署到 Render 進行實機測試。
實際用手機 LINE 輸入「消費分析」,成功顯示三個期間選項,點擊「🗓️ 本月」後成功得到完整消費分析結果。
補充 Demo 消費資料:一開始測試時發現「今天」與「本週」都是 NT$0,雖然程式沒有錯,但拿來展示容易讓人誤以為功能沒作用。因此重新整理 Google Sheets 測試資料,涵蓋 Food、Transport、Shopping、Entertainment 四種類別、共 14 筆消費,並確保今天、本週、本月、上個月都有資料,讓三種分析期間都能真正展示出結果。
今天:總支出 NT$350,3 筆消費,最高支出類別 Food(85.7%),最高單筆消費 NT$180(Food|午餐)。
當天已有消費紀錄時,SubWise 可以直接整理今日總支出、主要消費類別與最高單筆消費,讓記帳資料開始轉化成可閱讀的資訊。
本週:總支出 NT$1,870,10 筆消費,最高支出類別 Food(41.2%),最高單筆消費 NT$450(Shopping|生活用品),最高單日消費出現在 2026-08-15。
除了月度分析,SubWise 也能即時切換至本週資料,讓相同的分析服務根據不同期間重新計算消費統計。
本月:總支出 NT$2,240,14 筆消費,最高支出類別 Food(46.4%)。更重要的是,這次「本月 vs 上月」的比較也成功跑通。
使用者只需要選擇「本月」,SubWise 就會自動讀取 Google Sheets 消費資料,計算總支出、消費筆數、分類占比、最高單筆與最高單日消費等資訊。
代表 Day 18 完成的分析能力,成功被 Day 19 的互動入口重新利用,而不是各自獨立運作。
menu_service.py,分離 UI 文字與商業邏輯process_feature_command(),支援模糊指令匹配完成後提交 Git,Commit 5270674,成功推送到 GitHub,確認 working tree clean。
目前 SubWise 的整體流程:
LINE 使用者 → LINE Webhook → handle_message()
├── 固定指令 → process_command()(主選單 / 功能入口 / Quick Reply)
└── AI 訊息 → process_ai_message() → Gemini → 記帳/查詢/分析 → Sheets / analysis_service
明天 Day 20 我希望把主選單中的「發票辨識」從目前的「功能入口」真正變成可以使用的多模態 AI 功能,也就是讓使用者不需要手動輸入日期、分類、金額、品項,而是直接拍一張發票或收據,讓 AI 幫忙辨識並完成記帳。這將會是 SubWise 從「文字型智慧記帳」走向「多模態智慧生活管家」的重要一步。