feat: Add Sequential Task Agent Component. (#3444)
Adds a new component
This commit is contained in:
parent
1e7565ee9f
commit
ef08300054
1 changed files with 141 additions and 0 deletions
|
|
@ -0,0 +1,141 @@
|
|||
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 if self.tools else [],
|
||||
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:
|
||||
if isinstance(self.previous_task, list):
|
||||
tasks = self.previous_task + [task]
|
||||
else:
|
||||
tasks = [self.previous_task, task]
|
||||
else:
|
||||
tasks = [task]
|
||||
|
||||
self.status = f"Agent: {repr(agent)}\nTask: {repr(task)}"
|
||||
return tasks
|
||||
Loading…
Add table
Add a link
Reference in a new issue