[Gemini][LINEBot] 透過 Google ADK 打造一個 Agent LINE Bot

前言 雖然前幾天我才剛將 OpenAI Agents SDK 整合成一個簡單的 LINE Bot 範例程式,就在 20250410 的凌晨, Google 就宣佈了 ADK (Google Agent SDK) 的發佈。 本篇文章將介紹如何透過 Google Agent SDK (ADK) 來打造一個最簡單的 LINE Bot 功能,作為之後 MCP 與其他功能的起始專案。 (想不到才沒隔多久,就可以換成 Google ADK XD) 範例程式碼: https://github.com/kkdai/linebot-adk 05/25更新: SDK 有更改成 asynchronous 形式。 session = await session_service.create_session(app_name=app_name, user_id=user_id, session_id=session_id) 快速簡介 Google ADK Repo: https://github.com/google/adk-python Google 推出的Agent Development Kit (ADK),這是一個開源框架,旨在簡化智能多代理系統的開發。以下是內容的重點: ADK是一個開源框架,專為開發多代理系統而設計,提供從構建到部署的全方位支持。 它支持模組化和可擴展的應用程序開發,允許多個專業代理的協作。 功能特點: 內建串流:支持雙向音頻和視頻串流,提供自然的人機互動。 靈活的編排:支持工作流代理和LLM驅動的動態路由。 集成開發者體驗:提供強大的CLI和可視化Web UI,便於開發、測試和調試。 內建評估:系統性地評估代理性能。 簡易部署:支持容器化部署。 支援視覺化測試 WebUI (Refer: https://google.github.io/adk-docs/get-started/quickstart/#run-your-agent)) 可以在本地端透過 WebUI 來做一些快速的測試,快速部署到 Google Cloud 。 相關的功能也會在後續的文章中陸續提到。 整合 LINE Bot SDK 需要注意的事項: 接下來跟大家講一下,要加上 LINE Bot SDK 有哪一些需要注意的地方。 範例程式碼: https://github.com/kkdai/linebot-adk Agent 起始的流程 目前是放在 Services 啟動的時候,就將 Agent 初始化。 # Initialize ADK client root_agent = Agent( name="weather_time_agent", model="gemini-2.0-flash-exp", description=( "Agent to answer questions about the time and weather in a city." ), instruction=( "I can answer your questions about the time and weather in a city." ), tools=[get_weather, get_current_time], ) print(f"Agent '{root_agent.name}' created.") 建立 Agent 之後,接下來要準備好 Runner 來執行 Agent 溝通的工作。 # Key Concept: Runner...
繼續閱讀

[Gemini][LINEBot] 打造一個 OpenAI Agents LINE Bot 並且使用 Google Gemini Model

前言 OpenAI 在 03/11 發佈了新的 OpenAI-Agent SDK 的套件 (OpenAI-Agents-Python),裡面不僅僅支援多 Agent 可以相互作用外,還宣佈了可以支援 MCP Server 。 本篇文章將介紹如何透過 OpenAI-Agents SDK 來打造一個最簡單的 LINE Bot 功能,作為之後 MCP 與其他功能的起始專案。 範例程式碼: https://github.com/kkdai/linebot-openai-agent 快速簡介 OpenAI-Agents-SDK OpenAI-Agent SDK 的套件 (OpenAI-Agents-Python) OpenAI推出了一系列新工具和API,包括Responses API和Agents SDK,這些工具旨在簡化開發者和企業構建智能代理的過程。Responses API結合了Chat Completions API的簡單性和Assistants API的工具使用能力,支持網頁搜索、文件搜索和電腦使用等內建功能。Agents SDK提供了改進的可觀察性和安全檢查,簡化多代理工作流程的編排,並支持智能代理之間的控制轉移,從而提升各行各業的生產力。 並且這個套件同時也提供支援 MCP Server 的功能,詳細部分下一次再介紹。 透過 Custom Provider 來使用 Google Gemini 先來讓 OpenAI-Agents SDK 可以使用其他公司的模型,這邊使用的是 Custom Provider。官方的敘述如下: 這邊我們使用 custom_example_provider.py 範例程式碼來參考,實際完成整合可以看 範例程式碼: https://github.com/kkdai/linebot-openai-agent BASE_URL = os.getenv("EXAMPLE_BASE_URL") or "" API_KEY = os.getenv("EXAMPLE_API_KEY") or "" MODEL_NAME = os.getenv("EXAMPLE_MODEL_NAME") or "" # Initialize OpenAI client client = AsyncOpenAI(base_url=BASE_URL, api_key=API_KEY) set_tracing_disabled(disabled=True) 這邊主要需要三個環境參數,以下開始詳細說明: BASE_URL: 也就是 Custom Provider 的 API 網址,如果要使用 Google Gemini 請記得改成 https://generativelanguage.googleapis.com/v1beta/。 API_KEY: 這邊就寫成自己的 Google Gemini API Key MODEL_NAME: 這邊記得要改成 Gemini 的 Model ,要省費用可以使用 gemini-1.5-flash。 然後這樣的透過 AsyncOpenAI() 就可以呼叫 Google Gemini 的服務了。 加入簡單的 Tools 這個範例參考原本的 Tools 的寫法,並且加入兩個 Tools 。 @function_tool def get_weather(city: str): """Get weather information for a city""" print(f"[debug] getting weather for {city}") return f"The weather in {city} is sunny." @function_tool def translate_to_chinese(text: str): """Translate text...
繼續閱讀

