aiqcamp commited on
Commit
b15e361
ยท
verified ยท
1 Parent(s): 83757ca

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +170 -28
app.py CHANGED
@@ -42,6 +42,7 @@ def choose_alternative(transformation):
42
  else:
43
  return random.choice([left, right])
44
 
 
45
  # ์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด๋ฅผ ์œ„ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ (๊ธฐ์กด '๋ฌผ๋ฆฌ์  ๋ณ€ํ™”' ์‚ฌ์ „ ์œ ์ง€)
46
  physical_transformation_categories = {
47
  "๊ณต๊ฐ„ ์ด๋™": [
@@ -184,6 +185,118 @@ physical_transformation_categories = {
184
  ]
185
  }
186
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
187
  ##############################################################################
188
  # Gemini API ํ˜ธ์ถœ ํ•จ์ˆ˜ (์˜ˆ: gemini-2.0-flash-thinking-exp-01-21 -> ๋‹ค๋ฅธ ๋ชจ๋ธ ์‚ฌ์šฉ ์‹œ ์ˆ˜์ •)
189
  ##############################################################################
@@ -281,16 +394,31 @@ def generate_three_objects_interaction(obj1, obj2, obj3):
281
  ##############################################################################
282
  # ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ์„ค๋ช…์„ LLM์„ ํ†ตํ•ด ํ™•์žฅ
283
  ##############################################################################
284
- def enhance_descriptions(results, objects):
285
  obj_name = " ๋ฐ ".join([obj for obj in objects if obj])
286
- for category, result in results.items():
 
 
 
 
 
 
 
287
  result["enhanced"] = enhance_with_llm(result["base"], obj_name, category)
 
 
 
 
 
288
  return results
289
 
290
  ##############################################################################
291
  # ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์ตœ๋Œ€ 3๊ฐœ ํ‚ค์›Œ๋“œ)์— ๋”ฐ๋ผ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ
292
  ##############################################################################
293
- def generate_transformations(text1, text2=None, text3=None):
 
 
 
294
  if text2 and text3:
295
  results = generate_three_objects_interaction(text1, text2, text3)
296
  objects = [text1, text2, text3]
@@ -300,7 +428,11 @@ def generate_transformations(text1, text2=None, text3=None):
300
  else:
301
  results = generate_single_object_transformations(text1)
302
  objects = [text1]
303
- return enhance_descriptions(results, objects)
 
 
 
 
304
 
305
  ##############################################################################
306
  # ๊ฒฐ๊ณผ ํฌ๋งทํŒ…
@@ -314,29 +446,33 @@ def format_results(results):
314
  ##############################################################################
315
  # Gradio UI์—์„œ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜
316
  ##############################################################################
317
- def process_inputs(text1, text2, text3):
318
- messages = []
319
- messages.append("์ž…๋ ฅ๊ฐ’ ํ™•์ธ ์ค‘...")
320
- time.sleep(0.3)
321
  text1 = text1.strip() if text1 else None
322
  text2 = text2.strip() if text2 else None
323
  text3 = text3.strip() if text3 else None
 
324
  if not text1:
325
- messages.append("์˜ค๋ฅ˜: ์ตœ์†Œ ํ•˜๋‚˜์˜ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.")
326
- return "\n\n".join(messages)
327
 
328
- messages.append("์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ ์ค‘...")
329
- time.sleep(0.3)
330
- results = generate_transformations(text1, text2, text3)
331
 
332
- messages.append("๊ฒฐ๊ณผ ํฌ๋งทํŒ… ์ค‘...")
333
- time.sleep(0.3)
334
- formatted = format_results(results)
 
 
 
 
 
335
 
336
- messages.append("์™„๋ฃŒ!")
337
- messages.append(formatted)
338
 
339
- return "\n\n".join(messages)
 
 
 
 
340
 
341
  ##############################################################################
342
  # API ํ‚ค ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€
@@ -361,6 +497,7 @@ with gr.Blocks(title="ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ๊ธฐ",
361
  h2 { color: #555; }
362
  .output { background-color: #ffffff; padding: 15px; border-radius: 8px; }
363
  .gr-button { background-color: #4CAF50; color: white; border: none; border-radius: 4px; padding: 8px 16px; }
 
364
  </style>
365
  """)
366
 
@@ -375,12 +512,15 @@ with gr.Blocks(title="ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ๊ธฐ",
375
  text_input1 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 1 (ํ•„์ˆ˜)", placeholder="์˜ˆ: ์Šค๋งˆํŠธํฐ")
376
  text_input2 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 2 (์„ ํƒ)", placeholder="์˜ˆ: ์ธ๊ณต์ง€๋Šฅ")
377
  text_input3 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 3 (์„ ํƒ)", placeholder="์˜ˆ: ํ—ฌ์Šค์ผ€์–ด")
378
- submit_button = gr.Button("์•„์ด๋””์–ด ์ƒ์„ฑํ•˜๊ธฐ")
 
 
 
 
379
 
380
- # ์šฐ์ธก ์ถœ๋ ฅ ์˜์—ญ (ํƒญ์€ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ)
381
  with gr.Column(scale=2):
382
- with gr.TabItem("์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด", id="creative_tab"):
383
- idea_output = gr.Markdown(label="์•„์ด๋””์–ด ๊ฒฐ๊ณผ")
384
 
385
  # ์˜ˆ์‹œ ์ž…๋ ฅ
386
  gr.Examples(
@@ -393,10 +533,12 @@ with gr.Blocks(title="ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ๊ธฐ",
393
  inputs=[text_input1, text_input2, text_input3],
394
  )
395
 
396
- # ๋ฒ„ํŠผ ์ด๋ฒคํŠธ: ์ฒซ ๋ฒˆ์งธ ํƒญ์—๋งŒ ์—ฐ๊ฒฐ
397
- submit_button.click(fn=process_inputs,
398
- inputs=[text_input1, text_input2, text_input3],
399
- outputs=idea_output)
 
 
400
 
401
  if __name__ == "__main__":
402
- demo.launch(debug=True)
 
42
  else:
43
  return random.choice([left, right])
44
 
45
+
46
  # ์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด๋ฅผ ์œ„ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ (๊ธฐ์กด '๋ฌผ๋ฆฌ์  ๋ณ€ํ™”' ์‚ฌ์ „ ์œ ์ง€)
47
  physical_transformation_categories = {
48
  "๊ณต๊ฐ„ ์ด๋™": [
 
185
  ]
186
  }
187
 
188
+ import os
189
+ import gradio as gr
190
+ import random
191
+ import time
192
+ import logging
193
+ import google.generativeai as genai
194
+
195
+ # ๋กœ๊น… ์„ค์ •
196
+ logging.basicConfig(
197
+ level=logging.INFO,
198
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
199
+ handlers=[
200
+ logging.FileHandler("api_debug.log"),
201
+ logging.StreamHandler()
202
+ ]
203
+ )
204
+ logger = logging.getLogger("idea_generator")
205
+
206
+ # Gemini API ํ‚ค๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ GEMINI_API_KEY์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
207
+ GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
208
+ genai.configure(api_key=GEMINI_API_KEY)
209
+
210
+ # ์Šฌ๋ž˜์‹œ("/")๊ฐ€ ํฌํ•จ๋œ ๋ณ€ํ™˜ ๋ฌธ์ž์—ด์—์„œ ๋‘ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒํ•˜๋Š” ํ—ฌํผ ํ•จ์ˆ˜
211
+ def choose_alternative(transformation):
212
+ if "/" not in transformation:
213
+ return transformation
214
+ parts = transformation.split("/")
215
+ if len(parts) != 2:
216
+ return random.choice([part.strip() for part in parts])
217
+ left = parts[0].strip()
218
+ right = parts[1].strip()
219
+ if " " in left:
220
+ tokens = left.split(" ", 1)
221
+ prefix = tokens[0]
222
+ if not right.startswith(prefix):
223
+ option1 = left
224
+ option2 = prefix + " " + right
225
+ else:
226
+ option1 = left
227
+ option2 = right
228
+ return random.choice([option1, option2])
229
+ else:
230
+ return random.choice([left, right])
231
+
232
+ # ์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด๋ฅผ ์œ„ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ (๊ธฐ์กด '๋ฌผ๋ฆฌ์  ๋ณ€ํ™”' ์‚ฌ์ „ ์œ ์ง€)
233
+ physical_transformation_categories = {
234
+ "๊ณต๊ฐ„ ์ด๋™": [
235
+ "์•ž/๋’ค ์ด๋™", "์ขŒ/์šฐ ์ด๋™", "์œ„/์•„๋ž˜ ์ด๋™", "์„ธ๋กœ์ถ• ํšŒ์ „(๊ณ ๊ฐœ ๋„๋•์ž„)",
236
+ "๊ฐ€๋กœ์ถ• ํšŒ์ „(๊ณ ๊ฐœ ์ “๊ธฐ)", "๊ธธ์ด์ถ• ํšŒ์ „(์˜†์œผ๋กœ ๊ธฐ์šธ์ž„)", "์› ์šด๋™", "๋‚˜์„ ํ˜• ์ด๋™",
237
+ "๊ด€์„ฑ์— ์˜ํ•œ ๋ฏธ๋„๋Ÿฌ์ง", "ํšŒ์ „์ถ• ๋ณ€ํ™”", "๋ถˆ๊ทœ์น™ ํšŒ์ „", "ํ”๋“ค๋ฆผ ์šด๋™", "ํฌ๋ฌผ์„  ์ด๋™",
238
+ "๋ฌด์ค‘๋ ฅ ๋ถ€์œ ", "์ˆ˜๋ฉด ์œ„ ๋ถ€์œ ", "์ ํ”„/๋„์•ฝ", "์Šฌ๋ผ์ด๋”ฉ", "๋กค๋ง", "์ž์œ  ๋‚™ํ•˜",
239
+ "์™•๋ณต ์šด๋™", "ํƒ„์„ฑ ํŠ•๊น€", "๊ด€ํ†ต", "ํšŒํ”ผ ์›€์ง์ž„", "์ง€๊ทธ์žฌ๊ทธ ์ด๋™", "์Šค์œ™ ์šด๋™"
240
+ ],
241
+
242
+ # [๊ธฐ์กด ์นดํ…Œ๊ณ ๋ฆฌ๋“ค ์œ ์ง€]
243
+ # ... ๋‹ค๋ฅธ ๋ชจ๋“  ์นดํ…Œ๊ณ ๋ฆฌ๋“ค์€ ์›๋ž˜ ์ฝ”๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ ...
244
+
245
+ "ํฌ๊ธฐ์™€ ํ˜•ํƒœ ๋ณ€ํ™”": [
246
+ "๋ถ€ํ”ผ ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๊ธธ์ด ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๋„ˆ๋น„ ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๋†’์ด ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ",
247
+ "๋ฐ€๋„ ๋ณ€ํ™”", "๋ฌด๊ฒŒ ์ฆ๊ฐ€/๊ฐ์†Œ", "๋ชจ์–‘ ๋ณ€ํ˜•", "์ƒํƒœ ๋ณ€ํ™”", "๋ถˆ๊ท ๋“ฑ ๋ณ€ํ˜•",
248
+ "๋ณต์žกํ•œ ํ˜•ํƒœ ๋ณ€ํ˜•", "๋น„ํ‹€๋ฆผ/๊ผฌ์ž„", "๋ถˆ๊ท ์ผํ•œ ํ™•์žฅ/์ถ•์†Œ", "๋ชจ์„œ๋ฆฌ ๋‘ฅ๊ธ€๊ฒŒ/๋‚ ์นด๋กญ๊ฒŒ",
249
+ "๊นจ์ง/๊ฐˆ๋ผ์ง", "์—ฌ๋Ÿฌ ์กฐ๊ฐ ๋‚˜๋ˆ ์ง", "๋ฌผ ์ €ํ•ญ", "๋จผ์ง€ ์ €ํ•ญ", "์ฐŒ๊ทธ๋Ÿฌ์ง/๋ณต์›",
250
+ "์ ‘ํž˜/ํŽผ์ณ์ง", "์••์ฐฉ/ํŒฝ์ฐฝ", "๋Š˜์–ด๋‚จ/์ˆ˜์ถ•", "๊ตฌ๊ฒจ์ง/ํ‰ํ‰ํ•ด์ง", "๋ญ‰๊ฐœ์ง/๋‹จ๋‹จํ•ด์ง",
251
+ "๋ง๋ฆผ/ํŽด์ง", "๊บพ์ž„/๊ตฌ๋ถ€๋Ÿฌ์ง"
252
+ ],
253
+
254
+ "ํ‘œ๋ฉด ๋ฐ ์™ธ๊ด€ ๋ณ€ํ™”": [
255
+ "์ƒ‰์ƒ ๋ณ€ํ™”", "์งˆ๊ฐ ๋ณ€ํ™”", "ํˆฌ๋ช…/๋ถˆํˆฌ๋ช… ๋ณ€ํ™”", "๋ฐ˜์ง์ž„/๋ฌด๊ด‘ ๋ณ€ํ™”",
256
+ "๋น› ๋ฐ˜์‚ฌ ์ •๋„ ๋ณ€ํ™”", "๋ฌด๋Šฌ ๋ณ€ํ™”", "๊ฐ๋„์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋ณ€ํ™”", "๋น›์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋ณ€ํ™”",
257
+ "์˜จ๋„์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋ณ€ํ™”", "ํ™€๋กœ๊ทธ๋žจ ํšจ๊ณผ", "ํ‘œ๋ฉด ๊ฐ๋„๋ณ„ ๋น› ๋ฐ˜์‚ฌ", "ํ‘œ๋ฉด ๋ชจ์–‘ ๋ณ€ํ˜•",
258
+ "์ดˆ๋ฏธ์„ธ ํ‘œ๋ฉด ๊ตฌ์กฐ ๋ณ€ํ™”", "์ž๊ฐ€ ์„ธ์ • ํšจ๊ณผ", "์–ผ๋ฃฉ/ํŒจํ„ด ์ƒ์„ฑ", "ํ๋ฆผ/์„ ๋ช…ํ•จ ๋ณ€ํ™”",
259
+ "๊ด‘ํƒ/์œค๊ธฐ ๋ณ€ํ™”", "์ƒ‰์กฐ/์ฑ„๋„ ๋ณ€ํ™”", "๋ฐœ๊ด‘/ํ˜•๊ด‘", "๋น› ์‚ฐ๋ž€ ํšจ๊ณผ",
260
+ "๋น› ํก์ˆ˜ ๋ณ€ํ™”", "๋ฐ˜ํˆฌ๋ช… ํšจ๊ณผ", "๊ทธ๋ฆผ์ž ํšจ๊ณผ ๋ณ€ํ™”", "์ž์™ธ์„  ๋ฐ˜์‘ ๋ณ€ํ™”",
261
+ "์•ผ๊ด‘ ํšจ๊ณผ"
262
+ ],
263
+
264
+ "๋ฌผ์งˆ์˜ ์ƒํƒœ ๋ณ€ํ™”": [
265
+ "๊ณ ์ฒด/์•ก์ฒด/๊ธฐ์ฒด ์ „ํ™˜", "๊ฒฐ์ •ํ™”/์šฉํ•ด", "์‚ฐํ™”/๋ถ€์‹", "๋”ฑ๋”ฑํ•ด์ง/๋ถ€๋“œ๋Ÿฌ์›Œ์ง",
266
+ "ํŠน์ˆ˜ ์ƒํƒœ ์ „ํ™˜", "๋ฌด์ •ํ˜•/๊ฒฐ์ •ํ˜• ์ „ํ™˜", "์„ฑ๋ถ„ ๋ถ„๋ฆฌ", "๋ฏธ์„ธ ์ž…์ž ํ˜•์„ฑ/๋ถ„ํ•ด",
267
+ "์ ค ํ˜•์„ฑ/ํ’€์–ด์ง", "์ค€์•ˆ์ • ์ƒํƒœ ๋ณ€ํ™”", "๋ถ„์ž ์ž๊ฐ€ ์ •๋ ฌ/๋ถ„ํ•ด", "์ƒํƒœ๋ณ€ํ™” ์ง€์—ฐ ํ˜„์ƒ",
268
+ "๋…น์Œ", "๊ตณ์Œ", "์ฆ๋ฐœ/์‘์ถ•", "์Šนํ™”/์ฆ์ฐฉ", "์นจ์ „/๋ถ€์œ ", "๋ถ„์‚ฐ/์‘์ง‘",
269
+ "๊ฑด์กฐ/์Šต์œค", "ํŒฝ์œค/์ˆ˜์ถ•", "๋™๊ฒฐ/ํ•ด๋™", "ํ’ํ™”/์นจ์‹", "์ถฉ์ „/๋ฐฉ์ „",
270
+ "๊ฒฐํ•ฉ/๋ถ„๋ฆฌ", "๋ฐœํšจ/๋ถ€ํŒจ"
271
+ ],
272
+
273
+ "์—ด ๊ด€๋ จ ๋ณ€ํ™”": [
274
+ "์˜จ๋„ ์ƒ์Šน/ํ•˜๊ฐ•", "์—ด์— ์˜ํ•œ ํŒฝ์ฐฝ/์ˆ˜์ถ•", "์—ด ์ „๋‹ฌ/์ฐจ๋‹จ", "์••๋ ฅ ์ƒ์Šน/ํ•˜๊ฐ•",
275
+ "์—ด ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์žํ™”", "๋ฌด์งˆ์„œ๋„ ๋ณ€ํ™”", "์—ด์ „๊ธฐ ํ˜„์ƒ", "์ž๊ธฐ์žฅ์— ์˜ํ•œ ์—ด ๋ณ€ํ™”",
276
+ "์ƒํƒœ๋ณ€ํ™” ์ค‘ ์—ด ์ €์žฅ/๋ฐฉ์ถœ", "์—ด ์ŠคํŠธ๋ ˆ์Šค ๋ฐœ์ƒ/ํ•ด์†Œ", "๊ธ‰๊ฒฉํ•œ ์˜จ๋„ ๋ณ€ํ™” ์˜ํ–ฅ",
277
+ "๋ณต์‚ฌ์—ด์— ์˜ํ•œ ๋ƒ‰๊ฐ/๊ฐ€์—ด", "๋ฐœ์—ด/ํก์—ด", "์—ด ๋ถ„ํฌ ๋ณ€ํ™”", "์—ด ๋ฐ˜๏ฟฝ๏ฟฝ๏ฟฝ/ํก์ˆ˜",
278
+ "๋ƒ‰๊ฐ ์‘์ถ•", "์—ด ํ™œ์„ฑํ™”", "์—ด ๋ณ€์ƒ‰", "์—ด ํŒฝ์ฐฝ ๊ณ„์ˆ˜ ๋ณ€ํ™”", "์—ด ์•ˆ์ •์„ฑ ๋ณ€ํ™”",
279
+ "๋‚ด์—ด์„ฑ/๋‚ดํ•œ์„ฑ", "์ž๊ธฐ๋ฐœ์—ด", "์—ด์  ํ‰ํ˜•/๋ถˆ๊ท ํ˜•", "์—ด์  ๋ณ€ํ˜•", "์—ด ๋ถ„์‚ฐ/์ง‘์ค‘"
280
+ ],
281
+
282
+ "์›€์ง์ž„ ํŠน์„ฑ ๋ณ€ํ™”": [
283
+ "๊ฐ€์†/๊ฐ์†", "์ผ์ •
284
+ # ์ถ•์•ฝ๋œ ๋ถ€๋ถ„, ์‹ค์ œ ์ฝ”๋“œ์—์„œ๋Š” ๋ชจ๋“  ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
285
+ # ๋‹ค๋ฅธ ๋ชจ๋“  ์นดํ…Œ๊ณ ๋ฆฌ๋“ค์€ ์›๋ž˜ ์ฝ”๋“œ์™€ ๋™์ผํ•˜๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค
286
+ "์„ผ์„œ ๊ธฐ๋Šฅ": [
287
+ "์‹œ๊ฐ ์„ผ์„œ/๊ฐ์ง€", "์ฒญ๊ฐ ์„ผ์„œ/๊ฐ์ง€", "์ด‰๊ฐ ์„ผ์„œ/๊ฐ์ง€", "๋ฏธ๊ฐ ์„ผ์„œ/๊ฐ์ง€", "ํ›„๊ฐ ์„ผ์„œ/๊ฐ์ง€",
288
+ "์˜จ๋„ ์„ผ์„œ/๊ฐ์ง€", "์Šต๋„ ์„ผ์„œ/๊ฐ์ง€", "์••๋ ฅ ์„ผ์„œ/๊ฐ์ง€", "๊ฐ€์†๋„ ์„ผ์„œ/๊ฐ์ง€", "ํšŒ์ „ ์„ผ์„œ/๊ฐ์ง€",
289
+ "๊ทผ์ ‘ ์„ผ์„œ/๊ฐ์ง€", "์œ„์น˜ ์„ผ์„œ/๊ฐ์ง€", "์šด๋™ ์„ผ์„œ/๊ฐ์ง€", "๊ฐ€์Šค ์„ผ์„œ/๊ฐ์ง€", "์ ์™ธ์„  ์„ผ์„œ/๊ฐ์ง€",
290
+ "์ž์™ธ์„  ์„ผ์„œ/๊ฐ์ง€", "๋ฐฉ์‚ฌ์„  ์„ผ์„œ/๊ฐ์ง€", "์ž๊ธฐ์žฅ ์„ผ์„œ/๊ฐ์ง€", "์ „๊ธฐ์žฅ ์„ผ์„œ/๊ฐ์ง€", "ํ™”ํ•™๋ฌผ์งˆ ์„ผ์„œ/๊ฐ์ง€",
291
+ "์ƒ์ฒด์‹ ํ˜ธ ์„ผ์„œ/๊ฐ์ง€", "์ง„๋™ ์„ผ์„œ/๊ฐ์ง€", "์†Œ์Œ ์„ผ์„œ/๊ฐ์ง€", "๋น› ์„ธ๊ธฐ ์„ผ์„œ/๊ฐ์ง€", "๋น› ํŒŒ์žฅ ์„ผ์„œ/๊ฐ์ง€",
292
+ "๊ธฐ์šธ๊ธฐ ์„ผ์„œ/๊ฐ์ง€", "pH ์„ผ์„œ/๊ฐ์ง€", "์ „๋ฅ˜ ์„ผ์„œ/๊ฐ์ง€", "์ „์•• ์„ผ์„œ/๊ฐ์ง€", "์ด๋ฏธ์ง€ ์„ผ์„œ/๊ฐ์ง€",
293
+ "๊ฑฐ๋ฆฌ ์„ผ์„œ/๊ฐ์ง€", "๊นŠ์ด ์„ผ์„œ/๊ฐ์ง€", "์ค‘๋ ฅ ์„ผ์„œ/๊ฐ์ง€", "์†๋„ ์„ผ์„œ/๊ฐ์ง€", "ํ๋ฆ„ ์„ผ์„œ/๊ฐ์ง€",
294
+ "์ˆ˜์œ„ ์„ผ์„œ/๊ฐ์ง€", "ํƒ๋„ ์„ผ์„œ/๊ฐ์ง€", "์—ผ๋„ ์„ผ์„œ/๊ฐ์ง€", "๊ธˆ์† ๊ฐ์ง€", "์••์ „ ์„ผ์„œ/๊ฐ์ง€",
295
+ "๊ด‘์ „ ์„ผ์„œ/๊ฐ์ง€", "์—ด์ „๋Œ€ ์„ผ์„œ/๊ฐ์ง€", "ํ™€ ํšจ๊ณผ ์„ผ์„œ/๊ฐ์ง€", "์ดˆ์ŒํŒŒ ์„ผ์„œ/๊ฐ์ง€", "๋ ˆ์ด๋” ์„ผ์„œ/๊ฐ์ง€",
296
+ "๋ผ์ด๋‹ค ์„ผ์„œ/๊ฐ์ง€", "ํ„ฐ์น˜ ์„ผ์„œ/๊ฐ์ง€", "์ œ์Šค์ฒ˜ ์„ผ์„œ/๊ฐ์ง€", "์‹ฌ๋ฐ• ์„ผ์„œ/๊ฐ์ง€", "ํ˜ˆ์•• ์„ผ์„œ/๊ฐ์ง€"
297
+ ]
298
+ }
299
+
300
  ##############################################################################
301
  # Gemini API ํ˜ธ์ถœ ํ•จ์ˆ˜ (์˜ˆ: gemini-2.0-flash-thinking-exp-01-21 -> ๋‹ค๋ฅธ ๋ชจ๋ธ ์‚ฌ์šฉ ์‹œ ์ˆ˜์ •)
302
  ##############################################################################
 
394
  ##############################################################################
395
  # ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ์„ค๋ช…์„ LLM์„ ํ†ตํ•ด ํ™•์žฅ
396
  ##############################################################################
397
+ def enhance_descriptions(results, objects, progress=None):
398
  obj_name = " ๋ฐ ".join([obj for obj in objects if obj])
399
+ total_categories = len(results)
400
+
401
+ for i, (category, result) in enumerate(results.items()):
402
+ # ํ”„๋กœ๊ทธ๋ ˆ์Šค ์—…๋ฐ์ดํŠธ (์ง„ํ–‰๋ฅ ์„ 0.2~0.9 ์‚ฌ์ด๋กœ ๋งคํ•‘)
403
+ if progress:
404
+ progress_value = 0.2 + (i / total_categories) * 0.7
405
+ progress(progress_value, f"์นดํ…Œ๊ณ ๋ฆฌ '{category}' ์ฒ˜๋ฆฌ ์ค‘...")
406
+
407
  result["enhanced"] = enhance_with_llm(result["base"], obj_name, category)
408
+
409
+ # ์™„๋ฃŒ ๋ฉ”์‹œ์ง€
410
+ if progress:
411
+ progress(0.95, "๊ฒฐ๊ณผ ์ •๋ฆฌ ์ค‘...")
412
+
413
  return results
414
 
415
  ##############################################################################
416
  # ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์ตœ๋Œ€ 3๊ฐœ ํ‚ค์›Œ๋“œ)์— ๋”ฐ๋ผ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ
417
  ##############################################################################
418
+ def generate_transformations(text1, text2=None, text3=None, progress=None):
419
+ if progress:
420
+ progress(0.1, "์•„์ด๋””์–ด ๊ธฐ๋ณธ ๊ตฌ์กฐ ์ƒ์„ฑ ์ค‘...")
421
+
422
  if text2 and text3:
423
  results = generate_three_objects_interaction(text1, text2, text3)
424
  objects = [text1, text2, text3]
 
428
  else:
429
  results = generate_single_object_transformations(text1)
430
  objects = [text1]
431
+
432
+ if progress:
433
+ progress(0.2, "Gemini API๋ฅผ ํ†ตํ•œ ์•„์ด๋””์–ด ํ™•์žฅ ์ค‘...")
434
+
435
+ return enhance_descriptions(results, objects, progress)
436
 
437
  ##############################################################################
438
  # ๊ฒฐ๊ณผ ํฌ๋งทํŒ…
 
446
  ##############################################################################
447
  # Gradio UI์—์„œ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜
448
  ##############################################################################
449
+ def process_inputs(text1, text2, text3, progress=gr.Progress()):
 
 
 
450
  text1 = text1.strip() if text1 else None
451
  text2 = text2.strip() if text2 else None
452
  text3 = text3.strip() if text3 else None
453
+
454
  if not text1:
455
+ return "์˜ค๋ฅ˜: ์ตœ์†Œ ํ•˜๋‚˜์˜ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
 
456
 
457
+ progress(0.05, "์•„์ด๋””์–ด ์ƒ์„ฑ ์ค€๋น„ ์ค‘...")
 
 
458
 
459
+ # ํ‚ค์›Œ๋“œ ์ •๋ณด ํ™•์ธ
460
+ keyword_info = f"ํ‚ค์›Œ๋“œ: {text1}"
461
+ if text2:
462
+ keyword_info += f", {text2}"
463
+ if text3:
464
+ keyword_info += f", {text3}"
465
+
466
+ progress(0.1, "์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ ์‹œ์ž‘...")
467
 
468
+ # ๊ฒฐ๊ณผ ์ƒ์„ฑ
469
+ results = generate_transformations(text1, text2, text3, progress)
470
 
471
+ progress(0.95, "๊ฒฐ๊ณผ ํฌ๋งทํŒ… ์ค‘...")
472
+ formatted = format_results(results)
473
+
474
+ progress(1.0, "์™„๋ฃŒ!")
475
+ return formatted
476
 
477
  ##############################################################################
478
  # API ํ‚ค ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€
 
497
  h2 { color: #555; }
498
  .output { background-color: #ffffff; padding: 15px; border-radius: 8px; }
499
  .gr-button { background-color: #4CAF50; color: white; border: none; border-radius: 4px; padding: 8px 16px; }
500
+ .progress-message { color: #2196F3; font-weight: bold; margin-top: 10px; }
501
  </style>
502
  """)
503
 
 
512
  text_input1 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 1 (ํ•„์ˆ˜)", placeholder="์˜ˆ: ์Šค๋งˆํŠธํฐ")
513
  text_input2 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 2 (์„ ํƒ)", placeholder="์˜ˆ: ์ธ๊ณต์ง€๋Šฅ")
514
  text_input3 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 3 (์„ ํƒ)", placeholder="์˜ˆ: ํ—ฌ์Šค์ผ€์–ด")
515
+
516
+ # ์ƒํƒœ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•  ์˜์—ญ ์ถ”๊ฐ€
517
+ status_msg = gr.Markdown("๐Ÿ’ก '์•„์ด๋””์–ด ์ƒ์„ฑํ•˜๊ธฐ' ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๋ฉด ํ”„๋กœ๊ทธ๋ ˆ์Šค ๋ฐ”๊ฐ€ ๋‚˜ํƒ€๋‚ฉ๋‹ˆ๋‹ค.")
518
+
519
+ submit_button = gr.Button("์•„์ด๋””์–ด ์ƒ์„ฑํ•˜๊ธฐ", variant="primary")
520
 
521
+ # ์šฐ์ธก ์ถœ๋ ฅ ์˜์—ญ
522
  with gr.Column(scale=2):
523
+ idea_output = gr.Markdown(label="์•„์ด๋””์–ด ๊ฒฐ๊ณผ")
 
524
 
525
  # ์˜ˆ์‹œ ์ž…๋ ฅ
526
  gr.Examples(
 
533
  inputs=[text_input1, text_input2, text_input3],
534
  )
535
 
536
+ # ๋ฒ„ํŠผ ์ด๋ฒคํŠธ
537
+ submit_button.click(
538
+ fn=process_inputs,
539
+ inputs=[text_input1, text_input2, text_input3],
540
+ outputs=idea_output
541
+ )
542
 
543
  if __name__ == "__main__":
544
+ demo.launch(debug=True)