[Gemini][Google Maps] 使用 Google Maps Grounding API 打造位置感知的 AI 應用

前情提要 在開發 LINE Bot 時,我想加入一個功能:讓使用者分享位置後,AI 可以智慧推薦附近的餐廳、加油站或停車場。傳統做法需要串接 Google Places API,處理複雜的搜尋邏輯和結果排序。但 Google 在 2024 年推出了 Grounding with Google Maps 功能,可以讓 Gemini 模型直接存取 Google Maps 的 2.5 億個地點資訊,讓 AI 回應自動帶有地理位置脈絡! 這項功能透過 Vertex AI 提供,可以讓 Gemini 模型「接地氣」(grounded)地回答位置相關問題,不再只是憑空想像。 開發過程中遇到的問題 在實作 maps_grounding.py 時,我最初使用 Gemini Developer API 搭配 API Key 的方式: # ❌ 錯誤的做法 client = genai.Client( api_key=api_key, http_options=HttpOptions(api_version="v1") ) response = client.models.generate_content( model="gemini-2.0-flash-lite", # 不支援 Maps Grounding contents=query, config=GenerateContentConfig( tools=[Tool(google_maps=GoogleMaps())], tool_config=ToolConfig(...) ), ) 結果出現了這個錯誤: google.genai.errors.ClientError: 400 INVALID_ARGUMENT. {'error': {'code': 400, 'message': 'Invalid JSON payload received. Unknown name "tools": Cannot find field. Invalid JSON payload received. Unknown name "toolConfig": Cannot find field.'}} 經過查閱文件後才發現,Google Maps Grounding 只支援 Vertex AI,無法使用 Gemini Developer API! 正確的解決方案 1. 理解 API 差異 Google 提供兩種不同的 Gemini API 存取方式: 特性 Gemini Developer API Vertex AI API 認證方式 API Key ADC / Service Account Maps Grounding ❌ 不支援 ✅ 支援 企業級功能 有限 完整 適用場景 快速原型開發 生產環境 2. 修正程式碼 以下是正確的實作方式: from google import genai from google.genai import...
繼續閱讀

[VS Code][Colab] Google 正式釋出 Colab VS Code Plugin

前情提要 Google Colab 是一個我很喜歡的服務,你可以在線上透過 JupyterNotebook 的介面,快速使用到 GPU (甚至是 TPU)。有許多需要大量運算資源的東西,都可以很快速的在遠端的機器上面執行。 我自己很常在上面去嘗試一些模型,雖然常常排隊排不到機器。 使用 Colab 可能有的痛點 雖然使用Google Colab 機器非常的方便,但是由於在線上編輯有一些比較麻煩的地方: 無法使用 Copilot 這類型的 Code Assist Tool 來幫我 Auto-Complete 一些程式碼 無法跑 Gemini CLI Code Assist 來幫我寫出一些更多的測試或是幫忙想應用。 Colab for VS Code Plugin 但是現在 Colab VS Code Extension 終於可以在 VS Code Plugin 上面使用了。你可以透過 “Colab” 直接找到官方釋出的 Plugin 。 安裝過程相當的簡單又快速。 連線到 Colab 如果要連線,在選擇 Kernel 的時候,就可以選擇 Colab 來遠端連線。 這裡還可以快速連線,或是找你上次連線過的伺服器。 這裡就是讓人興奮的地方,可以找找 TPU (不保證排得到隊伍)來用用看。 這樣就可以了。 實際應用: 這樣比較對味啦!! Vibe Coding 出現之後,我們越來越習慣 Vibe Coding 了。但是如果需要 Step by Step 的去偵錯,或是想要跑一些大型機器才能運行的運算。真的還是需要透過 Colab 來幫忙,但是如果又希望可以有 Gemini CLI 的輔助的話,或許 Colab VS Code Extension 就是你不可或缺的好夥伴。 目前一些需要注意的地方 由於 Colab VS Code Plugin 還在持續開發中,有一些原本在 Colab Web UI 上可以使用的 google.colab 功能目前還無法在 VS Code 中使用。以下是一些主要的限制: auth.authenticate_user(): 認證 URL 會出現在選單中,無法直接點擊。建議改用 Python Cloud Client Library。 drive.mount(): 目前無法掛載 Google Drive,可以改用 Drive Python API 來存取檔案。 files.download() / files.upload(): 原生的檔案上傳下載功能無法使用,但可以透過 IPyWidget 來達成相同效果。 userdata.get(): 目前會回傳錯誤,暫時需要從 Colab Web UI 複製 secret 值到 notebook 中。 雖然有這些限制,但整體來說 Colab VS Code Plugin 還是大幅提升了開發體驗,特別是對於習慣使用 VS Code 和各種 AI Coding Assistant 的開發者來說,絕對是值得一試的好工具! 參考資料 Colab VS Code...
繼續閱讀

