Merge branch 'conditional-task-f' of github.com:joaomdmoura/crewAI into test-hierarchical-tools-proper-setup

This commit is contained in:
Lorenze Jay
2024-07-16 15:20:46 -07:00
5 changed files with 3152 additions and 9 deletions

View File

@@ -2,6 +2,5 @@ from crewai.agent import Agent
from crewai.crew import Crew
from crewai.process import Process
from crewai.task import Task
from crewai.conditional_task import ConditionalTask
__all__ = ["Agent", "Crew", "Process", "Task", "ConditionalTask"]
__all__ = ["Agent", "Crew", "Process", "Task"]

View File

@@ -28,7 +28,7 @@ from crewai.memory.long_term.long_term_memory import LongTermMemory
from crewai.memory.short_term.short_term_memory import ShortTermMemory
from crewai.process import Process
from crewai.task import Task
from crewai.conditional_task import ConditionalTask
from crewai.tasks.conditional_task import ConditionalTask
from crewai.tasks.output_format import OutputFormat
from crewai.tasks.task_output import TaskOutput
from crewai.telemetry import Telemetry

View File

@@ -1,4 +1,6 @@
from typing import Callable, Optional, Any
from typing import Callable, Any
from pydantic import Field
from crewai.task import Task
from crewai.tasks.task_output import TaskOutput
@@ -9,18 +11,21 @@ class ConditionalTask(Task):
Note: This cannot be the only task you have in your crew and cannot be the first since its needs context from the previous task.
"""
condition: Optional[Callable[[TaskOutput], bool]] = None
condition: Callable[[TaskOutput], bool] = Field(
default=None,
description="Maximum number of retries for an agent to execute a task when an error occurs.",
)
def __init__(
self,
*args,
condition: Optional[Callable[[TaskOutput], bool]] = None,
condition: Callable[[Any], bool],
**kwargs,
):
super().__init__(*args, **kwargs)
self.condition = condition
def should_execute(self, context: Any) -> bool:
def should_execute(self, context: TaskOutput) -> bool:
"""
Determines whether the conditional task should be executed based on the provided context.

File diff suppressed because it is too large Load Diff

View File

@@ -11,7 +11,7 @@ import pytest
from crewai.agent import Agent
from crewai.agents.cache import CacheHandler
from crewai.conditional_task import ConditionalTask
from crewai.tasks.conditional_task import ConditionalTask
from crewai.crew import Crew
from crewai.crews.crew_output import CrewOutput
from crewai.memory.contextual.contextual_memory import ContextualMemory
@@ -2337,9 +2337,13 @@ def test_key():
def test_conditional_task_requirement_breaks_when_singular_conditional_task():
def condition_fn(output) -> bool:
return output.raw.startswith("Andrew Ng has!!")
task = ConditionalTask(
description="Come up with a list of 5 interesting ideas to explore for an article, then write one amazing paragraph highlight for each idea that showcases how good an article about this topic could be. Return the list of ideas with their paragraph and your notes.",
expected_output="5 bullet points with a paragraph for each idea.",
condition=condition_fn,
)
with pytest.raises(pydantic_core._pydantic_core.ValidationError):
@@ -2349,17 +2353,54 @@ def test_conditional_task_requirement_breaks_when_singular_conditional_task():
)
@pytest.mark.vcr(filter_headers=["authorization"])
def test_conditional_task_last_task():
def condition_fn(output) -> bool:
if output.raw == "Hi":
return False
return True
task1 = Task(
description="Say Hi",
expected_output="Hi",
agent=researcher,
)
task2 = ConditionalTask(
description="Come up with a list of 5 interesting ideas to explore for an article, then write one amazing paragraph highlight for each idea that showcases how good an article about this topic could be. Return the list of ideas with their paragraph and your notes.",
expected_output="5 bullet points with a paragraph for each idea.",
condition=condition_fn,
agent=writer,
)
crew = Crew(
agents=[researcher, writer],
tasks=[task1, task2],
)
result = crew.kickoff()
assert result.raw == "Hi"
def test_conditional_task_requirement_breaks_when_task_async():
def my_condition(context):
return context.get("some_value") > 10
task = ConditionalTask(
description="Come up with a list of 5 interesting ideas to explore for an article, then write one amazing paragraph highlight for each idea that showcases how good an article about this topic could be. Return the list of ideas with their paragraph and your notes.",
expected_output="5 bullet points with a paragraph for each idea.",
execute_async=True,
condition=my_condition,
agent=researcher,
)
task2 = Task(
description="Say Hi",
expected_output="Hi",
agent=writer,
)
with pytest.raises(pydantic_core._pydantic_core.ValidationError):
Crew(
agents=[researcher, writer],
tasks=[task],
tasks=[task, task2],
)