File size: 7,620 Bytes
15e6faf 20f039a 15e6faf 20f039a cc09f1a 20f039a 15e6faf c92ec5b 0ac7181 e54503a 0ac7181 20f039a e54503a 0ac7181 e54503a 20f039a e54503a 0ac7181 e54503a 0ac7181 20f039a 15e6faf 20f039a |
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 |
import streamlit as st
import openai
from dotenv import load_dotenv
import os
from fpdf import FPDF
# 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 generate PDF report
def generate_pdf_report(participant_name, responses, mbti_type_classic, mbti_type_llm):
pdf = FPDF()
pdf.set_auto_page_break(auto=True, margin=15)
pdf.add_page()
# Add a title
pdf.set_font("Arial", 'B', 16)
pdf.cell(200, 10, txt="FlexTemp Personality Test Report", ln=True, align="C")
# Add participant name
pdf.set_font("Arial", size=12)
pdf.ln(10)
pdf.cell(200, 10, txt=f"Name: {participant_name}", ln=True)
# Add the responses
pdf.ln(10)
pdf.cell(200, 10, txt="Your Answers:", ln=True)
for i, question in enumerate(questions):
response = responses[i]
pdf.cell(200, 10, txt=f"Q{i+1}: {question['text']} - {response}", ln=True)
# Add MBTI results
pdf.ln(10)
pdf.cell(200, 10, txt=f"Your MBTI Type (Weighted): {mbti_type_classic}", ln=True)
pdf.cell(200, 10, txt=f"Your MBTI Type (AI Prediction): {mbti_type_llm}", ln=True)
# Save PDF
file_path = f"{participant_name}_MBTI_report.pdf"
pdf.output(file_path)
return file_path
# 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)
mbti_type_llm = ""
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-4",
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}")
# Generate PDF Report
file_path = generate_pdf_report(participant_name, responses, mbti_type_classic, mbti_type_llm)
st.download_button("Download your MBTI report", file_path)
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()
|