CoolFace
Apppublic

hydedada/gemiline

sourceHugging Faceupdated 2y agoView on Hugging Face
0likes
main.py144 linesDownload Raw Back to root
1import json, os2import gradio as gr3from fastapi.middleware.cors import CORSMiddleware4from fastapi import FastAPI, Request,  Header, BackgroundTasks, HTTPException, status5import google.generativeai as genai6 7from linebot import LineBotApi, WebhookHandler8from linebot.exceptions import InvalidSignatureError9from linebot.models import MessageEvent, TextMessage, TextSendMessage, ImageSendMessage, AudioMessage10 11# 設定 Google AI API 金鑰12genai.configure(api_key=os.environ["GOOGLE_API_KEY"])13 14# 設定生成文字的參數15generation_config = genai.types.GenerationConfig(max_output_tokens=2048, temperature=0.2, top_p=0.5, top_k=16)16 17# 使用 Gemini-1.5-flash 模型18model = genai.GenerativeModel('gemini-1.5-flash')19 20# 設定 Line Bot 的 API 金鑰和秘密金鑰21line_bot_api = LineBotApi(os.environ["CHANNEL_ACCESS_TOKEN"])22line_handler = WebhookHandler(os.environ["CHANNEL_SECRET"])23 24# 設定是否正在與使用者交談25working_status = os.getenv("DEFALUT_TALKING", default = "true").lower() == "true"26 27# 建立 FastAPI 應用程式28app = FastAPI()29 30# 設定 CORS,允許跨域請求31app.add_middleware(32    CORSMiddleware,33    allow_origins=["*"],34    allow_credentials=True,35    allow_methods=["*"],36    allow_headers=["*"],37)38 39# 處理根路徑請求40@app.get("/")41def root():42    return {"title": "Line Bot"}43 44# 處理 Line Webhook 請求45@app.post("/webhook")46async def webhook(47    request: Request,48    background_tasks: BackgroundTasks,49    x_line_signature=Header(None),50):51    # 取得請求內容52    body = await request.body()53    try:54        # 將處理 Line 事件的任務加入背景工作55        background_tasks.add_task(56            line_handler.handle, body.decode("utf-8"), x_line_signature57        )58    except InvalidSignatureError:59        # 處理無效的簽章錯誤60        raise HTTPException(status_code=400, detail="Invalid signature")61    return "ok"62 63# 處理文字訊息事件64@line_handler.add(MessageEvent, message=TextMessage)65def handle_message(event):66    global working_status67    68    # 檢查事件類型和訊息類型69    if event.type != "message" or event.message.type != "text":70        # 回覆錯誤訊息71        line_bot_api.reply_message(72            event.reply_token,73            TextSendMessage(text="Event type error:[No message or the message does not contain text]")74        )75        76    # 檢查使用者是否輸入 "再見"77    elif event.message.text == "再見":78        # 回覆 "Bye!"79        line_bot_api.reply_message(80            event.reply_token,81            TextSendMessage(text="Bye!")82        )83        return84       85    # 檢查是否正在與使用者交談86    elif working_status:87        try: 88            # 取得使用者輸入的文字89            prompt = event.message.text90            # 使用 Gemini 模型生成文字91            completion = model.generate_content(prompt, generation_config=generation_config)92            # 檢查生成結果是否為空93            if (completion.parts[0].text != None):94                # 取得生成結果95                out = completion.parts[0].text96            else:97                # 回覆 "Gemini沒答案!請換個說法!"98                out = "Gemini沒答案!請換個說法!"99        except:100            # 處理錯誤101            out = "Gemini執行出錯!請換個說法!" 102  103        # 回覆生成結果104        line_bot_api.reply_message(105            event.reply_token,106            TextSendMessage(text=out))107 108if __name__ == "__main__":109    # 啟動 FastAPI 應用程式110    uvicorn.run("main:app", host="0.0.0.0", port=7860, reload=True)111 112# 註解說明:113# import 導入必要的套件114# genai.configure 設定 Google AI API 金鑰115# generation_config 設定文字生成參數116# model 設定使用的 Gemini 模型117# line_bot_api 和 line_handler 設定 Line Bot API 和 webhook 處理器118# working_status 設定是否正在與使用者交談119# app 建立 FastAPI 應用程式120# app.add_middleware 設定 CORS121# @app.get("/") 處理根路徑請求122# @app.post("/webhook") 處理 Line Webhook 請求123# @line_handler.add(MessageEvent, message=TextMessage) 處理文字訊息事件124# if __name__ == "__main__": 啟動 FastAPI 應用程式125# 程式碼功能說明:126# 程式碼首先會導入必要的套件,並設定 Google AI API 金鑰、文字生成參數、Gemini 模型以及 Line Bot API。127# 接著會建立 FastAPI 應用程式,並設定 CORS。128# 程式碼會定義兩個函數:129# root() 處理根路徑請求,返回一個簡單的 JSON 訊息。130# webhook() 處理 Line Webhook 請求,將處理 Line 事件的任務加入背景工作,並處理無效的簽章錯誤。131# 程式碼還定義一個函數 handle_message() 來處理文字訊息事件,它會檢查事件類型和訊息類型,並根據使用者輸入執行不同的動作:132# 如果使用者輸入 "再見",回覆 "Bye!"。133# 如果正在與使用者交談,則會使用 Gemini 模型生成文字,並將結果回覆給使用者。134# 最後,程式碼會啟動 FastAPI 應用程式,開始監聽 HTTP 請求。135# 程式碼運行方式:136# 將程式碼存為 main.py 文件。137# 在環境變數中設定 GOOGLE_API_KEY、CHANNEL_ACCESS_TOKEN 和 CHANNEL_SECRET。138# 執行 uvicorn main:app --host 0.0.0.0 --port 7860 --reload 命令啟動 FastAPI 應用程式。139# 使用 Line 帳戶與 Line Bot 進行對話。140# 注意:141# 程式碼中使用 os.environ["GOOGLE_API_KEY"]、os.environ["CHANNEL_ACCESS_TOKEN"] 和 os.environ["CHANNEL_SECRET"] 來存取環境變數,需要先在環境變數中設定這些值。142# 程式碼中使用 uvicorn 執行 FastAPI 應用程式,需要先安裝 uvicorn 套件。143# 程式碼中使用 google.generativeai 套件,需要先安裝 google-generativeai 套件。144# 程式碼中使用 linebot 套件,需要先安裝 linebot 套件。