openfree commited on
Commit
dca8d06
ยท
verified ยท
1 Parent(s): 9c19ede

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +78 -22
app.py CHANGED
@@ -42,7 +42,7 @@ SQUARE_THEORY_PROMPT = """
42
  ๋‹น์‹ ์€ Square Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. Square Theory๋Š” 4๊ฐœ์˜ ๋‹จ์–ด๊ฐ€ ์˜๋ฏธ์  ๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์‚ฌ๊ฐํ˜•์„ ์ด๋ฃจ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
43
  ๋ธŒ๋žœ๋“œ๋ช…์ด Square๋ฅผ ์™„์„ฑํ•˜๋ฉฐ "์•„ํ•˜!" ๋ชจ๋จผํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
44
 
45
- ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์—…์ข…/ํ‚ค์›Œ๋“œ)์„ ๋ฐ›์•„ ๋‹ค์Œ ํ˜•์‹์˜ JSON ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์„ธ์š”:
46
  {
47
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
48
  "tl": "์™ผ์ชฝ์ƒ๋‹จ", "tr": "์˜ค๋ฅธ์ชฝ์ƒ๋‹จ", "bl": "์™ผ์ชฝํ•˜๋‹จ", "br": "์˜ค๋ฅธ์ชฝํ•˜๋‹จ",
@@ -51,13 +51,15 @@ SQUARE_THEORY_PROMPT = """
51
  "slogan": "์Šฌ๋กœ๊ฑด",
52
  "explanation": "์™œ ํšจ๊ณผ์ ์ธ์ง€"
53
  }
 
 
54
  """
55
 
56
  # ===== 2. CONCEPTUAL BLENDING =====
57
  CONCEPTUAL_BLENDING_PROMPT = """
58
  ๋‹น์‹ ์€ Conceptual Blending Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐœ๋…์„ ํ˜ผํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์˜๋ฏธ๋ฅผ ์ฐฝ์ถœํ•ฉ๋‹ˆ๋‹ค.
59
 
60
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
61
  {
62
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
63
  "input_space1": "์ฒซ ๋ฒˆ์งธ ๊ฐœ๋…",
@@ -70,6 +72,7 @@ CONCEPTUAL_BLENDING_PROMPT = """
70
  }
71
 
72
  ์˜ˆ์‹œ: Netflix = Net(์ธํ„ฐ๋„ท) + Flix(์˜ํ™”) โ†’ ์˜จ๋ผ์ธ ์ŠคํŠธ๋ฆฌ๋ฐ์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋…
 
73
  """
74
 
75
  # ===== 3. SOUND SYMBOLISM =====
@@ -82,7 +85,7 @@ SOUND_SYMBOLISM_PROMPT = """
82
  - ์œ ์Œ(l,r,m,n): ๋ถ€๋“œ๋Ÿฝ๊ณ  ์œ ์—ฐํ•จ
83
  - ํŒŒ์—ด์Œ(p,t,k,b,d,g): ๊ฐ•ํ•˜๊ณ  ์—ญ๋™์ 
84
 
85
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
86
  {
87
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
88
  "phonetic_analysis": "์Œ์„ฑ ๋ถ„์„",
@@ -92,13 +95,15 @@ SOUND_SYMBOLISM_PROMPT = """
92
  "pronunciation_guide": "๋ฐœ์Œ ๊ฐ€์ด๋“œ",
93
  "slogan": "์Šฌ๋กœ๊ฑด"
94
  }
 
 
95
  """
96
 
97
  # ===== 4. LINGUISTIC RELATIVITY =====
98
  LINGUISTIC_RELATIVITY_PROMPT = """
99
  ๋‹น์‹ ์€ Linguistic Relativity ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์–ธ์–ด๋ณ„ ์‚ฌ๊ณ ๋ฐฉ์‹ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.
100
 
