ll7098ll commited on
Commit
447013b
·
verified ·
1 Parent(s): d148fc4

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +91 -108
app.py CHANGED
@@ -36,17 +36,27 @@ enneagram_types = {
36
 
37
  # 날개 유형 정보
38
  wing_types = {
39
- "w1": "개혁가 날개",
40
- "w2": "조력가 날개",
41
- "w3": "성취자 날개",
42
- "w4": "예술가 날개",
43
- "w5": "사색가 날개",
44
- "w6": "충실가 날개",
45
- "w7": "낙천가 날개",
46
- "w8": "도전가 날개",
47
- "w9": "평화주의자 날개"
 
 
 
 
 
 
 
 
 
48
  }
49
 
 
50
  # 본능 유형 정보
51
  instinct_variants = {
52
  "sp": "자기보존",
@@ -54,7 +64,7 @@ instinct_variants = {
54
  "sx": "성적"
55
  }
56
 
57
- # 2인 관계 유형
58
  relationship_types_two = {
59
  "연인": "Romantic Couple",
60
  "부부": "Married Couple",
@@ -64,120 +74,93 @@ relationship_types_two = {
64
  "기타": "Others"
65
  }
66
 
67
- # 다자 관계 유형
68
  relationship_types_multiple = {
 
 
69
  "직장 동료": "Coworkers",
70
- "친구들": "Friends Group",
71
  "프로젝트 팀": "Project Team",
72
  "스터디 그룹": "Study Group",
73
- "동호회": "Club",
74
- "가족 모임": "Family Gathering",
75
- "네트워킹 모임": "Networking Event"
76
  }
77
 
78
- def generate_relationship_scenario(my_name, my_gender, my_type, my_wing, my_instinct, partner_infos, relationship, situation):
 
79
 
80
  # 에니어그램 유형 정보 문자열 생성 (날개/본능 포함)
81
- def create_type_info(name, gender, type, wing, instinct):
82
- type_info = f"{name} ({gender}): {type} ({enneagram_types.get(type, '알 수 없는 유형')})"
83
- if wing:
84
- type_info += f" 날개: {wing_types.get(wing)}"
85
- if instinct:
86
- type_info += f", 본능: {instinct_variants.get(instinct)}"
87
  return type_info
88
 
89
- my_type_info = create_type_info(my_name, my_gender, my_type, my_wing, my_instinct)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
90
 
91
  full_text = ""
92
- for partner_info in partner_infos:
93
- partner_name = partner_info["name"]
94
- partner_gender = partner_info["gender"]
95
- partner_type = partner_info["type"]
96
- partner_wing = partner_info["wing"]
97
- partner_instinct = partner_info["instinct"]
98
-
99
- partner_type_info = create_type_info(partner_name, partner_gender, partner_type, partner_wing, partner_instinct)
100
-
101
- system_prompt = f"""
102
- 당신은 에니어그램 전문가이자 관계 코치입니다. 아래 정보를 바탕으로 관계 시나리오를 작성해주세요.
103
- [대상자 정보]
104
- - {my_type_info}
105
- - {partner_type_info}
106
- [관계]
107
- - {relationship}
108
- [상황]
109
- - {situation}
110
- [요청 사항]
111
- 1. **{my_name} ({my_gender})의 에니어그램 유형에 대한 상세 설명:**
112
- - 핵심 가치, 성격적 특징, 강점과 약점, 주의할 점 등을 포함하여 자세히 설명해주세요.
113
- 2. **{partner_name} ({partner_gender})의 에니어그램 유형에 대한 상세 설명:**
114
- - 핵심 가치, 성격적 특징, 강점과 약점, 주의할 점 등을 포함하여 자세히 설명해주세요.
115
- 3. **에니어그램 유형을 바탕으로 한 구체적인 시나리오 작성:**
116
- - 만남, 대화 시작, 활동, 갈등 발생 및 해결 등 각 단계의 구체적인 대화 장면을 묘사해주세요.
117
- - 각 단계에서 {my_name}과 {partner_name}의 감정 변화와 반응을 상세히 묘사하고, 각 인물의 말과 행동이 에니어그램 특성과 어떻게 연결되는지 부가 설명해주세요.
118
- - 시나리오에 {my_name}과 {partner_name}의 이름, 성별, 에니어그램 유형이 모두 반영되어야 합니다.
119
- 4. **상대방을 서로 이해하기 위한 실질적인 조언:**
120
- - 각 대상자가 상대방의 에니어그램 유형을 이해하고, 더 나은 관계를 형성하기 위한 구체적인 조언을 제시해주세요.
121
- - 조언에 {my_name}과 {partner_name}의 이름, 성별, 에니어그램 유형이 모두 반영되어야 합니다.
122
- - 마지막에 상대방에게 해주면 좋은 말과 행동의 구체적인 예와 왜 상대방에게 좋은지에 대한 이유도 설명해주세요.
123
- """
124
-
125
- try:
126
- response = model.generate_content([system_prompt], stream=True)
127
- full_text += f"## {partner_name}과의 관계 시나리오\n\n"
128
- for chunk in response:
129
- full_text += chunk.text
130
- html_text = markdown.markdown(full_text)
131
- scenario_output_area.markdown(html_text, unsafe_allow_html=True)
132
- time.sleep(0.05) # 출력 속도 조절
133
- full_text += "\n\n---\n\n" # 시나리오 구분선 추가
134
- except Exception as e:
135
- st.error(f"Error: {str(e)}")
136
- return ""
137
 
138
  return full_text
139
 
 
140
  # Streamlit UI
141
  st.set_page_config(page_title="에니어그램 관계 시뮬레이터", page_icon="🤝")
142
-
143
  st.title("🤝 에니어그램 관계 시뮬레이터")
144
- st.write("여러 사람과의 에니어그램 관계 시나리오를 생성해보세요.")
145
-
146
- # 사이드바에 배치
147
- with st.sidebar:
148
- st.subheader("👤 정보")
149
- my_name = st.text_input("내 이름/닉네임", "나")
150
- my_gender = st.radio("내 성별", ["남성", "여성"])
151
- my_type = st.selectbox(" 에니어그램 유형", list(enneagram_types.keys()))
152
- my_wing = st.selectbox("내 날개 유형 (선택)", [""] + list(wing_types.keys()))
153
- my_instinct = st.selectbox("내 본능 유형 (선택)", [""] + list(instinct_variants.keys()))
154
-
155
- st.subheader("👥 상대방 정보")
156
- num_partners = st.number_input("상대방 ", min_value=1, max_value=10, value=1, step=1)
157
-
158
- partner_infos = []
159
- for i in range(int(num_partners)):
160
- st.write(f"**상대방 {i+1} 정보**")
161
- partner_name = st.text_input(f"상대방 {i+1} 이름/닉네임", f"상대방{i+1}")
162
- partner_gender = st.radio(f"상대방 {i+1} 성별", ["남성", "여성"], key=f"partner_gender_{i}")
163
- partner_type = st.selectbox(f"상대방 {i+1} 에니어그램 유형", list(enneagram_types.keys()), key=f"partner_type_{i}")
164
- partner_wing = st.selectbox(f"상대방 {i+1} 날개 유형 (선택)", [""] + list(wing_types.keys()), key=f"partner_wing_{i}")
165
- partner_instinct = st.selectbox(f"상대방 {i+1} 본능 유형 (선택)", [""] + list(instinct_variants.keys()), key=f"partner_instinct_{i}")
166
- partner_infos.append({
167
- "name": partner_name,
168
- "gender": partner_gender,
169
- "type": partner_type,
170
- "wing": partner_wing if partner_wing != "" else None,
171
- "instinct": partner_instinct if partner_instinct != "" else None
172
- })
173
-
174
- relationship_type = st.radio("관계 유형 선택", ["2인 관계", "다자 관계"])
175
- if relationship_type == "2인 관계":
176
- relationship = st.selectbox("관계 유형", list(relationship_types_two.keys()))
177
- else: # 다자 관계
178
- relationship = st.selectbox("관계 유형", list(relationship_types_multiple.keys()))
179
-
180
- situation = st.text_area("상황 (예: 갈등 상황, 특별한 이벤트 등)", height=150)
181
 
182
  generate_button = st.button("시나리오 생성 ➡️")
183
 
@@ -185,6 +168,6 @@ generate_button = st.button("시나리오 생성 ➡️")
185
  scenario_output_area = st.empty()
186
 
187
  if generate_button:
188
- full_text = generate_relationship_scenario(my_name, my_gender, my_type, my_wing, my_instinct, partner_infos, relationship, situation)
189
  if full_text:
190
- scenario_output_area.markdown(markdown.markdown(full_text), unsafe_allow_html=True)
 
36
 
37
  # 날개 유형 정보
38
  wing_types = {
39
+ "1w9": "1w9",
40
+ "1w2": "1w2",
41
+ "2w1": "2w1",
42
+ "2w3": "2w3",
43
+ "3w2": "3w2",
44
+ "3w4": "3w4",
45
+ "4w3": "4w3",
46
+ "4w5": "4w5",
47
+ "5w4": "5w4",
48
+ "5w6": "5w6",
49
+ "6w5": "6w5",
50
+ "6w7": "6w7",
51
+ "7w6": "7w6",
52
+ "7w8": "7w8",
53
+ "8w7": "8w7",
54
+ "8w9": "8w9",
55
+ "9w8": "9w8",
56
+ "9w1": "9w1",
57
  }
58
 
59
+
60
  # 본능 유형 정보
61
  instinct_variants = {
62
  "sp": "자기보존",
 
64
  "sx": "성적"
65
  }
66
 
67
+ # 관계 유형 (2인 관계 다인 관계 분리)
68
  relationship_types_two = {
69
  "연인": "Romantic Couple",
70
  "부부": "Married Couple",
 
74
  "기타": "Others"
75
  }
76
 
 
77
  relationship_types_multiple = {
78
+ "친구": "Friends",
79
+ "가족": "Family",
80
  "직장 동료": "Coworkers",
 
81
  "프로젝트 팀": "Project Team",
82
  "스터디 그룹": "Study Group",
83
+ "기타": "Others"
 
 
84
  }
85
 
86
+
87
+ def generate_relationship_scenario(people, relationship, situation):
88
 
89
  # 에니어그램 유형 정보 문자열 생성 (날개/본능 포함)
90
+ def create_type_info(person):
91
+ type_info = f"{person['name']} ({person['gender']}): {person['type']} ({enneagram_types.get(person['type'], '알 수 없는 유형')})"
92
+ if person['wing']:
93
+ type_info += f" 날개: {person['wing']}"
94
+ if person['instinct']:
95
+ type_info += f", 본능: {person['instinct_variants'].get(person['instinct'])}"
96
  return type_info
97
 
98
+ people_info = "\n".join([f"- {create_type_info(person)}" for person in people])
99
+
100
+
101
+ system_prompt = f"""
102
+ 당신은 에니어그램 전문가이자 관계 코치입니다. 아래 정보를 바탕으로 관계 시나리오를 작성해주세요.
103
+ [대상자 정보]
104
+ {people_info}
105
+ [관계]
106
+ - {relationship}
107
+ [상황]
108
+ - {situation}
109
+ [요청 사항]
110
+ 1. **각 대상자의 에니어그램 유형에 대한 상세 설명:**
111
+ - 각 대상자의 핵심 가치, 성격적 특징, 강점과 약점, 주의할 점 등을 포함하여 자세히 설명해주세요.
112
+ 2. **에니어그램 유형을 바탕으로 한 구체적인 시나리오 작성:**
113
+ - 상황에 맞는 시나리오를 작성하고, 각 단계를 구체적인 대화 장면으로 묘사해주세요.
114
+ - 각 단계에서 등장인물들의 감정 변화와 반응을 상세히 묘사하고, 각 인물의 말과 행동이 에니어그램 특성과 어떻게 연결되는지 부가 설명해주세요.
115
+ - 시나리오에 모든 등장인물의 이름, 성별, 에니어그램 유형이 모두 반영되어야 합니다.
116
+ 3. **서로 이해하기 위한 실질적인 조언:**
117
+ - 각 대상자가 서로의 에니어그램 유형을 이해하고, 더 나은 관계를 형성하기 위한 구체적인 조언을 제시해주세요.
118
+ - 조언에 모든 등장인물의 이름, 성별, 에니어그램 유형이 모두 반영되어야 합니다.
119
+ - 각 대상자가 다른 대상자에게 해주면 좋은 말과 행동의 구체적인 예와 왜 좋은지에 대한 이유도 설명해주세요.
120
+ """
121
 
122
  full_text = ""
123
+ try:
124
+ response = model.generate_content([system_prompt], stream=True)
125
+ for chunk in response:
126
+ full_text += chunk.text
127
+ html_text = markdown.markdown(full_text)
128
+ scenario_output_area.markdown(html_text, unsafe_allow_html=True)
129
+ time.sleep(0.05)
130
+ except Exception as e:
131
+ st.error(f"Error: {str(e)}")
132
+ return ""
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
133
 
134
  return full_text
135
 
136
+
137
  # Streamlit UI
138
  st.set_page_config(page_title="에니어그램 관계 시뮬레이터", page_icon="🤝")
 
139
  st.title("🤝 에니어그램 관계 시뮬레이터")
140
+ st.write("자들의 에니어그램 유형, 관계, 상황을 입력하여 관계 시나리오를 생성해보세요.")
141
+
142
+ # 사 추가/삭제 기능
143
+ num_people = st.number_input("참여자 수", min_value=2, value=2)
144
+ people = []
145
+
146
+ for i in range(num_people):
147
+ with st.expander(f"참여자 {i+1} 정보"):
148
+ person = {}
149
+ person['name'] = st.text_input(f"이름/닉네임", key=f"name_{i}")
150
+ person['gender'] = st.radio("성별", ["남성", "여성"], key=f"gender_{i}")
151
+ person['type'] = st.selectbox("에니어그램 유형", list(enneagram_types.keys()), key=f"type_{i}")
152
+ person['wing'] = st.selectbox("날개 유형 (선택)", [""] + list(wing_types.keys()), key=f"wing_{i}")
153
+ person['instinct'] = st.selectbox("본능 유형 (선택)", [""] + list(instinct_variants.keys()), key=f"instinct_{i}")
154
+ people.append(person)
155
+
156
+
157
+ # 관계 유형 선택 (참여자 수에 따라 다른 옵션 제공)
158
+ if num_people == 2:
159
+ relationship = st.selectbox("관계 유형", list(relationship_types_two.keys()))
160
+ else:
161
+ relationship = st.selectbox("관계 유형", list(relationship_types_multiple.keys()
162
+
163
+ situation = st.text_area("상황 (예: 갈등 상황, 특별한 이벤트 등)", height=150)
 
 
 
 
 
 
 
 
 
 
 
 
 
164
 
165
  generate_button = st.button("시나리오 생성 ➡️")
166
 
 
168
  scenario_output_area = st.empty()
169
 
170
  if generate_button:
171
+ full_text = generate_relationship_scenario(people, relationship, situation)
172
  if full_text:
173
+ scenario_output_area.markdown(markdown.markdown(full_text), unsafe_allow_html=True)