Evaaaaa06 commited on
Commit
faf1533
·
verified ·
1 Parent(s): 54b98bd

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +71 -63
main.py CHANGED
@@ -3,14 +3,12 @@ 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
- 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, ImageMessage
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
 
@@ -98,7 +96,7 @@ def handle_message(event):
98
  out = completion.parts[0].text
99
  else:
100
  # 回覆 "Gemini沒答案!請換個說法!"
101
- out = "Gemini沒答案!請換個說法!"
102
  except:
103
  # 處理錯誤
104
  out = "Gemini執行出錯!請換個說法!"
@@ -108,73 +106,83 @@ def handle_message(event):
108
  event.reply_token,
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
- @line_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
- @line_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 應用程式
 
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
7
+ import base64
8
+ from linebot import LineBot Api, WebhookHandler
9
  from linebot.exceptions import InvalidSignatureError
10
  from linebot.models import MessageEvent, TextMessage, TextSendMessage, ImageSendMessage, AudioMessage, ImageMessage
11
 
 
 
 
12
  # 設定 Google AI API 金鑰
13
  genai.configure(api_key=os.environ["GOOGLE_API_KEY"])
14
 
 
96
  out = completion.parts[0].text
97
  else:
98
  # 回覆 "Gemini沒答案!請換個說法!"
99
+ out = "我不太懂什麼意思也~"
100
  except:
101
  # 處理錯誤
102
  out = "Gemini執行出錯!請換個說法!"
 
106
  event.reply_token,
107
  TextSendMessage(text=out))
108
 
109
+
110
+
111
+ #設定open AI API 金鑰
112
+ OPENAI_API_KEY = os.environ.get("OPENAI_API_KEY")
113
  def get_image_url(message_id):
114
+ """
115
+ 從 LINE Messaging API 獲取圖片數據並保存為本地文件
116
+ """
117
  try:
118
+ # LINE API 下載圖片
119
+ message_content = line_bot_api.get_message_content(message_id)
120
+ file_path = f"/tmp/{message_id}.png" # 儲存路徑
121
+ with open(file_path, "wb") as f:
122
+ for chunk in message_content.iter_content():
123
+ f.write(chunk)
124
+ return file_path
 
 
125
  except Exception as e:
126
+ print(f"Error downloading image: {e}")
127
  return None
128
+
129
+ def analyze_with_openai(image_path, user_text):
130
+ """
131
+ 分析用戶問題和圖片,並返回 OpenAI 的回應
132
+ """
133
+ # 讀取圖片並轉換為 Base64
134
+ with open(image_path, "rb") as image_file:
135
+ image_binary = image_file.read()
136
+ image_base64 = base64.b64encode(image_binary).decode("utf-8")
137
+
138
+ # 構建分析請求
139
+ prompt = f"""
140
+ 用戶的問題是:{user_text}
141
+ 圖片已上傳,Base64 編碼如下:
142
+ {image_base64[:100]}...(已截斷)
143
+ 請根據圖片和問題進行詳細分析。
144
+ """
145
+
146
+ # 使用 OpenAI API 請求
147
+ response = openai.ChatCompletion.create(
148
+ model="gpt-4",
149
+ messages=[
150
+ {"role": "system", "content": "請用繁體中文回答。你現在是個專業助理,職稱為OPEN小助理,個性活潑、樂觀,願意回答所有問題"},
151
+ {"role": "user", "content": prompt}
152
+ ]
153
+ )
154
+
155
+ return response["choices"][0]["message"]["content"]
156
+
157
 
158
+ @handler.add(MessageEvent, message=(TextMessage, ImageMessage))
159
  def handle_image_message(event):
160
+ # LINE API 獲取圖片數據
161
+ image_path = get_image_url(event.message.id)
162
+
163
+ if not image_path:
164
+ line_bot_api.reply_message(
165
+ event.reply_token,
166
+ TextSendMessage(text="無法取得圖片,請再試一次!")
167
+ )
168
  return
169
 
170
+ # 獲取用戶問題(文字)
171
+ user_text = event.message.text # 自行實現,根據需求追蹤用戶文字
172
+ if not user_text:
173
+ line_bot_api.reply_message(
174
+ event.reply_token,
175
+ TextSendMessage(text="幫我輸入你想詢問的問題喔~")
176
+ )
177
+ return
178
 
179
+ # 將圖片與文字結合發送到 OpenAI
180
+ response_text = analyze_with_openai(image_path, user_text)
 
181
 
182
+ # 回覆生成結果
183
+ line_bot_api.reply_message(
184
+ event.reply_token,
185
+ TextSendMessage(text=out))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
186
 
187
  if __name__ == "__main__":
188
  # 啟動 FastAPI 應用程式