| import os |
| import time |
| import streamlit as st |
| import google.generativeai as genai |
| from streamlit_extras.colored_header import colored_header |
| import markdown |
|
|
| |
| genai.configure(api_key=os.environ["GEMINI_API_KEY"]) |
|
|
| |
| generation_config = { |
| "temperature": 0.75, |
| "top_p": 0.8, |
| "top_k": 40, |
| "max_output_tokens": 8000, |
| } |
|
|
| model = genai.GenerativeModel( |
| model_name="gemini-2.0-flash", |
| generation_config=generation_config, |
| ) |
|
|
| |
| enneagram_types = { |
| "1": "개혁가", |
| "2": "조력가", |
| "3": "성취자", |
| "4": "예술가", |
| "5": "사색가", |
| "6": "충실가", |
| "7": "낙천가", |
| "8": "도전가", |
| "9": "평화주의자" |
| } |
|
|
| |
| wing_types = { |
| "1w9": "1w9", |
| "1w2": "1w2", |
| "2w1": "2w1", |
| "2w3": "2w3", |
| "3w2": "3w2", |
| "3w4": "3w4", |
| "4w3": "4w3", |
| "4w5": "4w5", |
| "5w4": "5w4", |
| "5w6": "5w6", |
| "6w5": "6w5", |
| "6w7": "6w7", |
| "7w6": "7w6", |
| "7w8": "7w8", |
| "8w7": "8w7", |
| "8w9": "8w9", |
| "9w8": "9w8", |
| "9w1": "9w1", |
| } |
|
|
|
|
| |
| instinct_variants = { |
| "sp": "자기보존", |
| "so": "사회적", |
| "sx": "성적" |
| } |
|
|
| |
| relationship_types = { |
| "연인": "Romantic Couple", |
| "부부": "Married Couple", |
| "친구": "Friends", |
| "가족": "Family", |
| "직장 동료": "Coworkers", |
| "기타": "Others" |
| } |
|
|
|
|
| def generate_relationship_scenario(my_name, my_gender, my_type, my_wing, my_instinct, partner_name, partner_gender, partner_type, partner_wing, partner_instinct, relationship, situation): |
|
|
| |
| def create_type_info(name, gender, type, wing, instinct): |
| type_info = f"{name} ({gender}): {type} ({enneagram_types.get(type, '알 수 없는 유형')})" |
| if wing: |
| type_info += f" 날개: {wing}" |
| if instinct: |
| type_info += f", 본능: {instinct_variants.get(instinct)}" |
| return type_info |
|
|
| my_type_info = create_type_info(my_name, my_gender, my_type, my_wing, my_instinct) |
| partner_type_info = create_type_info(partner_name, partner_gender, partner_type, partner_wing, partner_instinct) |
|
|
| system_prompt = f""" |
| 당신은 에니어그램 전문가이자 관계 코치입니다. 아래 정보를 바탕으로 관계 시나리오를 작성해주세요. |
| [대상자 정보] |
| - {my_type_info} |
| - {partner_type_info} |
| [관계] |
| - {relationship} |
| [상황] |
| - {situation} |
| [요청 사항] |
| 1. **{my_name} ({my_gender})의 에니어그램 유형에 대한 상세 설명:** |
| - 핵심 가치, 성격적 특징, 강점과 약점, 주의할 점 등을 포함하여 자세히 설명해주세요. |
| 2. **{partner_name} ({partner_gender})의 에니어그램 유형에 대한 상세 설명:** |
| - 핵심 가치, 성격적 특징, 강점과 약점, 주의할 점 등을 포함하여 자세히 설명해주세요. |
| 3. **에니어그램 유형을 바탕으로 한 구체적인 데이트 시나리오 작성:** |
| - 만남, 대화 시작, 식사, 영화 관람, 갈등 발생 및 해결 등 데이트의 각 단계를 구체적인 대화 장면으로 묘사해주세요. |
| - 각 단계에서 {my_name}과 {partner_name}의 감정 변화와 반응을 상세히 묘사하고, 각 인물의 말과 행동이 에니어그램 특성과 어떻게 연결되는지 부가 설명해주세요. |
| - 시나리오에 {my_name}과 {partner_name}의 이름, 성별, 에니어그램 유형이 모두 반영되어야 합니다. |
| 4. **상대방을 서로 이해하기 위한 실질적인 조언:** |
| - 각 대상자가 상대방의 에니어그램 유형을 이해하고, 더 나은 관계를 형성하기 위한 구체적인 조언을 제시해주세요. |
| - 조언에 {my_name}과 {partner_name}의 이름, 성별, 에니어그램 유형이 모두 반영되어야 합니다. |
| - 마지막에 상대방에게 해주면 좋은 말과 행동의 구체적인 예와 왜 상대방에게 좋은지에 대한 이유도 설명해주세요. |
| """ |
|
|
| full_text = "" |
| try: |
| response = model.generate_content([system_prompt], stream=True) |
| for chunk in response: |
| full_text += chunk.text |
| html_text = markdown.markdown(full_text) |
| scenario_output_area.markdown(html_text, unsafe_allow_html=True) |
| time.sleep(0.05) |
| except Exception as e: |
| st.error(f"Error: {str(e)}") |
| return "" |
|
|
| return full_text |
|
|
|
|
| |
| st.set_page_config(page_title="에니어그램 관계 시뮬레이터", page_icon="🤝") |
|
|
| st.title("🤝 에니어그램 관계 시뮬레이터") |
| st.write("두 사람의 에니어그램 유형과 관계, 상황을 입력하여 관계 시나리오를 생성해보세요.") |
|
|
| |
| with st.sidebar: |
| tabs = st.tabs(["👤 내 정보", "👥 상대방 정보"]) |
|
|
| with tabs[0]: |
| my_name = st.text_input("내 이름/닉네임", "나") |
| my_gender = st.radio("내 성별", ["남성", "여성"]) |
| my_type = st.selectbox("내 에니어그램 유형", list(enneagram_types.keys())) |
| my_wing = st.selectbox("내 날개 유형 (선택)", [""] + list(wing_types.keys())) |
| my_instinct = st.selectbox("내 본능 유형 (선택)", [""] + list(instinct_variants.keys())) |
|
|
| with tabs[1]: |
| partner_name = st.text_input("상대방 이름/닉네임", "상대방") |
| partner_gender = st.radio("상대방 성별", ["남성", "여성"]) |
| partner_type = st.selectbox("상대방 에니어그램 유형", list(enneagram_types.keys())) |
| partner_wing = st.selectbox("상대방 날개 유형 (선택)", [""] + list(wing_types.keys())) |
| partner_instinct = st.selectbox("상대방 본능 유형 (선택)", [""] + list(instinct_variants.keys())) |
|
|
| relationship = st.selectbox("관계 유형", list(relationship_types.keys())) |
| situation = st.text_area("상황 (예: 갈등 상황, 특별한 이벤트 등)", height=150) |
|
|
| generate_button = st.button("시나리오 생성 ➡️") |
|
|
| |
| scenario_output_area = st.empty() |
|
|
| if generate_button: |
| full_text = generate_relationship_scenario(my_name, my_gender, my_type, my_wing, my_instinct, partner_name, partner_gender, partner_type, partner_wing, partner_instinct, relationship, situation) |
| if full_text: |
| scenario_output_area.markdown(markdown.markdown(full_text), unsafe_allow_html=True) |