import pandas as pd from typing import List from pydantic import BaseModel, Field from crewai import Agent, Task, Crew class TaskEstimate(BaseModel): task_name: str = Field(..., description="Name of the task") estimated_time_hours: float = Field(..., description = "Estimated time to complete the task in hours") required_resources: List[str] = Field(..., description = "List of resources required to complete the task") class Milestone(BaseModel): milestone_name: str = Field(..., description = "Name of the milestone") tasks: List[str] = Field(..., description = "List of task IDs associated with this milestone") class ProjectPlan(BaseModel): tasks: List[TaskEstimate] = Field(..., description = "List of tasks with their estimates") milestones: List[Milestone] = Field(..., description = "List of project milestones") class ProjectPlanner: def __init__(self, agents_config, tasks_config, llm): # Creating Agents project_planning_agent = Agent(config = agents_config['project_planning_agent'], llm = llm) estimation_agent = Agent(config = agents_config['estimation_agent'], llm = llm) resource_allocation_agent = Agent(config = agents_config['resource_allocation_agent'], llm = llm) # Creating Tasks task_breakdown = Task(config = tasks_config['task_breakdown'], agent = project_planning_agent) time_resource_estimation = Task(config = tasks_config['time_resource_estimation'], agent = estimation_agent) resource_allocation = Task(config = tasks_config['resource_allocation'], agent = resource_allocation_agent, output_pydantic = ProjectPlan # This is the structured output we want ) # Creating Crew self.crew = Crew( agents = [project_planning_agent, estimation_agent, resource_allocation_agent], tasks = [task_breakdown, time_resource_estimation, resource_allocation], verbose = True ) def getPlanning(self, project_details): results = self.crew.kickoff(inputs = project_details) task_breakdown = results.pydantic.model_dump()['tasks'] df_tasks = pd.DataFrame(task_breakdown) milestones = results.pydantic.model_dump()['milestones'] df_milestones = pd.DataFrame(milestones) return df_tasks, df_milestones