''' This is the main file of the app. This file contains the code for the streamlit app. ''' import time import datetime import base64 import streamlit as st from streamlit_chat import message from job_description_generator import predict_job_description, get_job_description_conversation from job_description_fixer import fix_job_description, get_job_description_fixer_conversation from interview_questions_generator import (predict_interview_question, get_interview_questions_conversation) from cover_letter_generator import get_cover_letter from top_accomplishment_generator import get_accomplishments from constants import PROMPT_VERSION conversation = get_job_description_conversation() if 'generator_conversation' not in st.session_state: with open("./conversation.txt", "a", encoding='utf-8') as f: #add a horizontal line f.write("--------------------------------------------------\n") #add the date f.write(f"Conversation on {datetime.datetime.now()}, prompt_{PROMPT_VERSION}: \n\n") st.session_state['generator_conversation'] = conversation fixer_conversation = get_job_description_fixer_conversation() if 'fixer_conversation' not in st.session_state: st.session_state['fixer_conversation'] = fixer_conversation st.session_state['response'] = {'history': [], 'prediction': ''} interview_questions_conversation = get_interview_questions_conversation() if 'interview_questions_conversation' not in st.session_state: st.session_state['interview_questions_conversation'] = interview_questions_conversation def get_downloadable_conversation(input_text, response): ''' Downloads the conversation to a text file. ''' conversation_to_save = f"Conversation with JobGPT on {datetime.datetime.now()}, prompt_{PROMPT_VERSION}: \n\n" for historical_message in response['history']: conversation_to_save = conversation_to_save + historical_message + "\n" conversation_to_save = conversation_to_save + f"Human: {input_text} \n" conversation_to_save = conversation_to_save + f"JobGPT: {response['prediction']} \n" conversation_to_save = conversation_to_save + "----------------------------------------\n" return conversation_to_save def message_writer(input_text, response): ''' Writes the messages to the chat window. ''' messages = [] current_message = "" current_is_user = True for historical_message in response['history']: if "human" in historical_message.lower(): messages.append([current_message, current_is_user]) current_message = historical_message.replace("Human:", "") current_is_user = True elif "JobGPT" in historical_message: messages.append([current_message, current_is_user]) current_message = historical_message.replace("JobGPT:", "") current_is_user = False else: current_message = current_message + "\n" + historical_message messages.append([current_message, current_is_user]) for message_to_send, is_user in messages: if message_to_send.strip() != "": message(message_to_send, is_user=is_user) message(input_text, is_user=True) message(response['prediction'], is_user=False) return 0 def setup(): """ Streamlit related setup. This has to be run for each page. """ hide_streamlit_style = """ """ st.markdown(hide_streamlit_style, unsafe_allow_html=True) def main(): ''' Main function of the app. ''' setup() #create a sidebar where you can select your page st.sidebar.title("JobGPT") st.sidebar.markdown("---") #selector page = st.sidebar.selectbox( "Select a page", ["Home", "Job Description Generator", "Job Description Fixer", "Cover Letter Generator", "Interview questions generator", "Accomplishments Generator"]) if page == "Home": st.title("JobGPT") st.write("Select a page in the sidebar to get started.") st.write("### Available options:") st.write("1. Job Description Generator") st.write("2. Job Description Fixer") st.write("3. Cover Letter Generator") st.write("4. Interview Questions Generator") st.write("5. Accomplishments Generator") st.markdown("---") elif page == "Job Description Generator": container_one = st.container() container_one.title("A Job Description Generating Chatbot") container_one.markdown( "JobGPT is a chatbot that generates job descriptions. \ This is built just for demo purpose." ) input_text = container_one.text_area( "Prompt", "Hi, can you please help me generate an unbiased job description?") button = container_one.button("Send") st.sidebar.markdown("---") st.sidebar.markdown("Click on `new chat` to start a new chat. \ History will be cleared and you'll lose access to current chat." ) clear_session = st.sidebar.button("New Chat") if clear_session: with open("./conversation.txt", "a", encoding='utf-8') as f: #add a horizontal line f.write("--------------------------------------------------\n") #add the date f.write(f"Conversation on {datetime.datetime.now()}, prompt_{PROMPT_VERSION}: \n\n") st.session_state['generator_conversation'] = conversation container_one.markdown("---") initial_message = "Hello, how can I help you?" message(initial_message) #download_button = st.sidebar.button("Download Conversation") if button: response = predict_job_description(input_text, st.session_state['generator_conversation']) message_writer(input_text, response) st.session_state['response'] = response conversation_to_save = get_downloadable_conversation( input_text, st.session_state['response']) #write to conversation.txt with open("./conversation.txt", "a", encoding='utf-8') as f: f.write(f"HUMAN: {input_text}\n") f.write(f"BOT: {response['prediction']}\n") #download the conversation b64 = base64.b64encode(conversation_to_save.encode()).decode() href = f'Download conversation' st.sidebar.markdown(href, unsafe_allow_html=True) elif page == "Job Description Fixer": container_two = st.container() container_two.title("A Job Description Fixing Chatbot") container_two.markdown( "JobGPT is a chatbot that fixes job descriptions. This is built just for demo purpose." ) input_text = container_two.text_area( "Prompt", "Hi, can you please help me fix my job description? It's biased.") button = container_two.button("Send") st.sidebar.markdown("---") st.sidebar.markdown("Click on `new chat` to start a new chat. \ History will be cleared and you'll lose access to current chat." ) clear_session = st.sidebar.button("New Chat") if clear_session: st.session_state['fixer_conversation'] = fixer_conversation container_two.markdown("---") initial_message = "Hello, how can I help you?" message(initial_message) if button: response = fix_job_description( input_text, st.session_state['fixer_conversation']) message_writer(input_text, response) st.session_state['response'] = response conversation_to_save = get_downloadable_conversation( input_text, st.session_state['response']) #download the conversation b64 = base64.b64encode(conversation_to_save.encode()).decode() href = f'Download conversation' st.sidebar.markdown(href, unsafe_allow_html=True) elif page == "Cover Letter Generator": container_three = st.container() container_three.title("A Cover Letter Generating Chatbot") container_three.markdown( "JobGPT is a chatbot that generates cover letters. \ This is built just for demo purpose.") container_three.markdown("---") uploaded_files = container_three.file_uploader("Upload your resume", type=["pdf", "txt", "docx"], accept_multiple_files=True) if uploaded_files is not None and uploaded_files != []: counter = 0 for uploaded_file in uploaded_files: file_extension = uploaded_file.name.split(".")[-1] with open(f"./documents/resume_{counter}.{file_extension}", "wb") as file_io: file_io.write(uploaded_file.getbuffer()) counter += 1 with st.spinner('Uploading...'): time.sleep(1) container_three.success('Uploaded!') container_three.markdown("---") form = container_three.form(key='my_form') title = form.text_input("Job Title (required)", placeholder="VP of Engineering") company = form.text_input("Company Name (required)", placeholder="Google") more_info = form.text_area("More Info", help="Add more info about you or the job in natural language", placeholder="I am a software engineer with 5 years of experience. The job focuses on building a new product in healthcare sector.") submit_button = form.form_submit_button(label='Submit') if submit_button: if title == "": st.error("Please enter a job title") elif company == "": st.error("Please enter a company name") else: with st.spinner('Generating...'): cover_letter = get_cover_letter(title, company, more_info, "./documents") container_three.markdown("---") container_three.markdown("### Cover Letter:") container_three.write(cover_letter) elif page == "Accomplishments Generator": container_three = st.container() container_three.title("An Accomplishments Generating Chatbot") container_three.markdown( "JobGPT is a chatbot that generates Accomplishments from resume. \ This is built just for demo purpose.") container_three.markdown("---") uploaded_file = container_three.file_uploader("Upload your resume", type=["pdf"]) if uploaded_file is not None: with open("resume.pdf", "wb") as file_io: file_io.write(uploaded_file.getbuffer()) with st.spinner('Uploading...'): time.sleep(1) container_three.success('Uploaded!') container_three.markdown("---") form = container_three.form(key='my_form') title = form.text_input("Job Title (required)", placeholder="VP of Engineering") company = form.text_input("Company Name (required)", placeholder="Google") job_description = form.text_area("Job Description", help="Paste the job description you are applying for", placeholder="We are looking for a software engineer with 5 years of experience. The job focuses on building a new product in healthcare sector") submit_button = form.form_submit_button(label='Submit') if submit_button: if title == "": st.error("Please enter a job title") elif company == "": st.error("Please enter a company name") elif job_description == "": st.error("Please enter a job description") else: with st.spinner('Generating...'): accomplishments = get_accomplishments(title, company, job_description, "resume.pdf") container_three.markdown("---") container_three.markdown("### Top Accomplishments for the given job:") container_three.write(accomplishments) elif page == "Interview questions generator": container_two = st.container() container_two.title("An Interview Questions Generating Chatbot") container_two.markdown( "JobGPT is a chatbot that generates interview questions.\ This is built just for demo purpose." ) input_text = container_two.text_area( "Prompt", "Hi, can you please help me generate interview questions?") button = container_two.button("Send") st.sidebar.markdown("---") st.sidebar.markdown("Click on `new chat` to start a new chat. \ History will be cleared and you'll lose access to current chat." ) clear_session = st.sidebar.button("New Chat") if clear_session: st.session_state['interview_questions_conversation'] = interview_questions_conversation container_two.markdown("---") initial_message = "Hello, how can I help you?" message(initial_message) if button: response = predict_interview_question( input_text, st.session_state['interview_questions_conversation']) message_writer(input_text, response) st.session_state['response'] = response conversation_to_save = get_downloadable_conversation( input_text, st.session_state['response']) #download the conversation b64 = base64.b64encode(conversation_to_save.encode()).decode() href = f'Download conversation' st.sidebar.markdown(href, unsafe_allow_html=True) main()