import os from crewai import Agent, Crew, Process, Task from crewai.project import CrewBase, agent, crew, task from .model_client import create_llm from .tools.python_code_run_tool import PythonCodeRunTool def is_running_in_hf_space() -> bool: """Returns True if running in a Hugging Face Space.""" return os.environ.get("SPACE_ID") is not None # If running in Hugging Face Space, then do not run code execution in docker run_in_docker = "unsafe" if is_running_in_hf_space() else "safe" @CrewBase class EngineeringTeam(): """EngineeringTeam crew""" agents_config = 'config/agents.yaml' tasks_config = 'config/tasks.yaml' def _agent_config(self, name: str) -> dict: config = dict(self.agents_config[name]) config.pop("llm", None) return config @agent def engineering_lead(self) -> Agent: return Agent( config=self._agent_config('engineering_lead'), llm=create_llm(), verbose=True, ) @agent def backend_engineer(self) -> Agent: return Agent( config=self._agent_config('backend_engineer'), llm=create_llm(), verbose=True, allow_code_execution=True, code_execution_mode=run_in_docker, max_execution_time=500, max_retry_limit=3 ) @agent def frontend_engineer(self) -> Agent: return Agent( config=self._agent_config('frontend_engineer'), llm=create_llm(), verbose=True, ) @agent def test_engineer(self) -> Agent: return Agent( config=self._agent_config('test_engineer'), llm=create_llm(), verbose=True, allow_code_execution=True, code_execution_mode=run_in_docker, max_execution_time=500, max_retry_limit=3 ) @agent def python_code_runner(self) -> Agent: return Agent( config=self._agent_config('python_code_runner'), llm=create_llm(), verbose=True, tools=[PythonCodeRunTool()], ) @task def design_task(self) -> Task: return Task( config=self.tasks_config['design_task'] ) @task def code_task(self) -> Task: return Task( config=self.tasks_config['code_task'], ) @task def frontend_task(self) -> Task: return Task( config=self.tasks_config['frontend_task'], ) @task def test_task(self) -> Task: return Task( config=self.tasks_config['test_task'], ) @task def python_code_run_task(self) -> Task: return Task( config=self.tasks_config['python_code_run_task'] ) @crew def crew(self) -> Crew: """Creates the research crew""" return Crew( agents=self.agents, tasks=self.tasks, process=Process.sequential, verbose=True, )