from flask import Flask, request, 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 from function import retrieve_resume_info, search_jobs # 初始化 Flask app = Flask(__name__) # 設定 Line Bot API 和 WebhookHandler api = LineBotApi(os.getenv('LINE_TOKEN')) handler = WebhookHandler(os.getenv('LINE_SECRET')) # 設定 Gemini API GEMINI_API_KEY = os.getenv('GEMINI_API_KEY') genai.configure(api_key=GEMINI_API_KEY) if not GEMINI_API_KEY: raise ValueError("GEMINI_API_KEY not found. Please set the environment variable!") # 設定 function mapping functions = {"search_jobs": search_jobs, "retrieve_resume_info": retrieve_resume_info} def call_function(function_call): function_name = function_call.name function_args = function_call.args return functions[function_name](**function_args) # 根路徑測試 @app.get("/") def hello(): return 'Hello, this is Gemini AI 求職 & 履歷助手!' # Line Webhook 回調 @app.post("/") def callback(): signature = request.headers['X-Line-Signature'] body = request.get_data(as_text=True) app.logger.info("Request body: " + body) try: handler.handle(body, signature) except InvalidSignatureError: print("電子簽章錯誤, 請檢查密鑰是否正確?") abort(400) return 'OK' @handler.add(MessageEvent, message=TextMessage) def handle_message(event): user_text = event.message.text.strip() model = genai.GenerativeModel(model_name="gemini-1.5-flash", tools=functions.values()) response = model.generate_content(user_text) part = response.candidates[0].content.parts[0] if part.function_call: result = call_function(part.function_call) final_response = model.generate_content( f"使用者的問題是:「{user_text}」。\n根據 function 查詢結果,{result}。\n請根據這些資訊,給出自然且完整的回答,不要捏造。在回答前先告訴使用者你呼叫的函式名稱!" ) reply_text = final_response.text else: reply_text = part.text api.reply_message(event.reply_token, TextSendMessage(text=reply_text)) if __name__ == "__main__": app.run(host='0.0.0.0', port = 7860)