2025年10月12日 星期日

在 render.com 佈署 Python 網頁應用程式 (五)

前一篇測試中我們已利用架設在 render.com 的仿 GCF 函式執行平台 serverless 做為 LINE Bot 的後端回應伺服器, 順利實作了一個串接 OpenAI API 的 AI 聊天機器人. 本篇旨在測試如何建立一個串接 Gemini 的 AI 聊天機器人. 

本系列之前的測試文章參考 : 


關於 Gemini API 的用法參考 :


先摘要整理串接 Gemini 模型的程序 :

首先是匯入串接套件 google.generativeai, 在之前重新佈署 Serverless 時已將 Genmini 的 API 套件 google-generativeai 放在 requirements.txt 中, 佈署時便會自動安裝此套件, 因此在聊天機器人函式模組中可以直接匯入 :

import google.generativeai as genai

在佈署時也同時建立了環境變數檔 .env, 其中記錄了 Gemini 的金鑰 GEMINI_API_KEY, 因此在函式模組的 main() 函式中可從傳入的關鍵字參數 **kwargs 取得 config 字典, 再從 config 中取得 GEMINI_API_KEY 金鑰 :

config=kwargs.get('config', {})
gemini_api_key=config.get('GEMINI_API_KEY')  

然後呼叫 google.generativeai 套件的 configure() 函式傳入金鑰建立物件 :

genai.configure(api_key=gemini_api_key)

接下來是呼叫 GenerativeModel() 建立聊天模型物件 :

model=genai.GenerativeModel('gemini-2.5-flash')

目前 Gemini 可用的模型如下表 : 


模型名稱 描述 適合場景 穩定性
gemini-2.5-flash 快速、低延遲的輕量模型 聊天、即時回應 穩定
gemini-2.5-pro 先進推理模型,支援長上下文 複雜問題、程式碼生成 穩定
gemini-2.5-flash-lite 更輕量的 Flash 變體 行動裝置、成本敏感應用 穩定
gemini-2.0-flash 舊 2.0 版本,快速但較舊 基本任務 穩定


最後呼叫 generate_content() 方法並傳入提示詞即可取得回應物件 : 

response=model.generate_content(prompt)

回應字串放在其 text 屬性裡 :

print(response.text)

完整的串接 Gemini 之 LINE 聊天機器人程式碼如下 :

# linebot_gemini.py
from flask import abort
from linebot import LineBotApi, WebhookHandler
from linebot.exceptions import InvalidSignatureError
from linebot.models import MessageEvent, TextMessage, TextSendMessage
import os
import google.generativeai as genai

def main(request, **kwargs):
    # 取得主程式傳入的 LINE 與 Gemini 金鑰
    config=kwargs.get('config', {})
    secret=config.get('LINE_CHANNEL_SECRET')
    token=config.get('LINE_CHANNEL_ACCESS_TOKEN')
    gemini_api_key=config.get('GEMINI_API_KEY', os.getenv('GEMINI_API_KEY'))

    # 檢查必要參數
    if not secret or not token or not gemini_api_key:
        return {'error': 'Missing LINE or Gemini credentials'}

    # 初始化 LINE API 與 Webhook Handler
    line_bot_api=LineBotApi(token)
    handler=WebhookHandler(secret)

    # 設定 Gemini API 金鑰
    genai.configure(api_key=gemini_api_key)

    # 建立模型 (選用 gemini-2.0-flash 或 gemini-2.5-flash)
    model=genai.GenerativeModel('gemini-2.5-flash')

    # 註冊 LINE 訊息事件
    @handler.add(MessageEvent, message=TextMessage)
    def handle_message(event):
        user_text=event.message.text  # 使用者訊息

        try:
            # 呼叫 Gemini 生成回應
            response=model.generate_content(user_text)
            reply_text=response.text.strip() if response.text else "(無法取得回覆)"
        except Exception as e:
            reply_text=f'⚠️ 錯誤:{e}'

        # 回覆給使用者
        line_bot_api.reply_message(
            event.reply_token,
            TextSendMessage(text=reply_text)
            )

    # 驗證簽章
    signature=request.headers.get('X-Line-Signature', '')
    body=request.get_data(as_text=True)

    try:
        handler.handle(body, signature)
    except InvalidSignatureError:
        abort(400, 'Invalid signature')

    return {'status': 'ok'}

接下來到我們於 Render 架設的 serverless 平台新增一個函式模組 :





將上面的 linebot_gemini.py 程式碼貼上存檔 :




在函式列表頁上, 將滑鼠移到 linebot_gemini 模組的 "執行" 連結處, 按滑鼠右鍵點選 "複製連結網址" 即可取得此回應程式的 web hook 網址 :

# https://serverless-fdof.onrender.com/function/linebot_gemini




注意, 此網址無法直接執行, 必須經過驗證是從 LINE 伺服器發出的才會回應. 

然後登入 Line 開發者控制台將聊天機器人的 Webhook URL 改成這個網址經 Verify 成功即可, 詳細作法參考這篇 : 





最後開啟手機 LINE App, 點選 "好友名單" 或 "群組", 切換到 "官方帳號", 找到前面測試中建立 "小狐狸事務所聊天機器人" 即可開始與 Gemini 聊天 :




Gemini 真的蠻長舌的, 言無不盡只好截取前半段. 

沒有留言 :