aiqcamp commited on
Commit
edcf253
ยท
verified ยท
1 Parent(s): 70a440f

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +40 -183
app.py CHANGED
@@ -5,7 +5,6 @@ import time
5
  import logging
6
  import google.generativeai as genai
7
 
8
- # ๋กœ๊น… ์„ค์ •
9
  logging.basicConfig(
10
  level=logging.INFO,
11
  format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
@@ -16,11 +15,10 @@ logging.basicConfig(
16
  )
17
  logger = logging.getLogger("idea_generator")
18
 
19
- # Gemini API ํ‚ค๋Š” ํ™˜๊ฒฝ ๋ณ€์ˆ˜ GEMINI_API_KEY์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
20
  GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
21
  genai.configure(api_key=GEMINI_API_KEY)
22
 
23
- # ์Šฌ๋ž˜์‹œ("/")๊ฐ€ ํฌํ•จ๋œ ๋ณ€ํ™˜ ๋ฌธ์ž์—ด์—์„œ ๋‘ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒํ•˜๋Š” ํ—ฌํผ ํ•จ์ˆ˜
24
  def choose_alternative(transformation):
25
  if "/" not in transformation:
26
  return transformation
@@ -42,7 +40,7 @@ def choose_alternative(transformation):
42
  else:
43
  return random.choice([left, right])
44
 
45
- # ์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด๋ฅผ ์œ„ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ (๊ธฐ์กด '๋ฌผ๋ฆฌ์  ๋ณ€ํ™”' ์‚ฌ์ „ ์œ ์ง€)
46
  physical_transformation_categories = {
47
  "๊ณต๊ฐ„ ์ด๋™": [
48
  "์•ž/๋’ค ์ด๋™", "์ขŒ/์šฐ ์ด๋™", "์œ„/์•„๋ž˜ ์ด๋™", "์„ธ๋กœ์ถ• ํšŒ์ „(๊ณ ๊ฐœ ๋„๋•์ž„)",
@@ -51,7 +49,6 @@ physical_transformation_categories = {
51
  "๋ฌด์ค‘๋ ฅ ๋ถ€์œ ", "์ˆ˜๋ฉด ์œ„ ๋ถ€์œ ", "์ ํ”„/๋„์•ฝ", "์Šฌ๋ผ์ด๋”ฉ", "๋กค๋ง", "์ž์œ  ๋‚™ํ•˜",
52
  "์™•๋ณต ์šด๋™", "ํƒ„์„ฑ ํŠ•๊น€", "๊ด€ํ†ต", "ํšŒํ”ผ ์›€์ง์ž„", "์ง€๊ทธ์žฌ๊ทธ ์ด๋™", "์Šค์œ™ ์šด๋™"
53
  ],
54
-
55
  "ํฌ๊ธฐ์™€ ํ˜•ํƒœ ๋ณ€ํ™”": [
56
  "๋ถ€ํ”ผ ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๊ธธ์ด ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๋„ˆ๋น„ ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๋†’์ด ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ",
57
  "๋ฐ€๋„ ๋ณ€ํ™”", "๋ฌด๊ฒŒ ์ฆ๊ฐ€/๊ฐ์†Œ", "๋ชจ์–‘ ๋ณ€ํ˜•", "์ƒํƒœ ๋ณ€ํ™”", "๋ถˆ๊ท ๋“ฑ ๋ณ€ํ˜•",
@@ -60,145 +57,18 @@ physical_transformation_categories = {
60
  "์ ‘ํž˜/ํŽผ์ณ์ง", "์••์ฐฉ/ํŒฝ์ฐฝ", "๋Š˜์–ด๋‚จ/์ˆ˜์ถ•", "๊ตฌ๊ฒจ์ง/ํ‰ํ‰ํ•ด์ง", "๋ญ‰๊ฐœ์ง/๋‹จ๋‹จํ•ด์ง",
61
  "๋ง๋ฆผ/ํŽด์ง", "๊บพ์ž„/๊ตฌ๋ถ€๋Ÿฌ์ง"
62
  ],
63
-
64
- "ํ‘œ๋ฉด ๋ฐ ์™ธ๊ด€ ๋ณ€ํ™”": [
65
- "์ƒ‰์ƒ ๋ณ€ํ™”", "์งˆ๊ฐ ๋ณ€ํ™”", "ํˆฌ๋ช…/๋ถˆํˆฌ๋ช… ๋ณ€ํ™”", "๋ฐ˜์ง์ž„/๋ฌด๊ด‘ ๋ณ€ํ™”",
66
- "๋น› ๋ฐ˜์‚ฌ ์ •๋„ ๋ณ€ํ™”", "๋ฌด๋Šฌ ๋ณ€ํ™”", "๊ฐ๋„์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋ณ€ํ™”", "๋น›์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋ณ€ํ™”",
67
- "์˜จ๋„์— ๋”ฐ๋ฅธ ์ƒ‰์ƒ ๋ณ€ํ™”", "ํ™€๋กœ๊ทธ๋žจ ํšจ๊ณผ", "ํ‘œ๋ฉด ๊ฐ๋„๋ณ„ ๋น› ๋ฐ˜์‚ฌ", "ํ‘œ๋ฉด ๋ชจ์–‘ ๋ณ€ํ˜•",
68
- "์ดˆ๋ฏธ์„ธ ํ‘œ๋ฉด ๊ตฌ์กฐ ๋ณ€ํ™”", "์ž๊ฐ€ ์„ธ์ • ํšจ๊ณผ", "์–ผ๋ฃฉ/ํŒจํ„ด ์ƒ์„ฑ", "ํ๋ฆผ/์„ ๋ช…ํ•จ ๋ณ€ํ™”",
69
- "๊ด‘ํƒ/์œค๊ธฐ ๋ณ€ํ™”", "์ƒ‰์กฐ/์ฑ„๋„ ๋ณ€ํ™”", "๋ฐœ๊ด‘/ํ˜•๊ด‘", "๋น› ์‚ฐ๋ž€ ํšจ๊ณผ",
70
- "๋น› ํก์ˆ˜ ๋ณ€ํ™”", "๋ฐ˜ํˆฌ๋ช… ํšจ๊ณผ", "๊ทธ๋ฆผ์ž ํšจ๊ณผ ๋ณ€ํ™”", "์ž์™ธ์„  ๋ฐ˜์‘ ๋ณ€ํ™”",
71
- "์•ผ๊ด‘ ํšจ๊ณผ"
72
- ],
73
-
74
- "๋ฌผ์งˆ์˜ ์ƒํƒœ ๋ณ€ํ™”": [
75
- "๊ณ ์ฒด/์•ก์ฒด/๊ธฐ์ฒด ์ „ํ™˜", "๊ฒฐ์ •ํ™”/์šฉํ•ด", "์‚ฐํ™”/๋ถ€์‹", "๋”ฑ๋”ฑํ•ด์ง/๋ถ€๋“œ๋Ÿฌ์›Œ์ง",
76
- "ํŠน์ˆ˜ ์ƒํƒœ ์ „ํ™˜", "๋ฌด์ •ํ˜•/๊ฒฐ์ •ํ˜• ์ „ํ™˜", "์„ฑ๋ถ„ ๋ถ„๋ฆฌ", "๋ฏธ์„ธ ์ž…์ž ํ˜•์„ฑ/๋ถ„ํ•ด",
77
- "์ ค ํ˜•์„ฑ/ํ’€์–ด์ง", "์ค€์•ˆ์ • ์ƒํƒœ ๋ณ€ํ™”", "๋ถ„์ž ์ž๊ฐ€ ์ •๋ ฌ/๋ถ„ํ•ด", "์ƒํƒœ๋ณ€ํ™” ์ง€์—ฐ ํ˜„์ƒ",
78
- "๋…น์Œ", "๊ตณ์Œ", "์ฆ๋ฐœ/์‘์ถ•", "์Šนํ™”/์ฆ์ฐฉ", "์นจ์ „/๋ถ€์œ ", "๋ถ„์‚ฐ/์‘์ง‘",
79
- "๊ฑด์กฐ/์Šต์œค", "ํŒฝ์œค/์ˆ˜์ถ•", "๋™๊ฒฐ/ํ•ด๋™", "ํ’ํ™”/์นจ์‹", "์ถฉ์ „/๋ฐฉ์ „",
80
- "๊ฒฐํ•ฉ/๋ถ„๋ฆฌ", "๋ฐœํšจ/๋ถ€ํŒจ"
81
- ],
82
-
83
- "์—ด ๊ด€๋ จ ๋ณ€ํ™”": [
84
- "์˜จ๋„ ์ƒ์Šน/ํ•˜๊ฐ•", "์—ด์— ์˜ํ•œ ํŒฝ์ฐฝ/์ˆ˜์ถ•", "์—ด ์ „๋‹ฌ/์ฐจ๋‹จ", "์••๋ ฅ ์ƒ์Šน/ํ•˜๊ฐ•",
85
- "์—ด ๋ณ€ํ™”์— ๋”ฐ๋ฅธ ์žํ™”", "๋ฌด์งˆ์„œ๋„ ๋ณ€ํ™”", "์—ด์ „๊ธฐ ํ˜„์ƒ", "์ž๊ธฐ์žฅ์— ์˜ํ•œ ์—ด ๋ณ€ํ™”",
86
- "์ƒํƒœ๋ณ€ํ™” ์ค‘ ์—ด ์ €์žฅ/๋ฐฉ์ถœ", "์—ด ์ŠคํŠธ๋ ˆ์Šค ๋ฐœ์ƒ/ํ•ด์†Œ", "๊ธ‰๊ฒฉํ•œ ์˜จ๋„ ๋ณ€ํ™” ์˜ํ–ฅ",
87
- "๋ณต์‚ฌ์—ด์— ์˜ํ•œ ๋ƒ‰๊ฐ/๊ฐ€์—ด", "๋ฐœ์—ด/ํก์—ด", "์—ด ๋ถ„ํฌ ๋ณ€ํ™”", "์—ด ๋ฐ˜์‚ฌ/ํก์ˆ˜",
88
- "๋ƒ‰๊ฐ ์‘์ถ•", "์—ด ํ™œ์„ฑํ™”", "์—ด ๋ณ€์ƒ‰", "์—ด ํŒฝ์ฐฝ ๊ณ„์ˆ˜ ๋ณ€ํ™”", "์—ด ์•ˆ์ •์„ฑ ๋ณ€ํ™”",
89
- "๋‚ด์—ด์„ฑ/๋‚ดํ•œ์„ฑ", "์ž๊ธฐ๋ฐœ์—ด", "์—ด์  ํ‰ํ˜•/๋ถˆ๊ท ํ˜•", "์—ด์  ๋ณ€ํ˜•", "์—ด ๋ถ„์‚ฐ/์ง‘์ค‘"
90
- ],
91
-
92
- "์›€์ง์ž„ ํŠน์„ฑ ๋ณ€ํ™”": [
93
- "๊ฐ€์†/๊ฐ์†", "์ผ์ • ์†๋„ ์œ ์ง€", "์ง„๋™/์ง„๋™ ๊ฐ์†Œ", "๋ถ€๋”ชํž˜/ํŠ•๊น€",
94
- "ํšŒ์ „ ์†๋„ ์ฆ๊ฐ€/๊ฐ์†Œ", "ํšŒ์ „ ๋ฐฉํ–ฅ ๋ณ€ํ™”", "๋ถˆ๊ทœ์น™ ์›€์ง์ž„", "๋ฉˆ์ท„๋‹ค ๋ฏธ๋„๋Ÿฌ์ง€๋Š” ํ˜„์ƒ",
95
- "๊ณต์ง„/๋ฐ˜๊ณต์ง„", "์œ ์ฒด ์† ์ €ํ•ญ/์–‘๋ ฅ ๋ณ€ํ™”", "์›€์ง์ž„ ์ €ํ•ญ ๋ณ€ํ™”", "๋ณตํ•ฉ ์ง„๋™ ์›€์ง์ž„",
96
- "ํŠน์ˆ˜ ์œ ์ฒด ์† ์›€์ง์ž„", "ํšŒ์ „-์ด๋™ ์—ฐ๊ณ„ ์›€์ง์ž„", "๊ด€์„ฑ ์ •์ง€", "์ถฉ๊ฒฉ ํก์ˆ˜",
97
- "์ถฉ๊ฒฉ ์ „๋‹ฌ", "์šด๋™๋Ÿ‰ ๋ณด์กด", "๋งˆ์ฐฐ๋ ฅ ๋ณ€ํ™”", "๊ด€์„ฑ ํƒˆ์ถœ", "๋ถˆ์•ˆ์ • ๊ท ํ˜•",
98
- "๋™์  ์•ˆ์ •์„ฑ", "ํ”๋“ค๋ฆผ ๊ฐ์‡ ", "๊ฒฝ๋กœ ์˜ˆ์ธก์„ฑ", "ํšŒํ”ผ ์›€์ง์ž„"
99
- ],
100
-
101
- "๊ตฌ์กฐ์  ๋ณ€ํ™”": [
102
- "๋ถ€ํ’ˆ ์ถ”๊ฐ€/์ œ๊ฑฐ", "์กฐ๋ฆฝ/๋ถ„ํ•ด", "์ ‘๊ธฐ/ํŽด๊ธฐ", "๋ณ€ํ˜•/์›์ƒ๋ณต๊ตฌ", "์ตœ์  ๊ตฌ์กฐ ๋ณ€ํ™”",
103
- "์ž๊ฐ€ ์žฌ๋ฐฐ์—ด", "์ž์—ฐ ํŒจํ„ด ํ˜•์„ฑ/์†Œ๋ฉธ", "๊ทœ์น™์  ํŒจํ„ด ๋ณ€ํ™”", "๋ชจ๋“ˆ์‹ ๋ณ€ํ˜•",
104
- "๋ณต์žก์„ฑ ์ฆ๊ฐ€ ๊ตฌ์กฐ", "์›๋ž˜ ๋ชจ์–‘ ๊ธฐ์–ต ํšจ๊ณผ", "์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ํ˜•ํƒœ ๋ณ€ํ™”", "๋ถ€๋ถ„ ์ œ๊ฑฐ",
105
- "๋ถ€๋ถ„ ๊ต์ฒด", "๊ฒฐํ•ฉ", "๋ถ„๋ฆฌ", "๋ถ„ํ• /ํ†ตํ•ฉ", "์ค‘์ฒฉ/๊ฒน์นจ", "๋‚ด๋ถ€ ๊ตฌ์กฐ ๋ณ€ํ™”",
106
- "์™ธ๋ถ€ ๊ตฌ์กฐ ๋ณ€ํ™”", "์ค‘์‹ฌ์ถ• ์ด๋™", "๊ท ํ˜•์  ๋ณ€ํ™”", "๊ณ„์ธต ๊ตฌ์กฐ ๋ณ€ํ™”", "์ง€์ง€ ๊ตฌ์กฐ ๋ณ€ํ™”",
107
- "์‘๋ ฅ ๋ถ„์‚ฐ ๊ตฌ์กฐ", "์ถฉ๊ฒฉ ํก์ˆ˜ ๊ตฌ์กฐ", "๊ทธ๋ฆฌ๋“œ/๋งคํŠธ๋ฆญ์Šค ๊ตฌ์กฐ ๋ณ€ํ™”", "์ƒํ˜ธ ์—ฐ๊ฒฐ์„ฑ ๋ณ€ํ™”"
108
- ],
109
-
110
- "์ „๊ธฐ ๋ฐ ์ž๊ธฐ ๋ณ€ํ™”": [
111
- "์ž์„ฑ ์ƒ์„ฑ/์†Œ๋ฉธ", "์ „ํ•˜๋Ÿ‰ ์ฆ๊ฐ€/๊ฐ์†Œ", "์ „๊ธฐ์žฅ ์ƒ์„ฑ/์†Œ๋ฉธ", "์ž๊ธฐ์žฅ ์ƒ์„ฑ/์†Œ๋ฉธ",
112
- "์ดˆ์ „๋„ ์ƒํƒœ ์ „ํ™˜", "๊ฐ•์œ ์ „์ฒด ํŠน์„ฑ ๋ณ€ํ™”", "์–‘์ž ์ƒํƒœ ๋ณ€ํ™”", "ํ”Œ๋ผ์ฆˆ๋งˆ ์ƒํƒœ ํ˜•์„ฑ/์†Œ๋ฉธ",
113
- "์Šคํ•€ํŒŒ ์ „๋‹ฌ", "๋น›์— ์˜ํ•œ ์ „๊ธฐ ๋ฐœ์ƒ", "์••๋ ฅ์— ์˜ํ•œ ์ „๊ธฐ ๋ฐœ์ƒ", "์ž๊ธฐ์žฅ ์† ์ „๋ฅ˜ ๋ณ€ํ™”",
114
- "์ „๊ธฐ ์ €ํ•ญ ๋ณ€ํ™”", "์ „๊ธฐ ์ „๋„์„ฑ ๋ณ€ํ™”", "์ •์ „๊ธฐ ๋ฐœ์ƒ/๋ฐฉ์ „", "์ „์ž๊ธฐ ์œ ๋„",
115
- "์ „์ž๊ธฐํŒŒ ๋ฐฉ์ถœ/ํก์ˆ˜", "์ „๊ธฐ ์šฉ๋Ÿ‰ ๋ณ€ํ™”", "์ž๊ธฐ ์ด๋ ฅ ํ˜„์ƒ", "์ „๊ธฐ์  ๋ถ„๊ทน",
116
- "์ „์ž ํ๋ฆ„ ๋ฐฉํ–ฅ ๋ณ€ํ™”", "์ „๊ธฐ์  ๊ณต๋ช…", "์ „๊ธฐ์  ์ฐจํ/๋…ธ์ถœ", "์ž๊ธฐ ์ฐจํ/๋…ธ์ถœ",
117
- "์ž๊ธฐ์žฅ ๋ฐฉํ–ฅ ์ •๋ ฌ"
118
- ],
119
-
120
- "ํ™”ํ•™์  ๋ณ€ํ™”": [
121
- "ํ‘œ๋ฉด ์ฝ”ํŒ… ๋ณ€ํ™”", "๋ฌผ์งˆ ์„ฑ๋ถ„ ๋ณ€ํ™”", "ํ™”ํ•™ ๋ฐ˜์‘ ๋ณ€ํ™”", "์ด‰๋งค ์ž‘์šฉ ์‹œ์ž‘/์ค‘๋‹จ",
122
- "๋น›์— ์˜ํ•œ ํ™”ํ•™ ๋ฐ˜์‘", "์ „๊ธฐ์— ์˜ํ•œ ํ™”ํ•™ ๋ฐ˜์‘", "๋‹จ๋ถ„์ž๋ง‰ ํ˜•์„ฑ", "๋ถ„์ž ์ˆ˜์ค€ ๊ณ„์‚ฐ ๋ณ€ํ™”",
123
- "์ž์—ฐ ๋ชจ๋ฐฉ ํ‘œ๋ฉด ๋ณ€ํ™”", "ํ™˜๊ฒฝ ๋ฐ˜์‘ํ˜• ๋ฌผ์งˆ ๋ณ€ํ™”", "์ฃผ๊ธฐ์  ํ™”ํ•™ ๋ฐ˜์‘", "์‚ฐํ™”", "ํ™˜์›",
124
- "๊ณ ๋ถ„์žํ™”", "๋ฌผ ๋ถ„ํ•ด", "ํ™”ํ•ฉ", "๋ฐฉ์‚ฌ์„  ์˜ํ–ฅ", "์‚ฐ-์—ผ๊ธฐ ๋ฐ˜์‘", "์ค‘ํ™” ๋ฐ˜์‘",
125
- "์ด์˜จํ™”", "ํ™”ํ•™์  ํก์ฐฉ/ํƒˆ์ฐฉ", "์ด‰๋งค ํšจ์œจ ๋ณ€ํ™”", "ํšจ์†Œ ํ™œ์„ฑ ๋ณ€ํ™”", "๋ฐœ์ƒ‰ ๋ฐ˜์‘",
126
- "pH ๋ณ€ํ™”", "ํ™”ํ•™์  ํ‰ํ˜• ์ด๋™", "๊ฒฐํ•ฉ ํ˜•์„ฑ/๋ถ„ํ•ด", "์šฉํ•ด๋„ ๋ณ€ํ™”"
127
- ],
128
-
129
- "์‹œ๊ฐ„ ๊ด€๋ จ ๋ณ€ํ™”": [
130
- "๋…ธํ™”/ํ’ํ™”", "๋งˆ๋ชจ/๋ถ€์‹", "์ƒ‰ ๋ฐ”๋žจ/๋ณ€์ƒ‰", "์†์ƒ/ํšŒ๋ณต", "์ˆ˜๋ช… ์ฃผ๊ธฐ ๋ณ€ํ™”",
131
- "์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์— ๋”ฐ๋ฅธ ์ ์‘", "ํ•™์Šต ๊ธฐ๋ฐ˜ ํ˜•ํƒœ ์ตœ์ ํ™”", "์‹œ๊ฐ„์— ๋”ฐ๋ฅธ ๋ฌผ์„ฑ ๋ณ€ํ™”",
132
- "์ง‘๋‹จ ๊ธฐ์–ต ํšจ๊ณผ", "๋ฌธํ™”์  ์˜๋ฏธ ๋ณ€ํ™”", "์ง€์—ฐ ๋ฐ˜์‘", "์ด์ „ ์ƒํƒœ ์˜์กด ๋ณ€ํ™”",
133
- "์ ์ง„์  ์‹œ๊ฐ„ ๋ณ€ํ™”", "์ง„ํ™”์  ๋ณ€ํ™”", "์ฃผ๊ธฐ์  ์žฌ์ƒ", "๊ณ„์ ˆ ๋ณ€ํ™” ์ ์‘",
134
- "์ƒ์ฒด๋ฆฌ๋“ฌ ๋ณ€ํ™”", "์ƒ์•  ์ฃผ๊ธฐ ๋‹จ๊ณ„", "์„ฑ์žฅ/ํ‡ดํ™”", "์ž๊ธฐ ๋ณต๊ตฌ/์žฌ์ƒ",
135
- "์ž์—ฐ ์ˆœํ™˜ ์ ์‘", "์ง€์†์„ฑ/์ผ์‹œ์„ฑ", "๊ธฐ์–ต ํšจ๊ณผ", "์ง€์—ฐ๋œ ์ž‘์šฉ", "๋ˆ„์  ํšจ๊ณผ"
136
- ],
137
-
138
- "๋น›๊ณผ ์‹œ๊ฐ ํšจ๊ณผ": [
139
- "๋ฐœ๊ด‘/์†Œ๋“ฑ", "๋น› ํˆฌ๊ณผ/์ฐจ๋‹จ", "๋น› ์‚ฐ๋ž€/์ง‘์ค‘", "์ƒ‰์ƒ ์ŠคํŽ™ํŠธ๋Ÿผ ๋ณ€ํ™”", "๋น› ํšŒ์ ˆ",
140
- "๋น› ๊ฐ„์„ญ", "ํ™€๋กœ๊ทธ๋žจ ์ƒ์„ฑ", "๋ ˆ์ด์ € ํšจ๊ณผ", "๋น› ํŽธ๊ด‘", "ํ˜•๊ด‘/์ธ๊ด‘",
141
- "์ž์™ธ์„ /์ ์™ธ์„  ๋ฐœ๊ด‘", "๊ด‘ํ•™์  ์ฐฉ์‹œ", "๋น› ๊ตด์ ˆ", "๊ทธ๋ฆผ์ž ์ƒ์„ฑ/์ œ๊ฑฐ",
142
- "์ƒ‰์ˆ˜์ฐจ ํšจ๊ณผ", "๋ฌด์ง€๊ฐœ ํšจ๊ณผ", "๊ธ€๋กœ์šฐ ํšจ๊ณผ", "ํ”Œ๋ž˜์‹œ ํšจ๊ณผ", "์กฐ๋ช… ํŒจํ„ด",
143
- "๋น” ํšจ๊ณผ", "๊ด‘ ํ•„ํ„ฐ ํšจ๊ณผ", "๋น›์˜ ๋ฐฉํ–ฅ์„ฑ ๋ณ€ํ™”", "ํˆฌ์˜ ํšจ๊ณผ", "๋น› ๊ฐ์ง€/๋ฐ˜์‘",
144
- "๊ด‘๋„ ๋ณ€ํ™”"
145
- ],
146
-
147
- "์†Œ๋ฆฌ์™€ ์ง„๋™ ํšจ๊ณผ": [
148
- "์†Œ๋ฆฌ ๋ฐœ์ƒ/์†Œ๋ฉธ", "์†Œ๋ฆฌ ๋†’๋‚ฎ์ด ๋ณ€ํ™”", "์†Œ๋ฆฌ ํฌ๊ธฐ ๋ณ€ํ™”", "์Œ์ƒ‰ ๋ณ€ํ™”",
149
- "๊ณต๋ช…/๋ฐ˜๊ณต๋ช…", "์Œํ–ฅ ์ง„๋™", "์ดˆ์ŒํŒŒ/์ €์ŒํŒŒ ๋ฐœ์ƒ", "์Œํ–ฅ ์ง‘์ค‘/๋ถ„์‚ฐ",
150
- "์Œํ–ฅ ๋ฐ˜์‚ฌ/ํก์ˆ˜", "์Œํ–ฅ ๋„ํ”Œ๋Ÿฌ ํšจ๊ณผ", "์ŒํŒŒ ๊ฐ„์„ญ", "์Œํ–ฅ ๊ณต์ง„",
151
- "์ง„๋™ ํŒจํ„ด ๋ณ€ํ™”", "ํƒ€์•… ํšจ๊ณผ", "์Œํ–ฅ ํ”ผ๋“œ๋ฐฑ", "์Œํ–ฅ ์ฐจํ/์ฆํญ",
152
- "์†Œ๋ฆฌ ์ง€ํ–ฅ์„ฑ", "์Œํ–ฅ ์™œ๊ณก", "๋น„ํŠธ ์ƒ์„ฑ", "ํ•˜๋ชจ๋‹‰์Šค ์ƒ์„ฑ", "์ฃผํŒŒ์ˆ˜ ๋ณ€์กฐ",
153
- "์Œํ–ฅ ์ถฉ๊ฒฉํŒŒ", "์Œํ–ฅ ํ•„ํ„ฐ๋ง", "์ŒํŒŒ ์ „ํŒŒ ํŒจํ„ด", "์ง„๋™ ๋Œํ•‘"
154
- ],
155
-
156
- "์ƒ๋ฌผํ•™์  ๋ณ€ํ™”": [
157
- "์ƒ์žฅ/์œ„์ถ•", "์„ธํฌ ๋ถ„์—ด/์‚ฌ๋ฉธ", "์ƒ๋ฌผ ๋ฐœ๊ด‘", "์‹ ์ง„๋Œ€์‚ฌ ๋ณ€ํ™”", "๋ฉด์—ญ ๋ฐ˜์‘",
158
- "ํ˜ธ๋ฅด๋ชฌ ๋ถ„๋น„", "์‹ ๊ฒฝ ๋ฐ˜์‘", "์œ ์ „์  ๋ฐœํ˜„", "์ ์‘/์ง„ํ™”", "์ƒ์ฒด๋ฆฌ๋“ฌ ๋ณ€ํ™”",
159
- "์žฌ์ƒ/์น˜์œ ", "๋…ธํ™”/์„ฑ์ˆ™", "์ƒ์ฒด ๋ชจ๋ฐฉ ๋ณ€ํ™”", "๋ฐ”์ด์˜คํ•„๋ฆ„ ํ˜•์„ฑ", "์ƒ๋ฌผํ•™์  ๋ถ„ํ•ด",
160
- "ํšจ์†Œ ํ™œ์„ฑํ™”/๋น„ํ™œ์„ฑํ™”", "์ƒ๋ฌผํ•™์  ์‹ ํ˜ธ ์ „๋‹ฌ", "์ŠคํŠธ๋ ˆ์Šค ๋ฐ˜์‘", "์ฒด์˜จ ์กฐ์ ˆ",
161
- "์ƒ๋ฌผํ•™์  ์‹œ๊ณ„ ๋ณ€ํ™”", "์„ธํฌ์™ธ ๊ธฐ์งˆ ๋ณ€ํ™”", "์ƒ์ฒด ์—ญํ•™์  ๋ฐ˜์‘", "์„ธํฌ ์šด๋™์„ฑ",
162
- "์„ธํฌ ๊ทน์„ฑ ๋ณ€ํ™”", "์˜์–‘ ์ƒํƒœ ๋ณ€ํ™”"
163
- ],
164
-
165
- "ํ™˜๊ฒฝ ์ƒํ˜ธ์ž‘์šฉ": [
166
- "์˜จ๋„ ๋ฐ˜์‘", "์Šต๋„ ๋ฐ˜์‘", "๊ธฐ์•• ๋ฐ˜์‘", "์ค‘๋ ฅ ๋ฐ˜์‘", "์ž๊ธฐ์žฅ ๋ฐ˜์‘",
167
- "๋น› ๋ฐ˜์‘", "์†Œ๋ฆฌ ๋ฐ˜์‘", "ํ™”ํ•™ ๋ฌผ์งˆ ๊ฐ์ง€", "๊ธฐ๊ณ„์  ์ž๊ทน ๊ฐ์ง€", "์ „๊ธฐ ์ž๊ทน ๋ฐ˜์‘",
168
- "๋ฐฉ์‚ฌ์„  ๋ฐ˜์‘", "์ง„๋™ ๊ฐ์ง€", "pH ๋ฐ˜์‘", "์šฉ๋งค ๋ฐ˜์‘", "๊ธฐ์ฒด ๊ตํ™˜",
169
- "ํ™˜๊ฒฝ ์˜ค์—ผ ๋ฐ˜์‘", "๋‚ ์”จ ๋ฐ˜์‘", "๊ณ„์ ˆ ๋ณ€ํ™” ๋ฐ˜์‘", "์ผ์ฃผ๊ธฐ ๋ฐ˜์‘", "์ƒํƒœ๊ณ„ ์ƒํ˜ธ์ž‘์šฉ",
170
- "๊ณต์ƒ/๊ฒฝ์Ÿ ๋ฐ˜์‘", "ํฌ์‹/ํ”ผ์‹ ๊ด€๊ณ„", "๊ตฐ์ง‘ ํ˜•์„ฑ", "์˜์—ญ ์„ค์ •", "์ด์ฃผ/์ •์ฐฉ ํŒจํ„ด"
171
- ],
172
-
173
- "์„ผ์„œ ๊ธฐ๋Šฅ": [
174
- "์‹œ๊ฐ ์„ผ์„œ/๊ฐ์ง€", "์ฒญ๊ฐ ์„ผ์„œ/๊ฐ์ง€", "์ด‰๊ฐ ์„ผ์„œ/๊ฐ์ง€", "๋ฏธ๊ฐ ์„ผ์„œ/๊ฐ์ง€", "ํ›„๊ฐ ์„ผ์„œ/๊ฐ์ง€",
175
- "์˜จ๋„ ์„ผ์„œ/๊ฐ์ง€", "์Šต๋„ ์„ผ์„œ/๊ฐ์ง€", "์••๋ ฅ ์„ผ๏ฟฝ๏ฟฝ๏ฟฝ/๊ฐ์ง€", "๊ฐ€์†๋„ ์„ผ์„œ/๊ฐ์ง€", "ํšŒ์ „ ์„ผ์„œ/๊ฐ์ง€",
176
- "๊ทผ์ ‘ ์„ผ์„œ/๊ฐ์ง€", "์œ„์น˜ ์„ผ์„œ/๊ฐ์ง€", "์šด๋™ ์„ผ์„œ/๊ฐ์ง€", "๊ฐ€์Šค ์„ผ์„œ/๊ฐ์ง€", "์ ์™ธ์„  ์„ผ์„œ/๊ฐ์ง€",
177
- "์ž์™ธ์„  ์„ผ์„œ/๊ฐ์ง€", "๋ฐฉ์‚ฌ์„  ์„ผ์„œ/๊ฐ์ง€", "์ž๊ธฐ์žฅ ์„ผ์„œ/๊ฐ์ง€", "์ „๊ธฐ์žฅ ์„ผ์„œ/๊ฐ์ง€", "ํ™”ํ•™๋ฌผ์งˆ ์„ผ์„œ/๊ฐ์ง€",
178
- "์ƒ์ฒด์‹ ํ˜ธ ์„ผ์„œ/๊ฐ์ง€", "์ง„๋™ ์„ผ์„œ/๊ฐ์ง€", "์†Œ์Œ ์„ผ์„œ/๊ฐ์ง€", "๋น› ์„ธ๊ธฐ ์„ผ์„œ/๊ฐ์ง€", "๋น› ํŒŒ์žฅ ์„ผ์„œ/๊ฐ์ง€",
179
- "๊ธฐ์šธ๊ธฐ ์„ผ์„œ/๊ฐ์ง€", "pH ์„ผ์„œ/๊ฐ์ง€", "์ „๋ฅ˜ ์„ผ์„œ/๊ฐ์ง€", "์ „์•• ์„ผ์„œ/๊ฐ์ง€", "์ด๋ฏธ์ง€ ์„ผ์„œ/๊ฐ์ง€",
180
- "๊ฑฐ๋ฆฌ ์„ผ์„œ/๊ฐ์ง€", "๊นŠ์ด ์„ผ์„œ/๊ฐ์ง€", "์ค‘๋ ฅ ์„ผ์„œ/๊ฐ์ง€", "์†๋„ ์„ผ์„œ/๊ฐ์ง€", "ํ๋ฆ„ ์„ผ์„œ/๊ฐ์ง€",
181
- "์ˆ˜์œ„ ์„ผ์„œ/๊ฐ์ง€", "ํƒ๋„ ์„ผ์„œ/๊ฐ์ง€", "์—ผ๋„ ์„ผ์„œ/๊ฐ์ง€", "๊ธˆ์† ๊ฐ์ง€", "์••์ „ ์„ผ์„œ/๊ฐ์ง€",
182
- "๊ด‘์ „ ์„ผ์„œ/๊ฐ์ง€", "์—ด์ „๋Œ€ ์„ผ์„œ/๊ฐ์ง€", "ํ™€ ํšจ๊ณผ ์„ผ์„œ/๊ฐ์ง€", "์ดˆ์ŒํŒŒ ์„ผ์„œ/๊ฐ์ง€", "๋ ˆ์ด๋” ์„ผ์„œ/๊ฐ์ง€",
183
- "๋ผ์ด๋‹ค ์„ผ์„œ/๊ฐ์ง€", "ํ„ฐ์น˜ ์„ผ์„œ/๊ฐ์ง€", "์ œ์Šค์ฒ˜ ์„ผ์„œ/๊ฐ์ง€", "์‹ฌ๋ฐ• ์„ผ์„œ/๊ฐ์ง€", "ํ˜ˆ์•• ์„ผ์„œ/๊ฐ์ง€"
184
- ]
185
  }
186
 
187
- ##############################################################################
188
- # Gemini API ํ˜ธ์ถœ ํ•จ์ˆ˜ (์˜ˆ: gemini-2.0-flash-thinking-exp-01-21 -> ๋‹ค๋ฅธ ๋ชจ๋ธ ์‚ฌ์šฉ ์‹œ ์ˆ˜์ •)
189
- ##############################################################################
190
  def query_gemini_api(prompt):
191
  try:
192
- # ์˜ˆ์‹œ: ๊ธฐ์กด gemini-2.0... ๋Œ€์‹ , ๋‹ค๋ฅธ ๋ชจ๋ธ์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ๊ต์ฒดํ•˜์„ธ์š”.
193
  model = genai.GenerativeModel('gemini-2.0-flash-thinking-exp-01-21')
194
-
195
  response = model.generate_content(prompt)
196
 
197
- # ์‘๋‹ต ๊ตฌ์กฐ ๋ฐฉ์–ด์ ์œผ๋กœ ์ฒ˜๋ฆฌ
198
  try:
199
  if hasattr(response, 'text'):
200
  return response.text
201
-
202
  if hasattr(response, 'candidates') and response.candidates:
203
  if len(response.candidates) > 0:
204
  candidate = response.candidates[0]
@@ -210,27 +80,21 @@ def query_gemini_api(prompt):
210
  if hasattr(response, 'parts') and response.parts:
211
  if len(response.parts) > 0:
212
  return response.parts[0].text
213
-
214
  return "Unable to generate a response. API response structure is different than expected."
215
-
216
  except Exception as inner_e:
217
  logger.error(f"Error processing response: {inner_e}")
218
  return f"An error occurred while processing the response: {str(inner_e)}"
219
-
220
  except Exception as e:
221
  logger.error(f"Error calling Gemini API: {e}")
222
  if "API key not valid" in str(e):
223
  return "API key is not valid. Please check your GEMINI_API_KEY environment variable."
224
  return f"An error occurred while calling the API: {str(e)}"
225
 
226
- ##############################################################################
227
- # ์„ค๋ช… ํ™•์žฅ ํ•จ์ˆ˜: "๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ์˜ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์ดํ•ด์™€ ํ˜์‹  ํฌ์ธํŠธ, ๊ธฐ๋Šฅ์„ฑ ๋“ฑ์„ ์ค‘์‹ฌ"์œผ๋กœ
228
- ##############################################################################
229
  def enhance_with_llm(base_description, obj_name, category):
230
  prompt = f"""
231
  ๋‹ค์Œ์€ '{obj_name}'์˜ '{category}' ๊ด€๋ จ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค:
232
  "{base_description}"
233
-
234
  ์œ„ ๋‚ด์šฉ์„ ๋ณด๋‹ค ๊ตฌ์ฒดํ™”ํ•˜์—ฌ,
235
  1) ์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ์˜ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์ดํ•ด,
236
  2) ํ˜์‹  ํฌ์ธํŠธ์™€ ๊ธฐ๋Šฅ์„ฑ ๋“ฑ์„ ์ค‘์‹ฌ์œผ๋กœ
@@ -238,9 +102,7 @@ def enhance_with_llm(base_description, obj_name, category):
238
  """
239
  return query_gemini_api(prompt)
240
 
241
- ##############################################################################
242
- # ๋‹จ์ผ ํ‚ค์›Œ๋“œ(์˜ค๋ธŒ์ ํŠธ)์— ๋Œ€ํ•œ "์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด" ์ƒ์„ฑ
243
- ##############################################################################
244
  def generate_single_object_transformations(obj):
245
  results = {}
246
  for category, transformations in physical_transformation_categories.items():
@@ -249,9 +111,7 @@ def generate_single_object_transformations(obj):
249
  results[category] = {"base": base_description, "enhanced": None}
250
  return results
251
 
252
- ##############################################################################
253
- # ๋‘ ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ "์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด" ์ƒ์„ฑ
254
- ##############################################################################
255
  def generate_two_objects_interaction(obj1, obj2):
256
  results = {}
257
  for category, transformations in physical_transformation_categories.items():
@@ -264,9 +124,7 @@ def generate_two_objects_interaction(obj1, obj2):
264
  results[category] = {"base": base_description, "enhanced": None}
265
  return results
266
 
267
- ##############################################################################
268
- # ์„ธ ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ "์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด" ์ƒ์„ฑ
269
- ##############################################################################
270
  def generate_three_objects_interaction(obj1, obj2, obj3):
271
  results = {}
272
  for category, transformations in physical_transformation_categories.items():
@@ -279,18 +137,14 @@ def generate_three_objects_interaction(obj1, obj2, obj3):
279
  results[category] = {"base": base_description, "enhanced": None}
280
  return results
281
 
282
- ##############################################################################
283
- # ์ƒ์„ฑ๋œ ๊ธฐ๋ณธ ์„ค๋ช…์„ LLM์„ ํ†ตํ•ด ํ™•์žฅ
284
- ##############################################################################
285
  def enhance_descriptions(results, objects):
286
  obj_name = " ๋ฐ ".join([obj for obj in objects if obj])
287
  for category, result in results.items():
288
  result["enhanced"] = enhance_with_llm(result["base"], obj_name, category)
289
  return results
290
 
291
- ##############################################################################
292
- # ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์ตœ๋Œ€ 3๊ฐœ ํ‚ค์›Œ๋“œ)์— ๋”ฐ๋ผ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ
293
- ##############################################################################
294
  def generate_transformations(text1, text2=None, text3=None):
295
  if text2 and text3:
296
  results = generate_three_objects_interaction(text1, text2, text3)
@@ -303,53 +157,55 @@ def generate_transformations(text1, text2=None, text3=None):
303
  objects = [text1]
304
  return enhance_descriptions(results, objects)
305
 
306
- ##############################################################################
307
- # ๊ฒฐ๊ณผ ํฌ๋งทํŒ…
308
- ##############################################################################
309
  def format_results(results):
310
  formatted = ""
311
  for category, result in results.items():
312
  formatted += f"## {category}\n**๊ธฐ๋ณธ ์•„์ด๋””์–ด**: {result['base']}\n\n**ํ™•์žฅ๋œ ์•„์ด๋””์–ด**: {result['enhanced']}\n\n---\n\n"
313
  return formatted
314
 
 
315
  ##############################################################################
316
- # Gradio UI์—์„œ ํ˜ธ์ถœํ•  ํ•จ์ˆ˜
317
  ##############################################################################
318
- def process_inputs(text1, text2, text3):
319
- messages = []
320
- messages.append("์ž…๋ ฅ๊ฐ’ ํ™•์ธ ์ค‘...")
321
  time.sleep(0.3)
 
322
  text1 = text1.strip() if text1 else None
323
  text2 = text2.strip() if text2 else None
324
  text3 = text3.strip() if text3 else None
325
  if not text1:
326
- messages.append("์˜ค๋ฅ˜: ์ตœ์†Œ ํ•˜๋‚˜์˜ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.")
327
- return "\n\n".join(messages)
328
 
329
- messages.append("์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ ์ค‘...")
 
330
  time.sleep(0.3)
 
 
331
  results = generate_transformations(text1, text2, text3)
332
 
333
- messages.append("๊ฒฐ๊ณผ ํฌ๋งทํŒ… ์ค‘...")
 
334
  time.sleep(0.3)
 
 
335
  formatted = format_results(results)
336
 
337
- messages.append("์™„๋ฃŒ!")
338
- messages.append(formatted)
339
 
340
- return "\n\n".join(messages)
 
341
 
342
- ##############################################################################
343
- # API ํ‚ค ๊ฒฝ๊ณ  ๋ฉ”์‹œ์ง€
344
- ##############################################################################
345
  def get_warning_message():
346
  if not GEMINI_API_KEY:
347
  return "โš ๏ธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ GEMINI_API_KEY๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Gemini API ํ‚ค๋ฅผ ์„ค์ •ํ•˜์„ธ์š”."
348
  return ""
349
 
350
- ##############################################################################
351
- # Gradio UI
352
- ##############################################################################
353
  with gr.Blocks(title="ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ๊ธฐ",
354
  theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral")) as demo:
355
 
@@ -370,7 +226,6 @@ with gr.Blocks(title="ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ๊ธฐ",
370
 
371
  warning = gr.Markdown(get_warning_message())
372
 
373
- # ์ขŒ์ธก ์ž…๋ ฅ ์˜์—ญ
374
  with gr.Row():
375
  with gr.Column(scale=1):
376
  text_input1 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 1 (ํ•„์ˆ˜)", placeholder="์˜ˆ: ์Šค๋งˆํŠธํฐ")
@@ -378,12 +233,11 @@ with gr.Blocks(title="ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ๊ธฐ",
378
  text_input3 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 3 (์„ ํƒ)", placeholder="์˜ˆ: ํ—ฌ์Šค์ผ€์–ด")
379
  submit_button = gr.Button("์•„์ด๋””์–ด ์ƒ์„ฑํ•˜๊ธฐ")
380
 
381
- # ์šฐ์ธก ์ถœ๋ ฅ ์˜์—ญ (ํƒญ์€ ํ•˜๋‚˜๋งŒ ์‚ฌ์šฉ)
382
  with gr.Column(scale=2):
383
  with gr.TabItem("์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด", id="creative_tab"):
 
384
  idea_output = gr.Markdown(label="์•„์ด๋””์–ด ๊ฒฐ๊ณผ")
385
 
386
- # ์˜ˆ์‹œ ์ž…๋ ฅ
387
  gr.Examples(
388
  examples=[
389
  ["์Šค๋งˆํŠธํฐ", "", ""],
@@ -394,10 +248,13 @@ with gr.Blocks(title="ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ๊ธฐ",
394
  inputs=[text_input1, text_input2, text_input3],
395
  )
396
 
397
- # ๋ฒ„ํŠผ ์ด๋ฒคํŠธ: ์ฒซ ๋ฒˆ์งธ ํƒญ์—๋งŒ ์—ฐ๊ฒฐ
398
- submit_button.click(fn=process_inputs,
399
- inputs=[text_input1, text_input2, text_input3],
400
- outputs=idea_output)
 
 
 
401
 
402
  if __name__ == "__main__":
403
  demo.launch(debug=True)
 
5
  import logging
6
  import google.generativeai as genai
7
 
 
8
  logging.basicConfig(
9
  level=logging.INFO,
10
  format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
 
15
  )
16
  logger = logging.getLogger("idea_generator")
17
 
 
18
  GEMINI_API_KEY = os.getenv("GEMINI_API_KEY")
19
  genai.configure(api_key=GEMINI_API_KEY)
20
 
21
+
22
  def choose_alternative(transformation):
23
  if "/" not in transformation:
24
  return transformation
 
40
  else:
41
  return random.choice([left, right])
42
 
43
+
44
  physical_transformation_categories = {
45
  "๊ณต๊ฐ„ ์ด๋™": [
46
  "์•ž/๋’ค ์ด๋™", "์ขŒ/์šฐ ์ด๋™", "์œ„/์•„๋ž˜ ์ด๋™", "์„ธ๋กœ์ถ• ํšŒ์ „(๊ณ ๊ฐœ ๋„๋•์ž„)",
 
49
  "๋ฌด์ค‘๋ ฅ ๋ถ€์œ ", "์ˆ˜๋ฉด ์œ„ ๋ถ€์œ ", "์ ํ”„/๋„์•ฝ", "์Šฌ๋ผ์ด๋”ฉ", "๋กค๋ง", "์ž์œ  ๋‚™ํ•˜",
50
  "์™•๋ณต ์šด๋™", "ํƒ„์„ฑ ํŠ•๊น€", "๊ด€ํ†ต", "ํšŒํ”ผ ์›€์ง์ž„", "์ง€๊ทธ์žฌ๊ทธ ์ด๋™", "์Šค์œ™ ์šด๋™"
51
  ],
 
52
  "ํฌ๊ธฐ์™€ ํ˜•ํƒœ ๋ณ€ํ™”": [
53
  "๋ถ€ํ”ผ ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๊ธธ์ด ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๋„ˆ๋น„ ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ", "๋†’์ด ๋Š˜์–ด๋‚จ/์ค„์–ด๋“ฆ",
54
  "๋ฐ€๋„ ๋ณ€ํ™”", "๋ฌด๊ฒŒ ์ฆ๊ฐ€/๊ฐ์†Œ", "๋ชจ์–‘ ๋ณ€ํ˜•", "์ƒํƒœ ๋ณ€ํ™”", "๋ถˆ๊ท ๋“ฑ ๋ณ€ํ˜•",
 
57
  "์ ‘ํž˜/ํŽผ์ณ์ง", "์••์ฐฉ/ํŒฝ์ฐฝ", "๋Š˜์–ด๋‚จ/์ˆ˜์ถ•", "๊ตฌ๊ฒจ์ง/ํ‰ํ‰ํ•ด์ง", "๋ญ‰๊ฐœ์ง/๋‹จ๋‹จํ•ด์ง",
58
  "๋ง๋ฆผ/ํŽด์ง", "๊บพ์ž„/๊ตฌ๋ถ€๋Ÿฌ์ง"
59
  ],
60
+ # ... (์ค‘๊ฐ„ ์ƒ๋žต: ๋‚˜๋จธ์ง€ ์นดํ…Œ๊ณ ๋ฆฌ๋Š” ๋™์ผ)
61
+ # ์ƒ๋žต๋œ ๋ถ€๋ถ„๋„ ๊ธฐ์กด ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ์œ ์ง€
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
62
  }
63
 
 
 
 
64
  def query_gemini_api(prompt):
65
  try:
 
66
  model = genai.GenerativeModel('gemini-2.0-flash-thinking-exp-01-21')
 
67
  response = model.generate_content(prompt)
68
 
 
69
  try:
70
  if hasattr(response, 'text'):
71
  return response.text
 
72
  if hasattr(response, 'candidates') and response.candidates:
73
  if len(response.candidates) > 0:
74
  candidate = response.candidates[0]
 
80
  if hasattr(response, 'parts') and response.parts:
81
  if len(response.parts) > 0:
82
  return response.parts[0].text
 
83
  return "Unable to generate a response. API response structure is different than expected."
 
84
  except Exception as inner_e:
85
  logger.error(f"Error processing response: {inner_e}")
86
  return f"An error occurred while processing the response: {str(inner_e)}"
 
87
  except Exception as e:
88
  logger.error(f"Error calling Gemini API: {e}")
89
  if "API key not valid" in str(e):
90
  return "API key is not valid. Please check your GEMINI_API_KEY environment variable."
91
  return f"An error occurred while calling the API: {str(e)}"
92
 
93
+
 
 
94
  def enhance_with_llm(base_description, obj_name, category):
95
  prompt = f"""
96
  ๋‹ค์Œ์€ '{obj_name}'์˜ '{category}' ๊ด€๋ จ ๊ฐ„๋‹จํ•œ ์„ค๋ช…์ž…๋‹ˆ๋‹ค:
97
  "{base_description}"
 
98
  ์œ„ ๋‚ด์šฉ์„ ๋ณด๋‹ค ๊ตฌ์ฒดํ™”ํ•˜์—ฌ,
99
  1) ์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ์˜ ๋ณ€ํ™”์— ๋Œ€ํ•œ ์ดํ•ด,
100
  2) ํ˜์‹  ํฌ์ธํŠธ์™€ ๊ธฐ๋Šฅ์„ฑ ๋“ฑ์„ ์ค‘์‹ฌ์œผ๋กœ
 
102
  """
103
  return query_gemini_api(prompt)
104
 
105
+
 
 
106
  def generate_single_object_transformations(obj):
107
  results = {}
108
  for category, transformations in physical_transformation_categories.items():
 
111
  results[category] = {"base": base_description, "enhanced": None}
112
  return results
113
 
114
+
 
 
115
  def generate_two_objects_interaction(obj1, obj2):
116
  results = {}
117
  for category, transformations in physical_transformation_categories.items():
 
124
  results[category] = {"base": base_description, "enhanced": None}
125
  return results
126
 
127
+
 
 
128
  def generate_three_objects_interaction(obj1, obj2, obj3):
129
  results = {}
130
  for category, transformations in physical_transformation_categories.items():
 
137
  results[category] = {"base": base_description, "enhanced": None}
138
  return results
139
 
140
+
 
 
141
  def enhance_descriptions(results, objects):
142
  obj_name = " ๋ฐ ".join([obj for obj in objects if obj])
143
  for category, result in results.items():
144
  result["enhanced"] = enhance_with_llm(result["base"], obj_name, category)
145
  return results
146
 
147
+
 
 
148
  def generate_transformations(text1, text2=None, text3=None):
149
  if text2 and text3:
150
  results = generate_three_objects_interaction(text1, text2, text3)
 
157
  objects = [text1]
158
  return enhance_descriptions(results, objects)
159
 
160
+
 
 
161
  def format_results(results):
162
  formatted = ""
163
  for category, result in results.items():
164
  formatted += f"## {category}\n**๊ธฐ๋ณธ ์•„์ด๋””์–ด**: {result['base']}\n\n**ํ™•์žฅ๋œ ์•„์ด๋””์–ด**: {result['enhanced']}\n\n---\n\n"
165
  return formatted
166
 
167
+
168
  ##############################################################################
169
+ # ์ŠคํŠธ๋ฆฌ๋ฐ(Streaming) ๋ฐฉ์‹์œผ๋กœ ์ถœ๋ ฅํ•˜๋Š” ํ•จ์ˆ˜: yield๋ฅผ ์‚ฌ์šฉ
170
  ##############################################################################
171
+ def process_inputs_stream(text1, text2, text3):
172
+ # 1) ์ฒซ ๋ฉ”์‹œ์ง€
173
+ yield "์ž…๋ ฅ๊ฐ’ ํ™•์ธ ์ค‘..."
174
  time.sleep(0.3)
175
+
176
  text1 = text1.strip() if text1 else None
177
  text2 = text2.strip() if text2 else None
178
  text3 = text3.strip() if text3 else None
179
  if not text1:
180
+ yield "์˜ค๋ฅ˜: ์ตœ์†Œ ํ•˜๋‚˜์˜ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”."
181
+ return # ์—ฌ๊ธฐ์„œ ํ•จ์ˆ˜ ์ข…๋ฃŒ
182
 
183
+ # 2) ๋‹ค์Œ ๋ฉ”์‹œ์ง€
184
+ yield "์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ ์ค‘..."
185
  time.sleep(0.3)
186
+
187
+ # 3) ์‹ค์ œ ์•„์ด๋””์–ด ์ƒ์„ฑ
188
  results = generate_transformations(text1, text2, text3)
189
 
190
+ # 4) ์ค‘๊ฐ„ ๋‹จ๊ณ„ ์ถœ๋ ฅ
191
+ yield "๊ฒฐ๊ณผ ํฌ๋งทํŒ… ์ค‘..."
192
  time.sleep(0.3)
193
+
194
+ # 5) ์ตœ์ข… ๊ฒฐ๊ณผ ์ •๋ฆฌ
195
  formatted = format_results(results)
196
 
197
+ # 6) ๊ฒฐ๊ณผ ์ถœ๋ ฅ
198
+ yield formatted
199
 
200
+ # 7) ์™„๋ฃŒ
201
+ yield "์™„๋ฃŒ!"
202
 
 
 
 
203
  def get_warning_message():
204
  if not GEMINI_API_KEY:
205
  return "โš ๏ธ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ GEMINI_API_KEY๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. Gemini API ํ‚ค๋ฅผ ์„ค์ •ํ•˜์„ธ์š”."
206
  return ""
207
 
208
+
 
 
209
  with gr.Blocks(title="ํ‚ค์›Œ๋“œ ๊ธฐ๋ฐ˜ ์ฐฝ์˜์  ๋ณ€ํ™” ์•„์ด๋””์–ด ์ƒ์„ฑ๊ธฐ",
210
  theme=gr.themes.Soft(primary_hue="teal", secondary_hue="slate", neutral_hue="neutral")) as demo:
211
 
 
226
 
227
  warning = gr.Markdown(get_warning_message())
228
 
 
229
  with gr.Row():
230
  with gr.Column(scale=1):
231
  text_input1 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 1 (ํ•„์ˆ˜)", placeholder="์˜ˆ: ์Šค๋งˆํŠธํฐ")
 
233
  text_input3 = gr.Textbox(label="ํ‚ค์›Œ๋“œ 3 (์„ ํƒ)", placeholder="์˜ˆ: ํ—ฌ์Šค์ผ€์–ด")
234
  submit_button = gr.Button("์•„์ด๋””์–ด ์ƒ์„ฑํ•˜๊ธฐ")
235
 
 
236
  with gr.Column(scale=2):
237
  with gr.TabItem("์ฐฝ์˜์ ์ธ ๋ชจ๋ธ/์ปจ์…‰/ํ˜•์ƒ ๋ณ€ํ™” ์•„์ด๋””์–ด", id="creative_tab"):
238
+ # Markdown ์ถœ๋ ฅ
239
  idea_output = gr.Markdown(label="์•„์ด๋””์–ด ๊ฒฐ๊ณผ")
240
 
 
241
  gr.Examples(
242
  examples=[
243
  ["์Šค๋งˆํŠธํฐ", "", ""],
 
248
  inputs=[text_input1, text_input2, text_input3],
249
  )
250
 
251
+ # stream=True ์˜ต์…˜์„ ํ†ตํ•ด ํ•จ์ˆ˜๊ฐ€ yieldํ•˜๋Š” ๋ฌธ์ž์—ด์„ ์‹ค์‹œ๊ฐ„ ์ถœ๋ ฅ
252
+ submit_button.click(
253
+ fn=process_inputs_stream,
254
+ inputs=[text_input1, text_input2, text_input3],
255
+ outputs=idea_output,
256
+ stream=True
257
+ )
258
 
259
  if __name__ == "__main__":
260
  demo.launch(debug=True)