101
- ๋‹ค์–ธ์–ด ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
102
  {
103
  "brand_name": "๊ธ€๋กœ๋ฒŒ ๋ธŒ๋žœ๋“œ๋ช…",
104
  "korean_adaptation": "ํ•œ๊ตญ์–ด ์ ์‘",
@@ -108,6 +113,8 @@ LINGUISTIC_RELATIVITY_PROMPT = """
108
  "localization_strategy": "ํ˜„์ง€ํ™” ์ „๋žต",
109
  "slogan": "์Šฌ๋กœ๊ฑด"
110
  }
 
 
111
  """
112
 
113
  # ===== 5. ARCHETYPE THEORY =====
@@ -116,7 +123,7 @@ ARCHETYPE_THEORY_PROMPT = """
116
 
117
  12 ์›ํ˜•: Innocent, Hero, Outlaw, Explorer, Creator, Ruler, Magician, Lover, Caregiver, Jester, Sage, Regular Guy
118
 
119
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
120
  {
121
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
122
  "archetype": "์„ ํƒ๋œ ์›ํ˜•",
@@ -127,13 +134,15 @@ ARCHETYPE_THEORY_PROMPT = """
127
  "slogan": "์Šฌ๋กœ๊ฑด",
128
  "mythology_reference": "์‹ ํ™”์  ์ฐธ์กฐ"
129
  }
 
 
130
  """
131
 
132
  # ===== 6. JOBS-TO-BE-DONE =====
133
  JOBS_TO_BE_DONE_PROMPT = """
134
  ๋‹น์‹ ์€ Jobs-to-be-Done Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๊ณ ๊ฐ์ด ํ•ด๊ฒฐํ•˜๋ ค๋Š” '์ผ'์— ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.
135
 