[Python] LINE Bot 名片管家進化:一鍵生成 vCard QR Code,讓名片直接加入手機通訊錄

前情提要 在先前的 LINE Bot 智慧名片管家 專案中,我們已經實作了使用 Gemini Pro Vision API 自動辨識名片的功能。使用者只要拍照上傳名片,AI 就能自動解析姓名、職稱、公司、電話、Email 等資訊,並儲存到 Firebase Realtime Database 中。 但在實際使用時,我發現了一個痛點: 📱 我已經有數位化的名片資料了,但要加入手機通訊錄還是得手動一個一個欄位輸入… 想像這些情境: 📇 參加研討會:收集了 20 張名片,辨識完成後還要手動加入通訊錄 💼 業務拜訪:拿到客戶名片,想快速加入手機聯絡人 🤝 社交場合:認識新朋友,希望立即儲存聯絡方式 於是我想:既然資料已經數位化了,為什麼不能一鍵加入通訊錄呢? 最理想的方式就是:生成 vCard QR Code,讓使用者掃描後直接加入通訊錄! 專案程式碼 https://github.com/kkdai/linebot-namecard-python (透過這個程式碼,可以快速部署到 GCP Cloud Run,享受無伺服器的便利) 📚 關於 vCard 與 QR Code vCard 格式介紹 vCard(Virtual Contact File)是一種電子名片的標準格式,副檔名為 .vcf。幾乎所有智慧型手機和郵件客戶端都原生支援 vCard,包括: 📱 iPhone:自動識別並提示「加入聯絡人」 🤖 Android:透過聯絡人 App 匯入 💻 電腦:Outlook、Apple Mail、Gmail 等都支援 vCard 3.0 格式範例 BEGIN:VCARD VERSION:3.0 FN:Kevin Dai N:Dai;Kevin;;; ORG:LINE Taiwan TITLE:Software Engineer TEL;TYPE=WORK,VOICE:+886-123-456-789 EMAIL;TYPE=WORK:[email protected] ADR;TYPE=WORK:;;Taipei, Taiwan;;;; NOTE:Met at DevFest 2025 END:VCARD QR Code + vCard 的優勢 將 vCard 編碼成 QR Code 有幾個好處: ✅ 一掃即加:相機 App 掃描後自動識別 ✅ 跨平台:iPhone/Android 都支援 ✅ 無需下載:不用儲存檔案再匯入 ✅ 資料完整:包含所有聯絡資訊和備註 ✨ 專案功能介紹 核心功能流程 使用者上傳名片圖片 ↓ Gemini Vision API 辨識 ↓ 儲存到 Firebase Realtime Database ↓ 顯示名片 Flex Message ↓ 【新功能】點擊「📥 加入通訊錄」按鈕 ↓ 生成 vCard QR Code ↓ 上傳到 Firebase Storage ↓ 回傳 QR Code 圖片給使用者 ↓ 使用者掃描 → 加入通訊錄 ✅ 新增功能亮點 📥 一鍵生成 QR...
繼續閱讀

LINE Messaging API 新功能介紹: Mark as Read API 讓你的聊天機器人標記訊息已讀

