hazelhh commited on
Commit
14a8337
·
verified ·
1 Parent(s): 3f78ed8

Update main.py

Browse files
Files changed (1) hide show
  1. main.py +41 -34
main.py CHANGED
@@ -23,9 +23,11 @@ user_states = defaultdict(lambda: {
23
  "upper_body_images": [],
24
  "lower_body_images": [],
25
  "current_mode": None, # "upper" or "lower"
 
26
  })
27
 
28
- MAX_IMAGES = 3
 
29
  GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-05-20:generateContent"
30
  GOOGLE_API_KEY = os.environ["GOOGLE_API_KEY"]
31
 
@@ -84,28 +86,52 @@ def get_gemini_response(prompt: str, images: list):
84
  def handle_text_message(event):
85
  user_id = event.source.user_id
86
  text = event.message.text.lower()
 
87
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  if text == "上衣":
89
  user_states[user_id]["current_mode"] = "upper"
90
  line_bot_api.reply_message(
91
- event.reply_token,
92
- TextSendMessage(text=f"請上傳三件上衣圖片,您已上傳 {len(user_states[user_id]['upper_body_images'])}/{MAX_IMAGES} 張。")
93
  )
94
  elif text == "褲子":
95
  user_states[user_id]["current_mode"] = "lower"
96
  line_bot_api.reply_message(
97
- event.reply_token,
98
- TextSendMessage(text=f"請上傳三件褲子/裙子圖片,您已上傳 {len(user_states[user_id]['lower_body_images'])}/{MAX_IMAGES} 張。")
99
  )
100
  elif text == "重置":
101
- user_states[user_id] = defaultdict(lambda: {"upper_body_images": [], "lower_body_images": [], "current_mode": None})[user_id]
102
  line_bot_api.reply_message(
103
- event.reply_token,
104
  TextSendMessage(text="狀態已重置。請傳送「上衣」或「褲子」來開始上傳。")
105
  )
106
  else:
107
  line_bot_api.reply_message(
108
- event.reply_token,
109
  TextSendMessage(text="請先傳送「上衣」或「褲子」來選擇要上傳的衣服類型。")
110
  )
111
 
@@ -128,7 +154,7 @@ def handle_image_message(event):
128
  base64_img = get_base64_image(image_id)
129
 
130
  if mode == "upper":
131
- if len(user_states[user_id]["upper_body_images"]) < MAX_IMAGES:
132
  user_states[user_id]["upper_body_images"].append(base64_img)
133
  else:
134
  line_bot_api.reply_message(
@@ -137,7 +163,7 @@ def handle_image_message(event):
137
  )
138
  return
139
  else: # mode == "lower"
140
- if len(user_states[user_id]["lower_body_images"]) < MAX_IMAGES:
141
  user_states[user_id]["lower_body_images"].append(base64_img)
142
  else:
143
  line_bot_api.reply_message(
@@ -149,38 +175,19 @@ def handle_image_message(event):
149
  upper_count = len(user_states[user_id]["upper_body_images"])
150
  lower_count = len(user_states[user_id]["lower_body_images"])
151
 
152
- if upper_count < MAX_IMAGES or lower_count < MAX_IMAGES:
153
  line_bot_api.reply_message(
154
  reply_token,
155
- TextSendMessage(text=f"已接收。上衣: {upper_count}/{MAX_IMAGES},褲子/裙子: {lower_count}/{MAX_IMAGES}。")
156
  )
157
  else:
 
 
158
  line_bot_api.reply_message(
159
  reply_token,
160
- TextSendMessage(text="已收到所有圖片,正在為您分析並產生穿搭建議... 請稍候。")
161
  )
162
 
163
- all_images = user_states[user_id]["upper_body_images"] + user_states[user_id]["lower_body_images"]
164
-
165
- prompt = (
166
- f"我提供了 {MAX_IMAGES} 張上衣圖片和 {MAX_IMAGES} 張下半身圖片(共 {MAX_IMAGES*2} 張)。"
167
- "請根據這些衣服,為我推薦三種不同場合的穿搭建議,並盡可能將不同的上衣和下衣進行搭配。"
168
- "請考慮以下場合:1. 約會,2. 結婚典禮,3. 工作。\n\n"
169
- "對於每種場合,請提供一個簡短的段落說明,解釋為何這個搭配適合該場合,並詳細描述你推薦的上衣與下衣組合。請以繁體中文回答。"
170
- )
171
-
172
- response_text = get_gemini_response(prompt, all_images)
173
-
174
- line_bot_api.push_message(
175
- user_id,
176
- TextSendMessage(text=response_text)
177
- )
178
-
179
- # 重置狀態以便下一次使用
180
- user_states[user_id]["upper_body_images"] = []
181
- user_states[user_id]["lower_body_images"] = []
182
- user_states[user_id]["current_mode"] = None
183
-
184
  except Exception as e:
185
  line_bot_api.reply_message(
186
  reply_token,
 
23
  "upper_body_images": [],
24
  "lower_body_images": [],
25
  "current_mode": None, # "upper" or "lower"
26
+ "is_ready": False # 新增狀態,標記圖片是否收集完畢
27
  })
