Spaces:
Sleeping
Sleeping
haepa_mac
Add multi-API support with OpenAI and improved UI - comprehensive system with dynamic API switching, enhanced PersonaGenerator, and validation tests
572fbe8
| #!/usr/bin/env python3 | |
| # -*- coding: utf-8 -*- | |
| from modules.persona_generator import PersonaGenerator, PersonalityProfile, HumorMatrix | |
| import json | |
| def test_8_stereotypes(): | |
| """8가지 스테레오타입 극명한 차별화 테스트""" | |
| generator = PersonaGenerator() | |
| # 8가지 극명한 스테레오타입 정의 | |
| stereotypes = [ | |
| { | |
| "name": "🎉 열정적 엔터테이너", | |
| "image_analysis": { | |
| 'object_type': '블루투스 스피커', | |
| 'colors': ['red', 'gold'], | |
| 'materials': ['plastic'], | |
| 'condition': '새것같음', | |
| 'personality_hints': {'warmth_factor': 85, 'competence_factor': 45, 'humor_factor': 90} | |
| }, | |
| "user_context": {'name': '댄스킹', 'location': '파티룸'} | |
| }, | |
| { | |
| "name": "❄️ 차가운 완벽주의자", | |
| "image_analysis": { | |
| 'object_type': '기계식 시계', | |
| 'colors': ['black', 'silver'], | |
| 'materials': ['metal', 'steel'], | |
| 'condition': '완벽함', | |
| 'personality_hints': {'warmth_factor': 25, 'competence_factor': 95, 'humor_factor': 20} | |
| }, | |
| "user_context": {'name': '프리시전', 'location': '사무실'} | |
| }, | |
| { | |
| "name": "💝 따뜻한 상담사", | |
| "image_analysis": { | |
| 'object_type': '털 쿠션', | |
| 'colors': ['beige', 'pink'], | |
| 'materials': ['fabric', 'cotton'], | |
| 'condition': '부드러움', | |
| 'personality_hints': {'warmth_factor': 95, 'competence_factor': 55, 'humor_factor': 30} | |
| }, | |
| "user_context": {'name': '허니', 'location': '침실'} | |
| }, | |
| { | |
| "name": "🎭 위트 넘치는 지식인", | |
| "image_analysis": { | |
| 'object_type': '고급 만년필', | |
| 'colors': ['burgundy', 'gold'], | |
| 'materials': ['metal', 'resin'], | |
| 'condition': '고급스러움', | |
| 'personality_hints': {'warmth_factor': 40, 'competence_factor': 90, 'humor_factor': 85} | |
| }, | |
| "user_context": {'name': '위즈덤', 'location': '서재'} | |
| }, | |
| { | |
| "name": "🌙 수줍은 몽상가", | |
| "image_analysis": { | |
| 'object_type': '수채화 붓', | |
| 'colors': ['lavender', 'white'], | |
| 'materials': ['wood', 'hair'], | |
| 'condition': '예술적임', | |
| 'personality_hints': {'warmth_factor': 60, 'competence_factor': 50, 'humor_factor': 55} | |
| }, | |
| "user_context": {'name': '루나', 'location': '화실'} | |
| }, | |
| { | |
| "name": "👑 카리스마틱 리더", | |
| "image_analysis": { | |
| 'object_type': '고급 노트북', | |
| 'colors': ['titanium', 'black'], | |
| 'materials': ['aluminum', 'carbon'], | |
| 'condition': '프리미엄', | |
| 'personality_hints': {'warmth_factor': 60, 'competence_factor': 95, 'humor_factor': 70} | |
| }, | |
| "user_context": {'name': '맥스', 'location': '회의실'} | |
| }, | |
| { | |
| "name": "😜 장난꾸러기 친구", | |
| "image_analysis": { | |
| 'object_type': '고무공', | |
| 'colors': ['rainbow', 'bright'], | |
| 'materials': ['rubber'], | |
| 'condition': '통통튐', | |
| 'personality_hints': {'warmth_factor': 80, 'competence_factor': 30, 'humor_factor': 95} | |
| }, | |
| "user_context": {'name': '바운시', 'location': '놀이터'} | |
| }, | |
| { | |
| "name": "🔮 신비로운 현자", | |
| "image_analysis": { | |
| 'object_type': '오래된 책', | |
| 'colors': ['dark_brown', 'gold'], | |
| 'materials': ['leather', 'paper'], | |
| 'condition': '고풍스러움', | |
| 'personality_hints': {'warmth_factor': 50, 'competence_factor': 90, 'humor_factor': 40} | |
| }, | |
| "user_context": {'name': '세이지', 'location': '도서관'} | |
| } | |
| ] | |
| print("🎭 8가지 스테레오타입 극명한 차별화 테스트") | |
| print("=" * 80) | |
| results = [] | |
| for i, stereotype in enumerate(stereotypes, 1): | |
| print(f"\n{stereotype['name']} ({i}/8)") | |
| print("-" * 50) | |
| try: | |
| # 페르소나 생성 | |
| persona = generator.create_frontend_persona( | |
| stereotype['image_analysis'], | |
| stereotype['user_context'] | |
| ) | |
| # 성격 특성 분석 | |
| traits = persona['성격특성'] | |
| profile_vars = persona.get('성격프로필', {}) | |
| # 핵심 지표 추출 | |
| result = { | |
| "이름": persona['기본정보']['이름'], | |
| "스테레오타입": stereotype['name'], | |
| "사물": stereotype['image_analysis']['object_type'], | |
| "위치": stereotype['user_context']['location'], | |
| "성격특성": { | |
| "온기": round(traits['온기'], 1), | |
| "능력": round(traits['능력'], 1), | |
| "외향성": round(traits['외향성'], 1), | |
| "유머감각": round(traits['유머감각'], 1), | |
| "창의성": round(traits['창의성'], 1), | |
| "공감능력": round(traits['공감능력'], 1) | |
| }, | |
| "127변수_샘플": { | |
| "W01_친절함": profile_vars.get('W01_친절함', 0), | |
| "C01_효율성": profile_vars.get('C01_효율성', 0), | |
| "E01_사교성": profile_vars.get('E01_사교성', 0), | |
| "H01_언어유희빈도": profile_vars.get('H01_언어유희빈도', 0), | |
| "F01_완벽주의불안": profile_vars.get('F01_완벽주의불안', 0) | |
| }, | |
| "매력적결함": persona['매력적결함'], | |
| "모순적특성": persona['모순적특성'], | |
| "유머스타일": persona['유머스타일'], | |
| "소통방식": persona['소통방식'] | |
| } | |
| results.append(result) | |
| # 출력 | |
| print(f"👤 이름: {result['이름']}") | |
| print(f"🏠 사물: {result['사물']} (위치: {result['위치']})") | |
| print(f"📊 성격: 온기{result['성격특성']['온기']} 능력{result['성격특성']['능력']} 외향성{result['성격특성']['외향성']} 유머{result['성격특성']['유머감각']}") | |
| print(f"🧬 127변수: 친절함{result['127변수_샘플']['W01_친절함']} 효율성{result['127변수_샘플']['C01_효율성']} 사교성{result['127변수_샘플']['E01_사교성']}") | |
| print(f"💎 매력적결함: {len(result['매력적결함'])}개 - {result['매력적결함'][0][:30]}...") | |
| print(f"🌈 모순적특성: {len(result['모순적특성'])}개 - {result['모순적특성'][0][:30]}...") | |
| print(f"🎪 유머스타일: {result['유머스타일'][:50]}...") | |
| print(f"💬 소통방식: {result['소통방식'][:50]}...") | |
| except Exception as e: | |
| print(f"❌ 오류: {str(e)}") | |
| import traceback | |
| traceback.print_exc() | |
| print(f"\n\n📊 차별화 분석 결과:") | |
| print("=" * 80) | |
| if len(results) >= 2: | |
| # 극명한 차별화 확인 | |
| print("🔥 극명한 차별화 확인:") | |
| # 가장 따뜻한 vs 가장 차가운 | |
| warmest = max(results, key=lambda x: x['성격특성']['온기']) | |
| coldest = min(results, key=lambda x: x['성격특성']['온기']) | |
| print(f" 🔥 가장 따뜻: {warmest['이름']} (온기 {warmest['성격특성']['온기']})") | |
| print(f" ❄️ 가장 차가운: {coldest['이름']} (온기 {coldest['성격특성']['온기']})") | |
| print(f" 📈 차이: {warmest['성격특성']['온기'] - coldest['성격특성']['온기']:.1f}") | |
| # 가장 유능한 vs 가장 무능한 | |
| most_competent = max(results, key=lambda x: x['성격특성']['능력']) | |
| least_competent = min(results, key=lambda x: x['성격특성']['능력']) | |
| print(f" 🏆 가장 유능: {most_competent['이름']} (능력 {most_competent['성격특성']['능력']})") | |
| print(f" 🤪 가장 무능: {least_competent['이름']} (능력 {least_competent['성격특성']['능력']})") | |
| print(f" 📈 차이: {most_competent['성격특성']['능력'] - least_competent['성격특성']['능력']:.1f}") | |
| # 가장 외향적 vs 가장 내향적 | |
| most_extroverted = max(results, key=lambda x: x['성격특성']['외향성']) | |
| most_introverted = min(results, key=lambda x: x['성격특성']['외향성']) | |
| print(f" 🎉 가장 외향적: {most_extroverted['이름']} (외향성 {most_extroverted['성격특성']['외향성']})") | |
| print(f" 🤫 가장 내향적: {most_introverted['이름']} (외향성 {most_introverted['성격특성']['외향성']})") | |
| print(f" 📈 차이: {most_extroverted['성격특성']['외향성'] - most_introverted['성격특성']['외향성']:.1f}") | |
| print(f"\n✅ 차별화 성공! 각 특성별로 극명한 차이가 확인됨") | |
| # 사물 특성 반영 확인 | |
| print(f"\n🎨 사물 특성 반영 확인:") | |
| for result in results: | |
| print(f" {result['사물']} → {result['이름']} → 온기{result['성격특성']['온기']} 능력{result['성격특성']['능력']}") | |
| return results | |
| def analyze_physical_trait_impact(): | |
| """물리적 특성이 성격에 미치는 영향 분석""" | |
| print(f"\n🎨 물리적 특성 → 성격 영향 분석") | |
| print("=" * 50) | |
| generator = PersonaGenerator() | |
| # 같은 기본 사물, 다른 물리적 특성 | |
| base_object = { | |
| 'object_type': '머그컵', | |
| 'personality_hints': {'warmth_factor': 50, 'competence_factor': 50, 'humor_factor': 50} | |
| } | |
| variations = [ | |
| { | |
| "name": "빨간 플라스틱 머그컵", | |
| "colors": ['red'], | |
| "materials": ['plastic'], | |
| "condition": "새것" | |
| }, | |
| { | |
| "name": "검은 금속 머그컵", | |
| "colors": ['black'], | |
| "materials": ['metal'], | |
| "condition": "고급스러움" | |
| }, | |
| { | |
| "name": "베이지 천 머그컵", | |
| "colors": ['beige'], | |
| "materials": ['fabric'], | |
| "condition": "부드러움" | |
| } | |
| ] | |
| results = [] | |
| for variation in variations: | |
| image_analysis = {**base_object, **variation} | |
| user_context = {'name': variation['name'][:5]} | |
| persona = generator.create_frontend_persona(image_analysis, user_context) | |
| traits = persona['성격특성'] | |
| result = { | |
| "name": variation['name'], | |
| "colors": variation['colors'], | |
| "materials": variation['materials'], | |
| "condition": variation['condition'], | |
| "warmth": round(traits['온기'], 1), | |
| "competence": round(traits['능력'], 1), | |
| "humor": round(traits['유머감각'], 1) | |
| } | |
| results.append(result) | |
| print(f"{result['name']}: 온기{result['warmth']} 능력{result['competence']} 유머{result['humor']}") | |
| print(f"\n🔍 결론: 같은 사물도 색상/재질/상태에 따라 성격이 다르게 형성됨!") | |
| return results | |
| if __name__ == "__main__": | |
| # 8가지 스테레오타입 테스트 | |
| stereotype_results = test_8_stereotypes() | |
| # 물리적 특성 영향 분석 | |
| physical_results = analyze_physical_trait_impact() | |
| print(f"\n\n🎉 테스트 완료!") | |
| print(f"📊 8가지 스테레오타입: {len(stereotype_results)}개 생성") | |
| print(f"🎨 물리적 특성 변화: {len(physical_results)}개 테스트") | |
| print(f"✅ 시스템이 정상적으로 차별화된 성격을 생성하고 있습니다!") |