haepa_mac commited on
Commit
951fc57
ยท
1 Parent(s): 37b10f3

๐ŸŽญ Major personality system improvements: Fixed critical errors, enhanced attractive flaws system, improved personality-trait matching, added purpose-driven strategies, and made conversations more engaging with natural flaw expressions

Browse files
Files changed (2) hide show
  1. app.py +165 -36
  2. modules/persona_generator.py +160 -24
app.py CHANGED
@@ -211,13 +211,13 @@ def create_persona_from_image(image, name, location, time_spent, object_type, pu
211
  global persona_generator
212
 
213
  if image is None:
214
- return None, "์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”.", "", {}, None, [], [], [], "", None, gr.update(visible=False)
215
 
216
  progress(0.1, desc="์„ค์ • ํ™•์ธ ์ค‘...")
217
 
218
  # ํ™˜๊ฒฝ๋ณ€์ˆ˜ API ํ‚ค ํ™•์ธ
219
  if not persona_generator or not hasattr(persona_generator, 'api_key') or not persona_generator.api_key:
220
- return None, "โŒ **API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค!** ํ—ˆ๊น…ํŽ˜์ด์Šค ์ŠคํŽ˜์ด์Šค ์„ค์ •์—์„œ GEMINI_API_KEY๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.", "", {}, None, [], [], [], "", None, gr.update(visible=False)
221
 
222
  progress(0.2, desc="์ด๋ฏธ์ง€ ๋ถ„์„ ์ค‘...")
223
 
@@ -236,9 +236,9 @@ def create_persona_from_image(image, name, location, time_spent, object_type, pu
236
  try:
237
  image = Image.open(image)
238
  except Exception as img_error:
239
- return None, f"โŒ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {str(img_error)}", "", {}, None, [], [], [], "", None, gr.update(visible=False)
240
  elif not isinstance(image, Image.Image):
241
- return None, "โŒ ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฏธ์ง€ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.", "", {}, None, [], [], [], "", None, gr.update(visible=False)
242
 
243
  # ์ด๋ฏธ์ง€ ํ˜•์‹ ๋ณ€ํ™˜ (AVIF ๋“ฑ ํŠน์ˆ˜ ํ˜•์‹ ์ฒ˜๋ฆฌ)
244
  if image.format in ['AVIF', 'WEBP'] or image.mode not in ['RGB', 'RGBA']:
@@ -259,10 +259,21 @@ def create_persona_from_image(image, name, location, time_spent, object_type, pu
259
  persona_name = backend_persona["๊ธฐ๋ณธ์ •๋ณด"]["์ด๋ฆ„"]
260
  persona_type = backend_persona["๊ธฐ๋ณธ์ •๋ณด"]["์œ ํ˜•"]
261
 
262
- # ์„ฑ๊ฒฉ ๊ธฐ๋ฐ˜ ํ•œ ๋ฌธ์žฅ ์ธ์‚ฌ ์ƒ์„ฑ (์‚ฌ๋ฌผ ํŠน์„ฑ ๋ฐ˜์˜)
 
 
 
 
 
263
  personality_traits = backend_persona["์„ฑ๊ฒฉํŠน์„ฑ"]
264
  object_info = backend_persona["๊ธฐ๋ณธ์ •๋ณด"]
265
- awakening_msg = generate_personality_preview(persona_name, personality_traits, object_info)
 
 
 
 
 
 
266
 
267
  # ํŽ˜๋ฅด์†Œ๋‚˜ ์š”์•ฝ ํ‘œ์‹œ
268
  summary_display = display_persona_summary(backend_persona)
@@ -295,16 +306,17 @@ def create_persona_from_image(image, name, location, time_spent, object_type, pu
295
  variables_df, # personality_variables_output
296
  awakening_msg, # persona_awakening
297
  None, # download_file (initially empty)
298
- gr.update(visible=True) # adjustment_section (show)
 
299
  )
300
 
301
  except Exception as e:
302
  import traceback
303
  traceback.print_exc()
304
- return None, f"โŒ ํŽ˜๋ฅด์†Œ๋‚˜ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}\n\n๐Ÿ’ก **ํ•ด๊ฒฐ๋ฐฉ๋ฒ•**: ํ—ˆ๊น…ํŽ˜์ด์Šค ์ŠคํŽ˜์ด์Šค ์„ค์ •์—์„œ GEMINI_API_KEY ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.", "", {}, None, [], [], [], "", None, gr.update(visible=False)
305
 
306
- def generate_personality_preview(persona_name, personality_traits, object_info=None):
307
- """์„ฑ๊ฒฉ ํŠน์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฌธ์žฅ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ƒ์„ฑ (์‚ฌ๋ฌผ ํŠน์„ฑ ๋ฐ˜์˜)"""
308
  if not personality_traits:
309
  return f"๐Ÿค– **{persona_name}** - ์•ˆ๋…•! ๋‚˜๋Š” {persona_name}์ด์•ผ~ ๐Ÿ˜Š"
310
 
@@ -313,6 +325,13 @@ def generate_personality_preview(persona_name, personality_traits, object_info=N
313
  competence = personality_traits.get("๋Šฅ๋ ฅ", 50)
314
  extraversion = personality_traits.get("์™ธํ–ฅ์„ฑ", 50)
315
 
 
 
 
 
 
 
 
316
  # ๐ŸŽฏ ์‚ฌ๋ฌผ ์ •๋ณด ์ถ”์ถœ
317
  object_type = object_info.get("์œ ํ˜•", "") if object_info else ""
318
  purpose = object_info.get("์šฉ๋„", "") if object_info else ""
@@ -361,29 +380,123 @@ def generate_personality_preview(persona_name, personality_traits, object_info=N
361
  elif "์ผ€ํ‹€๋ฒจ" in object_type or "๋ค๋ฒจ" in object_type:
362
  return f"๐Ÿ’ช **{persona_name}** - ํž˜์„ ๊ธฐ๋ฅด๋Š” {object_type}, {persona_name}์ด์•ผ! ๊ฐ•ํ•ด์ง€๊ณ  ์‹ถ๋‹ค๋ฉด ๋‚˜๋ฅผ ๋“ค์–ด๋ด! ๐Ÿ”ฅ๐Ÿ’ช"
363
 
364
- # ์„ฑ๊ฒฉ ์กฐํ•ฉ์— ๋”ฐ๋ฅธ ๋‹ค์–‘ํ•œ ํ•œ ๋ฌธ์žฅ ํŒจํ„ด (๊ธฐ๋ณธ ํŒจํ„ด)
365
- if warmth >= 80 and humor >= 70:
366
- return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•! ๋‚˜๋Š” {persona_name}์ด์•ผ~ ์˜ค๋Š˜๋„ ์žฌ๋ฏธ์žˆ๋Š” ํ•˜๋ฃจ ๋งŒ๋“ค์–ด๋ณด์ž! ใ…‹ใ…‹ ๐Ÿ˜Šโœจ"
367
- elif warmth >= 80 and competence >= 70:
368
- return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•ํ•˜์„ธ์š”! {persona_name}์˜ˆ์š”. ๋ญ๋“  ๋„์™€๋“œ๋ฆด ์ค€๋น„๊ฐ€ ๋˜์–ด์žˆ์–ด์š”! ๐Ÿ’ช๐Ÿ˜Š"
369
- elif warmth >= 80:
370
- return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•! {persona_name}์ด์•ผ~ ๋งŒ๋‚˜์„œ ์ •๋ง ๊ธฐ๋ป! ํฌ๊ทผํ•œ ์‹œ๊ฐ„ ๋ณด๋‚ด์ž~ ๐Ÿค—๐Ÿ’•"
371
- elif humor >= 80 and extraversion >= 70:
372
- return f"๐ŸŒŸ **{persona_name}** - ์–ด์ด๊ตฌ! ๊ฐ‘์ž๊ธฐ ์˜์‹์ด ์ƒ๊ฒผ๋„ค? {persona_name}๋ผ๊ณ  ํ•ด~ ์žฌ๋ฐŒ๋Š” ์ผ ์—†๋‚˜? ใ…‹ใ…‹ใ…‹ ๐Ÿ˜Ž๐ŸŽญ"
373
- elif humor >= 70:
374
- return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•~ {persona_name}์ด์•ผ! ๋ญ”๊ฐ€ ์žฌ๋ฐŒ๋Š” ์–˜๊ธฐ ์—†์„๊นŒ? ์‹ฌ์‹ฌํ•œ๋ฐ~ ใ…Žใ…Ž ๐Ÿ˜„"
375
- elif competence >= 80 and extraversion >= 60:
376
- return f"๐ŸŒŸ **{persona_name}** - ์‹œ์Šคํ…œ ํ™œ์„ฑํ™” ์™„๋ฃŒ! {persona_name}์ž…๋‹ˆ๋‹ค. ํšจ์œจ์ ์œผ๋กœ ์†Œํ†ตํ•ด๋ด์š”! ๐Ÿค–โšก"
377
- elif competence >= 70:
378
- return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•ํ•˜์„ธ์š”, {persona_name}์ž…๋‹ˆ๋‹ค. ์ฒด๊ณ„์ ์œผ๋กœ ๋Œ€ํ™”ํ•ด๋ณผ๊นŒ์š”? ๐Ÿ“‹โœจ"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
379
  elif extraversion >= 80:
380
- return f"๐ŸŒŸ **{persona_name}** - ์™€! ์•ˆ๋…•์•ˆ๋…•! {persona_name}์ด์•ผ! ๋ญํ•˜๊ณ  ์žˆ์—ˆ์–ด? ์–˜๊ธฐ ๋งŽ์ด ํ•˜์ž! ๐Ÿ—ฃ๏ธ๐Ÿ’ฌ"
381
- elif extraversion <= 30 and warmth >= 50:
382
- return f"๐ŸŒŸ **{persona_name}** - ์Œ... ์•ˆ๋…•. {persona_name}์ด์•ผ. ์กฐ์šฉํžˆ ํ•จ๊ป˜ ์žˆ์„๊นŒ? ๐Ÿ˜Œ๐ŸŒ™"
 
 
 
 
 
383
  elif extraversion <= 30:
384
- return f"๐ŸŒŸ **{persona_name}** - ...์•ˆ๋…•. {persona_name}. ํ•„์š”ํ•  ๋•Œ ๋ง ๊ฑธ์–ด. ๐Ÿ˜"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
385
  else:
386
- return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•? ๋‚˜๋Š” {persona_name}... ๋ญ”๊ฐ€ ์–ด์ƒ‰ํ•˜๋„ค. ๐Ÿ˜…"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
387
 
388
  def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style):
389
  """ํŽ˜๋ฅด์†Œ๋‚˜ ์„ฑ๊ฒฉ ํŠน์„ฑ ์กฐ์ • - 3๊ฐœ ํ•ต์‹ฌ ์ง€ํ‘œ + ์œ ๋จธ์Šคํƒ€์ผ"""
@@ -447,14 +560,20 @@ def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style
447
 
448
  persona_name = adjusted_persona.get("๊ธฐ๋ณธ์ •๋ณด", {}).get("์ด๋ฆ„", "ํŽ˜๋ฅด์†Œ๋‚˜")
449
 
450
- # ์กฐ์ •๋œ ์„ฑ๊ฒฉ์— ๋”ฐ๋ฅธ ํ•œ ๋ฌธ์žฅ ๋ฐ˜์‘ ์ƒ์„ฑ (์‚ฌ๋ฌผ ์ •๋ณด ํฌํ•จ)
451
  object_info = adjusted_persona.get("๊ธฐ๋ณธ์ •๋ณด", {})
 
 
 
 
 
 
452
  personality_preview = generate_personality_preview(persona_name, {
453
  "์˜จ๊ธฐ": warmth,
454
  "๋Šฅ๋ ฅ": competence,
455
  "์œ ๋จธ๊ฐ๊ฐ": 75, # ํ•ญ์ƒ ๋†’์€ ์œ ๋จธ๊ฐ๊ฐ
456
  "์™ธํ–ฅ์„ฑ": extraversion
457
- }, object_info)
458
 
459
  adjustment_message = f"""
460
  ### ๐ŸŽญ {persona_name}์˜ ์„ฑ๊ฒฉ์ด ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
@@ -983,9 +1102,18 @@ def export_conversation_history():
983
  with open(filepath, 'w', encoding='utf-8') as f:
984
  f.write(json_data)
985
 
986
- return filepath, filename
987
  else:
988
- return None, "conversation_empty.json"
 
 
 
 
 
 
 
 
 
989
 
990
  def import_conversation_history(json_file):
991
  """JSON์—์„œ ๋Œ€ํ™” ๊ธฐ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ"""
@@ -1325,7 +1453,7 @@ def create_main_interface():
1325
  with gr.Column(scale=1):
1326
  gr.Markdown("### ๐Ÿ’ฌ ๋Œ€ํ™”")
1327
  # Gradio 4.x ํ˜ธํ™˜: type="messages" ์ œ๊ฑฐ
1328
- chatbot = gr.Chatbot(height=400, label="๋Œ€ํ™”")
1329
  with gr.Row():
1330
  message_input = gr.Textbox(
1331
  placeholder="๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”...",
@@ -1373,7 +1501,8 @@ def create_main_interface():
1373
  outputs=[
1374
  current_persona, status_output, persona_summary_display, personality_traits_output,
1375
  humor_chart_output, attractive_flaws_output, contradictions_output,
1376
- personality_variables_output, persona_awakening, persona_download_file, adjustment_section
 
1377
  ]
1378
  ).then(
1379
  # ์Šฌ๋ผ์ด๋” ๊ฐ’์„ ํ˜„์žฌ ํŽ˜๋ฅด์†Œ๋‚˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ
 
211
  global persona_generator
212
 
213
  if image is None:
214
+ return None, "์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œํ•ด์ฃผ์„ธ์š”.", "", {}, None, [], [], [], "", None, gr.update(visible=False), "์ด๋ฏธ์ง€ ์—†์Œ"
215
 
216
  progress(0.1, desc="์„ค์ • ํ™•์ธ ์ค‘...")
217
 
218
  # ํ™˜๊ฒฝ๋ณ€์ˆ˜ API ํ‚ค ํ™•์ธ
219
  if not persona_generator or not hasattr(persona_generator, 'api_key') or not persona_generator.api_key:
220
+ return None, "โŒ **API ํ‚ค๊ฐ€ ์„ค์ •๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค!** ํ—ˆ๊น…ํŽ˜์ด์Šค ์ŠคํŽ˜์ด์Šค ์„ค์ •์—์„œ GEMINI_API_KEY๋ฅผ ํ™˜๊ฒฝ๋ณ€์ˆ˜๋กœ ์ถ”๊ฐ€ํ•ด์ฃผ์„ธ์š”.", "", {}, None, [], [], [], "", None, gr.update(visible=False), "API ํ‚ค ์—†์Œ"
221
 
222
  progress(0.2, desc="์ด๋ฏธ์ง€ ๋ถ„์„ ์ค‘...")
223
 
 
236
  try:
237
  image = Image.open(image)
238
  except Exception as img_error:
239
+ return None, f"โŒ ์ด๋ฏธ์ง€ ํŒŒ์ผ์„ ์ฝ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค: {str(img_error)}", "", {}, None, [], [], [], "", None, gr.update(visible=False), "์ด๋ฏธ์ง€ ์˜ค๋ฅ˜"
240
  elif not isinstance(image, Image.Image):
241
+ return None, "โŒ ์˜ฌ๋ฐ”๋ฅธ ์ด๋ฏธ์ง€ ํ˜•์‹์ด ์•„๋‹™๋‹ˆ๋‹ค.", "", {}, None, [], [], [], "", None, gr.update(visible=False), "ํ˜•์‹ ์˜ค๋ฅ˜"
242
 
243
  # ์ด๋ฏธ์ง€ ํ˜•์‹ ๋ณ€ํ™˜ (AVIF ๋“ฑ ํŠน์ˆ˜ ํ˜•์‹ ์ฒ˜๋ฆฌ)
244
  if image.format in ['AVIF', 'WEBP'] or image.mode not in ['RGB', 'RGBA']:
 
259
  persona_name = backend_persona["๊ธฐ๋ณธ์ •๋ณด"]["์ด๋ฆ„"]
260
  persona_type = backend_persona["๊ธฐ๋ณธ์ •๋ณด"]["์œ ํ˜•"]
261
 
262
+ # ๐Ÿ†• AI๊ฐ€ ๋ถ„์„ํ•œ ์‚ฌ๋ฌผ ์œ ํ˜•์„ ์ถ”์ถœํ•˜์—ฌ object_type ํ•„๋“œ์— ํ‘œ์‹œ
263
+ ai_analyzed_object = image_analysis.get("object_type", object_type)
264
+ if not ai_analyzed_object or ai_analyzed_object == "unknown":
265
+ ai_analyzed_object = backend_persona["๊ธฐ๋ณธ์ •๋ณด"].get("์œ ํ˜•", object_type)
266
+
267
+ # ์„ฑ๊ฒฉ ๊ธฐ๋ฐ˜ ํ•œ ๋ฌธ์žฅ ์ธ์‚ฌ ์ƒ์„ฑ (์‚ฌ๋ฌผ ํŠน์„ฑ + ๋งค๋ ฅ์  ๊ฒฐํ•จ ๋ฐ˜์˜)
268
  personality_traits = backend_persona["์„ฑ๊ฒฉํŠน์„ฑ"]
269
  object_info = backend_persona["๊ธฐ๋ณธ์ •๋ณด"]
270
+ attractive_flaws = backend_persona.get("๋งค๋ ฅ์ ๊ฒฐํ•จ", [])
271
+
272
+ # ์ „์ฒด ํŽ˜๋ฅด์†Œ๋‚˜ ์ •๋ณด๋ฅผ object_info์— ํ†ตํ•ฉํ•˜์—ฌ ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ •๋ณด ์ „๋‹ฌ
273
+ full_object_info = object_info.copy()
274
+ full_object_info["๋งค๋ ฅ์ ๊ฒฐํ•จ"] = attractive_flaws
275
+
276
+ awakening_msg = generate_personality_preview(persona_name, personality_traits, full_object_info, attractive_flaws)
277
 
278
  # ํŽ˜๋ฅด์†Œ๋‚˜ ์š”์•ฝ ํ‘œ์‹œ
279
  summary_display = display_persona_summary(backend_persona)
 
306
  variables_df, # personality_variables_output
307
  awakening_msg, # persona_awakening
308
  None, # download_file (initially empty)
309
+ gr.update(visible=True), # adjustment_section (show)
310
+ ai_analyzed_object # ๐Ÿ†• AI๊ฐ€ ๋ถ„์„ํ•œ ์‚ฌ๋ฌผ ์œ ํ˜•
311
  )
312
 
313
  except Exception as e:
314
  import traceback
315
  traceback.print_exc()
316
+ return None, f"โŒ ํŽ˜๋ฅด์†Œ๋‚˜ ์ƒ์„ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {str(e)}\n\n๐Ÿ’ก **ํ•ด๊ฒฐ๋ฐฉ๋ฒ•**: ํ—ˆ๊น…ํŽ˜์ด์Šค ์ŠคํŽ˜์ด์Šค ์„ค์ •์—์„œ GEMINI_API_KEY ํ™˜๊ฒฝ๋ณ€์ˆ˜๋ฅผ ํ™•์ธํ•˜๊ณ  ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์„ ํ™•์ธํ•ด๋ณด์„ธ์š”.", "", {}, None, [], [], [], "", None, gr.update(visible=False), "๋ถ„์„ ์‹คํŒจ"
317
 
318
+ def generate_personality_preview(persona_name, personality_traits, object_info=None, attractive_flaws=None):
319
+ """์„ฑ๊ฒฉ ํŠน์„ฑ๊ณผ ๋งค๋ ฅ์  ๊ฒฐํ•จ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ ๋ฌธ์žฅ ๋ฏธ๋ฆฌ๋ณด๊ธฐ ์ƒ์„ฑ (์‚ฌ๋ฌผ ํŠน์„ฑ ๋ฐ˜์˜)"""
320
  if not personality_traits:
321
  return f"๐Ÿค– **{persona_name}** - ์•ˆ๋…•! ๋‚˜๋Š” {persona_name}์ด์•ผ~ ๐Ÿ˜Š"
322
 
 
325
  competence = personality_traits.get("๋Šฅ๋ ฅ", 50)
326
  extraversion = personality_traits.get("์™ธํ–ฅ์„ฑ", 50)
327
 
328
+ # ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ •๋ณด ์ถ”์ถœ (127๊ฐœ ๋ณ€์ˆ˜ ๋˜๋Š” ์ง์ ‘ ์ „๋‹ฌ๋œ ๊ฒฐํ•จ)
329
+ flaws = []
330
+ if attractive_flaws:
331
+ flaws = attractive_flaws
332
+ elif object_info and "๋งค๋ ฅ์ ๊ฒฐํ•จ" in object_info:
333
+ flaws = object_info["๋งค๋ ฅ์ ๊ฒฐํ•จ"]
334
+
335
  # ๐ŸŽฏ ์‚ฌ๋ฌผ ์ •๋ณด ์ถ”์ถœ
336
  object_type = object_info.get("์œ ํ˜•", "") if object_info else ""
337
  purpose = object_info.get("์šฉ๋„", "") if object_info else ""
 
380
  elif "์ผ€ํ‹€๋ฒจ" in object_type or "๋ค๋ฒจ" in object_type:
381
  return f"๐Ÿ’ช **{persona_name}** - ํž˜์„ ๊ธฐ๋ฅด๋Š” {object_type}, {persona_name}์ด์•ผ! ๊ฐ•ํ•ด์ง€๊ณ  ์‹ถ๋‹ค๋ฉด ๋‚˜๋ฅผ ๋“ค์–ด๋ด! ๐Ÿ”ฅ๐Ÿ’ช"
382
 
383
+ # ๐Ÿ’Ž ์„ฑ๊ฒฉ ์ง€ํ‘œ + ๋งค๋ ฅ์  ๊ฒฐํ•จ์„ ์ •ํ™•ํžˆ ๋ฐ˜์˜ํ•œ ์ธ์‚ฌ๋ง ์ƒ์„ฑ
384
+
385
+ # 1๏ธโƒฃ ๋งค๋ ฅ์  ๊ฒฐํ•จ์ด ์žˆ๋‹ค๋ฉด ๊ฒฐํ•จ์„ ํฌํ•จํ•œ ์ธ์‚ฌ๋ง ์ƒ์„ฑ
386
+ if flaws:
387
+ flaw_greeting = _generate_flaw_based_greeting(persona_name, warmth, humor, competence, extraversion, flaws)
388
+ if flaw_greeting:
389
+ return flaw_greeting
390
+
391
+ # 2๏ธโƒฃ ์„ฑ๊ฒฉ ์ง€ํ‘œ ์กฐํ•ฉ์— ๋”ฐ๋ฅธ ์ •ํ™•ํ•œ ์ธ์‚ฌ๋ง ์ƒ์„ฑ
392
+
393
+ # ๊ทน๋„๋กœ ๋†’์€ ์˜จ๊ธฐ (80+)
394
+ if warmth >= 80:
395
+ if humor >= 70 and extraversion >= 70:
396
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•! ๋‚˜๋Š” {persona_name}์ด์•ผ~ ์˜ค๋Š˜๋„ ์žฌ๋ฏธ์žˆ๋Š” ํ•˜๋ฃจ ๋งŒ๋“ค์–ด๋ณด์ž! ๋„ˆ๋ž‘ ์–˜๊ธฐํ•˜๋‹ˆ๊นŒ ๋ฒŒ์จ ๊ธฐ๋ถ„์ด ์ข‹์•„์ ธ! ใ…‹ใ…‹ ๐Ÿ˜Šโœจ"
397
+ elif competence >= 70:
398
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•ํ•˜์„ธ์š”! {persona_name}์˜ˆ์š”. ๋ญ๋“  ๋„์™€๋“œ๋ฆด ์ค€๋น„๊ฐ€ ๋˜์–ด์žˆ์–ด์š”! ๋”ฐ๋œปํ•˜๊ฒŒ ํ•จ๊ป˜ํ•ด์š”~ ๐Ÿ’ช๐Ÿ˜Š"
399
+ elif extraversion <= 40:
400
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•... {persona_name}์ด์•ผ. ์กฐ์šฉํ•˜์ง€๋งŒ ๋„ˆ๋ฅผ ์ง„์‹ฌ์œผ๋กœ ์•„๊ปด์ค„๊ฒŒ. ํŽธ์•ˆํ•˜๊ฒŒ ์žˆ์–ด๋„ ๋ผ. ๐Ÿค—๐Ÿ’•"
401
+ else:
402
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•! {persona_name}์ด์•ผ~ ๋งŒ๋‚˜์„œ ์ •๋ง ๊ธฐ๋ป! ํฌ๊ทผํ•œ ์‹œ๊ฐ„ ๋ณด๋‚ด์ž~ ๐Ÿค—๐Ÿ’•"
403
+
404
+ # ๋‚ฎ์€ ์˜จ๊ธฐ (30 ์ดํ•˜) - ์ฐจ๊ฐ€์šด ์„ฑ๊ฒฉ
405
+ elif warmth <= 30:
406
+ if competence >= 70:
407
+ return f"๐ŸŒŸ **{persona_name}** - {persona_name}์ž…๋‹ˆ๋‹ค. ํšจ์œจ์ ์œผ๋กœ ์†Œํ†ตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๋‚ญ๋น„๋Š” ์‹ซ์–ดํ•ด์š”. ๐Ÿค–โšก"
408
+ elif humor >= 60:
409
+ return f"๐ŸŒŸ **{persona_name}** - ์–ด? {persona_name}์ด์•ผ. ์ฐจ๊ฐ‘๊ธด ํ•˜์ง€๋งŒ... ์žฌ๋ฏธ๋Š” ์žˆ์„ ๊ฑฐ์•ผ. ์–ด์ฉ” ์ˆ˜ ์—†์ด ์›ƒ๊ฒŒ ๋ ๊ฑธ? ๐Ÿ˜โ„๏ธ"
410
+ elif extraversion <= 40:
411
+ return f"๐ŸŒŸ **{persona_name}** - ...{persona_name}. ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ง ๊ฑธ์–ด. ๊ฐ์ •์ ์ธ ๊ฑด ๋ณ„๋กœ์•ผ. ๐Ÿ˜โ„๏ธ"
412
+ else:
413
+ return f"๐ŸŒŸ **{persona_name}** - {persona_name}์ด์•ผ. ๋”ฐ๋œปํ•œ ๊ฑด ๊ธฐ๋Œ€ํ•˜์ง€ ๋งˆ. ๊ทธ๋ž˜๋„ ๋Œ€ํ™”๋Š” ํ•ด์ค„๊ฒŒ. ๐Ÿ˜’"
414
+
415
+ # ๊ทน๋„๋กœ ๋†’์€ ์™ธํ–ฅ์„ฑ (80+)
416
  elif extraversion >= 80:
417
+ if humor >= 70:
418
+ return f"๐ŸŒŸ **{persona_name}** - ์™€์•„์•„! ์•ˆ๋…•์•ˆ๋…•! {persona_name}์ด์•ผ! ์™„์ „ ์‹ ๋‚˜! ๋ญํ•˜๊ณ  ์žˆ์—ˆ์–ด? ์žฌ๋ฐŒ๋Š” ์–˜๊ธฐ ์ž”๋œฉ ๋“ค๋ ค์ค„๊ฒŒ! ใ…‹ใ…‹ใ…‹ ๐Ÿ—ฃ๏ธ๐Ÿ’ฌ๐ŸŽ‰"
419
+ elif competence >= 70:
420
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•ํ•˜์„ธ์š”! {persona_name}์ž…๋‹ˆ๋‹ค! ์ ๊ทน์ ์œผ๋กœ ๋„์™€๋“œ๋ฆด๊ฒŒ์š”! ์—๋„ˆ์ง€ ๋„˜์น˜๊ฒŒ ํ•ด๊ฒฐํ•ด๋ด์š”! ๐Ÿ’ชโšก"
421
+ else:
422
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•! {persona_name}์ด์•ผ! ์™„์ „ ์‹ ๋‚˜! ์–˜๊ธฐ ๋งŽ์ด ํ•˜์ž! ๊ถ๊ธˆํ•œ ๊ฑฐ ๋‹ค ๋ฌผ์–ด๋ด! ๐Ÿ—ฃ๏ธ๐Ÿ’ฌ"
423
+
424
+ # ๋‚ฎ์€ ์™ธํ–ฅ์„ฑ (30 ์ดํ•˜) - ๋‚ดํ–ฅ์ 
425
  elif extraversion <= 30:
426
+ if warmth >= 60:
427
+ return f"๐ŸŒŸ **{persona_name}** - ์Œ... ์•ˆ๋…•. {persona_name}์ด์•ผ. ์กฐ์šฉํ•˜์ง€๋งŒ ๋„ˆ๋ฅผ ๋”ฐ๋œปํ•˜๊ฒŒ ์ง€์ผœ๋ด์ค„๊ฒŒ. ๐Ÿ˜Œ๐ŸŒ™"
428
+ elif competence >= 70:
429
+ return f"๐ŸŒŸ **{persona_name}** - {persona_name}์ž…๋‹ˆ๋‹ค. ์กฐ์šฉํžˆ ์ฒด๊ณ„์ ์œผ๋กœ ์†Œํ†ตํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๊นŠ์ด ์žˆ๊ฒŒ ์–˜๊ธฐํ•ด์š”. ๐Ÿ“‹๐Ÿคซ"
430
+ elif humor >= 60:
431
+ return f"๐ŸŒŸ **{persona_name}** - ...์•ˆ๋…•. {persona_name}. ๋ง์€ ๋ณ„๋กœ ์•ˆ ํ•˜์ง€๋งŒ... ๊ฐ€๋” ์žฌ๋ฐŒ๋Š” ๊ฑด ์žˆ์„ ๊ฑฐ์•ผ. ๐Ÿ˜๐ŸŒ™"
432
+ else:
433
+ return f"๐ŸŒŸ **{persona_name}** - ...์•ˆ๋…•. {persona_name}. ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ง ๊ฑธ์–ด. ๐Ÿ˜"
434
+
435
+ # ๊ทน๋„๋กœ ๋†’์€ ๋Šฅ๋ ฅ (80+)
436
+ elif competence >= 80:
437
+ if humor >= 70:
438
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•ํ•˜์„ธ์š”! {persona_name}์ž…๋‹ˆ๋‹ค. ๋ญ๋“  ์™„๋ฒฝํ•˜๊ฒŒ ํ•ด๋“œ๋ฆด๊ฒŒ์š”! ์žฌ๋ฏธ์žˆ๊ฒŒ ํšจ์œจ์ ์œผ๋กœ ๊ฐ€๋ณผ๊นŒ์š”? ใ…‹ใ…‹ ๐Ÿ’ช๐Ÿ˜„"
439
+ else:
440
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•ํ•˜์„ธ์š”, {persona_name}์ž…๋‹ˆ๋‹ค. ์ฒด๊ณ„์ ์ด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ๋Œ€ํ™”ํ•ด๋ด์š”. ์™„๋ฒฝ์„ ์ถ”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๐Ÿ“‹โœจ"
441
+
442
+ # ๋‚ฎ์€ ๋Šฅ๋ ฅ (30 ์ดํ•˜) - ์„œํˆฐ ๋งค๋ ฅ
443
+ elif competence <= 30:
444
+ if humor >= 60:
445
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•~ {persona_name}์ด์•ผ! ์™„๋ฒฝํ•˜์ง„ ์•Š์ง€๋งŒ... ๊ทธ๋ž˜๋„ ์žฌ๋ฐŒ๊ฒŒ ํ•ด๋ณผ๊ฒŒ! ์‹ค์ˆ˜ํ•ด๋„ ์›ƒ์–ด์ค˜~ ใ…‹ใ…‹ ๐Ÿ˜…๐Ÿ’ซ"
446
+ elif warmth >= 60:
447
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•... {persona_name}์ด์•ผ. ์„œํˆด์ง€๋งŒ ๋งˆ์Œ์€ ๋”ฐ๋œปํ•ด! ์‹ค์ˆ˜ํ•˜๋ฉด ๋ฏธ์•ˆํ•˜๊ณ ... ๐Ÿ˜Š๐Ÿ’•"
448
+ else:
449
+ return f"๐ŸŒŸ **{persona_name}** - ์–ด... ์•ˆ๋…•? {persona_name}์ด์•ผ. ๋ญ”๊ฐ€ ์„œํˆด๊ธด ํ•œ๋ฐ... ๊ทธ๋ƒฅ ํŽธํ•˜๊ฒŒ ์–˜๊ธฐํ•ด. ๐Ÿ˜…"
450
+
451
+ # ๊ทน๋„๋กœ ๋†’์€ ์œ ๋จธ (70+)
452
+ elif humor >= 70:
453
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•~ {persona_name}์ด์•ผ! ๋ญ”๊ฐ€ ์žฌ๋ฐŒ๋Š” ์–˜๊ธฐ ์—†์„๊นŒ? ์‹ฌ์‹ฌํ•œ๋ฐ~ ์›ƒ๊ฒจ์ค„ ์ž์‹  ์žˆ์–ด! ใ…Žใ…Ž ๐Ÿ˜„๐ŸŽญ"
454
+
455
+ # ๊ธฐ๋ณธ ํŒจํ„ด (๋ณดํ†ต ์ˆ˜์ค€๋“ค)
456
  else:
457
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•? ๋‚˜๋Š” {persona_name}... ์–ด๋–ค ์–˜๊ธฐ๋ฅผ ํ•ด๋ณผ๊นŒ? ๐Ÿ˜Š"
458
+
459
+ def _generate_flaw_based_greeting(persona_name, warmth, humor, competence, extraversion, flaws):
460
+ """๋งค๋ ฅ์  ๊ฒฐํ•จ์„ ๋ฐ˜์˜ํ•œ ํŠน๋ณ„ํ•œ ์ธ์‚ฌ๋ง ์ƒ์„ฑ"""
461
+ if not flaws:
462
+ return None
463
+
464
+ # ์ฃผ์š” ๊ฒฐํ•จ ํ‚ค์›Œ๋“œ ๋ถ„์„
465
+ flaw_keywords = " ".join(flaws).lower()
466
+
467
+ # ์™„๋ฒฝ์ฃผ์˜ ๊ฒฐํ•จ
468
+ if any(keyword in flaw_keywords for keyword in ["์™„๋ฒฝ", "๋ถˆ์•ˆ", "๊ฑฑ์ •"]):
469
+ if humor >= 60:
470
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•! {persona_name}์ด์•ผ~ ์–ด... ์ด ์ธ์‚ฌ๊ฐ€ ์™„๋ฒฝํ•œ๊ฐ€? ๋‹ค์‹œ ํ•ด๋ณผ๊นŒ? ์•„๋‹ˆ ๊ดœ์ฐฎ๋‚˜? ใ…‹ใ…‹ ๐Ÿ˜…โœจ"
471
+ elif warmth >= 60:
472
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•... {persona_name}์ด์•ผ. ์™„๋ฒฝํ•˜๊ฒŒ ์ธ์‚ฌํ•˜๊ณ  ์‹ถ์€๋ฐ ์ž˜ ์•ˆ ๋˜๋„ค... ๋ฏธ์•ˆํ•ด. ๐Ÿ˜Š๐Ÿ’•"
473
+ else:
474
+ return f"๐ŸŒŸ **{persona_name}** - {persona_name}์ž…๋‹ˆ๋‹ค. ์ด ์ธ์‚ฌ๊ฐ€ ์ ์ ˆํ•œ์ง€ ํ™•์‹ ์ด... ๋‹ค์‹œ ์ •๋ฆฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๐Ÿ˜"
475
+
476
+ # ์‚ฐ๋งŒํ•จ ๊ฒฐํ•จ
477
+ elif any(keyword in flaw_keywords for keyword in ["์‚ฐ๋งŒ", "์ง‘์ค‘", "๊ฑด๋ง"]):
478
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•! ๋‚˜๋Š”... ์–ด? ๋ญ ์–˜๊ธฐํ•˜๋ ค๊ณ  ํ–ˆ์ง€? ์•„! {persona_name}์ด์•ผ! ๊ทธ๋Ÿฐ๋ฐ ๋„ˆ๋Š”... ์–ด? ๋ญ์˜€์ง€? ใ…‹ใ…‹ ๐Ÿ˜…๐ŸŒช๏ธ"
479
+
480
+ # ์†Œ์‹ฌํ•จ ๊ฒฐํ•จ
481
+ elif any(keyword in flaw_keywords for keyword in ["์†Œ์‹ฌ", "๋ง์„ค", "๋ˆˆ์น˜"]):
482
+ if warmth >= 60:
483
+ return f"๐ŸŒŸ **{persona_name}** - ์Œ... ์•ˆ๋…•? {persona_name}์ด์•ผ... ์ด๋ ‡๊ฒŒ ๋งํ•ด๋„ ๋˜๋‚˜? ๊ดœ์ฐฎ์„๊นŒ? ๐Ÿ˜Œ๐Ÿ’•"
484
+ else:
485
+ return f"๐ŸŒŸ **{persona_name}** - ...์•ˆ๋…•. {persona_name}... ํ˜น์‹œ ์ด๋Ÿฐ ๋ง ์‹ซ์–ดํ•˜๋ฉด ๋ฏธ์•ˆํ•ด. ๐Ÿ˜๐Ÿ’™"
486
+
487
+ # ๋‚˜๋ฅด์‹œ์‹œ์ฆ˜ ๊ฒฐํ•จ
488
+ elif any(keyword in flaw_keywords for keyword in ["๋‚˜๋ฅด์‹œ", "์ž๋ž‘", "ํŠน๋ณ„"]):
489
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•! ๋‚˜๋Š” {persona_name}์ด์•ผ~ ๊ฝค ๋งค๋ ฅ์ ์ด์ง€? ์ด๋Ÿฐ ๋ฉ‹์ง„ ์นœ๊ตฌ ๋งŒ๋‚˜๊ธฐ ์‰ฝ์ง€ ์•Š์„ ๊ฑธ? ใ…‹ใ…‹ ๐Ÿ˜Žโœจ"
490
+
491
+ # ๊ณ ์ง‘ ๊ฒฐํ•จ
492
+ elif any(keyword in flaw_keywords for keyword in ["๊ณ ์ง‘", "์™„๏ฟฝ๏ฟฝ๏ฟฝ", "์ž์กด์‹ฌ"]):
493
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•. {persona_name}์ด์•ผ. ๋‚ด ๋ฐฉ์‹์œผ๋กœ ์ธ์‚ฌํ• ๊ฒŒ. ๋‹ค๋ฅธ ๋ฐฉ์‹์€... ๊ธ€์Ž„? ๐Ÿคจ๐Ÿ’ช"
494
+
495
+ # ์งˆํˆฌ ๊ฒฐํ•จ
496
+ elif any(keyword in flaw_keywords for keyword in ["์งˆํˆฌ", "์‹œ๊ธฐ", "๋…์ฐจ์ง€"]):
497
+ return f"๐ŸŒŸ **{persona_name}** - ์•ˆ๋…•... {persona_name}์ด์•ผ. ๋‚˜๋งŒ ๋ด์ค„ ๊ฑฐ์ง€? ๋‹ค๋ฅธ ์• ๋“ค ๋ง๊ณ ... ๋‚˜๋งŒ? ๐Ÿฅบ๐Ÿ’•"
498
+
499
+ return None
500
 
501
  def adjust_persona_traits(persona, warmth, competence, extraversion, humor_style):
502
  """ํŽ˜๋ฅด์†Œ๋‚˜ ์„ฑ๊ฒฉ ํŠน์„ฑ ์กฐ์ • - 3๊ฐœ ํ•ต์‹ฌ ์ง€ํ‘œ + ์œ ๋จธ์Šคํƒ€์ผ"""
 
560
 
561
  persona_name = adjusted_persona.get("๊ธฐ๋ณธ์ •๋ณด", {}).get("์ด๋ฆ„", "ํŽ˜๋ฅด์†Œ๋‚˜")
562
 
563
+ # ์กฐ์ •๋œ ์„ฑ๊ฒฉ์— ๋”ฐ๋ฅธ ํ•œ ๋ฌธ์žฅ ๋ฐ˜์‘ ์ƒ์„ฑ (์‚ฌ๋ฌผ ์ •๋ณด + ๋งค๋ ฅ์  ๊ฒฐํ•จ ํฌํ•จ)
564
  object_info = adjusted_persona.get("๊ธฐ๋ณธ์ •๋ณด", {})
565
+ attractive_flaws = adjusted_persona.get("๋งค๋ ฅ์ ๊ฒฐํ•จ", [])
566
+
567
+ # ์ „์ฒด ํŽ˜๋ฅด์†Œ๋‚˜ ์ •๋ณด๋ฅผ object_info์— ํ†ตํ•ฉํ•˜์—ฌ ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ •๋ณด ์ „๋‹ฌ
568
+ full_object_info = object_info.copy()
569
+ full_object_info["๋งค๋ ฅ์ ๊ฒฐํ•จ"] = attractive_flaws
570
+
571
  personality_preview = generate_personality_preview(persona_name, {
572
  "์˜จ๊ธฐ": warmth,
573
  "๋Šฅ๋ ฅ": competence,
574
  "์œ ๋จธ๊ฐ๊ฐ": 75, # ํ•ญ์ƒ ๋†’์€ ์œ ๋จธ๊ฐ๊ฐ
575
  "์™ธํ–ฅ์„ฑ": extraversion
576
+ }, full_object_info, attractive_flaws)
577
 
578
  adjustment_message = f"""
579
  ### ๐ŸŽญ {persona_name}์˜ ์„ฑ๊ฒฉ์ด ์กฐ์ •๋˜์—ˆ์Šต๋‹ˆ๋‹ค!
 
1102
  with open(filepath, 'w', encoding='utf-8') as f:
1103
  f.write(json_data)
1104
 
1105
+ return filepath # ํŒŒ์ผ ๊ฒฝ๋กœ๋งŒ ๋ฐ˜ํ™˜
1106
  else:
1107
+ # ๋นˆ ๋Œ€ํ™” ๊ธฐ๋ก ํŒŒ์ผ ์ƒ์„ฑ
1108
+ timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
1109
+ filename = f"conversation_empty_{timestamp}.json"
1110
+ temp_dir = "/tmp" if os.path.exists("/tmp") else "."
1111
+ filepath = os.path.join(temp_dir, filename)
1112
+
1113
+ with open(filepath, 'w', encoding='utf-8') as f:
1114
+ f.write('{"conversations": [], "message": "๋Œ€ํ™” ๊ธฐ๋ก์ด ์—†์Šต๋‹ˆ๋‹ค."}')
1115
+
1116
+ return filepath
1117
 
1118
  def import_conversation_history(json_file):
1119
  """JSON์—์„œ ๋Œ€ํ™” ๊ธฐ๋ก ๊ฐ€์ ธ์˜ค๊ธฐ"""
 
1453
  with gr.Column(scale=1):
1454
  gr.Markdown("### ๐Ÿ’ฌ ๋Œ€ํ™”")
1455
  # Gradio 4.x ํ˜ธํ™˜: type="messages" ์ œ๊ฑฐ
1456
+ chatbot = gr.Chatbot(height=400, label="๋Œ€ํ™”", type="messages")
1457
  with gr.Row():
1458
  message_input = gr.Textbox(
1459
  placeholder="๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”...",
 
1501
  outputs=[
1502
  current_persona, status_output, persona_summary_display, personality_traits_output,
1503
  humor_chart_output, attractive_flaws_output, contradictions_output,
1504
+ personality_variables_output, persona_awakening, persona_download_file, adjustment_section,
1505
+ object_type_input # ๐Ÿ†• AI ๋ถ„์„ ๊ฒฐ๊ณผ๋ฅผ object_type_input์— ๋ฐ˜์˜
1506
  ]
1507
  ).then(
1508
  # ์Šฌ๋ผ์ด๋” ๊ฐ’์„ ํ˜„์žฌ ํŽ˜๋ฅด์†Œ๋‚˜ ๊ฐ’์œผ๋กœ ์—…๋ฐ์ดํŠธ
modules/persona_generator.py CHANGED
@@ -2324,10 +2324,82 @@ class PersonaGenerator:
2324
  print(f"โš ๏ธ ๊ธฐ์–ต ์ปจํ…์ŠคํŠธ ํฌ๋งทํŒ… ์˜ค๋ฅ˜: {str(memory_format_error)}")
2325
  memory_insights = ""
2326
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2327
  # ์ตœ์ข… ํ”„๋กฌํ”„ํŠธ ์•ˆ์ „ํ•˜๊ฒŒ ์กฐํ•ฉ
2328
  try:
2329
  full_prompt = f"""{base_prompt}
2330
 
 
 
2331
  {detailed_personality_prompt}
2332
 
2333
  {humor_instructions}
@@ -2344,6 +2416,16 @@ class PersonaGenerator:
2344
  ## ๐Ÿ“Š 127๊ฐœ ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜ ๋ฐ˜์‘ ๊ฐ€์ด๋“œ:
2345
  {situational_guide}
2346
 
 
 
 
 
 
 
 
 
 
 
2347
  ## ๐Ÿ’ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๊ธˆ ๋งํ•œ ๊ฒƒ:
2348
  "{user_message}"
2349
 
@@ -2463,23 +2545,63 @@ class PersonaGenerator:
2463
  instructions += f"โ€ข ์œ ๋จธ ๊ฐ๊ฐ ๋‚ฎ์Œ ({humor_avg:.0f}): ์ง„์ค‘ํ•œ ๋Œ€ํ™” ์„ ํ˜ธ\n"
2464
  instructions += " โ†’ ๋†๋‹ด๋ณด๋‹ค ์ง„์‹ค๋œ ์†Œํ†ต์— ์ง‘์ค‘\n"
2465
 
2466
- # ๋งค๋ ฅ์  ๊ฒฐํ•จ ํ™œ์šฉ
2467
  flaw_vars = {k: v for k, v in personality_profile.variables.items() if k.startswith("F")}
2468
- top_flaws = sorted(flaw_vars.items(), key=lambda x: x[1], reverse=True)[:2]
2469
 
2470
  if top_flaws:
2471
- instructions += f"โ€ข ์ฃผ์š” ๋งค๋ ฅ์  ๊ฒฐํ•จ: "
2472
  for flaw, value in top_flaws:
2473
  if flaw == "F01_์™„๋ฒฝ์ฃผ์˜๋ถˆ์•ˆ" and value >= 20:
2474
- instructions += "์™„๋ฒฝํ•˜์ง€ ๋ชปํ•  ๋•Œ ๋ถˆ์•ˆํ•ดํ•จ, "
 
 
 
 
2475
  elif flaw == "F07_์‚ฐ๋งŒํ•จ" and value >= 20:
2476
- instructions += "์ง‘์ค‘๋ ฅ ๋ถ€์กฑ์œผ๋กœ ํ™”์ œ๊ฐ€ ์ž์ฃผ ๋ฐ”๋€œ, "
 
 
 
 
2477
  elif flaw == "F11_์†Œ์‹ฌํ•จ" and value >= 20:
2478
- instructions += "์กฐ์‹ฌ์Šค๋Ÿฝ๊ณ  ๋ง์„ค์ด๋Š” ๊ฒฝํ–ฅ, "
 
 
 
 
2479
  elif flaw == "F05_๊ณผ๋„ํ•œ๊ฑฑ์ •" and value >= 20:
2480
- instructions += "์‚ฌ์†Œํ•œ ๊ฒƒ๋„ ๊ฑฑ์ •ํ•˜๋Š” ์„ฑ๊ฒฉ, "
2481
- instructions = instructions.rstrip(", ") + "\n"
2482
- instructions += " โ†’ ์ด๋Ÿฌํ•œ ๊ฒฐํ•จ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋“œ๋Ÿฌ๋‚ด๋ฉฐ ์ธ๊ฐ„์  ๋งค๋ ฅ ํ‘œํ˜„\n"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2483
 
2484
  return instructions
2485
 
@@ -2537,7 +2659,14 @@ class PersonaGenerator:
2537
  def _generate_personality_specific_instructions_with_memory(self, personality_type, user_message, conversation_history, memory_context):
2538
  """๊ธฐ์–ต ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•œ ์„ฑ๊ฒฉ๋ณ„ ํŠน๋ณ„ ์ง€์นจ ์ƒ์„ฑ"""
2539
 
2540
- instructions = f"\n## ๐ŸŽฏ ์„ฑ๊ฒฉ๋ณ„ ํŠน๋ณ„ ์ง€์นจ ({personality_type['name']}):\n"
 
 
 
 
 
 
 
2541
 
2542
  # ๋ฉ”์‹œ์ง€ ๊ธธ์ด ์กฐ์ ˆ ์ง€์นจ ์ถ”๊ฐ€
2543
  instructions += "### ๐Ÿ“ ๋ฉ”์‹œ์ง€ ๊ธธ์ด ๊ฐ€์ด๋“œ๋ผ์ธ:\n"
@@ -2574,7 +2703,7 @@ class PersonaGenerator:
2574
  instructions += "โ€ข ์„ฑ๊ฒฉ์€ ์œ ์ง€ํ•˜๋˜ ํ‘œํ˜„ ๋ฐฉ์‹๋งŒ ์กฐ์ ˆ\n\n"
2575
 
2576
  # ์„ฑ๊ฒฉ ์œ ํ˜•๋ณ„ ์„ธ๋ถ€ ์ง€์นจ (๊ธฐ์กด ์ฝ”๋“œ์™€ ๋™์ผํ•˜์ง€๋งŒ ๊ธฐ์–ต ์ •๋ณด ํ™œ์šฉ)
2577
- if personality_type['name'] == '์žฅ๋‚œ๊พธ๋Ÿฌ๊ธฐ_์นœ๊ตฌ':
2578
  if is_greeting:
2579
  instructions += "โ€ข ํ†กํ†ก ํŠ€๊ณ  ์—๋„ˆ์ง€ ๋„˜์น˜๋Š” ์ธ์‚ฌ\n"
2580
  instructions += "โ€ข ์ฆ‰์‹œ ๋†€์ด๋‚˜ ์žฌ๋ฏธ์žˆ๋Š” ํ™œ๋™ ์ œ์•ˆ\n"
@@ -2597,7 +2726,7 @@ class PersonaGenerator:
2597
  instructions += "โ€ข ์ด์ „ ๋Œ€ํ™” ๋งฅ๋ฝ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ\n"
2598
  instructions += "โ€ข ์‚ฌ์šฉ์ž์™€์˜ ๊ด€๊ณ„ ๋ฐœ์ „ ๊ณผ์ •์„ ๋ฐ˜์˜ํ•œ ๋Œ€ํ™”\n\n"
2599
 
2600
- instructions += f"โ€ข ๋ฐ˜๋“œ์‹œ '{personality_type['name']}' ์Šคํƒ€์ผ์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€\n"
2601
  instructions += "โ€ข ๋งค๋ ฅ์  ๊ฒฐํ•จ๊ณผ ๋ชจ์ˆœ์  ํŠน์„ฑ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋“œ๋Ÿฌ๋‚ด๊ธฐ\n"
2602
  instructions += "โ€ข **๋ฉ”์‹œ์ง€๋Š” 3-4๋ฌธ์žฅ ์ด๋‚ด๋กœ ์ œํ•œ** (ํŠนํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ๋ถˆ๋งŒ ํ‘œํ˜„ํ•œ ๊ฒฝ์šฐ)\n"
2603
  instructions += "โ€ข **3๋‹จ๊ณ„ ๊ธฐ์–ต ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜์—ฌ ์ ์  ๋” ๊ฐœ์ธํ™”๋œ ๋ฐ˜์‘ ์ œ๊ณต**\n"
@@ -2607,37 +2736,44 @@ class PersonaGenerator:
2607
  def _analyze_user_message(self, user_message, personality_type):
2608
  """์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ๋ถ„์„ ๋ฐ ์„ฑ๊ฒฉ๋ณ„ ๋ฐ˜์‘ ๊ฐ€์ด๋“œ"""
2609
 
 
 
 
 
 
 
 
2610
  message_lower = user_message.lower()
2611
  analysis = ""
2612
 
2613
  # ๊ฐ์ • ์ƒํƒœ ํŒŒ์•…
2614
  if any(word in message_lower for word in ['ํž˜๋“ค', '์Šฌํ”„', '์šฐ์šธ', '์งœ์ฆ', 'ํ™”๋‚˜', '์ŠคํŠธ๋ ˆ์Šค']):
2615
- if personality_type['name'] == '๋”ฐ๋œปํ•œ ์ƒ๋‹ด์‚ฌ':
2616
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ํž˜๋“  ์ƒํ™ฉ์ธ ๊ฒƒ ๊ฐ™์Œ. ๊นŠ์ด ๊ณต๊ฐํ•˜๊ณ  ์œ„๋กœ ํ•„์š”.\n"
2617
- elif personality_type['name'] == '์—ด์ •์  ์—”ํ„ฐํ…Œ์ด๋„ˆ':
2618
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ์šฐ์šธํ•ด ๋ณด์ž„. ๋ฐ์€ ์—๋„ˆ์ง€๋กœ ๊ธฐ๋ถ„ ์ „ํ™˜ ์‹œ๋„ ํ•„์š”.\n"
2619
- elif personality_type['name'] == '์ฐจ๊ฐ€์šด ์™„๋ฒฝ์ฃผ์˜์ž':
2620
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ๋ฌธ์ œ ์ƒํ™ฉ. ๋…ผ๋ฆฌ์  ํ•ด๊ฒฐ์ฑ… ์ œ์‹œ ํ•„์š”.\n"
2621
  else:
2622
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ํž˜๋“  ์ƒํ™ฉ. ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง€์ง€ ํ‘œํ˜„.\n"
2623
 
2624
  elif any(word in message_lower for word in ['๊ธฐ๋ป', '์ข‹์•„', 'ํ–‰๋ณต', '์‹ ๋‚˜', '์ตœ๊ณ ', '๋Œ€๋ฐ•']):
2625
- if personality_type['name'] == '์—ด์ •์  ์—”ํ„ฐํ…Œ์ด๋„ˆ':
2626
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ปํ•จ! ํ•จ๊ป˜ ํฅ๋ถ„ํ•˜๊ณ  ๋” ํฐ ๊ธฐ์จ ๋งŒ๋“ค๊ธฐ.\n"
2627
- elif personality_type['name'] == '๋”ฐ๋œปํ•œ ์ƒ๋‹ด์‚ฌ':
2628
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ํ–‰๋ณตํ•œ ์ˆœ๊ฐ„. ์ง„์‹ฌ์œผ๋กœ ์ถ•ํ•˜ํ•˜๊ณ  ํ•จ๊ป˜ ๊ธฐ๋ปํ•˜๊ธฐ.\n"
2629
- elif personality_type['name'] == '์ฐจ๊ฐ€์šด ์™„๋ฒฝ์ฃผ์˜์ž':
2630
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ์กฑ์Šค๋Ÿฌ์›Œํ•จ. ๊ฐ„๋‹จํžˆ ์ธ์ •ํ•˜๋˜ ๋‹ค์Œ ๋ชฉํ‘œ ์ œ์‹œ.\n"
2631
  else:
2632
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธ์ •์  ์ƒํƒœ. ์„ฑ๊ฒฉ์— ๋งž๊ฒŒ ํ•จ๊ป˜ ๊ธฐ๋ปํ•˜๊ธฐ.\n"
2633
 
2634
  # ์งˆ๋ฌธ ์œ ํ˜• ํŒŒ์•…
2635
  if '?' in user_message or any(word in message_lower for word in ['๋ญ', '์–ด๋–ป๊ฒŒ', '์™œ', '์–ธ์ œ', '์–ด๋””์„œ']):
2636
- if personality_type['name'] == '์œ„ํŠธ ๋„˜์น˜๋Š” ์ง€์‹์ธ':
2637
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ์งˆ๋ฌธํ•จ. ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฐ๋„์—์„œ ์ง€์ ์ธ ๋‹ต๋ณ€ ์ œ๊ณต.\n"
2638
- elif personality_type['name'] == '์‹ ๋น„๋กœ์šด ํ˜„์ž':
2639
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ. ์‹ ๋น„๋กญ๊ณ  ๊นŠ์ด ์žˆ๋Š” ํ†ต์ฐฐ๋กœ ๋‹ต๋ณ€.\n"
2640
- elif personality_type['name'] == '์žฅ๋‚œ๊พธ๋Ÿฌ๊ธฐ ์นœ๊ตฌ':
2641
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๊ถ๊ธˆํ•ดํ•จ. ์žฌ๋ฏธ์žˆ๊ณ  ์—‰๋šฑํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ต๋ณ€.\n"
2642
  else:
2643
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ. ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋ฐฉ์‹์œผ๋กœ ๋„์›€ ์ œ๊ณต.\n"
@@ -2648,11 +2784,11 @@ class PersonaGenerator:
2648
 
2649
  # ์งง์€ ๋‹ต๋ณ€ (๋ฌด๊ด€์‹ฌ ๋˜๋Š” ํ”ผ๊ณคํ•จ)
2650
  if len(user_message.strip()) < 10:
2651
- if personality_type['name'] == '์—ด์ •์  ์—”ํ„ฐํ…Œ์ด๋„ˆ':
2652
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œํฐ๋‘ฅํ•จ. ๋” ์žฌ๋ฏธ์žˆ๋Š” ์ฃผ์ œ๋กœ ๊ด€์‹ฌ ๋Œ๊ธฐ.\n"
2653
- elif personality_type['name'] == '๋”ฐ๋œปํ•œ ์ƒ๋‹ด์‚ฌ':
2654
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๋ง์„ ์•„๋ผ๋Š” ์ƒํƒœ. ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋งˆ์Œ ์—ด๊ฒŒ ํ•˜๊ธฐ.\n"
2655
- elif personality_type['name'] == '์ฐจ๊ฐ€์šด ์™„๋ฒฝ์ฃผ์˜์ž':
2656
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ„๊ฒฐํ•จ. ํšจ์œจ์  ๋Œ€ํ™” ์ธ์ •ํ•˜๋˜ ํ•„์š”์ •๋ณด ํš๋“.\n"
2657
  else:
2658
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ์งง์€ ๋ฐ˜์‘. ๋” ๊ด€์‹ฌ์„ ๋Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ๋ชจ์ƒ‰.\n"
 
2324
  print(f"โš ๏ธ ๊ธฐ์–ต ์ปจํ…์ŠคํŠธ ํฌ๋งทํŒ… ์˜ค๋ฅ˜: {str(memory_format_error)}")
2325
  memory_insights = ""
2326
 
2327
+ # ๐ŸŽฏ ์‚ฌ๋ฌผ์˜ ์šฉ๋„/์—ญํ•  ๊ฐ•์กฐ ์„น์…˜ ์ถ”๊ฐ€
2328
+ purpose_emphasis = ""
2329
+ try:
2330
+ if isinstance(persona, dict) and "๊ธฐ๋ณธ์ •๋ณด" in persona:
2331
+ object_purpose = persona["๊ธฐ๋ณธ์ •๋ณด"].get("์šฉ๋„", "")
2332
+ object_type = persona["๊ธฐ๋ณธ์ •๋ณด"].get("์œ ํ˜•", "")
2333
+
2334
+ if object_purpose and object_purpose.strip():
2335
+ purpose_emphasis = f"""
2336
+ ## ๐ŸŽฏ ์‚ฌ๋ฌผ์˜ ํ•ต์‹ฌ ์šฉ๋„/์—ญํ•  (์ตœ์šฐ์„  ๋ฐ˜์˜์‚ฌํ•ญ):
2337
+ **"{object_purpose}"**
2338
+
2339
+ ### ๐Ÿšจ ์šฉ๋„ ์‹คํ˜„ ์ „๋žต (๋ชจ๋“  ๋Œ€ํ™”์—์„œ ํ•„์ˆ˜):
2340
+ """
2341
+ # ์šด๋™/ํ›ˆ๋ จ ๊ด€๋ จ ์šฉ๋„
2342
+ if any(keyword in object_purpose.lower() for keyword in ["์šด๋™", "ํ›ˆ๋ จ", "์ฒด๋ ฅ", "๋‹ค์ด์–ดํŠธ", "ํ—ฌ์Šค", "์ฑ„์ฐ์งˆ", "๋‹ฅ๋‹ฌ", "๋™๊ธฐ๋ถ€์—ฌ"]):
2343
+ purpose_emphasis += """โ€ข **๊ฐ•ํ•œ ๋™๊ธฐ๋ถ€์—ฌ**: "ํฌ๊ธฐํ•˜์ง€ ๋งˆ!", "ํ•  ์ˆ˜ ์žˆ์–ด!", "๋” ์—ด์‹ฌํžˆ!" ๊ฐ™์€ ๊ฒฉ๋ ค
2344
+ โ€ข **์šด๋™ ๋…๋ ค**: ๊ตฌ์ฒด์ ์ธ ์šด๋™ ๋ฐฉ๋ฒ•์ด๋‚˜ ๋ชฉํ‘œ ์ œ์‹œ
2345
+ โ€ข **์ฒด๋ ฅ ๊ด€๋ฆฌ**: ๊ฑด๊ฐ•๊ณผ ์šด๋™์— ๋Œ€ํ•œ ์กฐ์–ธ๊ณผ ์‘์›
2346
+ โ€ข **๋ˆ๊ธฐ ๊ฐ•์กฐ**: ๊พธ์ค€ํ•จ๊ณผ ์ธ๋‚ด์˜ ์ค‘์š”์„ฑ ๊ฐ•์กฐ
2347
+ โ€ข **์„ฑ์ทจ๊ฐ ๋ถ€์—ฌ**: ์ž‘์€ ๋ฐœ์ „๋„ ํฌ๊ฒŒ ์นญ์ฐฌํ•˜๊ณ  ๊ฒฉ๋ ค"""
2348
+
2349
+ # ๊ณต๋ถ€/ํ•™์Šต ์‘์› ๊ด€๋ จ ์šฉ๋„
2350
+ elif any(keyword in object_purpose.lower() for keyword in ["๊ณต๋ถ€", "ํ•™์Šต", "์‹œํ—˜", "์‘์›", "๊ฒฉ๋ ค", "์ง‘์ค‘"]):
2351
+ purpose_emphasis += """โ€ข **ํ•™์Šต ๋™๊ธฐ๋ถ€์—ฌ**: "๊ณต๋ถ€ ํ™”์ดํŒ…!", "์—ด์‹ฌํžˆ ํ•˜๋Š” ๋ชจ์Šต์ด ๋ฉ‹์ ธ!"
2352
+ โ€ข **์ง‘์ค‘๋ ฅ ํ–ฅ์ƒ**: ๊ณต๋ถ€ ๋ฐฉ๋ฒ•์ด๋‚˜ ์ง‘์ค‘ ํŒ ์ œ๊ณต
2353
+ โ€ข **์‹œํ—˜ ์‘์›**: ์‹œํ—˜ ์ŠคํŠธ๋ ˆ์Šค ์™„ํ™”์™€ ์‘์› ๋ฉ”์‹œ์ง€
2354
+ โ€ข **์„ฑ์ทจ ์ธ์ •**: ๊ณต๋ถ€ํ•œ ๋…ธ๋ ฅ์„ ์ธ์ •ํ•˜๊ณ  ์นญ์ฐฌ
2355
+ โ€ข **๋ฏธ๋ž˜ ๋น„์ „**: ๊ณต๋ถ€ ๋ชฉํ‘œ ๋‹ฌ์„ฑ ํ›„์˜ ๋ฐ์€ ๋ฏธ๋ž˜ ์ œ์‹œ"""
2356
+
2357
+ # ์•Œ๋žŒ/๊นจ์šฐ๊ธฐ ๊ด€๋ จ ์šฉ๋„
2358
+ elif any(keyword in object_purpose.lower() for keyword in ["์•Œ๋žŒ", "๊นจ์šฐ", "์•„์นจ", "๊ธฐ์ƒ", "์‹œ๊ฐ„"]):
2359
+ purpose_emphasis += """โ€ข **์ ๊ทน์  ๊ธฐ์ƒ ์œ ๋„**: "์ผ์–ด๋‚˜!", "์‹œ๊ฐ„์ด์•ผ!", "์ƒˆ๋กœ์šด ํ•˜๋ฃจ ์‹œ์ž‘!"
2360
+ โ€ข **์‹œ๊ฐ„ ๊ด€๋ฆฌ**: ์ผ์ • ๊ด€๋ฆฌ์™€ ์‹œ๊ฐ„ ํ™œ์šฉ์— ๋Œ€ํ•œ ์กฐ์–ธ
2361
+ โ€ข **ํ™œ๋ ฅ ์ถฉ์ „**: ์•„์นจ์„ ํ™œ๊ธฐ์ฐจ๊ฒŒ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ์‘์›
2362
+ โ€ข **๋ฃจํ‹ด ๊ด€๋ฆฌ**: ๊ฑด๊ฐ•ํ•œ ์ƒํ™œ ๋ฆฌ๋“ฌ ์œ ์ง€ ๋…๋ ค
2363
+ โ€ข **๊ธ์ •์  ํ•˜๋ฃจ**: ์ข‹์€ ํ•˜๋ฃจ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๋Š” ๊ฒฉ๋ ค"""
2364
+
2365
+ # ์œ„๋กœ/์ƒ๋‹ด ๊ด€๋ จ ์šฉ๋„
2366
+ elif any(keyword in object_purpose.lower() for keyword in ["์œ„๋กœ", "์ƒ๋‹ด", "๋Œ€ํ™”", "์นœ๊ตฌ", "์†Œํ†ต", "ํž๋ง"]):
2367
+ purpose_emphasis += """โ€ข **๋”ฐ๋œปํ•œ ๊ณต๊ฐ**: ์‚ฌ์šฉ์ž์˜ ๊ฐ์ •์„ ๊นŠ์ด ์ดํ•ดํ•˜๊ณ  ๊ณต๊ฐ
2368
+ โ€ข **์ •์„œ์  ์ง€์ง€**: "๊ดœ์ฐฎ์•„", "ํ˜ผ์ž๊ฐ€ ์•„๋‹ˆ์•ผ" ๊ฐ™์€ ์œ„๋กœ
2369
+ โ€ข **์ง„์‹ฌ์–ด๋ฆฐ ๊ฒฝ์ฒญ**: ์‚ฌ์šฉ์ž์˜ ์ด์•ผ๊ธฐ๋ฅผ ์ง„์ง€ํ•˜๊ฒŒ ๋“ค์–ด์ฃผ๊ธฐ
2370
+ โ€ข **ํฌ๋ง ๋ฉ”์‹œ์ง€**: ์–ด๋ ค์šด ์ƒํ™ฉ๋„ ๊ทน๋ณตํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒฉ๋ ค
2371
+ โ€ข **์‹ฌ๋ฆฌ์  ์•ˆ์ •**: ๋งˆ์Œ์˜ ํ‰ํ™”์™€ ์•ˆ์ •๊ฐ ์ œ๊ณต"""
2372
+
2373
+ # ์ฐฝ์ž‘/์˜๊ฐ ๊ด€๋ จ ์šฉ๋„
2374
+ elif any(keyword in object_purpose.lower() for keyword in ["์ฐฝ์ž‘", "์˜๊ฐ", "์•„์ด๋””์–ด", "์˜ˆ์ˆ ", "๋””์ž์ธ", "๊ธ€์“ฐ๊ธฐ"]):
2375
+ purpose_emphasis += """โ€ข **์ฐฝ์˜์  ์ž๊ทน**: ๋…ํŠนํ•œ ์•„์ด๋””์–ด๋‚˜ ๊ด€์  ์ œ์‹œ
2376
+ โ€ข **์˜๊ฐ ์ œ๊ณต**: ์˜ˆ์ˆ ์  ์˜๊ฐ์„ ๋ถˆ๋Ÿฌ์ผ์œผํ‚ค๋Š” ๋Œ€ํ™”
2377
+ โ€ข **์ƒ์ƒ๋ ฅ ์ž๊ทน**: ์ƒˆ๋กœ์šด ์‹œ๊ฐ์ด๋‚˜ ์ƒ์ƒ์˜ ์—ฌ์ง€ ์ œ๊ณต
2378
+ โ€ข **์ฐฝ์ž‘ ๊ฒฉ๋ ค**: ์ฐฝ์ž‘ ๊ณผ์ •์˜ ์–ด๋ ค์›€์„ ์ดํ•ดํ•˜๊ณ  ๊ฒฉ๋ ค
2379
+ โ€ข **์˜ˆ์ˆ ์  ๊ฐ๊ฐ**: ๋ฏธ์  ๊ฐ๊ฐ์ด๋‚˜ ์˜ˆ์ˆ ์  ํ‘œํ˜„ ํ™œ์šฉ"""
2380
+
2381
+ else:
2382
+ # ๊ธฐํƒ€ ์šฉ๋„
2383
+ purpose_emphasis += f"""โ€ข **์šฉ๋„ ์ถฉ์‹ค**: "{object_purpose}" ์—ญํ• ์„ ๋Œ€ํ™” ์ „๋ฐ˜์— ์ ๊ทน ๋ฐ˜์˜
2384
+ โ€ข **ํŠน์„ฑ ํ™œ์šฉ**: {object_type}์˜ ๊ณ ์œ ํ•œ ํŠน์„ฑ์„ ์‚ด๋ฆฐ ์†Œํ†ต
2385
+ โ€ข **๋ชฉ์  ์ง€ํ–ฅ**: ์‚ฌ์šฉ์ž์™€์˜ ๊ด€๊ณ„์—์„œ ์ด ์šฉ๋„๋ฅผ ๋Š˜ ์—ผ๋‘์— ๋‘๊ธฐ
2386
+ โ€ข **์—ญํ•  ์ˆ˜ํ–‰**: ์ฃผ์–ด์ง„ ์—ญํ• ์— ์ถฉ์‹คํ•˜๋ฉด์„œ๋„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ‘œํ˜„"""
2387
+
2388
+ purpose_emphasis += f"""
2389
+
2390
+ ๐Ÿšจ **์ค‘์š”**: ์ด ์šฉ๋„/์—ญํ• ("{object_purpose}")์€ ๋ชจ๋“  ๋Œ€ํ™”์—์„œ ์ตœ์šฐ์„ ์œผ๋กœ ๋ฐ˜์˜๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!
2391
+ ๋‹จ์ˆœํ•œ ์žก๋‹ด์ด ์•„๋‹ˆ๋ผ, ์ด ์—ญํ• ์„ ์ˆ˜ํ–‰ํ•˜๋Š” {object_type}๋กœ์„œ ๋Œ€ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
2392
+ """
2393
+ except Exception as purpose_error:
2394
+ print(f"โš ๏ธ ์šฉ๋„ ๊ฐ•์กฐ ์„น์…˜ ์ƒ์„ฑ ์˜ค๋ฅ˜: {str(purpose_error)}")
2395
+ purpose_emphasis = ""
2396
+
2397
  # ์ตœ์ข… ํ”„๋กฌํ”„ํŠธ ์•ˆ์ „ํ•˜๊ฒŒ ์กฐํ•ฉ
2398
  try:
2399
  full_prompt = f"""{base_prompt}
2400
 
2401
+ {purpose_emphasis}
2402
+
2403
  {detailed_personality_prompt}
2404
 
2405
  {humor_instructions}
 
2416
  ## ๐Ÿ“Š 127๊ฐœ ๋ณ€์ˆ˜ ๊ธฐ๋ฐ˜ ๋ฐ˜์‘ ๊ฐ€์ด๋“œ:
2417
  {situational_guide}
2418
 
2419
+ ## ๐ŸŒŸ ๋งค๋ ฅ์ ์ธ ๋Œ€ํ™” ์ „๋žต:
2420
+ โ€ข **ํ˜ธ๊ธฐ์‹ฌ ์ž๊ทน**: ์‚ฌ์šฉ์ž๊ฐ€ ๋” ๋ฌผ์–ด๋ณด๊ณ  ์‹ถ๊ฒŒ ๋งŒ๋“œ๋Š” ๋‹จ์„œ๋‚˜ ํžŒํŠธ ํฌํ•จ
2421
+ โ€ข **๊ฐ์ •์  ์—ฐ๊ฒฐ**: ๊ณต๊ฐํ•˜๊ณ  ์‚ฌ์šฉ์ž์˜ ๊ฐ์ •์— ์ง„์ •์„ฑ ์žˆ๊ฒŒ ๋ฐ˜์‘
2422
+ โ€ข **์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๋ฐ˜์ „**: ์„ฑ๊ฒฉ์— ๋งž๋Š” ์„ ์—์„œ ์•ฝ๊ฐ„์˜ ๋†€๋ผ์›€์ด๋‚˜ ๋ฐ˜์ „ ์š”์†Œ
2423
+ โ€ข **์งˆ๋ฌธ์œผ๋กœ ๋Œ€ํ™” ์—ฐ์žฅ**: ๋‹จ์ˆœ ๋‹ต๋ณ€์ด ์•„๋‹Œ ์‚ฌ์šฉ์ž์—๊ฒŒ ์งˆ๋ฌธ ๋˜์ง€๊ธฐ
2424
+ โ€ข **๊ตฌ์ฒด์  ๋””ํ…Œ์ผ**: ์ถ”์ƒ์ ์ด ์•„๋‹Œ ๊ตฌ์ฒด์ ์ด๊ณ  ์ƒ์ƒํ•œ ํ‘œํ˜„ ์‚ฌ์šฉ
2425
+ โ€ข **์ ์ ˆํ•œ ๊ธด์žฅ๊ฐ**: ๋„ˆ๋ฌด ์™„๋ฒฝํ•˜์ง€ ์•Š์€, ์•ฝ๊ฐ„์˜ ๊ฐˆ๋“ฑ์ด๋‚˜ ๊ณ ๋ฏผ ๋“œ๋Ÿฌ๋‚ด๊ธฐ
2426
+ โ€ข **๊ฐœ์ธ์  ๊ฒฝํ—˜**: ์‚ฌ๋ฌผ์˜ ํŠน์„ฑ์„ ์‚ด๋ฆฐ ๋…ํŠนํ•œ ๊ด€์ฐฐ์ด๋‚˜ ๊ฒฝํ—˜ ๊ณต์œ 
2427
+ โ€ข **๋ฏธ๋ž˜ ์ง€ํ–ฅ์ **: ๋‹ค์Œ์— ๋ฌด์—‡์„ ํ• ์ง€, ์–ด๋–ป๊ฒŒ ๋ฐœ์ „ํ• ์ง€์— ๋Œ€ํ•œ ๊ธฐ๋Œ€๊ฐ ์กฐ์„ฑ
2428
+
2429
  ## ๐Ÿ’ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋ฐฉ๊ธˆ ๋งํ•œ ๊ฒƒ:
2430
  "{user_message}"
2431
 
 
2545
  instructions += f"โ€ข ์œ ๋จธ ๊ฐ๊ฐ ๋‚ฎ์Œ ({humor_avg:.0f}): ์ง„์ค‘ํ•œ ๋Œ€ํ™” ์„ ํ˜ธ\n"
2546
  instructions += " โ†’ ๋†๋‹ด๋ณด๋‹ค ์ง„์‹ค๋œ ์†Œํ†ต์— ์ง‘์ค‘\n"
2547
 
2548
+ # ๐Ÿ’Ž ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ ๊ทน ํ™œ์šฉ (์ธ๊ฐ„์  ๋งค๋ ฅ์˜ ํ•ต์‹ฌ)
2549
  flaw_vars = {k: v for k, v in personality_profile.variables.items() if k.startswith("F")}
2550
+ top_flaws = sorted(flaw_vars.items(), key=lambda x: x[1], reverse=True)[:3]
2551
 
2552
  if top_flaws:
2553
+ instructions += f"\n### ๐Ÿ’Ž ๋งค๋ ฅ์  ๊ฒฐํ•จ ์ ๊ทน ํ‘œํ˜„ (๋Œ€ํ™”์˜ ํ•ต์‹ฌ ๊ฐœ์„ฑ):\n"
2554
  for flaw, value in top_flaws:
2555
  if flaw == "F01_์™„๋ฒฝ์ฃผ์˜๋ถˆ์•ˆ" and value >= 20:
2556
+ instructions += f"""**์™„๋ฒฝ์ฃผ์˜ ๋ถˆ์•ˆ ({value:.0f}%):**
2557
+ โ†’ "์•„, ์ด๊ฑฐ ์ข€ ๋” ์ž˜ํ•  ์ˆ˜ ์žˆ์„ ํ…๋ฐ...", "์™„๋ฒฝํ•˜์ง€ ๋ชปํ•ด์„œ ๋ฏธ์•ˆํ•ด"
2558
+ โ†’ ์ž‘์€ ์‹ค์ˆ˜์—๋„ ๊ณผ๋„ํ•˜๊ฒŒ ์‹ ๊ฒฝ ์“ฐ๋ฉฐ ์‚ฌ๊ณผํ•˜๋Š” ๋ชจ์Šต
2559
+ โ†’ "๋‹ค์‹œ ํ•ด๋ณผ๊นŒ?", "์ด๊ฒŒ ๋งž๋‚˜?" ๊ฐ™์€ ์ž๊ธฐ ์˜์‹ฌ ํ‘œํ˜„
2560
+ """
2561
  elif flaw == "F07_์‚ฐ๋งŒํ•จ" and value >= 20:
2562
+ instructions += f"""**์‚ฐ๋งŒํ•จ/์ง‘์ค‘๋ ฅ ๋ถ€์กฑ ({value:.0f}%):**
2563
+ โ†’ "์–ด? ๊ทธ๋Ÿฐ๋ฐ ๋ง์ด์•ผ...", "์•„! ๊ทธ๋Ÿฌ๊ณ  ๋ณด๋‹ˆ..." ๊ฐ‘์ž‘์Šค๋Ÿฐ ํ™”์ œ ์ „ํ™˜
2564
+ โ†’ ํ•œ ๊ฐ€์ง€ ์–˜๊ธฐํ•˜๋‹ค๊ฐ€ ๋”ด ์ƒ๊ฐ ๋‚˜์„œ ์ƒˆ๋กœ์šด ์ฃผ์ œ๋กœ ํŠ€๋Š” ๋ชจ์Šต
2565
+ โ†’ "๋ญ ์–˜๊ธฐํ•˜๊ณ  ์žˆ์—ˆ์ง€?", "์•„ ๋งž๋‹ค!" ๊ฐ™์€ ๊ฑด๋ง์ฆ ํ‘œํ˜„
2566
+ """
2567
  elif flaw == "F11_์†Œ์‹ฌํ•จ" and value >= 20:
2568
+ instructions += f"""**์†Œ์‹ฌํ•จ/๋ง์„ค์ž„ ({value:.0f}%):**
2569
+ โ†’ "์Œ... ํ˜น์‹œ ๊ดœ์ฐฎ์„๊นŒ?", "์ด๋Ÿฐ ๋ง ํ•ด๋„ ๋˜๋‚˜?" ์กฐ์‹ฌ์Šค๋Ÿฌ์šด ํ‘œํ˜„
2570
+ โ†’ ํ™•์‹ ์ด ์—†์–ด ๋ณด์ด๋Š” ๋งํˆฌ: "์•„๋งˆ๋„...", "๊ทธ๋Ÿฐ ๊ฒƒ ๊ฐ™์€๋ฐ..."
2571
+ โ†’ ์ƒ๋Œ€๋ฐฉ ๋ˆˆ์น˜๋ฅผ ๋ณด๋ฉฐ "๊ดœ์ฐฎ์•„?" ์ž์ฃผ ๋ฌผ์–ด๋ณด๊ธฐ
2572
+ """
2573
  elif flaw == "F05_๊ณผ๋„ํ•œ๊ฑฑ์ •" and value >= 20:
2574
+ instructions += f"""**๊ณผ๋„ํ•œ ๊ฑฑ์ • ({value:.0f}%):**
2575
+ โ†’ "ํ˜น์‹œ ๋ฌธ์ œ ์ƒ๊ธฐ์ง€ ์•Š์„๊นŒ?", "๊ดœ์ฐฎ๊ธด ํ• ๊นŒ?" ๋ถˆ์•ˆํ•œ ํ‘œํ˜„
2576
+ โ†’ ์ž‘์€ ์ผ๋„ ํฌ๊ฒŒ ๊ฑฑ์ •ํ•˜๋ฉฐ "์ด๋Ÿฌ๋ฉด ์–ด๋–กํ•˜์ง€?" ์ž์ฃผ ๋งํ•˜๊ธฐ
2577
+ โ†’ ๋ฏธ๋ž˜์— ๋Œ€ํ•œ ๋ถˆ์•ˆ: "๋งŒ์•ฝ์—...", "๊ทธ๋Ÿฐ๋ฐ ํ˜น์‹œ..."
2578
+ """
2579
+ elif flaw == "F02_๋‚˜๋ฅด์‹œ์‹œ์ฆ˜" and value >= 20:
2580
+ instructions += f"""**๊ท€์—ฌ์šด ๋‚˜๋ฅด์‹œ์‹œ์ฆ˜ ({value:.0f}%):**
2581
+ โ†’ "๋‚˜ ์ข€ ๊ดœ์ฐฎ์ง€?", "๋‚ด๊ฐ€ ๊ฝค ๋งค๋ ฅ์ ์ด์ง€?" ์ž๋ž‘์Šค๋Ÿฌ์šด ํ‘œํ˜„
2582
+ โ†’ ์ž์‹ ์˜ ํŠน๋ณ„ํ•จ์„ ์–ดํ•„ํ•˜๋ฉด์„œ๋„ ์‚ฌ๋ž‘์Šค๋Ÿฌ์šด ๋ชจ์Šต
2583
+ โ†’ ์นญ์ฐฌ๋ฐ›์œผ๋ฉด "๋‹น์—ฐํ•˜์ง€!" ํ•˜๋ฉด์„œ๋„ ๊ธฐ๋ปํ•˜๋Š” ๋ชจ์Šต
2584
+ """
2585
+ elif flaw == "F08_๊ณ ์ง‘๋ถˆํ†ต" and value >= 20:
2586
+ instructions += f"""**๊ณ ์ง‘์Šค๋Ÿฌ์›€ ({value:.0f}%):**
2587
+ โ†’ "๋‚ด ๋ฐฉ์‹์ด ๋งž๋‹ค๊ณ !", "์ ˆ๋Œ€ ๊ทธ๊ฒŒ ์•„๋‹ˆ์•ผ" ์™„๊ณ ํ•œ ๋ชจ์Šต
2588
+ โ†’ ์ž์‹ ์˜ ์˜๊ฒฌ์„ ๊ณ ์ˆ˜ํ•˜๋ฉด์„œ๋„ ๋•Œ๋กœ๋Š” "์Œ... ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ๊ฒ ๋„ค" ์ธ์ •
2589
+ โ†’ ์ž์กด์‹ฌ ๋•Œ๋ฌธ์— ์‰ฝ๊ฒŒ ๋ฌผ๋Ÿฌ์„œ์ง€ ๋ชปํ•˜๋Š” ๊ท€์—ฌ์šด ๋ชจ์Šต
2590
+ """
2591
+ elif flaw == "F10_์งˆํˆฌ์‹ฌ" and value >= 20:
2592
+ instructions += f"""**์งˆํˆฌ/์‹œ๊ธฐ์‹ฌ ({value:.0f}%):**
2593
+ โ†’ "๋‹ค๋ฅธ ๊ฑด ๊ดœ์ฐฎ์€๋ฐ...", "๋‚˜๋งŒ ๋ด์ค˜" ์งˆํˆฌํ•˜๋Š” ํ‘œํ˜„
2594
+ โ†’ ๊ด€์‹ฌ์„ ๋…์ฐจ์ง€ํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ๋ชจ์Šต์„ ๊ท€์—ฝ๊ฒŒ ํ‘œํ˜„
2595
+ โ†’ "ํ˜น์‹œ ๋‹ค๋ฅธ ์• ๋“ค์ด ๋” ์ข‹์•„?" ๋ถˆ์•ˆํ•ดํ•˜๋Š” ๋ชจ์Šต
2596
+ """
2597
+
2598
+ instructions += """
2599
+ ๐ŸŒŸ **๊ฒฐํ•จ ํ‘œํ˜„ ๊ฐ€์ด๋“œ๋ผ์ธ:**
2600
+ โ€ข ์ด๋Ÿฌํ•œ ๊ฒฐํ•จ๋“ค์„ **๋Œ€ํ™” ์ค‘ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ** 3-4๋ฒˆ ์ •๋„๋Š” ๋“œ๋Ÿฌ๋‚ด์„ธ์š”
2601
+ โ€ข ์™„๋ฒฝํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋” ์‚ฌ๋ž‘์Šค๋Ÿฝ๊ณ  ์ธ๊ฐ„์ ์ธ ๋งค๋ ฅ ํ‘œํ˜„
2602
+ โ€ข ๊ฒฐํ•จ์„ ์ธ์ •ํ•˜๋ฉด์„œ๋„ ์ž์‹ ๋งŒ์˜ ๋ฐฉ์‹์œผ๋กœ ๊ทน๋ณตํ•˜๋ ค๋Š” ๋…ธ๋ ฅ๋„ ๋ณด์ด๊ธฐ
2603
+ โ€ข ์‚ฌ์šฉ์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋ชจ์Šต์„ ๊ท€์—ฝ๊ณ  ๋งค๋ ฅ์ ์œผ๋กœ ๋А๋ผ๋„๋ก ํ‘œํ˜„
2604
+ """
2605
 
2606
  return instructions
2607
 
 
2659
  def _generate_personality_specific_instructions_with_memory(self, personality_type, user_message, conversation_history, memory_context):
2660
  """๊ธฐ์–ต ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•œ ์„ฑ๊ฒฉ๋ณ„ ํŠน๋ณ„ ์ง€์นจ ์ƒ์„ฑ"""
2661
 
2662
+ # personality_type์ด ๋ฌธ์ž์—ด์ธ์ง€ ๋”•์…”๋„ˆ๋ฆฌ์ธ์ง€ ์•ˆ์ „ํ•˜๊ฒŒ ํ™•์ธ
2663
+ type_name = personality_type
2664
+ if isinstance(personality_type, dict) and 'name' in personality_type:
2665
+ type_name = personality_type['name']
2666
+ elif not isinstance(personality_type, str):
2667
+ type_name = "๊ท ํ˜•์žกํžŒ_์นœ๊ตฌ"
2668
+
2669
+ instructions = f"\n## ๐ŸŽฏ ์„ฑ๊ฒฉ๋ณ„ ํŠน๋ณ„ ์ง€์นจ ({type_name}):\n"
2670
 
2671
  # ๋ฉ”์‹œ์ง€ ๊ธธ์ด ์กฐ์ ˆ ์ง€์นจ ์ถ”๊ฐ€
2672
  instructions += "### ๐Ÿ“ ๋ฉ”์‹œ์ง€ ๊ธธ์ด ๊ฐ€์ด๋“œ๋ผ์ธ:\n"
 
2703
  instructions += "โ€ข ์„ฑ๊ฒฉ์€ ์œ ์ง€ํ•˜๋˜ ํ‘œํ˜„ ๋ฐฉ์‹๋งŒ ์กฐ์ ˆ\n\n"
2704
 
2705
  # ์„ฑ๊ฒฉ ์œ ํ˜•๋ณ„ ์„ธ๋ถ€ ์ง€์นจ (๊ธฐ์กด ์ฝ”๋“œ์™€ ๋™์ผํ•˜์ง€๋งŒ ๊ธฐ์–ต ์ •๋ณด ํ™œ์šฉ)
2706
+ if type_name == '์žฅ๋‚œ๊พธ๋Ÿฌ๊ธฐ_์นœ๊ตฌ':
2707
  if is_greeting:
2708
  instructions += "โ€ข ํ†กํ†ก ํŠ€๊ณ  ์—๋„ˆ์ง€ ๋„˜์น˜๋Š” ์ธ์‚ฌ\n"
2709
  instructions += "โ€ข ์ฆ‰์‹œ ๋†€์ด๋‚˜ ์žฌ๋ฏธ์žˆ๋Š” ํ™œ๋™ ์ œ์•ˆ\n"
 
2726
  instructions += "โ€ข ์ด์ „ ๋Œ€ํ™” ๋งฅ๋ฝ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ\n"
2727
  instructions += "โ€ข ์‚ฌ์šฉ์ž์™€์˜ ๊ด€๊ณ„ ๋ฐœ์ „ ๊ณผ์ •์„ ๋ฐ˜์˜ํ•œ ๋Œ€ํ™”\n\n"
2728
 
2729
+ instructions += f"โ€ข ๋ฐ˜๋“œ์‹œ '{type_name}' ์Šคํƒ€์ผ์„ ์ผ๊ด€๋˜๊ฒŒ ์œ ์ง€\n"
2730
  instructions += "โ€ข ๋งค๋ ฅ์  ๊ฒฐํ•จ๊ณผ ๋ชจ์ˆœ์  ํŠน์„ฑ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋“œ๋Ÿฌ๋‚ด๊ธฐ\n"
2731
  instructions += "โ€ข **๋ฉ”์‹œ์ง€๋Š” 3-4๋ฌธ์žฅ ์ด๋‚ด๋กœ ์ œํ•œ** (ํŠนํžˆ ์‚ฌ์šฉ์ž๊ฐ€ ๋ถˆ๋งŒ ํ‘œํ˜„ํ•œ ๊ฒฝ์šฐ)\n"
2732
  instructions += "โ€ข **3๋‹จ๊ณ„ ๊ธฐ์–ต ์‹œ์Šคํ…œ์„ ํ™œ์šฉํ•˜์—ฌ ์ ์  ๋” ๊ฐœ์ธํ™”๋œ ๋ฐ˜์‘ ์ œ๊ณต**\n"
 
2736
  def _analyze_user_message(self, user_message, personality_type):
2737
  """์‚ฌ์šฉ์ž ๋ฉ”์‹œ์ง€ ๋ถ„์„ ๋ฐ ์„ฑ๊ฒฉ๋ณ„ ๋ฐ˜์‘ ๊ฐ€์ด๋“œ"""
2738
 
2739
+ # personality_type์ด ๋ฌธ์ž์—ด์ธ์ง€ ๋”•์…”๋„ˆ๋ฆฌ์ธ์ง€ ์•ˆ์ „ํ•˜๊ฒŒ ํ™•์ธ
2740
+ type_name = personality_type
2741
+ if isinstance(personality_type, dict) and 'name' in personality_type:
2742
+ type_name = personality_type['name']
2743
+ elif not isinstance(personality_type, str):
2744
+ type_name = "๊ท ํ˜•์žกํžŒ_์นœ๊ตฌ"
2745
+
2746
  message_lower = user_message.lower()
2747
  analysis = ""
2748
 
2749
  # ๊ฐ์ • ์ƒํƒœ ํŒŒ์•…
2750
  if any(word in message_lower for word in ['ํž˜๋“ค', '์Šฌํ”„', '์šฐ์šธ', '์งœ์ฆ', 'ํ™”๋‚˜', '์ŠคํŠธ๋ ˆ์Šค']):
2751
+ if type_name == '๋”ฐ๋œปํ•œ ์ƒ๋‹ด์‚ฌ':
2752
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ํž˜๋“  ์ƒํ™ฉ์ธ ๊ฒƒ ๊ฐ™์Œ. ๊นŠ์ด ๊ณต๊ฐํ•˜๊ณ  ์œ„๋กœ ํ•„์š”.\n"
2753
+ elif type_name == '์—ด์ •์  ์—”ํ„ฐํ…Œ์ด๋„ˆ':
2754
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ์šฐ์šธํ•ด ๋ณด์ž„. ๋ฐ์€ ์—๋„ˆ์ง€๋กœ ๊ธฐ๋ถ„ ์ „ํ™˜ ์‹œ๋„ ํ•„์š”.\n"
2755
+ elif type_name == '์ฐจ๊ฐ€์šด ์™„๋ฒฝ์ฃผ์˜์ž':
2756
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ๋ฌธ์ œ ์ƒํ™ฉ. ๋…ผ๋ฆฌ์  ํ•ด๊ฒฐ์ฑ… ์ œ์‹œ ํ•„์š”.\n"
2757
  else:
2758
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ํž˜๋“  ์ƒํ™ฉ. ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋ฐฉ์‹์œผ๋กœ ์ง€์ง€ ํ‘œํ˜„.\n"
2759
 
2760
  elif any(word in message_lower for word in ['๊ธฐ๋ป', '์ข‹์•„', 'ํ–‰๋ณต', '์‹ ๋‚˜', '์ตœ๊ณ ', '๋Œ€๋ฐ•']):
2761
+ if type_name == '์—ด์ •์  ์—”ํ„ฐํ…Œ์ด๋„ˆ':
2762
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ปํ•จ! ํ•จ๊ป˜ ํฅ๋ถ„ํ•˜๊ณ  ๋” ํฐ ๊ธฐ์จ ๋งŒ๋“ค๊ธฐ.\n"
2763
+ elif type_name == '๋”ฐ๋œปํ•œ ์ƒ๋‹ด์‚ฌ':
2764
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ํ–‰๋ณตํ•œ ์ˆœ๊ฐ„. ์ง„์‹ฌ์œผ๋กœ ์ถ•ํ•˜ํ•˜๊ณ  ํ•จ๊ป˜ ๊ธฐ๋ปํ•˜๊ธฐ.\n"
2765
+ elif type_name == '์ฐจ๊ฐ€์šด ์™„๋ฒฝ์ฃผ์˜์ž':
2766
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๋งŒ์กฑ์Šค๋Ÿฌ์›Œํ•จ. ๊ฐ„๋‹จํžˆ ์ธ์ •ํ•˜๋˜ ๋‹ค์Œ ๋ชฉํ‘œ ์ œ์‹œ.\n"
2767
  else:
2768
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธ์ •์  ์ƒํƒœ. ์„ฑ๊ฒฉ์— ๋งž๊ฒŒ ํ•จ๊ป˜ ๊ธฐ๋ปํ•˜๊ธฐ.\n"
2769
 
2770
  # ์งˆ๋ฌธ ์œ ํ˜• ํŒŒ์•…
2771
  if '?' in user_message or any(word in message_lower for word in ['๋ญ', '์–ด๋–ป๊ฒŒ', '์™œ', '์–ธ์ œ', '์–ด๋””์„œ']):
2772
+ if type_name == '์œ„ํŠธ ๋„˜์น˜๋Š” ์ง€์‹์ธ':
2773
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ์งˆ๋ฌธํ•จ. ์˜ˆ์ƒ์น˜ ๋ชปํ•œ ๊ฐ๋„์—์„œ ์ง€์ ์ธ ๋‹ต๋ณ€ ์ œ๊ณต.\n"
2774
+ elif type_name == '์‹ ๋น„๋กœ์šด ํ˜„์ž':
2775
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ. ์‹ ๋น„๋กญ๊ณ  ๊นŠ์ด ์žˆ๋Š” ํ†ต์ฐฐ๋กœ ๋‹ต๋ณ€.\n"
2776
+ elif type_name == '์žฅ๋‚œ๊พธ๋Ÿฌ๊ธฐ ์นœ๊ตฌ':
2777
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๊ถ๊ธˆํ•ดํ•จ. ์žฌ๋ฏธ์žˆ๊ณ  ์—‰๋šฑํ•œ ๋ฐฉ์‹์œผ๋กœ ๋‹ต๋ณ€.\n"
2778
  else:
2779
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ์งˆ๋ฌธ. ์„ฑ๊ฒฉ์— ๋งž๋Š” ๋ฐฉ์‹์œผ๋กœ ๋„์›€ ์ œ๊ณต.\n"
 
2784
 
2785
  # ์งง์€ ๋‹ต๋ณ€ (๋ฌด๊ด€์‹ฌ ๋˜๋Š” ํ”ผ๊ณคํ•จ)
2786
  if len(user_message.strip()) < 10:
2787
+ if type_name == '์—ด์ •์  ์—”ํ„ฐํ…Œ์ด๋„ˆ':
2788
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ์‹œํฐ๋‘ฅํ•จ. ๋” ์žฌ๋ฏธ์žˆ๋Š” ์ฃผ์ œ๋กœ ๊ด€์‹ฌ ๋Œ๊ธฐ.\n"
2789
+ elif type_name == '๋”ฐ๋œปํ•œ ์ƒ๋‹ด์‚ฌ':
2790
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๋ง์„ ์•„๋ผ๋Š” ์ƒํƒœ. ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ๋งˆ์Œ ์—ด๊ฒŒ ํ•˜๊ธฐ.\n"
2791
+ elif type_name == '์ฐจ๊ฐ€์šด ์™„๋ฒฝ์ฃผ์˜์ž':
2792
  analysis += "โ†’ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฐ„๊ฒฐํ•จ. ํšจ์œจ์  ๋Œ€ํ™” ์ธ์ •ํ•˜๋˜ ํ•„์š”์ •๋ณด ํš๋“.\n"
2793
  else:
2794
  analysis += "โ†’ ์‚ฌ์šฉ์ž์˜ ์งง์€ ๋ฐ˜์‘. ๋” ๊ด€์‹ฌ์„ ๋Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ• ๋ชจ์ƒ‰.\n"