Claude Code 教學/第 25 篇・共 25 篇

LINE 家庭 AI 小幫手(五):常駐上線,開機自動跑、固定網址、一個月花多少錢

最後一篇讓小幫手正式上班:Cloudflare Tunnel 換成固定網址、程式只聽本機、用 macOS launchd 開機自動啟動與當機重開,再攤開我家四個月的真實帳本,教你設花費警報。

上一篇做完,小欣的功能已經齊了。但現在她是「你開著終端機她才上班」:電腦重開、終端機關掉、快速通道的網址一換,她就失聯了。這篇讓她變成真正的常駐服務,最後攤開我家的帳本。

一、固定網址:具名 Cloudflare Tunnel

第一篇用的快速通道每次重開都換網址。要固定,需要一個交給 Cloudflare 管理的網域(在 Cloudflare 買,或把現有網域的 DNS 轉過去,一年幾百元)。

有網域之後,請 Claude 帶你做,或照下面自己來:

cloudflared tunnel login                                   # 瀏覽器會跳出來,選你的網域授權
cloudflared tunnel create line-family-bot                  # 建一條通道,產生憑證檔
cloudflared tunnel route dns line-family-bot bot.example.com   # 把子網域指到這條通道

接著建立 ~/.cloudflared/config.yml,範本的 ops/cloudflared-config.example.yml 可以照抄再改:

tunnel: line-family-bot
credentials-file: /Users/YOU/.cloudflared/<tunnel-id>.json

ingress:
  - hostname: bot.example.com
    service: http://127.0.0.1:8001
  - service: http_status:404

ingress 是轉送規則:打到 bot.example.com 的請求送進你電腦的 8001 port,其他一律回 404。用 cloudflared tunnel run line-family-bot 測試,確認可以之後,依 Cloudflare 官方文件把它裝成開機自動執行的服務。

最後回 LINE Developers Console,把 Webhook URL 改成 https://bot.example.com/webhook,按 Verify。

沒有網域也可以先繼續用快速通道,只是每次重開都要記得回後台換網址。

二、只聽本機,外面只能走通道

main.py 最後一行:

# 只聽本機 127.0.0.1:外面只能透過 Cloudflare Tunnel 進來,區網的人也打不到
uvicorn.run(app, host="127.0.0.1", port=PORT)

很多教學會寫 host="0.0.0.0",意思是「這台電腦的所有網路介面都接受連線」,連同一個 Wi-Fi 底下的其他裝置都能直接打你的程式。我家的版本一開始也是這樣,後來才改成只聽 127.0.0.1(本機自己)。通道本身就在本機,程式完全不需要對外開放,能少開一個門就少開一個。

三、開機自動上班:launchd

macOS 管理背景服務的機制叫 launchd。範本的 ops/com.example.line-family-bot.plist 就是給它的設定檔,最重要的是這幾行:

<key>ProgramArguments</key>
<array>
    <string>/Users/YOU/claude-line-family-bot/venv/bin/python</string>
    <string>main.py</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<true/>

RunAtLoad 是登入時就啟動,KeepAlive 是程式掛掉自動重開。請 Claude 幫你裝:

請把 ops/com.example.line-family-bot.plist 裡的 /Users/YOU/claude-line-family-bot 換成這個專案的實際路徑,
複製到 ~/Library/LaunchAgents/,用 launchctl bootstrap 載入。
裝好後確認 curl http://127.0.0.1:8001/health 回 {"status":"ok"},再教我怎麼重開和看 log。

日常會用到的三個指令:

launchctl kickstart -k gui/$(id -u)/com.example.line-family-bot   # 改完程式後重開
tail -f server.log                                                 # 看即時 log
launchctl bootout gui/$(id -u)/com.example.line-family-bot         # 停用

還有一件很容易忘的事:Mac 睡著了,小欣也會跟著睡。到「系統設定 › 能源」打開「顯示器關閉時防止自動進入睡眠」。用筆電當主機的話,蓋上螢幕就會睡,不太適合,桌機或 Mac mini 最理想。

四、帳本:一個月到底花多少

範本把每次呼叫都記在 data/usage.jsonl,一行一筆:

{"ts": "2026-11-11T11:19:41+08:00", "model": "claude-sonnet-5", "input": 161, "output": 151,
 "cache_read": 4676, "cache_write": 13210, "web_search": 1}

usage.py 照價目表換算成美元,每 30 分鐘檢查一次。當天超過 1 美元、或當月超過 20 美元,就私訊你一則警報。門檻在檔案開頭,可以自己改:

DAILY_LIMIT_USD = 1.0
MONTHLY_LIMIT_USD = 20.0

這是第二道保險,第一道是第二篇在 Claude Console 設的每月花費上限。兩道都設:程式的警報讓你提早知道,Console 的上限保證最壞情況也不會失控。

我家的真實數字

我家的小幫手 6 月上線,下面是 token 費(不含搜尋費):

期間 模型 每月 token 費
2026 年 6~9 月 Haiku 4.5 約 US$1.1~1.3
2026 年 10 月 Sonnet 5 約 US$2.7(93 次呼叫)

我家的版本當時沒有記搜尋次數,所以搜尋費要另外估:每次 0.01 美元,假設一個月查 100 次,就是 1 美元。估計一個月合計 3~4 美元,一杯咖啡的錢。

換 Sonnet 之後費用多了一倍,換到的是第二篇講的那些錯(編天氣、算錯星期)不再出現。對家庭群組來說,我覺得一個月多 1.5 美元很值得。範本已經把搜尋次數也記進去了,你的帳本會比我的完整。

有一個很省錢的設計在第三篇講過:快取。人設和工具說明每次都一樣,第二次以後只收一成的錢。上面那行紀錄裡,cache_read 有 4,676 個 token,是一般 input(161)的將近 30 倍,這部分如果沒吃到快取,費用會高很多。

五、上線後的維運清單

  • 每週:看一次 data/knowledge_auto.md,刪掉記錯的;看一次 server.log 有沒有反覆出現的錯誤。
  • 每月:看 Claude Console 的用量頁,對一下 usage.jsonl 的估算。
  • 金鑰外流:LINE 到 Developers Console 按 Reissue;Claude 到 Console 刪掉舊金鑰、建新的;更新 .env 後重開。
  • 備份:data/ 資料夾就是小欣全部的記憶(提醒、記事、長期記憶)。程式可以重新 clone,資料沒了就沒了,偶爾備份一份。
  • 想加功能時:照第四篇的樣子寫一個 tools_xxx.py,先用 DRY_RUN 和 fake_line_event.py 測過,再上線。

結語

回頭看,五篇做的其實是同一件事:讓一個很聰明、但不認識你家的模型,在正確的時間、用正確的分寸開口。 人設控制分寸,@ 判斷控制時機,前後文和記憶讓它認識你家,工具讓它說到做到,最後這篇讓它穩定地一直在。

全部程式在 claude-line-family-bot,MIT 授權,歡迎拿去改成你家的樣子。做出來的小幫手叫什麼名字、遇到什麼問題,都歡迎留言告訴我。

參考來源

回教學列表