|
import streamlit as st |
|
import os |
|
import json |
|
from openai import AzureOpenAI |
|
from model import invoke, create_models, configure_settings, load_documents_and_create_index, \ |
|
create_chat_prompt_template, execute_query |
|
|
|
client = AzureOpenAI(azure_endpoint = "https://personalityanalysisfinetuning.openai.azure.com/",api_key=os.environ.get("AZURE_OPENAI_KEY"), api_version="2024-02-01") |
|
|
|
|
|
example_profile = { |
|
"Team": [ |
|
{ |
|
"name": "JAMES ARTHUR", |
|
"main_profile": { |
|
"VISION": { |
|
"score": "HIGH" |
|
}, |
|
"IDEATION": { |
|
"score": "HIGH" |
|
}, |
|
"OPPORTUNISM": { |
|
"score": "HIGH" |
|
}, |
|
"DRIVE": { |
|
"score": "HIGH" |
|
}, |
|
"RESILIENCE": { |
|
"score": "HIGH" |
|
} |
|
}, |
|
"red_flag": { |
|
"HUBRIS": { |
|
"score": "HIGH" |
|
}, |
|
"MERCURIAL": { |
|
"score": "LOW" |
|
}, |
|
"DOMINANT": { |
|
"score": "HIGH" |
|
}, |
|
"MACHIAVELLIAN": { |
|
"score": "AVERAGE" |
|
} |
|
} |
|
}, |
|
{ |
|
"name": "LOUSIE HART", |
|
"main_profile": { |
|
"VISION": { |
|
"score": "AVERAGE" |
|
}, |
|
"IDEATION": { |
|
"score": "AVERAGE" |
|
}, |
|
"OPPORTUNISM": { |
|
"score": "AVERAGE" |
|
}, |
|
"DRIVE": { |
|
"score": "HIGH" |
|
}, |
|
"RESILIENCE": { |
|
"score": "HIGH" |
|
} |
|
}, |
|
"red_flag": { |
|
"HUBRIS": { |
|
"score": "AVERAGE" |
|
}, |
|
"MERCURIAL": { |
|
"score": "LOW" |
|
}, |
|
"DOMINANT": { |
|
"score": "HIGH" |
|
}, |
|
"MACHIAVELLIAN": { |
|
"score": "LOW" |
|
} |
|
} |
|
}, |
|
{ |
|
"name": "SIMONE LEVY", |
|
"main_profile": { |
|
"VISION": { |
|
"score": "LOW" |
|
}, |
|
"IDEATION": { |
|
"score": "AVERAGE" |
|
}, |
|
"OPPORTUNISM": { |
|
"score": "LOW" |
|
}, |
|
"DRIVE": { |
|
"score": "AVERAGE" |
|
}, |
|
"RESILIENCE": { |
|
"score": "LOW" |
|
} |
|
}, |
|
"red_flag": { |
|
"HUBRIS": { |
|
"score": "LOW" |
|
}, |
|
"MERCURIAL": { |
|
"score": "LOW" |
|
}, |
|
"DOMINANT": { |
|
"score": "LOW" |
|
}, |
|
"MACHIAVELLIAN": { |
|
"score": "LOW" |
|
} |
|
} |
|
}, |
|
{ |
|
"name": "Uri Lef", |
|
"main_profile": { |
|
"VISION": { |
|
"score": "HIGH" |
|
}, |
|
"IDEATION": { |
|
"score": "HIGH" |
|
}, |
|
"OPPORTUNISM": { |
|
"score": "HIGH" |
|
}, |
|
"DRIVE": { |
|
"score": "AVERAGE" |
|
}, |
|
"RESILIENCE": { |
|
"score": "LOW" |
|
} |
|
}, |
|
"red_flag": { |
|
"HUBRIS": { |
|
"score": "AVERAGE" |
|
}, |
|
"MERCURIAL": { |
|
"score": "HIGH" |
|
}, |
|
"DOMINANT": { |
|
"score": "HIGH" |
|
}, |
|
"MACHIAVELLIAN": { |
|
"score": "AVERAGE" |
|
} |
|
} |
|
} |
|
] |
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import json |
|
|
|
def generate_prompt_from_profile(profile, version="TeamSummary"): |
|
with open('prompts.json') as f: |
|
prompt_sets = json.load(f)['Prompts'] |
|
prompt_templates = prompt_sets[version] |
|
|
|
try: |
|
team_members = profile['Team'] |
|
|
|
team_member_profiles = [] |
|
for member in team_members: |
|
profile = f"{member['name']}: Main Profile - VISION: {member['main_profile']['VISION']['score']}, " \ |
|
f"IDEATION: {member['main_profile']['IDEATION']['score']}, " \ |
|
f"OPPORTUNISM: {member['main_profile']['OPPORTUNISM']['score']}, " \ |
|
f"DRIVE: {member['main_profile']['DRIVE']['score']}, " \ |
|
f"RESILIENCE: {member['main_profile']['RESILIENCE']['score']}. " \ |
|
f"Red Flags - HUBRIS: {member['red_flag']['HUBRIS']['score']}, " \ |
|
f"MERCURIAL: {member['red_flag']['MERCURIAL']['score']}, " \ |
|
f"DOMINANT: {member['red_flag']['DOMINANT']['score']}, " \ |
|
f"MACHIAVELLIAN: {member['red_flag']['MACHIAVELLIAN']['score']}." |
|
team_member_profiles.append(profile) |
|
|
|
|
|
team_member_profiles_str = "\n".join(team_member_profiles) |
|
|
|
prompt = prompt_templates[0].replace("{{TEAM_MEMBERS}}", team_member_profiles_str) |
|
|
|
|
|
except KeyError as e: |
|
return [{"role": "system", "content": f"Error processing profile data: missing {str(e)}"}] |
|
|
|
message = [ |
|
{"role": "system", "content": prompt_sets["System"][0]}, |
|
{"role": "user", "content": prompt} |
|
] |
|
|
|
return message |
|
|
|
|
|
def display_profile_info(profile): |
|
|
|
st.markdown("### Profile Information:") |
|
team_members = profile["Team"] |
|
for member in team_members: |
|
st.sidebar.markdown(f"#### {member['name']}") |
|
main_profile = member["main_profile"] |
|
red_flag = member["red_flag"] |
|
st.sidebar.markdown("### Main Profile:") |
|
st.sidebar.markdown("\n".join([f"- **{attribute}**: {details['score']}" for attribute, details in main_profile.items()])) |
|
st.sidebar.markdown("### Red Flags:") |
|
st.sidebar.markdown("\n".join([f"- **{attribute}**: {details['score']}" for attribute, details in red_flag.items()])) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def validate_json(profile): |
|
required_keys = ['Team'] |
|
for key in required_keys: |
|
if key not in profile: |
|
return False, f"Key '{key}' is missing." |
|
if not isinstance(profile[key], dict): |
|
return False, f"'{key}' should be a dictionary." |
|
return True, "JSON structure is valid." |
|
def logout(): |
|
st.session_state['authenticated'] = False |
|
st.session_state['profile'] = None |
|
st.session_state['show_chat'] = None |
|
st.session_state['analysis'] = None |
|
st.rerun() |
|
|
|
|
|
def main_app(): |
|
|
|
sidebar_components() |
|
|
|
if st.button('Logout'): |
|
logout() |
|
|
|
|
|
st.title('Metaprofiling\'s Career Insight Analyzer Demo') |
|
|
|
|
|
|
|
if st.session_state['profile']: |
|
profile = st.session_state['profile'] |
|
display_profile_info(profile) |
|
|
|
st.markdown(""" |
|
### Generation Temperature |
|
Adjust the 'Generation Temperature' to control the creativity of the AI responses. |
|
- A *lower temperature* (closer to 0.0) generates more predictable, conservative responses. |
|
- A *higher temperature* (closer to 1.0) generates more creative, diverse responses. |
|
""") |
|
|
|
st.session_state['temperature'] = st.slider("",min_value=0.0, max_value=1.0, value=0.5, step=0.01) |
|
|
|
|
|
st.session_state['version'] = st.selectbox("Select Prompt Version", ["TeamSummary"]) |
|
|
|
|
|
if st.button(f'Analyze Profile ({st.session_state["version"]})'): |
|
|
|
prompt = generate_prompt_from_profile(profile, version=st.session_state['version']) |
|
|
|
|
|
|
|
with st.chat_message("assistant"): |
|
stream = client.chat.completions.create( |
|
model="personality_gpt4o", |
|
temperature=st.session_state['temperature'], |
|
max_tokens=1000, |
|
frequency_penalty=0.2, |
|
presence_penalty=0.2, |
|
messages= prompt, |
|
stream=True) |
|
|
|
response = st.write_stream(stream) |
|
|
|
|
|
st.session_state['analysis'] = response |
|
st.session_state['show_chat'] = True |
|
st.rerun() |
|
|
|
|
|
if st.session_state['analysis']: |
|
st.markdown(st.session_state['analysis']) |
|
|
|
else: |
|
st.write("Please upload a profile JSON file or use the example profile.") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
def verify_credentials(): |
|
if st.session_state['username'] == os.getenv("username_app") and st.session_state['password'] == os.getenv("password_app"): |
|
st.session_state['authenticated'] = True |
|
else: |
|
st.error("Invalid username or password") |
|
|
|
|
|
|
|
def login_page(): |
|
|
|
st.title("Welcome to Metaprofiling's Career Insight Analyzer Demo") |
|
st.write("This application provides in-depth analysis and insights into professional profiles. Please log in to continue.") |
|
|
|
|
|
st.markdown(""" |
|
## How to Use This Application |
|
- Enter your username and password in the sidebar. |
|
- Click on 'Login' to access the application. |
|
- Once logged in, you will be able to upload and analyze professional profiles. |
|
""") |
|
|
|
st.sidebar.write("Login:") |
|
username = st.sidebar.text_input("Username") |
|
password = st.sidebar.text_input("Password", type="password") |
|
|
|
st.session_state['username'] = username |
|
st.session_state['password'] = password |
|
st.sidebar.button("Login", on_click=verify_credentials) |
|
|
|
def sidebar_components(): |
|
with st.sidebar: |
|
if st.button('Reset'): |
|
st.session_state['profile'] = None |
|
st.session_state['show_chat'] = None |
|
st.session_state['analysis'] = None |
|
st.rerun() |
|
|
|
if not st.session_state['show_chat']: |
|
|
|
st.markdown("### JSON File Requirements:") |
|
st.markdown("1. Must contain 'bio_information', 'main_profile', and 'red_flag' as top-level keys.") |
|
st.markdown("2. Both keys should have dictionary values.") |
|
|
|
|
|
st.markdown("### Upload a profile JSON file") |
|
uploaded_file = st.file_uploader("", type=['json']) |
|
|
|
if uploaded_file is not None: |
|
try: |
|
profile_data = json.load(uploaded_file) |
|
valid, message = validate_json(profile_data) |
|
if valid: |
|
st.session_state['profile'] = profile_data |
|
else: |
|
st.error(message) |
|
except json.JSONDecodeError: |
|
st.error("Invalid JSON file. Please upload a valid JSON file.") |
|
|
|
|
|
if st.button('Use Example Profile'): |
|
st.session_state['profile'] = example_profile |
|
|
|
|
|
|
|
else: |
|
st.sidebar.title("Chat with Our Career Advisor") |
|
st.sidebar.markdown("Hello, we hope you learned something about yourself in this report. This chat is here so you can ask any questions you have about your report! It’s also a great tool to get ideas about how you can use the information in your report for your personal development and achieving your current goals.") |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
name = st.session_state['profile']['bio_information'].get('Name', 'the individual') |
|
|
|
|
|
question_templates = [ |
|
"What are the main risks associated with {}’s profile?", |
|
"What are the implications of {}’s profile for working with others?", |
|
"What conclusions might we draw from his profile about {}’s style of leadership?", |
|
"Looking specifically at {}'s Red Flags, are there any particular areas of concern?", |
|
"Based on this profile, is {} better suited as a COO or a CEO?", |
|
"If speed of execution is important, based on his profile, how likely is {} to be able to achieve this?", |
|
"How is {} likely to react to business uncertainty and disruption?", |
|
"Based on his profile, what should a coaching plan designed for {} focus on?" |
|
] |
|
|
|
|
|
questions_list = [question.format("Test Taker") for question in question_templates] |
|
|
|
|
|
questions_markdown = "\n\n".join( |
|
[f"Q{index + 1}: {question}" for index, question in enumerate(questions_list)]) |
|
|
|
|
|
st.sidebar.markdown("### Suggest Questions") |
|
st.sidebar.markdown(questions_markdown) |
|
|
|
|
|
|
|
user_input = st.sidebar.text_input("Ask a question about the profile analysis:") |
|
|
|
llm, embed_model = create_models() |
|
configure_settings(llm, embed_model) |
|
index = load_documents_and_create_index() |
|
|
|
if st.sidebar.button('Submit'): |
|
if user_input: |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
chat_prompt_template = create_chat_prompt_template(st.session_state['analysis']) |
|
response = execute_query(index, chat_prompt_template, user_input) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
st.sidebar.markdown(response) |
|
|
|
|
|
if 'show_chat' not in st.session_state: |
|
st.session_state['show_chat'] = None |
|
|
|
if 'profile' not in st.session_state: |
|
st.session_state['profile'] = None |
|
|
|
if 'analysis' not in st.session_state: |
|
st.session_state['analysis'] = None |
|
|
|
if 'temperature' not in st.session_state: |
|
st.session_state['temperature'] = 0 |
|
|
|
if 'version' not in st.session_state: |
|
st.session_state['version'] = "" |
|
|
|
|
|
if 'username' not in st.session_state: |
|
st.session_state['username'] = '' |
|
if 'password' not in st.session_state: |
|
st.session_state['password'] = '' |
|
if 'authenticated' not in st.session_state: |
|
st.session_state['authenticated'] = False |
|
|
|
if st.session_state['authenticated']: |
|
main_app() |
|
else: |
|
login_page() |