crewai / app.py
Prathamesh1420's picture
Update app.py
0ffd981 verified
raw
history blame contribute delete
No virus
7.38 kB
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}")