alanchen1115 commited on
Commit
9accbde
1 Parent(s): dfe7b69

Update main.py

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