From 091ab3de166fd0170851530fd3fc7592c13902f8 Mon Sep 17 00:00:00 2001 From: Bisan Suleiman Date: Tue, 27 Aug 2024 11:11:27 -0700 Subject: [PATCH] created crew.py --- job-posting/src/job_posting/crew.py | 96 +++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) create mode 100644 job-posting/src/job_posting/crew.py diff --git a/job-posting/src/job_posting/crew.py b/job-posting/src/job_posting/crew.py new file mode 100644 index 00000000..7e013ba4 --- /dev/null +++ b/job-posting/src/job_posting/crew.py @@ -0,0 +1,96 @@ +from typing import List +from crewai import Agent, Crew, Process, Task +from crewai.project import CrewBase, agent, crew, task + +# Check our tools documentations for more information on how to use them +from crewai_tools import SerperDevTool, ScrapeWebsiteTool, WebsiteSearchTool, FileReadTool +from pydantic import BaseModel, Field + +web_search_tool = WebsiteSearchTool() +seper_dev_tool = SerperDevTool() +file_read_tool = FileReadTool( + file_path='job_description_example.md', + description='A tool to read the job description example file.' +) + +class ResearchRoleRequirements(BaseModel): + """Research role requirements model""" + skills: List[str] = Field(..., description="List of recommended skills for the ideal candidate aligned with the company's culture, ongoing projects, and the specific role's requirements.") + experience: List[str] = Field(..., description="List of recommended experience for the ideal candidate aligned with the company's culture, ongoing projects, and the specific role's requirements.") + qualities: List[str] = Field(..., description="List of recommended qualities for the ideal candidate aligned with the company's culture, ongoing projects, and the specific role's requirements.") + +@CrewBase +class JobPostingCrew: + """JobPosting crew""" + agents_config = 'config/agents.yaml' + tasks_config = 'config/tasks.yaml' + + @agent + def research_agent(self) -> Agent: + return Agent( + config=self.agents_config['research_agent'], + tools=[web_search_tool, seper_dev_tool], + verbose=True + ) + + @agent + def writer_agent(self) -> Agent: + return Agent( + config=self.agents_config['writer_agent'], + tools=[web_search_tool, seper_dev_tool, file_read_tool], + verbose=True + ) + + @agent + def review_agent(self) -> Agent: + return Agent( + config=self.agents_config['review_agent'], + tools=[web_search_tool, seper_dev_tool, file_read_tool], + verbose=True + ) + + @task + def research_company_culture_task(self) -> Task: + return Task( + config=self.tasks_config['research_company_culture_task'], + agent=self.research_agent() + ) + + @task + def research_role_requirements_task(self) -> Task: + return Task( + config=self.tasks_config['research_role_requirements_task'], + agent=self.research_agent(), + output_json=ResearchRoleRequirements + ) + + @task + def draft_job_posting_task(self) -> Task: + return Task( + config=self.tasks_config['draft_job_posting_task'], + agent=self.writer_agent() + ) + + @task + def review_and_edit_job_posting_task(self) -> Task: + return Task( + config=self.tasks_config['review_and_edit_job_posting_task'], + agent=self.review_agent() + ) + + @task + def industry_analysis_task(self) -> Task: + return Task( + config=self.tasks_config['industry_analysis_task'], + agent=self.research_agent() + ) + + @crew + def crew(self) -> Crew: + """Creates the JobPostingCrew""" + return Crew( + agents=self.agents, # Automatically created by the @agent decorator + tasks=self.tasks, # Automatically created by the @task decorator + process=Process.sequential, + verbose=2, + ) \ No newline at end of file