| 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() |