File size: 9,147 Bytes
15e6faf
 
b27025e
1886b45
64d92ad
15e6faf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
b27025e
 
 
 
 
 
 
1886b45
b27025e
 
 
14d5507
 
 
 
 
 
 
 
1886b45
14d5507
 
 
15e6faf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c92ec5b
 
 
 
0ac7181
e54503a
1886b45
e54503a
1886b45
e54503a
 
 
 
 
 
 
 
ab70864
e54503a
 
 
 
0ac7181
e54503a
0ac7181
14d5507
 
b27025e
14d5507
 
 
 
 
 
 
 
 
 
 
 
b27025e
 
14d5507
b27025e
14d5507
b27025e
 
 
 
 
15e6faf
 
 
 
 
f64ab63
e76560b
ab70864
1886b45
f64ab63
 
 
 
 
 
 
 
0d83e25
1886b45
15e6faf
 
 
 
 
 
ab70864
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
import streamlit as st
import openai
import json
import os
from dotenv import load_dotenv

# Load the OpenAI API Key
api_key = st.text_input('Enter your OpenAI API Key', type="password")

# Set the OpenAI API key
if api_key:
    openai.api_key = api_key

# English-translated version of the questions (MBTI-related questions)
questions = [
    {"text": "Do you enjoy being spontaneous and keeping your options open?", "trait": "P"},
    {"text": "Do you prefer spending weekends quietly at home rather than going out?", "trait": "I"},
    {"text": "Do you feel more energized when you are around people?", "trait": "E"},
    {"text": "Do you easily set and meet deadlines?", "trait": "J"},
    {"text": "Are your decisions often influenced by how they will affect others emotionally?", "trait": "F"},
    {"text": "Do you like discussing symbolic or metaphorical interpretations of a story?", "trait": "N"},
    {"text": "Do you strive to maintain harmony in group settings, even if it means compromising?", "trait": "F"},
    {"text": "When a friend is upset, is your first instinct to offer emotional support rather than solutions?", "trait": "F"},
    {"text": "In arguments, do you focus more on being rational than on people's feelings?", "trait": "T"},
    {"text": "When you learn something new, do you prefer hands-on experience over theory?", "trait": "S"},
    {"text": "Do you often think about how today's actions will affect the future?", "trait": "N"},
    {"text": "Are you comfortable adapting to new situations as they happen?", "trait": "P"},
    {"text": "Do you prefer exploring different options before making a decision?", "trait": "P"},
    {"text": "At parties, do you start conversations with new people?", "trait": "E"},
    {"text": "When faced with a problem, do you prefer discussing it with others?", "trait": "E"},
    {"text": "When making decisions, do you prioritize logic over personal considerations?", "trait": "T"},
    {"text": "Do you find solitude more refreshing than social gatherings?", "trait": "I"},
    {"text": "Do you prefer having a clear plan and dislike unexpected changes?", "trait": "J"},
    {"text": "Do you find satisfaction in finishing tasks and making final decisions?", "trait": "J"},
    {"text": "Do you tend to process your thoughts internally before speaking?", "trait": "I"},
    {"text": "Are you more interested in exploring abstract theories and future possibilities?", "trait": "N"},
    {"text": "When planning a vacation, do you prefer to have a detailed plan?", "trait": "S"},
    {"text": "Do you often rely on objective criteria to assess situations?", "trait": "T"},
    {"text": "Do you focus more on details and facts in your surroundings?", "trait": "S"}
]

# Function to calculate MBTI scores based on responses
def calculate_weighted_mbti_scores(responses):
    weights = {
        "Strongly Agree": 2,
        "Agree": 1,
        "Neutral": 0,
        "Disagree": -1,
        "Strongly Disagree": -2
    }

    scores = {'E': 0, 'I': 0, 'S': 0, 'N': 0, 'T': 0, 'F': 0, 'J': 0, 'P': 0}

    for i, response in enumerate(responses):
        weight = weights.get(response, 0)
        trait = questions[i]["trait"]
        if trait in scores:
            scores[trait] += weight

    return scores

# Function to determine MBTI type based on weighted scores
def classic_mbti_weighted(responses):
    scores = calculate_weighted_mbti_scores(responses)
    mbti_type = ""
    for trait_pair in ['EI', 'SN', 'TF', 'JP']:
        trait1, trait2 = trait_pair
        if scores[trait1] >= scores[trait2]:
            mbti_type += trait1
        else:
            mbti_type += trait2
    return mbti_type