[Google Cloud] GCP 上面避免 YouTube 阻擋同區網路流量(透過 Proxy 解決)

前言 之前有一篇文章「[Google Cloud] 如何在 GCP Cloud Run 上面透過 LangChain 取得 YouTube 的相關資訊」,雖然有講過使用 Secret Manager 與 GCP. 相關的 LangChain YouTube 套件來試著抓取資料。但是近期 YouTube 又開始修該他的讀取規範,造成原來的方式不能成功,這裡記錄一下主要錯誤訊息,還有該如何解決。 主要的問題 有一天 YouTube 的字幕開始抓不到,查詢 Log 出現以下內容。 During handling of the above exception, another exception occurred: youtube_transcript_api._errors.RequestBlocked: Could not retrieve a transcript for the video https://www.youtube.com/watch?v=ViA4-YWx8Y4! This is most likely caused by: YouTube is blocking requests from your IP. This usually is due to one of the following reasons: - You have done too many requests and your IP has been blocked by YouTube - You are doing requests from an IP belonging to a cloud provider (like AWS, Google Cloud Platform, Azure, etc.). Unfortunately, most IPs from cloud providers are blocked by YouTube. There are two things you can do to work around this: 1. Use proxies to hide your IP address, as explained in the "Working around IP bans" section of the README (https://github.com/jdepoix/youtube-transcript-api?tab=readme-ov-file#working-around-ip-bans-requestblocked-or-ipblocked-exception). 2. (NOT RECOMMENDED)...
繼續閱讀

[Gemini][MCP] 在 Cline 上面使用 Gemini 來呼叫 MCP 的功能

前情提要 最近 MCP 是非常熱門的討論話題,但是大家提到 MCP 不免會想到 Anthropic 的 Claude 或是其他語言的模型。這一篇文章要告訴大家關於 MCP 的一些基礎原理,並且如何使用 Google Gemini 來呼叫 MCP 。希望能給大家一些整理。 什麼是 MCP(Model Context Protocol) 根據 Anthropic 的文件上面有提到: MCP 是一個開放協議,用於標準化應用程式如何為大型語言模型(LLM)提供上下文。您可以將 MCP 想像成 AI 應用程式的 USB-C 接口。就像 USB-C 為您的設備提供了一個標準化的方式來連接各種外圍設備和配件一樣,MCP 為 AI 模型提供了一個標準化的方式來連接不同的數據源和工具。 這邊也分享 YT https://www.youtube.com/watch?v=McNRkd5CxFY&t=17s 上面的架構圖,讓大家更容易理解 (圖片來源 技术爬爬虾 TechShrimp :MCP是啥?技术原理是什么?一个视频搞懂MCP的一切。Windows系统配置MCP,Cursor,Cline 使用MCP) 這邊可以看出來, 透過 MCP 這邊提到的 AI 客戶端(大家常使用的 ChatGPT, Claude, Gemini 的等等)都可以透過 MCP 架構直接來對這些服務做「操作」。 MCP 服務中的架構圖 (架構圖: MCP Core architecture) 這個架構圖,有清楚的敘述出關於 MCP 的 Client Server 的架構,這邊再強調一下。 MCP Host: 使用這些 MCP 服務的應用,可能是 Cline, Windsurf 或是 Claude Desktop) MCP Server: 許多地方應該都要介紹過,這裡不太贅述。之後也會有範例程式碼。就是一個萬用的溝通協定,讓每一個 MCP Host 可以更容易去使用一些外部功能。並且變成一個共通的協定。 MCP Client: 在每一個 Host 中,確定使用某個 MCP Server 後。在 Host 中,會有其相關的 client 這裡將會是用 Prompt 存在著。接下來會詳細敘述。 MCP 運作細節 完整細節可以參考網路上這位的說明,不過我將內容改成 Google Gemini 相關的應用。除了換掉影片中使用的 DeepSeek 之外,也可以讓整個使用更符合資訊安全相關的應用。 參考影片: 技术爬爬虾 TechShrimp MCP是怎么对接大模型的?抓取AI提示词,拆解MCP的底层原理 透過 CloudFlare 建立 AI API Gateway (如果要查看相關細節,需要使用 OpenRouter 或是 OpenAI Compatible ) 建立一個 Cloudflare 帳號 建立 AI -> API Gateway 選項選擇 OpenRouter ,然後記得去 OpenRouter 申請帳號 如果要查看 MCP 溝通細節,就得使用 OpenAI 或是 OpenRouter 。這裡查看影片可以看到完整教學。這裡將直接貼出相關細節。 以上是透過 Cloudflare 抓取封包後,來解析 MCP 的溝通機制: 你會發現...
繼續閱讀

