| | 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 = [ |
| | |
| | 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, |
| | ), |
| | |
| | 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.", |
| | ), |
| | |
| | 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]: |
| | |
| | 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, |
| | ) |
| |
|
| | |
| | task = Task( |
| | description=self.task_description, |
| | expected_output=self.expected_output, |
| | agent=agent, |
| | async_execution=self.async_execution, |
| | ) |
| |
|
| | |
| | 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 |
| |
|