Spaces:
Running
Running
| from crewai import Agent, Task | |
| from langflow.base.agents.crewai.tasks import SequentialTask | |
| from langflow.custom import Component | |
| from langflow.io import BoolInput, DictInput, HandleInput, MultilineInput, Output | |
| class SequentialTaskAgentComponent(Component): | |
| display_name = "Sequential Task Agent" | |
| description = "Creates a CrewAI Task and its associated Agent." | |
| documentation = "https://docs.crewai.com/how-to/LLM-Connections/" | |
| icon = "CrewAI" | |
| inputs = [ | |
| # Agent inputs | |
| MultilineInput(name="role", display_name="Role", info="The role of the agent."), | |
| MultilineInput(name="goal", display_name="Goal", info="The objective of the agent."), | |
| MultilineInput( | |
| name="backstory", | |
| display_name="Backstory", | |
| info="The backstory of the agent.", | |
| ), | |
| HandleInput( | |
| name="tools", | |
| display_name="Tools", | |
| input_types=["Tool"], | |
| is_list=True, | |
| info="Tools at agent's disposal", | |
| value=[], | |
| ), | |
| HandleInput( | |
| name="llm", | |
| display_name="Language Model", | |
| info="Language model that will run the agent.", | |
| input_types=["LanguageModel"], | |
| ), | |
| BoolInput( | |
| name="memory", | |
| display_name="Memory", | |
| info="Whether the agent should have memory or not", | |
| advanced=True, | |
| value=True, | |
| ), | |
| BoolInput( | |
| name="verbose", | |
| display_name="Verbose", | |
| advanced=True, | |
| value=True, | |
| ), | |
| BoolInput( | |
| name="allow_delegation", | |
| display_name="Allow Delegation", | |
| info="Whether the agent is allowed to delegate tasks to other agents.", | |
| value=False, | |
| advanced=True, | |
| ), | |
| BoolInput( | |
| name="allow_code_execution", | |
| display_name="Allow Code Execution", | |
| info="Whether the agent is allowed to execute code.", | |
| value=False, | |
| advanced=True, | |
| ), | |
| DictInput( | |
| name="agent_kwargs", | |
| display_name="Agent kwargs", | |
| info="Additional kwargs for the agent.", | |
| is_list=True, | |
| advanced=True, | |
| ), | |
| # Task inputs | |
| MultilineInput( | |
| name="task_description", | |
| display_name="Task Description", | |
| info="Descriptive text detailing task's purpose and execution.", | |
| ), | |
| MultilineInput( | |
| name="expected_output", | |
| display_name="Expected Task Output", | |
| info="Clear definition of expected task outcome.", | |
| ), | |
| BoolInput( | |
| name="async_execution", | |
| display_name="Async Execution", | |
| value=False, | |
| advanced=True, | |
| info="Boolean flag indicating asynchronous task execution.", | |
| ), | |
| # Chaining input | |
| HandleInput( | |
| name="previous_task", | |
| display_name="Previous Task", | |
| input_types=["SequentialTask"], | |
| info="The previous task in the sequence (for chaining).", | |
| required=False, | |
| ), | |
| ] | |
| outputs = [ | |
| Output( | |
| display_name="Sequential Task", | |
| name="task_output", | |
| method="build_agent_and_task", | |
| ), | |
| ] | |
| def build_agent_and_task(self) -> list[SequentialTask]: | |
| # Build the agent | |
| agent_kwargs = self.agent_kwargs or {} | |
| agent = Agent( | |
| role=self.role, | |
| goal=self.goal, | |
| backstory=self.backstory, | |
| llm=self.llm, | |
| verbose=self.verbose, | |
| memory=self.memory, | |
| tools=self.tools or [], | |
| allow_delegation=self.allow_delegation, | |
| allow_code_execution=self.allow_code_execution, | |
| **agent_kwargs, | |
| ) | |
| # Build the task | |
| task = Task( | |
| description=self.task_description, | |
| expected_output=self.expected_output, | |
| agent=agent, | |
| async_execution=self.async_execution, | |
| ) | |
| # If there's a previous task, create a list of tasks | |
| if self.previous_task: | |
| tasks = [*self.previous_task, task] if isinstance(self.previous_task, list) else [self.previous_task, task] | |
| else: | |
| tasks = [task] | |
| self.status = f"Agent: {agent!r}\nTask: {task!r}" | |
| return tasks | |