[Gemini] 讓 Gemini 根據你問題的關鍵字,透過 Google Custom Search 找到結果總結回覆

前情提要 一直以來我們都知道透過 LLM 上的 function call ,是可以讓 LLM 有了使用工具的能力。可以去做網頁搜尋,或是查詢資料庫,甚至是做一些特殊的工作。 而在處理網頁搜尋的時候,通常是會使用到一些外部服務 SerpAPI 相關的付費服務。 如果你原本的服務是建置在 Google Cloud Platform 上面,有沒有想過是否有可以使用的服務呢? 本篇文章就來介紹一下,如何透過 Google Custom Search API 搜尋 Google 並且將結果總結回覆。 如何快速取的 Google Search 的網頁 以往來說,如果你是在本地端直接來呼叫,可以透過 https://www.google.com/search?q=YOUR_KEYWORD 來直接呼叫網址顯示相關的搜尋結果。 這個時候,你也可以透過一些 Crawler 來搜尋以下的結果,但是…. 但是 如果你服務放在 GCP 不能直接爬 Google 網頁 如果你服務放在 GCP 不能直接爬 Google 網頁 如果你服務放在 GCP 不能直接爬 Google 網頁 這個時候,就應該要去思考有沒有其他的方式可以解決。 Google Custom Search JSON API (相關說明網址) Google Custom Search JSON API 提供了免費提供每天 100 個搜尋查詢。如果您需要更多,請在 API 控制台中申請billing功能。額外要求的費用為每 1 千筆查詢 $5 美元,每日最多 1 萬次查詢。 接下來給大家一個範例程式碼,看要如何呼叫 Google Custom Search JSON API def search_with_google_custom_search(keywords, search_api_key, cx, num_results=10): """ 使用 Google Custom Search API 根據關鍵字進行搜尋。 :param keywords: 關鍵字列表 :param search_api_key: Google Custom Search API 的 API 金鑰 :param cx: 搜尋引擎 ID :param num_results: 要返回的搜尋結果數量,預設為 10 :return: 搜尋結果列表,每個結果包含標題、連結和摘要 """ query = " ".join(keywords) # 將關鍵字組合成搜尋查詢 url = f"https://www.googleapis.com/customsearch/v1?key={search_api_key}&cx={cx}&q={query}&num={num_results}" try: logger.info(f"Searching for: {query}") response = requests.get(url) response.raise_for_status() # 如果請求失敗,拋出異常 result_data = response.json() # Check if there are search results if "items" not in result_data: logger.warning(f"No...
繼續閱讀

[Python] 在 LangChain 中將 Gemini 換成使用 Vertex AI

前情提要 前面提供相當多透過 LangChain 來打造一個 LINE Bot 的案例。但是如果希望使用更穩定的後台,並且希望使用更多 AI 相關的功能,那麼 Vertex AI 就是就是一個很好的選擇。接下來會開始逐步介紹整個移植過程並且介紹需要介紹的地方,還有可能會出現的問題。 範例程式碼: https://github.com/kkdai/linebot-gemini-python (透過這個程式碼,可以快速部署到 GCP Cloud Run) 透過 LangChain 與 Gemini 打造 LINE Bot 到 Vertex AI 首先先給各位一個簡單的 LangChain + Gemini 打造 LINE Bot 的範例程式碼: 處理 Webhook 相關程式碼: for event in events: if not isinstance(event, MessageEvent): continue if (event.message.type == "text"): # Process text message using LangChain msg = event.message.text response = generate_text_with_langchain(f'{msg}, reply in zh-TW:') reply_msg = TextSendMessage(text=response) await line_bot_api.reply_message( event.reply_token, reply_msg ) 接下來解釋一下 generate_text_with_langchain 的內容: # Initialize LangChain with Gemini os.environ["GOOGLE_API_KEY"] = gemini_key .... def generate_text_with_langchain(prompt): """ Generate a text completion using LangChain with Gemini model. """ # Create a chat prompt template with system instructions prompt_template = ChatPromptTemplate.from_messages([ SystemMessage( content="You are a helpful assistant that responds in Traditional Chinese (zh-TW)."), HumanMessage(content=prompt) ]) # Format the prompt and call the model formatted_prompt = prompt_template.format_messages() response = text_model.invoke(formatted_prompt) return response.content 這就是部分片段的透過 LangChain 加上 Gemini 來打造 LINE Bot 的程式碼,完成程式碼。...
繼續閱讀