Evaaaaa06 commited on
Commit
8b31299
·
verified ·
1 Parent(s): 7cb0eb8

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +66 -26
main.py CHANGED
@@ -3,11 +3,14 @@ import gradio as gr
3
  from fastapi.middleware.cors import CORSMiddleware
4
  from fastapi import FastAPI, Request, Header, BackgroundTasks, HTTPException, status
5
  import google.generativeai as genai
6
-
7
  from linebot import LineBotApi, WebhookHandler
8
  from linebot.exceptions import InvalidSignatureError
9
  from linebot.models import MessageEvent, TextMessage, TextSendMessage, ImageSendMessage, AudioMessage
10
 
 
 
 
11
  # 設定 Google AI API 金鑰
12
  genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
13
 
@@ -106,35 +109,72 @@ def handle_message(event):
106
  TextSendMessage(text=out))
107
 
108
  # 處理非文字訊息事件
109
- @handler.add(MessageEvent, message=ImageMessage)
110
- def handle_image_message(event):
111
  try:
112
- message_id = event.message.id
113
- image_content = line_bot_api.get_message_content(message_id)
114
- image_data = io.BytesIO(image_content.content)
115
-
116
- # 使用 Google Cloud Vision API 提取圖片文字
117
- image = vision.Image(content=image_data.getvalue())
118
- response = vision_client.text_detection(image=image)
119
- texts = response.text_annotations
120
-
121
- if texts:
122
- extracted_text = texts[0].description
123
- # 將提取的文字傳遞給 Gemini
124
- try:
125
- chat = model.start_chat(history=[{"role": "user", "parts": "你好"},{"role": "model", "parts": "早安,有什麼可以協助您"},])
126
- gemini_response = chat.send_message(f"分析圖片中的文字:{extracted_text}", generation_config=genai.GenerationConfig(temperature=0.8))
127
- line_bot_api.reply_message(event.reply_token, TextSendMessage(text=gemini_response.text))
128
- except Exception as e:
129
- print(f"Error with Gemini: {e}")
130
- line_bot_api.reply_message(event.reply_token, TextSendMessage(text="分析圖片文字時發生錯誤。"))
131
  else:
132
- line_bot_api.reply_message(event.reply_token, TextSendMessage(text="圖片中沒有文字。"))
133
-
134
  except Exception as e:
135
- print(f"Error processing image message: {e}")
136
- line_bot_api.reply_message(event.reply_token, TextSendMessage(text="處理圖片訊息時發生錯誤。"))
 
 
 
 
 
 
 
137
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
138
 
139
  if __name__ == "__main__":
140
  # 啟動 FastAPI 應用程式
 
3
  from fastapi.middleware.cors import CORSMiddleware
4
  from fastapi import FastAPI, Request, Header, BackgroundTasks, HTTPException, status
5
  import google.generativeai as genai
6
+ import openai # 導入 OpenAI 函式庫
7
  from linebot import LineBotApi, WebhookHandler
8
  from linebot.exceptions import InvalidSignatureError
9
  from linebot.models import MessageEvent, TextMessage, TextSendMessage, ImageSendMessage, AudioMessage
10
 
11
+ #設定open AI API 金鑰
12
+ OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
13
+
14
  # 設定 Google AI API 金鑰
15
  genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
16
 
 
109
  TextSendMessage(text=out))
110
 
111
  # 處理非文字訊息事件
112
+ def get_image_url(message_id):
113
+ """從 Line 取得圖片 URL。"""
114
  try:
115
+ content = line_bot_api.get_message_content(message_id)
116
+ # Line API 回傳的內容不是直接的 URL,需要進一步處理
117
+ # 這裡使用 requests 取得圖片內容並暫時儲存在記憶體中
118
+ response = requests.get(line_bot_api.config.http_client.line_endpoint + "/bot/message/" + message_id + "/content", headers=line_bot_api.config.http_client.default_headers, stream=True)
119
+ if response.status_code == 200:
120
+ return response.url
 
 
 
 
 
 
 
 
 
 
 
 
 
121
  else:
122
+ print(f"Error getting image url: {response.status_code}")
123
+ return None
124
  except Exception as e:
125
+ print(f"Error getting image content: {e}")
126
+ return None
127
+
128
+ @handler.add(MessageEvent, message=ImageMessage)
129
+ def handle_image_message(event):
130
+ image_url = get_image_url(event.message.id)
131
+ if not image_url:
132
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text="無法取得圖片。"))
133
+ return
134
 
135
+ # 回覆訊息,請使用者提問
136
+ line_bot_api.reply_message(
137
+ event.reply_token,
138
+ TextSendMessage(text="圖片已收到,請針對圖片提問。"))
139
+
140
+ # 將圖片 URL 儲存到用戶的 session 中
141
+ user_id = event.source.user_id
142
+ user_sessions[user_id] = {"image_url": image_url}
143
+
144
+ @handler.add(MessageEvent, message=TextMessage)
145
+ def handle_text_message(event):
146
+ user_id = event.source.user_id
147
+ if user_id in user_sessions and "image_url" in user_sessions[user_id]:
148
+ image_url = user_sessions[user_id]["image_url"]
149
+ user_question = event.message.text
150
+ del user_sessions[user_id]
151
+
152
+ try:
153
+ response = openai.ChatCompletion.create(
154
+ model="gpt-4-vision-preview",
155
+ messages=[
156
+ {
157
+ "role": "user",
158
+ "content": [
159
+ {"type": "text", "text": user_question},
160
+ {"type": "image_url", "image_url": {"url": image_url}},
161
+ ],
162
+ }
163
+ ],
164
+ max_tokens=300,
165
+ )
166
+ bot_reply = response.choices[0].message.content
167
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text=bot_reply))
168
+ except openai.error.OpenAIError as e:
169
+ print(f"OpenAI API error: {e}")
170
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text=f"處理您的問題時發生錯誤:{e}"))
171
+ except Exception as e:
172
+ print(f"Other error: {e}")
173
+ line_bot_api.reply_message(event.reply_token, TextSendMessage(text=f"發生未預期的錯誤:{e}"))
174
+
175
+ else:
176
+ line_bot_api.reply_message(event.reply_token,TextSendMessage(text=event.message.text))
177
+ user_sessions = {}
178
 
179
  if __name__ == "__main__":
180
  # 啟動 FastAPI 應用程式