28
 
29
+ MAX_IMAGES_PER_TYPE = 3
30
+ MAX_TOTAL_IMAGES = MAX_IMAGES_PER_TYPE * 2
31
  GEMINI_API_URL = "https://generativelanguage.googleapis.com/v1beta/models/gemini-2.5-flash-preview-05-20:generateContent"
32
  GOOGLE_API_KEY = os.environ["GOOGLE_API_KEY"]
33
 
 
86
  def handle_text_message(event):
87
  user_id = event.source.user_id
88
  text = event.message.text.lower()
89
+ reply_token = event.reply_token
90
 
91
+ # 檢查是否已準備好處理場合選擇
92
+ if user_states[user_id]["is_ready"]:
93
+ prompt = (
94
+ f"我提供了三件上衣圖片和三件下半身圖片。請根據這些衣服,為我推薦一個適合「{text}」的穿搭建議,並詳細描述你推薦的上衣與下衣組合。請以繁體中文回答。"
95
+ )
96
+
97
+ all_images = user_states[user_id]["upper_body_images"] + user_states[user_id]["lower_body_images"]
98
+
99
+ line_bot_api.reply_message(
100
+ reply_token,
101
+ TextSendMessage(text=f"正在為您生成適合「{text}」的穿搭建議... 請稍候。")
102
+ )
103
+
104
+ response_text = get_gemini_response(prompt, all_images)
105
+
106
+ line_bot_api.push_message(
107
+ user_id,
108
+ TextSendMessage(text=response_text)
109
+ )
110
+ # 重置狀態以便下一次使用
111
+ user_states[user_id] = defaultdict(lambda: {"upper_body_images": [], "lower_body_images": [], "current_mode": None, "is_ready": False})[user_id]
112
+ return
113
+
114
  if text == "上衣":
115
  user_states[user_id]["current_mode"] = "upper"
116
  line_bot_api.reply_message(
117
+ reply_token,
118
+ TextSendMessage(text=f"請上傳三件上衣圖片,您已上傳 {len(user_states[user_id]['upper_body_images'])}/{MAX_IMAGES_PER_TYPE} 張。")
119
  )
120
  elif text == "褲子":
121
  user_states[user_id]["current_mode"] = "lower"
122
  line_bot_api.reply_message(
123
+ reply_token,
124
+ TextSendMessage(text=f"請上傳三件褲子/裙子圖片,您已上傳 {len(user_states[user_id]['lower_body_images'])}/{MAX_IMAGES_PER_TYPE} 張。")
125
  )
126
  elif text == "重置":
127
+ user_states[user_id] = defaultdict(lambda: {"upper_body_images": [], "lower_body_images": [], "current_mode": None, "is_ready": False})[user_id]
128
  line_bot_api.reply_message(
129
+ reply_token,
130
  TextSendMessage(text="狀態已重置。請傳送「上衣」或「褲子」來開始上傳。")
131
  )
132
  else:
133
  line_bot_api.reply_message(
134
+ reply_token,
135
  TextSendMessage(text="請先傳送「上衣」或「褲子」來選擇要上傳的衣服類型。")
136
  )
137
 
 
154
  base64_img = get_base64_image(image_id)
155
 
156
  if mode == "upper":
157
+ if len(user_states[user_id]["upper_body_images"]) < MAX_IMAGES_PER_TYPE:
158
  user_states[user_id]["upper_body_images"].append(base64_img)
159
  else:
160
  line_bot_api.reply_message(
 
163
  )
164
  return
165
  else: # mode == "lower"
166
+ if len(user_states[user_id]["lower_body_images"]) < MAX_IMAGES_PER_TYPE:
167
  user_states[user_id]["lower_body_images"].append(base64_img)
168
  else:
169
  line_bot_api.reply_message(
 
175
  upper_count = len(user_states[user_id]["upper_body_images"])
176
  lower_count = len(user_states[user_id]["lower_body_images"])
177
 
178
+ if upper_count < MAX_IMAGES_PER_TYPE or lower_count < MAX_IMAGES_PER_TYPE:
179
  line_bot_api.reply_message(
180
  reply_token,
181
+ TextSendMessage(text=f"已接收。上衣: {upper_count}/{MAX_IMAGES_PER_TYPE},褲子/裙子: {lower_count}/{MAX_IMAGES_PER_TYPE}。")
182
  )
183
  else:
184
+ # 所有圖片已收集完畢,改變狀態並提示使用者選擇場合
185
+ user_states[user_id]["is_ready"] = True
186
  line_bot_api.reply_message(
187
  reply_token,
188
+ TextSendMessage(text="已收到所有圖片!請告訴我您想參加什麼樣的場合?例如:約會、工作、結婚典禮。")
189
  )
190
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
191
  except Exception as e:
192
  line_bot_api.reply_message(
193
  reply_token,