# Function to save responses to a JSON file
def save_responses_to_json(username, responses):
    user_data = {
        "username": username,
        "responses": [{"text": question["text"], "answer": response} for question, response in zip(questions, responses)]
    }

    # Save to UserChoices.json
    with open("UserChoices.json", "w") as json_file:
        json.dump(user_data, json_file, indent=4)

# Function to save personality results to Output.json
def save_personality_to_output_json(username, mbti_type_classic, mbti_type_llm):
    output_data = {
        "username": username,
        "mbti_type_classic": mbti_type_classic,
        "mbti_type_llm": mbti_type_llm
    }

    # Save to Output.json
    with open("Output.json", "w") as json_file:
        json.dump(output_data, json_file, indent=4)

# Streamlit component to display the quiz and handle responses
def show_mbti_quiz():
    st.title('FlexTemp Personality Test')

    # Step 1: Input name
    participant_name = st.text_input("Enter your name")

    if participant_name:
        responses = []
        st.subheader(f"Hello {participant_name}, let's start the quiz!")

        for i, question in enumerate(questions):
            response = st.radio(
                question["text"],
                ["Strongly Agree", "Agree", "Neutral", "Disagree", "Strongly Disagree"]
            )
            if response:
                responses.append(response)

        if len(responses) == len(questions):
            # Add a button to generate personality information
            if st.button("Generate Personality Trait Information"):
                st.subheader("Your MBTI Personality Type:")
                mbti_type_classic = classic_mbti_weighted(responses)
                st.write(f"Your MBTI type based on weighted answers: {mbti_type_classic}")

                # You can add LLM-based prediction if needed here (example OpenAI-based model)
                if api_key:
                    # Run the LLM (GPT-4, for example) model to generate a personality type.
                    prompt = f"""
                    Determine a person's personality type based on their answers to the following Myers-Briggs Type Indicator (MBTI) questions:
                    The person has answered the following questions:
                    {', '.join([f"{question['text']} {response}" for question, response in zip(questions, responses)])}
                    What is the MBTI personality type based on these answers?
                    """
                    try:
                        response = openai.ChatCompletion.create(
                            model="gpt-4o",
                            messages=[{"role": "system", "content": "You are a helpful assistant."},
                                      {"role": "user", "content": prompt}]
                        )
                        mbti_type_llm = response['choices'][0]['message']['content']
                        st.write(f"Your MBTI type according to AI: {mbti_type_llm}")
                    except Exception as e:
                        st.error(f"Error occurred: {e}")

                # Save responses and personality info to Output.json
                save_responses_to_json(participant_name, responses)
                save_personality_to_output_json(participant_name, mbti_type_classic, mbti_type_llm)

                with open("Output.json", "r") as json_file:
                    json_data = json_file.read()

                st.download_button(
                    label="Download Output.json",
                    data=json_data,
                    file_name="Output.json",
                    mime="application/json"
                )

                with open("UserChoices.json", "r") as json_file:
                    json_data = json_file.read()

                st.download_button(
                    label="Download UserChoices.json",
                    data=json_data,
                    file_name="UserChoices.json",
                    mime="application/json"
                )

        else:
            st.warning("Please answer all the questions!")

# Main function to display the app
def main():
    # Add instructions to the sidebar
    with st.sidebar.expander("How This App Works", expanded=False):
        st.write("""
            ### FlexTemp Personality Test
            This app is designed to help you determine your MBTI personality type based on your answers to a series of questions. The process works as follows:
            1. **Weighted MBTI Scoring**: 
            - Each question corresponds to a trait in the MBTI system. 
            - Your responses are scored on a scale from "Strongly Agree" to "Strongly Disagree", with each level being assigned a weight. 
            - These weights are used to calculate your MBTI type by comparing the scores of trait pairs (E/I, S/N, T/F, J/P).
            2. **LLM-Based Prediction**:
            - Optionally, you can also get your MBTI type based on the answers using a language model (LLM) like GPT-4. This provides an additional prediction that may offer insights into your personality.
            - The LLM is trained on vast amounts of data and can generate responses based on patterns from psychological research and real-world interactions.
            """)
    
    if api_key:
        show_mbti_quiz()
    else:
        st.info("Please enter your OpenAI API Key to begin the quiz.")

if __name__ == "__main__":
    main()