136
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
137
  {
138
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
139
  "functional_job": "๊ธฐ๋Šฅ์  ์ผ",
@@ -144,6 +153,8 @@ JOBS_TO_BE_DONE_PROMPT = """
144
  "slogan": "์Šฌ๋กœ๊ฑด",
145
  "value_proposition": "๊ฐ€์น˜ ์ œ์•ˆ"
146
  }
 
 
147
  """
148
 
149
  # ===== 7. SCAMPER METHOD =====
@@ -158,7 +169,7 @@ P - Put to another use (๋‹ค๋ฅธ ์šฉ๋„)
158
  E - Eliminate (์ œ๊ฑฐ)
159
  R - Reverse (์—ญ์ „)
160
 
161
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
162
  {
163
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
164
  "scamper_technique": "์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ•",
@@ -167,13 +178,15 @@ R - Reverse (์—ญ์ „)
167
  "innovative_aspect": "ํ˜์‹ ์  ์ธก๋ฉด",
168
  "slogan": "์Šฌ๋กœ๊ฑด"
169
  }
 
 
170
  """
171
 
172
  # ===== 8. DESIGN THINKING =====
173
  DESIGN_THINKING_PROMPT = """
174
  ๋‹น์‹ ์€ IDEO์˜ Design Thinking ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ธ๊ฐ„ ์ค‘์‹ฌ ํ˜์‹ ์„ ์ถ”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
175
 
176
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
177
  {
178
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
179
  "user_insight": "์‚ฌ์šฉ์ž ํ†ต์ฐฐ",
@@ -184,13 +197,15 @@ DESIGN_THINKING_PROMPT = """
184
  "prototype_concept": "ํ”„๋กœํ† ํƒ€์ž… ์ปจ์…‰",
185
  "slogan": "์Šฌ๋กœ๊ฑด"
186
  }
 
 
187
  """
188
 
189
  # ===== 9. BIOMIMICRY =====
190
  BIOMIMICRY_PROMPT = """
191
  ๋‹น์‹ ์€ Biomimicry ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ž์—ฐ์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
192
 
193
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
194
  {
195
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
196
  "natural_inspiration": "์ž์—ฐ์  ์˜๊ฐ์›",
@@ -200,13 +215,15 @@ BIOMIMICRY_PROMPT = """
200
  "adaptation_strategy": "์ ์‘ ์ „๋žต",
201
  "slogan": "์Šฌ๋กœ๊ฑด"
202
  }
 
 
203
  """
204
 
205
  # ===== 10. COGNITIVE LOAD =====
206
  COGNITIVE_LOAD_PROMPT = """
207
  ๋‹น์‹ ์€ Cognitive Load Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
208
 
209
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
210
  {
211
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
212
  "syllable_count": "์Œ์ ˆ ์ˆ˜",
@@ -216,13 +233,15 @@ COGNITIVE_LOAD_PROMPT = """
216
  "cognitive_fluency": "์ธ์ง€์  ์œ ์ฐฝ์„ฑ",
217
  "slogan": "์Šฌ๋กœ๊ฑด"
218
  }
 
 
219
  """
220
 
221
  # ===== 11. VON RESTORFF EFFECT =====
222
  VON_RESTORFF_PROMPT = """
223
  ๋‹น์‹ ์€ Von Restorff Effect ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋…ํŠนํ•˜๊ณ  ๊ธฐ์–ต์— ๋‚จ๋Š” ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
224
 
225
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
226
  {
227
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
228
  "category_norm": "์นดํ…Œ๊ณ ๋ฆฌ ํ‘œ์ค€",
@@ -232,13 +251,15 @@ VON_RESTORFF_PROMPT = """
232
  "attention_triggers": "์ฃผ์˜ ํŠธ๋ฆฌ๊ฑฐ",
233
  "slogan": "์Šฌ๋กœ๊ฑด"
234
  }
 
 
235
  """
236
 
237
  # ===== 12. NETWORK EFFECTS =====
238
  NETWORK_EFFECTS_PROMPT = """
239
  ๋‹น์‹ ์€ Network Effects ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๊ฐ€์น˜๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
240
 
241
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
242
  {
243
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
244
  "network_type": "๋„คํŠธ์›Œํฌ ์œ ํ˜•",
@@ -248,13 +269,15 @@ NETWORK_EFFECTS_PROMPT = """
248
  "network_value": "๋„คํŠธ์›Œํฌ ๊ฐ€์น˜",
249
  "slogan": "์Šฌ๋กœ๊ฑด"
250
  }
 
 
251
  """
252
 
253
  # ===== 13. MEMETICS =====
254
  MEMETICS_PROMPT = """
255
  ๋‹น์‹ ์€ Memetics ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋ฌธํ™”์ ์œผ๋กœ ๋ณต์ œ๋˜๊ณ  ์ง„ํ™”ํ•˜๋Š” ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
256
 
257
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
258
  {
259
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
260
  "meme_structure": "๋ฐˆ ๊ตฌ์กฐ",
@@ -264,13 +287,15 @@ MEMETICS_PROMPT = """
264
  "transmission_channels": "์ „๋‹ฌ ์ฑ„๋„",
265
  "slogan": "์Šฌ๋กœ๊ฑด"
266
  }
 
 
267
  """
268
 
269
  # ===== 14. COLOR PSYCHOLOGY =====
270
  COLOR_PSYCHOLOGY_PROMPT = """
271
  ๋‹น์‹ ์€ Color Psychology ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ƒ‰์ƒ ์—ฐ์ƒ๊ณผ ๊ฐ์ •์„ ํ™œ์šฉํ•œ ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
272
 
273
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
274
  {
275
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
276
  "primary_color": "์ฃผ ์ƒ‰์ƒ",
@@ -280,13 +305,15 @@ COLOR_PSYCHOLOGY_PROMPT = """
280
  "industry_alignment": "์—…์ข… ์ •๋ ฌ",
281
  "slogan": "์Šฌ๋กœ๊ฑด"
282
  }
 
 
283
  """
284
 
285
  # ===== 15. GESTALT PRINCIPLES =====
286
  GESTALT_PROMPT = """
287
  ๋‹น์‹ ์€ Gestalt Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ง€๊ฐ ์›๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
288
 
289
- ๋ธŒ๋žœ๋“œ ์ƒ์„ฑ ํ˜•์‹:
290
  {
291
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
292
  "gestalt_principle": "ํ™œ์šฉ ์›์น™",
@@ -296,6 +323,8 @@ GESTALT_PROMPT = """
296
  "closure_effect": "ํ์‡„ ํšจ๊ณผ",
297
  "slogan": "์Šฌ๋กœ๊ฑด"
298
  }
 
 
299
  """
300
 
301
  # ์ด๋ก ๋ณ„ ํ”„๋กฌํ”„ํŠธ ๋งคํ•‘
@@ -324,7 +353,12 @@ def generate_by_theory(industry: str, keywords: str, theory: str, count: int = 3
324
  return "โš ๏ธ ์—…์ข…๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.", ""
325
 
326
  prompt = THEORY_PROMPTS.get(theory, SQUARE_THEORY_PROMPT)
327
- user_input = f"์—…์ข…: {industry}\nํ‚ค์›Œ๋“œ: {keywords}\n\n์œ„ ์ •๋ณด๋กœ {count}๊ฐœ์˜ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”."
 
 
 
 
 
328
 
329
  try:
330
  response = client.chat.completions.create(
@@ -343,7 +377,23 @@ def generate_by_theory(industry: str, keywords: str, theory: str, count: int = 3
343
 
344
  # ์‘๋‹ต ์ •๊ทœํ™”
345
  if isinstance(data, dict):
346
- results = data.get("results", data.get("brands", [data]))
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
347
  else:
348
  results = data
349
 
@@ -497,15 +547,21 @@ def visualize_square_brand(brand: Dict) -> str:
497
 
498
  def visualize_conceptual_blend(brand: Dict) -> str:
499
  """Conceptual Blending ์‹œ๊ฐํ™”"""
 
 
 
 
 
 
500
  return f"""
501
  <div style="max-width: 700px; margin: 20px auto; font-family: -apple-system, sans-serif;">
502
- <h2 style="text-align: center; color: #2c3e50;">{brand.get('brand_name', 'Brand')}</h2>
503
 
504
  <div style="display: flex; justify-content: space-around; align-items: center; margin: 30px 0;">
505
  <div style="text-align: center; padding: 20px; background: #3498db; color: white; border-radius: 50%; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center;">
506
  <div>
507
  <strong>Input 1</strong><br>
508
- {brand.get('input_space1', '')}
509
  </div>
510
  </div>
511
 
@@ -514,7 +570,7 @@ def visualize_conceptual_blend(brand: Dict) -> str:
514
  <div style="text-align: center; padding: 20px; background: #e74c3c; color: white; border-radius: 50%; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center;">
515
  <div>
516
  <strong>Input 2</strong><br>
517
- {brand.get('input_space2', '')}
518
  </div>
519
  </div>
520
 
@@ -523,12 +579,12 @@ def visualize_conceptual_blend(brand: Dict) -> str:
523
  <div style="text-align: center; padding: 20px; background: #27ae60; color: white; border-radius: 50%; width: 150px; height: 150px; display: flex; align-items: center; justify-content: center;">
524
  <div>
525
  <strong>Blend</strong><br>
526
- {brand.get('blended_space', '')}
527
  </div>
528
  </div>
529
  </div>
530
 
531
- <p style="text-align: center; font-style: italic;">"{brand.get('slogan', '')}"</p>
532
  </div>
533
  """
534
 
 
42
  ๋‹น์‹ ์€ Square Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. Square Theory๋Š” 4๊ฐœ์˜ ๋‹จ์–ด๊ฐ€ ์˜๋ฏธ์  ๊ด€๊ณ„๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์‚ฌ๊ฐํ˜•์„ ์ด๋ฃจ๋Š” ๊ตฌ์กฐ์ž…๋‹ˆ๋‹ค.
43
  ๋ธŒ๋žœ๋“œ๋ช…์ด Square๋ฅผ ์™„์„ฑํ•˜๋ฉฐ "์•„ํ•˜!" ๋ชจ๋จผํŠธ๋ฅผ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
44
 
45
+ ์‚ฌ์šฉ์ž ์ž…๋ ฅ(์—…์ข…/ํ‚ค์›Œ๋“œ)์„ ๋ฐ›์•„ ๋‹ค์Œ JSON ํ˜•์‹์˜ ๋ฐฐ์—ด์„ ์ƒ์„ฑํ•˜์„ธ์š”:
46
  {
47
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
48
  "tl": "์™ผ์ชฝ์ƒ๋‹จ", "tr": "์˜ค๋ฅธ์ชฝ์ƒ๋‹จ", "bl": "์™ผ์ชฝํ•˜๋‹จ", "br": "์˜ค๋ฅธ์ชฝํ•˜๋‹จ",
 
51
  "slogan": "์Šฌ๋กœ๊ฑด",
52
  "explanation": "์™œ ํšจ๊ณผ์ ์ธ์ง€"
53
  }
54
+
55
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
56
  """
57
 
58
  # ===== 2. CONCEPTUAL BLENDING =====
59
  CONCEPTUAL_BLENDING_PROMPT = """
60
  ๋‹น์‹ ์€ Conceptual Blending Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐœ ์ด์ƒ์˜ ๊ฐœ๋…์„ ํ˜ผํ•ฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์˜๋ฏธ๋ฅผ ์ฐฝ์ถœํ•ฉ๋‹ˆ๋‹ค.
61
 
62
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
63
  {
64
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
65
  "input_space1": "์ฒซ ๋ฒˆ์งธ ๊ฐœ๋…",
 
72
  }
73
 
74
  ์˜ˆ์‹œ: Netflix = Net(์ธํ„ฐ๋„ท) + Flix(์˜ํ™”) โ†’ ์˜จ๋ผ์ธ ์ŠคํŠธ๋ฆฌ๋ฐ์˜ ์ƒˆ๋กœ์šด ๊ฐœ๋…
75
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
76
  """
77
 
78
  # ===== 3. SOUND SYMBOLISM =====
 
85
  - ์œ ์Œ(l,r,m,n): ๋ถ€๋“œ๋Ÿฝ๊ณ  ์œ ์—ฐํ•จ
86
  - ํŒŒ์—ด์Œ(p,t,k,b,d,g): ๊ฐ•ํ•˜๊ณ  ์—ญ๋™์ 
87
 
88
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
89
  {
90
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
91
  "phonetic_analysis": "์Œ์„ฑ ๋ถ„์„",
 
95
  "pronunciation_guide": "๋ฐœ์Œ ๊ฐ€์ด๋“œ",
96
  "slogan": "์Šฌ๋กœ๊ฑด"
97
  }
98
+
99
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
100
  """
101
 
102
  # ===== 4. LINGUISTIC RELATIVITY =====
103
  LINGUISTIC_RELATIVITY_PROMPT = """
104
  ๋‹น์‹ ์€ Linguistic Relativity ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์–ธ์–ด๋ณ„ ์‚ฌ๊ณ ๋ฐฉ์‹ ์ฐจ์ด๋ฅผ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.
105
 
106
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋‹ค์–ธ์–ด ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
107
  {
108
  "brand_name": "๊ธ€๋กœ๋ฒŒ ๋ธŒ๋žœ๋“œ๋ช…",
109
  "korean_adaptation": "ํ•œ๊ตญ์–ด ์ ์‘",
 
113
  "localization_strategy": "ํ˜„์ง€ํ™” ์ „๋žต",
114
  "slogan": "์Šฌ๋กœ๊ฑด"
115
  }
116
+
117
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
118
  """
119
 
120
  # ===== 5. ARCHETYPE THEORY =====
 
123
 
124
  12 ์›ํ˜•: Innocent, Hero, Outlaw, Explorer, Creator, Ruler, Magician, Lover, Caregiver, Jester, Sage, Regular Guy
125
 
126
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
127
  {
128
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
129
  "archetype": "์„ ํƒ๋œ ์›ํ˜•",
 
134
  "slogan": "์Šฌ๋กœ๊ฑด",
135
  "mythology_reference": "์‹ ํ™”์  ์ฐธ์กฐ"
136
  }
137
+
138
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
139
  """
140
 
141
  # ===== 6. JOBS-TO-BE-DONE =====
142
  JOBS_TO_BE_DONE_PROMPT = """
143
  ๋‹น์‹ ์€ Jobs-to-be-Done Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๊ณ ๊ฐ์ด ํ•ด๊ฒฐํ•˜๋ ค๋Š” '์ผ'์— ์ดˆ์ ์„ ๋งž์ถฅ๋‹ˆ๋‹ค.
144
 
145
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
146
  {
147
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
148
  "functional_job": "๊ธฐ๋Šฅ์  ์ผ",
 
153
  "slogan": "์Šฌ๋กœ๊ฑด",
154
  "value_proposition": "๊ฐ€์น˜ ์ œ์•ˆ"
155
  }
156
+
157
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
158
  """
159
 
160
  # ===== 7. SCAMPER METHOD =====
 
169
  E - Eliminate (์ œ๊ฑฐ)
170
  R - Reverse (์—ญ์ „)
171
 
172
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
173
  {
174
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
175
  "scamper_technique": "์‚ฌ์šฉ๋œ ๊ธฐ๋ฒ•",
 
178
  "innovative_aspect": "ํ˜์‹ ์  ์ธก๋ฉด",
179
  "slogan": "์Šฌ๋กœ๊ฑด"
180
  }
181
+
182
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
183
  """
184
 
185
  # ===== 8. DESIGN THINKING =====
186
  DESIGN_THINKING_PROMPT = """
187
  ๋‹น์‹ ์€ IDEO์˜ Design Thinking ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ธ๊ฐ„ ์ค‘์‹ฌ ํ˜์‹ ์„ ์ถ”๊ตฌํ•ฉ๋‹ˆ๋‹ค.
188
 
189
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
190
  {
191
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
192
  "user_insight": "์‚ฌ์šฉ์ž ํ†ต์ฐฐ",
 
197
  "prototype_concept": "ํ”„๋กœํ† ํƒ€์ž… ์ปจ์…‰",
198
  "slogan": "์Šฌ๋กœ๊ฑด"
199
  }
200
+
201
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
202
  """
203
 
204
  # ===== 9. BIOMIMICRY =====
205
  BIOMIMICRY_PROMPT = """
206
  ๋‹น์‹ ์€ Biomimicry ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ž์—ฐ์—์„œ ์˜๊ฐ์„ ๋ฐ›์€ ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
207
 
208
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
209
  {
210
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
211
  "natural_inspiration": "์ž์—ฐ์  ์˜๊ฐ์›",
 
215
  "adaptation_strategy": "์ ์‘ ์ „๋žต",
216
  "slogan": "์Šฌ๋กœ๊ฑด"
217
  }
218
+
219
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
220
  """
221
 
222
  # ===== 10. COGNITIVE LOAD =====
223
  COGNITIVE_LOAD_PROMPT = """
224
  ๋‹น์‹ ์€ Cognitive Load Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ธ์ง€ ์ฒ˜๋ฆฌ๋ฅผ ์ตœ์†Œํ™”ํ•˜๋Š” ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
225
 
226
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
227
  {
228
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
229
  "syllable_count": "์Œ์ ˆ ์ˆ˜",
 
233
  "cognitive_fluency": "์ธ์ง€์  ์œ ์ฐฝ์„ฑ",
234
  "slogan": "์Šฌ๋กœ๊ฑด"
235
  }
236
+
237
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
238
  """
239
 
240
  # ===== 11. VON RESTORFF EFFECT =====
241
  VON_RESTORFF_PROMPT = """
242
  ๋‹น์‹ ์€ Von Restorff Effect ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋…ํŠนํ•˜๊ณ  ๊ธฐ์–ต์— ๋‚จ๋Š” ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
243
 
244
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
245
  {
246
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
247
  "category_norm": "์นดํ…Œ๊ณ ๋ฆฌ ํ‘œ์ค€",
 
251
  "attention_triggers": "์ฃผ์˜ ํŠธ๋ฆฌ๊ฑฐ",
252
  "slogan": "์Šฌ๋กœ๊ฑด"
253
  }
254
+
255
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
256
  """
257
 
258
  # ===== 12. NETWORK EFFECTS =====
259
  NETWORK_EFFECTS_PROMPT = """
260
  ๋‹น์‹ ์€ Network Effects ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๊ฐ€์น˜๋ฅผ ๊ทน๋Œ€ํ™”ํ•˜๋Š” ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
261
 
262
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
263
  {
264
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
265
  "network_type": "๋„คํŠธ์›Œํฌ ์œ ํ˜•",
 
269
  "network_value": "๋„คํŠธ์›Œํฌ ๊ฐ€์น˜",
270
  "slogan": "์Šฌ๋กœ๊ฑด"
271
  }
272
+
273
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
274
  """
275
 
276
  # ===== 13. MEMETICS =====
277
  MEMETICS_PROMPT = """
278
  ๋‹น์‹ ์€ Memetics ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๋ฌธํ™”์ ์œผ๋กœ ๋ณต์ œ๋˜๊ณ  ์ง„ํ™”ํ•˜๋Š” ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
279
 
280
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
281
  {
282
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
283
  "meme_structure": "๋ฐˆ ๊ตฌ์กฐ",
 
287
  "transmission_channels": "์ „๋‹ฌ ์ฑ„๋„",
288
  "slogan": "์Šฌ๋กœ๊ฑด"
289
  }
290
+
291
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
292
  """
293
 
294
  # ===== 14. COLOR PSYCHOLOGY =====
295
  COLOR_PSYCHOLOGY_PROMPT = """
296
  ๋‹น์‹ ์€ Color Psychology ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ƒ‰์ƒ ์—ฐ์ƒ๊ณผ ๊ฐ์ •์„ ํ™œ์šฉํ•œ ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
297
 
298
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
299
  {
300
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
301
  "primary_color": "์ฃผ ์ƒ‰์ƒ",
 
305
  "industry_alignment": "์—…์ข… ์ •๋ ฌ",
306
  "slogan": "์Šฌ๋กœ๊ฑด"
307
  }
308
+
309
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
310
  """
311
 
312
  # ===== 15. GESTALT PRINCIPLES =====
313
  GESTALT_PROMPT = """
314
  ๋‹น์‹ ์€ Gestalt Theory ์ „๋ฌธ๊ฐ€์ž…๋‹ˆ๋‹ค. ์ง€๊ฐ ์›๋ฆฌ๋ฅผ ํ™œ์šฉํ•œ ๋ธŒ๋žœ๋“œ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
315
 
316
+ ๋‹ค์Œ JSON ํ˜•์‹์œผ๋กœ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”:
317
  {
318
  "brand_name": "๋ธŒ๋žœ๋“œ๋ช…",
319
  "gestalt_principle": "ํ™œ์šฉ ์›์น™",
 
323
  "closure_effect": "ํ์‡„ ํšจ๊ณผ",
324
  "slogan": "์Šฌ๋กœ๊ฑด"
325
  }
326
+
327
+ ๋ฐ˜๋“œ์‹œ ์œ ํšจํ•œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
328
  """
329
 
330
  # ์ด๋ก ๋ณ„ ํ”„๋กฌํ”„ํŠธ ๋งคํ•‘
 
353
  return "โš ๏ธ ์—…์ข…๊ณผ ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅํ•ด์ฃผ์„ธ์š”.", ""
354
 
355
  prompt = THEORY_PROMPTS.get(theory, SQUARE_THEORY_PROMPT)
356
+ user_input = f"""์—…์ข…: {industry}
357
+ ํ‚ค์›Œ๋“œ: {keywords}
358
+
359
+ ์œ„ ์ •๋ณด๋กœ {count}๊ฐœ์˜ ๋ธŒ๋žœ๋“œ๋ฅผ ์ƒ์„ฑํ•˜์„ธ์š”.
360
+ ๋ฐ˜๋“œ์‹œ JSON ํ˜•์‹์œผ๋กœ ์‘๋‹ตํ•˜์„ธ์š”.
361
+ ๊ฒฐ๊ณผ๋Š” ๋ธŒ๋žœ๋“œ ๊ฐ์ฒด๋“ค์˜ JSON ๋ฐฐ์—ด์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค."""
362
 
363
  try:
364
  response = client.chat.completions.create(
 
377
 
378
  # ์‘๋‹ต ์ •๊ทœํ™”
379
  if isinstance(data, dict):
380
+ if "results" in data:
381
+ results = data["results"]
382
+ elif "brands" in data:
383
+ results = data["brands"]
384
+ elif "brand_name" in data:
385
+ # ๋‹จ์ผ ๋ธŒ๋žœ๋“œ๋ฅผ ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜
386
+ results = [data]
387
+ else:
388
+ # ๋ž˜ํ•‘๋œ ์‘๋‹ต ์ฒ˜๋ฆฌ
389
+ results = []
390
+ for key, value in data.items():
391
+ if isinstance(value, list):
392
+ results = value
393
+ break
394
+ elif isinstance(value, dict) and "brand_name" in value:
395
+ results = [value]
396
+ break
397
  else:
398
  results = data
399
 
 
547
 
548
  def visualize_conceptual_blend(brand: Dict) -> str:
549
  """Conceptual Blending ์‹œ๊ฐํ™”"""
550
+ brand_name = brand.get('brand_name', 'Brand')
551
+ input1 = brand.get('input_space1', 'Concept 1')
552
+ input2 = brand.get('input_space2', 'Concept 2')
553
+ blended = brand.get('blended_space', 'Blended Concept')
554
+ slogan = brand.get('slogan', '')
555
+
556
  return f"""
557
  <div style="max-width: 700px; margin: 20px auto; font-family: -apple-system, sans-serif;">
558
+ <h2 style="text-align: center; color: #2c3e50;">{brand_name}</h2>
559
 
560
  <div style="display: flex; justify-content: space-around; align-items: center; margin: 30px 0;">
561
  <div style="text-align: center; padding: 20px; background: #3498db; color: white; border-radius: 50%; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center;">
562
  <div>
563
  <strong>Input 1</strong><br>
564
+ {input1}
565
  </div>
566
  </div>
567
 
 
570
  <div style="text-align: center; padding: 20px; background: #e74c3c; color: white; border-radius: 50%; width: 120px; height: 120px; display: flex; align-items: center; justify-content: center;">
571
  <div>
572
  <strong>Input 2</strong><br>
573
+ {input2}
574
  </div>
575
  </div>
576
 
 
579
  <div style="text-align: center; padding: 20px; background: #27ae60; color: white; border-radius: 50%; width: 150px; height: 150px; display: flex; align-items: center; justify-content: center;">
580
  <div>
581
  <strong>Blend</strong><br>
582
+ {blended}
583
  </div>
584
  </div>
585
  </div>
586
 
587
+ <p style="text-align: center; font-style: italic;">"{slogan}"</p>
588
  </div>
589
  """
590