在 2025 年 11 月 5 日,LINE Messaging API 推出了新的功能,讓聊天機器人可以將用戶發送的訊息標記為已讀。這項功能的推出,讓開發者能夠為用戶提供更好的互動體驗,用戶可以清楚知道機器人是否已經「看過」他們的訊息。 前言 以往在回應設定中,如果開啟了聊天,希望可以用真人來回覆客戶的話。這個時候,由於系統是允許「真人聊天」跟「聊天機器人」是共存的。但是如果這個聊天選項打開的話,直到真人打開聊天視窗之前,即便客戶的訊息已經被聊天機器人處理了,他也不會標示成「已讀」。 這一篇文章就要跟大家分享,這一個新功能開放後。該如何應用這個新的 API 。 新 API 功能介紹 已讀標記功能 當用戶發送訊息給 LINE 官方帳號時,機器人現在可以主動將訊息標記為已讀狀態。這讓用戶在聊天介面上可以看到「已讀」的指示,就像一般的 1 對 1 聊天一樣。這項功能特別適合用於: 客服機器人:讓用戶知道他們的問題已經被機器人接收並處理 訂單通知機器人:確認用戶的訂單查詢已被讀取 互動式問答機器人:提供更自然的對話體驗 SDK 版本需求 line-bot-sdk-go/v8: v8.18.0 或更新版本 Go: 1.24 或更新版本 新增 API 規格 LINE Messaging API 新增了兩個標記已讀的 API: MarkMessagesAsRead 使用 userId 來標記特定用戶的所有未讀訊息為已讀。 端點: POST https://api.line.me/v2/bot/message/markAsRead 請求參數: { "chat": { "userId": "U1234567890abcdef1234567890abcdef" } } MarkMessagesAsReadByToken (本文重點) 使用訊息專屬的 markAsReadToken 來標記特定訊息為已讀,更精確也更安全。 端點: POST https://api.line.me/v2/bot/message/markAsRead/token 請求參數: { "markAsReadToken": "abc123def456..." } 新 API 欄位介紹 markAsReadToken 欄位 LINE Messaging API v8.18.0 在各種訊息內容中新增了 markAsReadToken 欄位: TextMessageContent.markAsReadToken: 文字訊息的已讀標記 token StickerMessageContent.markAsReadToken: 貼圖訊息的已讀標記 token ImageMessageContent.markAsReadToken: 圖片訊息的已讀標記 token VideoMessageContent.markAsReadToken: 影片訊息的已讀標記 token AudioMessageContent.markAsReadToken: 音訊訊息的已讀標記 token FileMessageContent.markAsReadToken: 檔案訊息的已讀標記 token LocationMessageContent.markAsReadToken: 位置訊息的已讀標記 token 每個訊息都會有一個唯一的 markAsReadToken,機器人可以使用這個 token 來標記該訊息為已讀。 如何使用 Golang 來開發相關部分 以下是使用 Golang 實作 Mark as Read 功能的完整範例程式碼: (請注意 github.com/line/line-bot-sdk-go/v8 需要更新到 8.18.0 之後) 範例程式碼在:https://github.com/kkdai/linebot-mark-as-read 實作方式:使用 Quick Reply + Postback 本範例採用使用者友善的互動方式:在每則回覆訊息上加上「Mark as Read」快速回覆按鈕,讓使用者可以主動選擇要將哪些訊息標記為已讀。 步驟 1: 接收訊息並提取 markAsReadToken case webhook.TextMessageContent: // 從訊息內容中取得 markAsReadToken markAsReadToken := message.MarkAsReadToken log.Printf("Received text message with...
繼續閱讀

[Python] 用 Python + Gemini File Search 打造智能文件助手 LINE Bot:讓 AI 幫你讀文件

前情提要 在工作和生活中,我們經常需要處理大量的文件:會議記錄、技術文件、合約、研究報告等等。每次要找特定資訊時,都得翻開文件一頁一頁找,既費時又容易遺漏重點。 最近 Google 推出了 Gemini File Search API,讓 AI 可以直接分析上傳的文件並回答問題。我想到,如果能結合 LINE Bot,讓大家透過最常用的通訊軟體就能「問」文件問題,那不是很方便嗎? 想像一下這些場景: 📄 會議記錄:「這次會議的主要決議是什麼?」 📊 技術文件:「這個 API 的參數有哪些?」 🖼️ 圖片內容:「這張圖片裡有什麼?」 📑 研究報告:「這份報告的結論是什麼?」 於是我決定動手打造這個「智能文件助手 LINE Bot」,讓 AI 成為你的私人文件分析師! 專案程式碼 https://github.com/kkdai/linebot-gemini-file-search (透過這個程式碼,可以快速部署到 GCP Cloud Run,享受無伺服器的便利) 📚 關於 Gemini File Search 基本介紹 Gemini File Search 是 Google DeepMind 於 2025 年 11 月 6 日推出的全新工具,直接內建在 Gemini API 之中。這個工具是一套全託管的 RAG(檢索增強生成,Retrieval-Augmented Generation)系統,目標是讓開發者能更簡單、有效率地將自己的資料與 Gemini 模型結合,產生更精確、相關且可驗證的 AI 回應。 主要特色 簡化開發流程 File Search 免去自行搭建 RAG 管線的麻煩,開發者只需專注於應用程式本身。檔案儲存、分段(chunking)、嵌入(embedding)及檢索等繁瑣細節都自動處理。 強大的向量搜尋 採用最新的 Gemini Embedding 模型,可理解使用者查詢的語意與上下文,找出最相關的資訊,即使關鍵字不同也能命中答案。 自動引用來源 AI 回應會自動附上出處,明確標示答案引用自哪一份文件、哪一段內容,方便核對與驗證。 廣泛格式支援 支援 PDF、DOCX、TXT、JSON 及多種程式語言檔案等主流格式,方便建立多元知識庫。 輕鬆整合 可直接在 generateContent API 中使用,且有完善的 Python SDK,開發者能快速上手。 📚 專案功能介紹 核心功能 📤 多格式檔案上傳 支援文件檔案:PDF、Word (DOCX)、純文字 (TXT) 等 支援圖片檔案:JPG、PNG 等(利用 Gemini Image Understanding 圖片內容) 自動處理中文檔名,避免編碼問題 即時回饋上傳狀態 🤖 AI 智能問答 基於 Google Gemini 2.5 Flash 模型 從上傳的文件中搜尋相關內容並回答 支援繁體中文、英文等多語言 理解上下文,提供精準回答 👥 多對話隔離 1對1聊天:每個人有獨立的文件庫(完全隔離) 群組聊天:群組成員共享文件庫(協作查詢) 自動識別對話類型,無需手動設定 File Search Store 自動建立和管理 📁 檔案管理功能 Quick Reply 快速操作:上傳成功後提供快捷按鈕 明確檔案指定:Quick Reply 自動帶入檔案名稱 🔄 智能錯誤處理 檔案上傳失敗自動重試 沒有文件時引導使用者上傳 詳細的錯誤日誌記錄 💻 核心功能實作 1. File Search Store 的自動管理 這是整個系統的核心,負責管理每個使用者或群組的文件庫。 Store 命名策略...
繼續閱讀

