Spaces:
Running
Running
import streamlit as st | |
import os | |
import asyncio | |
import warnings | |
from crewai import Agent, Task, Crew | |
from langchain_google_genai import ChatGoogleGenerativeAI | |
from crewai_tools import FileReadTool, ScrapeWebsiteTool, SerperDevTool | |
import json | |
# Warning control | |
warnings.filterwarnings('ignore') | |
# Set the Google API key directly in the code | |
google_api_key = "AIzaSyCHHl4LgpZIBw3_Zf15XWuuLSWWIlLROdQ" | |
# Function to initialize the Gemini model with an event loop | |
async def initialize_llm(): | |
return ChatGoogleGenerativeAI( | |
model="gemini-1.5-flash", | |
verbose=True, | |
temperature=0.5, | |
google_api_key=google_api_key | |
) | |
# Run the initialization within the event loop | |
if not hasattr(st, 'llm'): | |
loop = asyncio.new_event_loop() | |
asyncio.set_event_loop(loop) | |
st.llm = loop.run_until_complete(initialize_llm()) | |
# Ensure the SERPER API key is correctly passed during initialization | |
serper_api_key = "uxSCra7XOaiojmWo3MIQ2xzFWkX2306yJY7YIVMsT771qLCaOJejKKQB7nKbRXd7" # Replace with your actual API key | |
search_tool = SerperDevTool(api_key=serper_api_key) | |
# Initialize tools | |
scrape_tool = ScrapeWebsiteTool() | |
read_resume = FileReadTool(file_path='fake_resume.md') | |
# Define agents | |
researcher = Agent( | |
role="Tech Job Researcher", | |
goal="Make sure to do amazing analysis on job posting to help job applicants", | |
tools=[scrape_tool, search_tool], | |
verbose=True, | |
backstory=( | |
"As a Job Researcher, your prowess in navigating and extracting critical " | |
"information from job postings is unmatched. Your skills help pinpoint the necessary " | |
"qualifications and skills sought by employers, forming the foundation for effective application tailoring." | |
), | |
llm=st.llm | |
) | |
profiler = Agent( | |
role="Personal Profiler for Engineers", | |
goal="Do incredible research on job applicants to help them stand out in the job market", | |
tools=[scrape_tool, search_tool, read_resume], | |
verbose=True, | |
backstory=( | |
"Equipped with analytical prowess, you dissect and synthesize information " | |
"from diverse sources to craft comprehensive personal and professional profiles, laying the " | |
"groundwork for personalized resume enhancements." | |
), | |
llm=st.llm | |
) | |
resume_strategist = Agent( | |
role="Resume Strategist for Engineers", | |
goal="Find all the best ways to make a resume stand out in the job market.", | |
tools=[scrape_tool, search_tool, read_resume], | |
verbose=True, | |
backstory=( | |
"With a strategic mind and an eye for detail, you excel at refining resumes to highlight the most " | |
"relevant skills and experiences, ensuring they resonate perfectly with the job's requirements." | |
), | |
llm=st.llm | |
) | |
interview_preparer = Agent( | |
role="Engineering Interview Preparer", | |
goal="Create interview questions and talking points based on the resume and job requirements", | |
tools=[scrape_tool, search_tool, read_resume], | |
verbose=True, | |
backstory=( | |
"Your role is crucial in anticipating the dynamics of interviews. With your ability to formulate key questions " | |
"and talking points, you prepare candidates for success, ensuring they can confidently address all aspects of the " | |
"job they are applying for." | |
), | |
llm=st.llm | |
) | |
# Define tasks | |
research_task = Task( | |
description=( | |
"Analyze the job posting URL provided ({job_posting_url}) " | |
"to extract key skills, experiences, and qualifications required. Use the tools to gather content and identify " | |
"and categorize the requirements." | |
), | |
expected_output=( | |
"A structured list of job requirements, including necessary skills, qualifications, and experiences." | |
), | |
agent=researcher, | |
async_execution=True | |
) | |
profile_task = Task( | |
description=( | |
"Compile a detailed personal and professional profile using the GitHub ({github_url}) URLs, LinkedIn ({linkedin_url}) URL, and personal write-up " | |
"({personal_writeup}). Utilize tools to extract and synthesize information from these sources." | |
), | |
expected_output=( | |
"A comprehensive profile document that includes skills, project experiences, contributions, interests, and " | |
"communication style." | |
), | |
agent=profiler, | |
async_execution=True | |
) | |
resume_strategy_task = Task( | |
description=( | |
"Using the profile and job requirements obtained from previous tasks, tailor the resume to highlight the most " | |
"relevant areas. Employ tools to adjust and enhance the resume content. Make sure this is the best resume even but " | |
"don't make up any information. Update every section, including the initial summary, work experience, skills, " | |
"and education. All to better reflect the candidate's abilities and how it matches the job posting." | |
), | |
expected_output=( | |
"An updated resume that effectively highlights the candidate's qualifications and experiences relevant to the job." | |
), | |
output_file="tailored_resume.md", | |
context=[research_task, profile_task], | |
agent=resume_strategist | |
) | |
interview_preparation_task = Task( | |
description=( | |
"Create a set of potential interview questions and talking points based on the tailored resume and job requirements. " | |
"Utilize tools to generate relevant questions and discussion points. Make sure to use these questions and talking points to " | |
"help the candidate highlight the main points of the resume and how it matches the job posting." | |
), | |
expected_output=( | |
"A document containing key questions and talking points that the candidate should prepare for the initial interview." | |
), | |
output_file="interview_materials.md", | |
context=[research_task, profile_task, resume_strategy_task], | |
agent=interview_preparer | |
) | |
# Crew Setup | |
job_application_crew = Crew( | |
agents=[researcher, profiler, resume_strategist, interview_preparer], | |
tasks=[research_task, profile_task, resume_strategy_task, interview_preparation_task], | |
verbose=True | |
) | |
# Job Application Inputs | |
job_application_inputs = { | |
'job_posting_url': 'https://jobs.lever.co/AIFund/6c82e23e-d954-4dd8-a734-c0c2c5ee00f1?lever-origin=applied&lever-source%5B%5D=AI+Fund', | |
'github_url': 'https://github.com/PrathameshK', | |
'linkedin_url': 'https://www.linkedin.com/in/prathameshkhade/', | |
'personal_writeup': 'fake_resume.md' | |
} | |
# Running Tasks | |
try: | |
# Assuming job_application_crew.kickoff is an async function | |
results = job_application_crew.kickoff(inputs=job_application_inputs) | |
# Print type and contents for debugging | |
st.write("Type of results:", type(results)) | |
st.write("Contents of results:", results) | |
# Check if results is a dictionary | |
if isinstance(results, dict): | |
# Display results based on their expected keys | |
st.write("Job Requirements:", results.get('job_requirements', 'No job requirements found')) | |
st.write("Personal Profile:", results.get('personal_profile', 'No personal profile found')) | |
st.write("Tailored Resume:", results.get('tailored_resume', 'No tailored resume found')) | |
st.write("Interview Materials:", results.get('interview_materials', 'No interview materials found')) | |
else: | |
st.write("Unexpected results format:", results) | |
except Exception as e: | |
st.error(f"An error occurred: {e}") | |