llm-project-api / app.py
yjhuang
update port
c9405fd
raw
history blame
2.38 kB
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)