Update main.py
Browse files
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 |
-
|
| 110 |
-
|
| 111 |
try:
|
| 112 |
-
|
| 113 |
-
|
| 114 |
-
|
| 115 |
-
|
| 116 |
-
|
| 117 |
-
|
| 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 |
-
|
| 133 |
-
|
| 134 |
except Exception as e:
|
| 135 |
-
print(f"Error
|
| 136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 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 應用程式
|