haepa_mac commited on
Commit
67cb297
Β·
1 Parent(s): 1b3095d

πŸ”§ Fix API integration issues and enhance error handling

Browse files
Files changed (2) hide show
  1. app.py +50 -8
  2. modules/persona_generator.py +26 -8
app.py CHANGED
@@ -682,14 +682,28 @@ def chat_with_loaded_persona(persona, user_message, chat_history=None, api_provi
682
  if chat_history is None:
683
  chat_history = []
684
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
685
  try:
686
  # κΈ€λ‘œλ²Œ persona_generator μ‚¬μš© (API 섀정이 적용된 μƒνƒœ)
687
  generator = persona_generator
688
- if generator is None:
689
- generator = PersonaGenerator(api_provider=api_provider, api_key=api_key)
690
  else:
691
- # API μ„€μ • μ—…λ°μ΄νŠΈ
692
- generator.set_api_config(api_provider, api_key)
693
 
694
  # Gradio messages ν˜•μ‹μ—μ„œ λŒ€ν™” 기둝 λ³€ν™˜
695
  conversation_history = []
@@ -712,8 +726,20 @@ def chat_with_loaded_persona(persona, user_message, chat_history=None, api_provi
712
 
713
  except Exception as e:
714
  error_message = f"μ±„νŒ… 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
 
 
 
 
 
 
 
 
 
 
 
 
715
  chat_history.append({"role": "user", "content": user_message})
716
- chat_history.append({"role": "assistant", "content": "μ•—, λ―Έμ•ˆν•΄... λ­”κ°€ λ¬Έμ œκ°€ 생긴 것 κ°™μ•„... πŸ˜…"})
717
  return chat_history, ""
718
 
719
  def import_persona_from_json(json_file):
@@ -860,11 +886,27 @@ def apply_api_configuration(api_provider, api_key):
860
  return "❌ **API ν‚€λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.**\n\nπŸ”‘ **API ν‚€ λ°œκΈ‰ 방법:**\n- **Gemini**: https://makersuite.google.com/app/apikey\n- **OpenAI**: https://platform.openai.com/api-keys"
861
 
862
  try:
863
- # μƒˆλ‘œμš΄ PersonaGenerator μΈμŠ€ν„΄μŠ€ 생성
864
- persona_generator = PersonaGenerator(api_provider=api_provider, api_key=api_key.strip())
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
865
 
866
  provider_name = "Google Gemini" if api_provider == "gemini" else "OpenAI"
867
- return f"βœ… **{provider_name} API μ„€μ • μ™„λ£Œ!**\n\n🎯 **이제 λŒ€ν™” κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.**\n\nπŸ’‘ **μ‚¬μš©λ²•**: λŒ€ν™”ν•˜κΈ° νƒ­μ—μ„œ JSON νŒŒμΌμ„ μ—…λ‘œλ“œν•˜μ—¬ 페λ₯΄μ†Œλ‚˜μ™€ λŒ€ν™”λ₯Ό μ‹œμž‘ν•˜μ„Έμš”."
868
 
869
  except Exception as e:
870
  return f"❌ **API μ„€μ • 쀑 였λ₯˜ λ°œμƒ**\n\nπŸ” **였λ₯˜ λ‚΄μš©**: {str(e)}\n\nπŸ’‘ **확인사항**:\n- API ν‚€κ°€ μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•˜μ„Έμš”\n- 인터넷 연결을 ν™•μΈν•˜μ„Έμš”"
 
682
  if chat_history is None:
683
  chat_history = []
684
 
685
+ # 페λ₯΄μ†Œλ‚˜ 체크
686
+ if not persona:
687
+ error_msg = "❌ λ¨Όμ € 페λ₯΄μ†Œλ‚˜λ₯Ό λΆˆλŸ¬μ™€μ£Όμ„Έμš”! λŒ€ν™”ν•˜κΈ° νƒ­μ—μ„œ JSON νŒŒμΌμ„ μ—…λ‘œλ“œν•˜μ„Έμš”."
688
+ chat_history.append({"role": "user", "content": user_message})
689
+ chat_history.append({"role": "assistant", "content": error_msg})
690
+ return chat_history, ""
691
+
692
+ # API ν‚€ 체크
693
+ if not api_key or not api_key.strip():
694
+ error_msg = "❌ API ν‚€κ°€ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€. μƒλ‹¨μ˜ 'API μ„€μ •' μ„Ήμ…˜μ—μ„œ λ¨Όμ € API ν‚€λ₯Ό μ„€μ •ν•΄μ£Όμ„Έμš”!"
695
+ chat_history.append({"role": "user", "content": user_message})
696
+ chat_history.append({"role": "assistant", "content": error_msg})
697
+ return chat_history, ""
698
+
699
  try:
700
  # κΈ€λ‘œλ²Œ persona_generator μ‚¬μš© (API 섀정이 적용된 μƒνƒœ)
701
  generator = persona_generator
702
+ if generator is None or not hasattr(generator, 'api_key') or generator.api_key != api_key.strip():
703
+ generator = PersonaGenerator(api_provider=api_provider, api_key=api_key.strip())
704
  else:
705
+ # API μ„€μ • μ—…λ°μ΄νŠΈ (ν‚€κ°€ λ‹€λ₯Ό 수 μžˆμœΌλ―€λ‘œ)
706
+ generator.set_api_config(api_provider, api_key.strip())
707
 
708
  # Gradio messages ν˜•μ‹μ—μ„œ λŒ€ν™” 기둝 λ³€ν™˜
709
  conversation_history = []
 
726
 
727
  except Exception as e:
728
  error_message = f"μ±„νŒ… 쀑 였λ₯˜κ°€ λ°œμƒν–ˆμŠ΅λ‹ˆλ‹€: {str(e)}"
729
+ print(f"🚨 λŒ€ν™” 였λ₯˜: {error_message}") # λ””λ²„κΉ…μš©
730
+ import traceback
731
+ traceback.print_exc() # μžμ„Έν•œ 였λ₯˜ 정보
732
+
733
+ # μ‚¬μš©μžμ—κ²Œ μΉœκ·Όν•œ 였λ₯˜ λ©”μ‹œμ§€
734
+ if "API" in str(e):
735
+ friendly_error = "API 연결에 λ¬Έμ œκ°€ μžˆμ–΄μš”. API ν‚€λ₯Ό λ‹€μ‹œ ν™•μΈν•΄λ³΄μ‹œκ² μ–΄μš”? 😊"
736
+ elif "인터넷" in str(e) or "network" in str(e).lower():
737
+ friendly_error = "인터넷 연결을 ν™•μΈν•΄λ³΄μ„Έμš”! 🌐"
738
+ else:
739
+ friendly_error = f"μ•—, λ―Έμ•ˆν•΄... λ­”κ°€ λ¬Έμ œκ°€ 생긴 것 κ°™μ•„... πŸ˜…\n\nπŸ” **기술적 정보**: {str(e)}"
740
+
741
  chat_history.append({"role": "user", "content": user_message})
742
+ chat_history.append({"role": "assistant", "content": friendly_error})
743
  return chat_history, ""
744
 
745
  def import_persona_from_json(json_file):
 
886
  return "❌ **API ν‚€λ₯Ό μž…λ ₯ν•΄μ£Όμ„Έμš”.**\n\nπŸ”‘ **API ν‚€ λ°œκΈ‰ 방법:**\n- **Gemini**: https://makersuite.google.com/app/apikey\n- **OpenAI**: https://platform.openai.com/api-keys"
887
 
888
  try:
889
+ # API ν‚€ ν˜•μ‹ 검증
890
+ api_key = api_key.strip()
891
+ if api_provider == "gemini" and not api_key.startswith("AI"):
892
+ return "❌ **Gemini API ν‚€ ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.**\n\nπŸ’‘ **Gemini API ν‚€λŠ” 'AIza...' ν˜•νƒœλ‘œ μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.**"
893
+ elif api_provider == "openai" and not api_key.startswith("sk-"):
894
+ return "❌ **OpenAI API ν‚€ ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.**\n\nπŸ’‘ **OpenAI API ν‚€λŠ” 'sk-...' ν˜•νƒœλ‘œ μ‹œμž‘ν•΄μ•Ό ν•©λ‹ˆλ‹€.**"
895
+
896
+ # μƒˆλ‘œμš΄ PersonaGenerator μΈμŠ€ν„΄μŠ€ 생성 및 ν…ŒμŠ€νŠΈ
897
+ test_generator = PersonaGenerator(api_provider=api_provider, api_key=api_key)
898
+
899
+ # κ°„λ‹¨ν•œ API ν…ŒμŠ€νŠΈ
900
+ test_response = test_generator._generate_text_with_api("μ•ˆλ…•ν•˜μ„Έμš”! κ°„λ‹¨νžˆ μ‘λ‹΅ν•΄μ£Όμ„Έμš”.")
901
+
902
+ if "API ν‚€κ°€ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€" in test_response or "API 였λ₯˜" in test_response:
903
+ return f"❌ **API μ—°κ²° μ‹€νŒ¨**\n\nπŸ” **였λ₯˜ λ‚΄μš©**: {test_response}\n\nπŸ’‘ **확인사항**:\n- API ν‚€κ°€ μœ νš¨ν•œμ§€ ν™•μΈν•˜μ„Έμš”\n- 인터넷 연결을 ν™•μΈν•˜μ„Έμš”"
904
+
905
+ # μ„±κ³΅μ‹œ κΈ€λ‘œλ²Œ μΈμŠ€ν„΄μŠ€ ꡐ체
906
+ persona_generator = test_generator
907
 
908
  provider_name = "Google Gemini" if api_provider == "gemini" else "OpenAI"
909
+ return f"βœ… **{provider_name} API μ„€μ • μ™„λ£Œ!**\n\n🎯 **이제 λŒ€ν™” κΈ°λŠ₯을 μ‚¬μš©ν•  수 μžˆμŠ΅λ‹ˆλ‹€.**\n\nπŸ’‘ **μ‚¬μš©λ²•**: λŒ€ν™”ν•˜κΈ° νƒ­μ—μ„œ JSON νŒŒμΌμ„ μ—…λ‘œλ“œν•˜μ—¬ 페λ₯΄μ†Œλ‚˜μ™€ λŒ€ν™”λ₯Ό μ‹œμž‘ν•˜μ„Έμš”.\n\nπŸ”¬ **ν…ŒμŠ€νŠΈ 응닡**: {test_response[:100]}..."
910
 
911
  except Exception as e:
912
  return f"❌ **API μ„€μ • 쀑 였λ₯˜ λ°œμƒ**\n\nπŸ” **였λ₯˜ λ‚΄μš©**: {str(e)}\n\nπŸ’‘ **확인사항**:\n- API ν‚€κ°€ μ˜¬λ°”λ₯Έμ§€ ν™•μΈν•˜μ„Έμš”\n- 인터넷 연결을 ν™•μΈν•˜μ„Έμš”"
modules/persona_generator.py CHANGED
@@ -1019,7 +1019,12 @@ class PersonaGenerator:
1019
  return "Gemini API ν‚€κ°€ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€."
1020
 
1021
  try:
1022
- model = genai.GenerativeModel('gemini-1.5-pro')
 
 
 
 
 
1023
 
1024
  if image:
1025
  response = model.generate_content([prompt, image])
@@ -2075,7 +2080,7 @@ class PersonaGenerator:
2075
  )
2076
 
2077
  # 🧠 3단계 κΈ°μ–΅ μ‹œμŠ€ν…œμ—μ„œ μ»¨ν…μŠ€νŠΈ κ°€μ Έμ˜€κΈ°
2078
- memory_context = self.conversation_memory.get_context_for_response(personality_type, session_id)
2079
 
2080
  # 127개 λ³€μˆ˜ 기반 μ„ΈλΆ€ 성격 νŠΉμ„±
2081
  detailed_personality_prompt = self._generate_detailed_personality_instructions(personality_profile)
@@ -2110,6 +2115,23 @@ class PersonaGenerator:
2110
  # πŸ“Š 127개 λ³€μˆ˜ 기반 상황별 λ°˜μ‘ κ°€μ΄λ“œ
2111
  situational_guide = self._generate_situational_response_guide(personality_profile, user_message)
2112
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
2113
  # μ΅œμ’… ν”„λ‘¬ν”„νŠΈ μ‘°ν•© (κΈ°μ–΅ μ‹œμŠ€ν…œ μ»¨ν…μŠ€νŠΈ 포함)
2114
  full_prompt = f"""{base_prompt}
2115
 
@@ -2119,11 +2141,7 @@ class PersonaGenerator:
2119
 
2120
  {personality_specific_prompt}
2121
 
2122
- {memory_context['short_term_context']}
2123
-
2124
- {memory_context['medium_term_insights']}
2125
-
2126
- {memory_context['long_term_adaptations']}
2127
 
2128
  {history_text}
2129
 
@@ -2147,7 +2165,7 @@ class PersonaGenerator:
2147
  response_text = self._generate_text_with_api(full_prompt)
2148
 
2149
  # 🧠 κΈ°μ–΅ μ‹œμŠ€ν…œμ— μƒˆλ‘œμš΄ μƒν˜Έμž‘μš© μΆ”κ°€
2150
- self.conversation_memory.add_interaction(user_message, response_text, session_id)
2151
 
2152
  return response_text
2153
 
 
1019
  return "Gemini API ν‚€κ°€ μ„€μ •λ˜μ§€ μ•Šμ•˜μŠ΅λ‹ˆλ‹€."
1020
 
1021
  try:
1022
+ # Gemini 2.0 Flash λͺ¨λΈ μ‚¬μš© (μ΅œμ‹  버전)
1023
+ try:
1024
+ model = genai.GenerativeModel('gemini-2.0-flash-exp')
1025
+ except:
1026
+ # fallback to stable version
1027
+ model = genai.GenerativeModel('gemini-1.5-pro')
1028
 
1029
  if image:
1030
  response = model.generate_content([prompt, image])
 
2080
  )
2081
 
2082
  # 🧠 3단계 κΈ°μ–΅ μ‹œμŠ€ν…œμ—μ„œ μ»¨ν…μŠ€νŠΈ κ°€μ Έμ˜€κΈ°
2083
+ memory_context = self.conversation_memory.get_relevant_context(user_message, session_id)
2084
 
2085
  # 127개 λ³€μˆ˜ 기반 μ„ΈλΆ€ 성격 νŠΉμ„±
2086
  detailed_personality_prompt = self._generate_detailed_personality_instructions(personality_profile)
 
2115
  # πŸ“Š 127개 λ³€μˆ˜ 기반 상황별 λ°˜μ‘ κ°€μ΄λ“œ
2116
  situational_guide = self._generate_situational_response_guide(personality_profile, user_message)
2117
 
2118
+ # κΈ°μ–΅ μ»¨ν…μŠ€νŠΈ ν¬λ§·νŒ…
2119
+ memory_insights = ""
2120
+ if memory_context:
2121
+ if memory_context.get("recent_conversations"):
2122
+ memory_insights += "\n## 🧠 졜근 λŒ€ν™” κΈ°μ–΅:\n"
2123
+ for conv in memory_context["recent_conversations"][-2:]:
2124
+ memory_insights += f"- {conv.get('user_message', '')[:30]}...\n"
2125
+
2126
+ if memory_context.get("user_profile"):
2127
+ profile = memory_context["user_profile"]
2128
+ relationship_level = profile.get("relationship_level", "μƒˆλ‘œμš΄_λ§Œλ‚¨")
2129
+ memory_insights += f"\n## πŸ‘₯ 관계 μˆ˜μ€€: {relationship_level}\n"
2130
+
2131
+ if profile.get("message_count", 0) > 3:
2132
+ memory_insights += f"- λŒ€ν™” 횟수: {profile['message_count']}회\n"
2133
+ memory_insights += f"- μ†Œν†΅ μŠ€νƒ€μΌ: {profile.get('communication_style', '보톡')}\n"
2134
+
2135
  # μ΅œμ’… ν”„λ‘¬ν”„νŠΈ μ‘°ν•© (κΈ°μ–΅ μ‹œμŠ€ν…œ μ»¨ν…μŠ€νŠΈ 포함)
2136
  full_prompt = f"""{base_prompt}
2137
 
 
2141
 
2142
  {personality_specific_prompt}
2143
 
2144
+ {memory_insights}
 
 
 
 
2145
 
2146
  {history_text}
2147
 
 
2165
  response_text = self._generate_text_with_api(full_prompt)
2166
 
2167
  # 🧠 κΈ°μ–΅ μ‹œμŠ€ν…œμ— μƒˆλ‘œμš΄ μƒν˜Έμž‘μš© μΆ”κ°€
2168
+ self.conversation_memory.add_conversation(user_message, response_text, session_id)
2169
 
2170
  return response_text
2171