[Go] 用 Go + Gemini + GCP 打造智慧垃圾車 LINE Bot:從查詢到提醒的完整解決方案

前情提要 在台灣,垃圾車的時間總是讓人捉摸不定。明明記得昨天是晚上七點來,今天卻遲遲等不到;或是剛好外出倒垃圾,垃圾車就這樣錯過了。相信這是許多人共同的困擾。 隨著智慧城市的發展,越來越多城市開始提供垃圾車即時資訊 API,但這些資料對一般民眾來說並不容易使用。 這時候我看到臉書上一個朋友貼文 ,他敘述他做出了一個垃圾車追蹤的網站。 (網站, github) 這時候我在想,難道不能結合 LINE Bot 做出一個可以很快速幫助到其他的工具嗎?因此,我決定打造一個垃圾車 LINE Bot,讓大家可以透過最熟悉的通訊軟體,輕鬆查詢垃圾車資訊,甚至設定提醒通知。更重要的是,這個 Bot 不只是簡單的指令查詢,而是整合了 Google Gemini AI,能夠理解「我晚上七點前在哪裡倒垃圾?」這樣的自然語言,提供真正智慧化的服務體驗。 專案程式碼 https://github.com/kkdai/linebot-garbage-helper (透過這個程式碼,可以快速部署到 GCP Cloud Run,並使用 Cloud Build 實現自動化 CI/CD) 🗑️ 專案功能介紹 核心功能 🗑️ 即時查詢垃圾車 輸入地址或分享位置即可查詢附近垃圾車站點 顯示預計抵達時間、路線資訊和 Google Maps 導航連結 ⏰ 智慧提醒系統 可設定垃圾車抵達前 N 分鐘提醒 自動推播通知,再也不會錯過垃圾車 支援多種提醒狀態管理(活躍、已發送、已過期、已取消) 🤖 自然語言查詢 整合 Google Gemini AI,支援自然語言理解 例如:「我晚上七點前在台北市大安區哪裡倒垃圾?」 自動提取地點、時間範圍等查詢條件 ❤️ 收藏地點功能 儲存常用地點(家、公司等) 快速查詢收藏地點的垃圾車資訊 🏗️ 技術架構說明 系統架構圖 ┌─────────────────┐ ┌──────────────────┐ ┌─────────────────┐ │ LINE Client │───▶│ Cloud Run │───▶│ Firestore │ └─────────────────┘ │ (Go App) │ │ (Database) │ └──────────────────┘ └─────────────────┘ │ ▼ ┌──────────────────┐ │ External APIs │ │ • Google Maps │ │ • Gemini AI │ │ • 垃圾車資料源 │ └──────────────────┘ │ ▼ ┌──────────────────┐ │ Cloud Scheduler │ │ (提醒排程觸發) │ └──────────────────┘ 💻 核心功能實作 1. 垃圾車資訊的處理 這是整個系統的核心部分,負責從開放資料 API 取得垃圾車資訊,並進行智慧化的查詢處理。 資料來源與結構設計 我們使用了開源專案 Yukaii/garbage 提供的垃圾車資料 API,這個 API 提供了台北市的即時垃圾車收集點資訊。 type GarbageData struct { Result GarbageResult `json:"result"` } type CollectionPoint struct { ID int `json:"_id"` District string `json:"行政區"` // 行政區域...
繼續閱讀