File size: 6,254 Bytes
15e6faf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
c92ec5b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
15e6faf
 
 
 
 
 
 
 
 
 
 
 
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
import streamlit as st
import openai
from dotenv import load_dotenv
import os

# 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

# 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}")
        else:
            st.warning("Please answer all the questions!")

# Main function to display the app
def main():
    if api_key:
        show_mbti_quiz()
    else:
        st.info("Please enter your OpenAI API Key to begin the quiz.")

if __name__ == "__main__":
    main()