mirror of
https://github.com/crewAIInc/crewAI.git
synced 2026-01-10 16:48:30 +00:00
Merge branch 'main' of github.com:crewAIInc/crewAI into brandon/cre-130-pipeline-project-structure
This commit is contained in:
@@ -126,7 +126,7 @@ task2 = Task(
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[researcher, writer],
|
agents=[researcher, writer],
|
||||||
tasks=[task1, task2],
|
tasks=[task1, task2],
|
||||||
verbose=2, # You can set it to 1 or 2 to different logging levels
|
verbose=True,
|
||||||
process = Process.sequential
|
process = Process.sequential
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -134,7 +134,7 @@ Once a crew has been executed, its output can be accessed through the `output` a
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[research_agent, writer_agent],
|
agents=[research_agent, writer_agent],
|
||||||
tasks=[research_task, write_article_task],
|
tasks=[research_task, write_article_task],
|
||||||
verbose=2
|
verbose=True
|
||||||
)
|
)
|
||||||
|
|
||||||
crew_output = crew.kickoff()
|
crew_output = crew.kickoff()
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ task = Task(
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[research_agent],
|
agents=[research_agent],
|
||||||
tasks=[task],
|
tasks=[task],
|
||||||
verbose=2
|
verbose=True
|
||||||
)
|
)
|
||||||
|
|
||||||
result = crew.kickoff()
|
result = crew.kickoff()
|
||||||
@@ -142,7 +142,7 @@ task = Task(
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[research_agent],
|
agents=[research_agent],
|
||||||
tasks=[task],
|
tasks=[task],
|
||||||
verbose=2
|
verbose=True
|
||||||
)
|
)
|
||||||
|
|
||||||
result = crew.kickoff()
|
result = crew.kickoff()
|
||||||
@@ -264,7 +264,7 @@ task1 = Task(
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[research_agent],
|
agents=[research_agent],
|
||||||
tasks=[task1, task2, task3],
|
tasks=[task1, task2, task3],
|
||||||
verbose=2
|
verbose=True
|
||||||
)
|
)
|
||||||
|
|
||||||
result = crew.kickoff()
|
result = crew.kickoff()
|
||||||
|
|||||||
@@ -84,7 +84,7 @@ write = Task(
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[researcher, writer],
|
agents=[researcher, writer],
|
||||||
tasks=[research, write],
|
tasks=[research, write],
|
||||||
verbose=2
|
verbose=True
|
||||||
)
|
)
|
||||||
|
|
||||||
# Execute tasks
|
# Execute tasks
|
||||||
|
|||||||
@@ -79,7 +79,7 @@ task3 = Task(
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[data_fetcher_agent, data_processor_agent, summary_generator_agent],
|
agents=[data_fetcher_agent, data_processor_agent, summary_generator_agent],
|
||||||
tasks=[task1, conditional_task, task3],
|
tasks=[task1, conditional_task, task3],
|
||||||
verbose=2,
|
verbose=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
result = crew.kickoff()
|
result = crew.kickoff()
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ task2 = Task(
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[researcher, writer],
|
agents=[researcher, writer],
|
||||||
tasks=[task1, task2],
|
tasks=[task1, task2],
|
||||||
verbose=2,
|
verbose=True,
|
||||||
memory=True,
|
memory=True,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|||||||
@@ -74,7 +74,7 @@ task = Task(description="""what is 3 + 5""",
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[general_agent],
|
agents=[general_agent],
|
||||||
tasks=[task],
|
tasks=[task],
|
||||||
verbose=2
|
verbose=True
|
||||||
)
|
)
|
||||||
|
|
||||||
result = crew.kickoff()
|
result = crew.kickoff()
|
||||||
|
|||||||
@@ -158,7 +158,7 @@ class BaseAgent(ABC, BaseModel):
|
|||||||
@model_validator(mode="after")
|
@model_validator(mode="after")
|
||||||
def set_private_attrs(self):
|
def set_private_attrs(self):
|
||||||
"""Set private attributes."""
|
"""Set private attributes."""
|
||||||
self._logger = Logger(self.verbose)
|
self._logger = Logger(verbose=self.verbose)
|
||||||
if self.max_rpm and not self._rpm_controller:
|
if self.max_rpm and not self._rpm_controller:
|
||||||
self._rpm_controller = RPMController(
|
self._rpm_controller = RPMController(
|
||||||
max_rpm=self.max_rpm, logger=self._logger
|
max_rpm=self.max_rpm, logger=self._logger
|
||||||
|
|||||||
@@ -51,7 +51,7 @@ class CrewAgentExecutor(AgentExecutor, CrewAgentExecutorMixin):
|
|||||||
system_template: Optional[str] = None
|
system_template: Optional[str] = None
|
||||||
prompt_template: Optional[str] = None
|
prompt_template: Optional[str] = None
|
||||||
response_template: Optional[str] = None
|
response_template: Optional[str] = None
|
||||||
_logger: Logger = Logger(verbose_level=2)
|
_logger: Logger = Logger()
|
||||||
_fit_context_window_strategy: Optional[Literal["summarize"]] = "summarize"
|
_fit_context_window_strategy: Optional[Literal["summarize"]] = "summarize"
|
||||||
|
|
||||||
def _call(
|
def _call(
|
||||||
|
|||||||
@@ -48,6 +48,6 @@ class {{crew_name}}Crew():
|
|||||||
agents=self.agents, # Automatically created by the @agent decorator
|
agents=self.agents, # Automatically created by the @agent decorator
|
||||||
tasks=self.tasks, # Automatically created by the @task decorator
|
tasks=self.tasks, # Automatically created by the @task decorator
|
||||||
process=Process.sequential,
|
process=Process.sequential,
|
||||||
verbose=2,
|
verbose=True,
|
||||||
# process=Process.hierarchical, # In case you wanna use that instead https://docs.crewai.com/how-to/Hierarchical/
|
# process=Process.hierarchical, # In case you wanna use that instead https://docs.crewai.com/how-to/Hierarchical/
|
||||||
)
|
)
|
||||||
@@ -104,7 +104,7 @@ class Crew(BaseModel):
|
|||||||
tasks: List[Task] = Field(default_factory=list)
|
tasks: List[Task] = Field(default_factory=list)
|
||||||
agents: List[BaseAgent] = Field(default_factory=list)
|
agents: List[BaseAgent] = Field(default_factory=list)
|
||||||
process: Process = Field(default=Process.sequential)
|
process: Process = Field(default=Process.sequential)
|
||||||
verbose: int = Field(default=0)
|
verbose: bool = Field(default=False)
|
||||||
memory: bool = Field(
|
memory: bool = Field(
|
||||||
default=False,
|
default=False,
|
||||||
description="Whether the crew should use memory to store memories of it's execution",
|
description="Whether the crew should use memory to store memories of it's execution",
|
||||||
@@ -198,7 +198,7 @@ class Crew(BaseModel):
|
|||||||
def set_private_attrs(self) -> "Crew":
|
def set_private_attrs(self) -> "Crew":
|
||||||
"""Set private attributes."""
|
"""Set private attributes."""
|
||||||
self._cache_handler = CacheHandler()
|
self._cache_handler = CacheHandler()
|
||||||
self._logger = Logger(self.verbose)
|
self._logger = Logger(verbose=self.verbose)
|
||||||
if self.output_log_file:
|
if self.output_log_file:
|
||||||
self._file_handler = FileHandler(self.output_log_file)
|
self._file_handler = FileHandler(self.output_log_file)
|
||||||
self._rpm_controller = RPMController(max_rpm=self.max_rpm, logger=self._logger)
|
self._rpm_controller = RPMController(max_rpm=self.max_rpm, logger=self._logger)
|
||||||
|
|||||||
@@ -6,15 +6,11 @@ from crewai.utilities.printer import Printer
|
|||||||
class Logger:
|
class Logger:
|
||||||
_printer = Printer()
|
_printer = Printer()
|
||||||
|
|
||||||
def __init__(self, verbose_level=0):
|
def __init__(self, verbose=False):
|
||||||
verbose_level = (
|
self.verbose = verbose
|
||||||
2 if isinstance(verbose_level, bool) and verbose_level else verbose_level
|
|
||||||
)
|
|
||||||
self.verbose_level = verbose_level
|
|
||||||
|
|
||||||
def log(self, level, message, color="bold_green"):
|
def log(self, level, message, color="bold_green"):
|
||||||
level_map = {"debug": 1, "info": 2}
|
if self.verbose:
|
||||||
if self.verbose_level and level_map.get(level, 0) <= self.verbose_level:
|
|
||||||
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||||
self._printer.print(
|
self._printer.print(
|
||||||
f"[{timestamp}][{level.upper()}]: {message}", color=color
|
f"[{timestamp}][{level.upper()}]: {message}", color=color
|
||||||
|
|||||||
@@ -470,7 +470,7 @@ def test_agent_respect_the_max_rpm_set_over_crew_rpm(capsys):
|
|||||||
agent=agent,
|
agent=agent,
|
||||||
)
|
)
|
||||||
|
|
||||||
crew = Crew(agents=[agent], tasks=[task], max_rpm=1, verbose=2)
|
crew = Crew(agents=[agent], tasks=[task], max_rpm=1, verbose=True)
|
||||||
|
|
||||||
with patch.object(RPMController, "_wait_for_next_minute") as moveon:
|
with patch.object(RPMController, "_wait_for_next_minute") as moveon:
|
||||||
moveon.return_value = True
|
moveon.return_value = True
|
||||||
@@ -522,7 +522,7 @@ def test_agent_without_max_rpm_respet_crew_rpm(capsys):
|
|||||||
),
|
),
|
||||||
]
|
]
|
||||||
|
|
||||||
crew = Crew(agents=[agent1, agent2], tasks=tasks, max_rpm=1, verbose=2)
|
crew = Crew(agents=[agent1, agent2], tasks=tasks, max_rpm=1, verbose=True)
|
||||||
|
|
||||||
with patch.object(RPMController, "_wait_for_next_minute") as moveon:
|
with patch.object(RPMController, "_wait_for_next_minute") as moveon:
|
||||||
moveon.return_value = True
|
moveon.return_value = True
|
||||||
@@ -563,7 +563,7 @@ def test_agent_error_on_parsing_tool(capsys):
|
|||||||
crew = Crew(
|
crew = Crew(
|
||||||
agents=[agent1],
|
agents=[agent1],
|
||||||
tasks=tasks,
|
tasks=tasks,
|
||||||
verbose=2,
|
verbose=True,
|
||||||
function_calling_llm=ChatOpenAI(model="gpt-4-0125-preview"),
|
function_calling_llm=ChatOpenAI(model="gpt-4-0125-preview"),
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -602,7 +602,7 @@ def test_agent_remembers_output_format_after_using_tools_too_many_times():
|
|||||||
)
|
)
|
||||||
]
|
]
|
||||||
|
|
||||||
crew = Crew(agents=[agent1], tasks=tasks, verbose=2)
|
crew = Crew(agents=[agent1], tasks=tasks, verbose=True)
|
||||||
|
|
||||||
with patch.object(ToolUsage, "_remember_format") as remember_format:
|
with patch.object(ToolUsage, "_remember_format") as remember_format:
|
||||||
crew.kickoff()
|
crew.kickoff()
|
||||||
|
|||||||
5474
tests/cassettes/test_hierarchical_verbose_false_manager_agent.yaml
Normal file
5474
tests/cassettes/test_hierarchical_verbose_false_manager_agent.yaml
Normal file
File diff suppressed because it is too large
Load Diff
10311
tests/cassettes/test_hierarchical_verbose_manager_agent.yaml
Normal file
10311
tests/cassettes/test_hierarchical_verbose_manager_agent.yaml
Normal file
File diff suppressed because it is too large
Load Diff
@@ -450,45 +450,13 @@ def test_crew_verbose_output(capsys):
|
|||||||
assert expected_string in captured.out
|
assert expected_string in captured.out
|
||||||
|
|
||||||
# Now test with verbose set to False
|
# Now test with verbose set to False
|
||||||
crew._logger = Logger(verbose_level=False)
|
crew.verbose = False
|
||||||
|
crew._logger = Logger(verbose=False)
|
||||||
crew.kickoff()
|
crew.kickoff()
|
||||||
captured = capsys.readouterr()
|
captured = capsys.readouterr()
|
||||||
assert captured.out == ""
|
assert captured.out == ""
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
|
||||||
def test_crew_verbose_levels_output(capsys):
|
|
||||||
tasks = [
|
|
||||||
Task(
|
|
||||||
description="Write about AI advancements.",
|
|
||||||
expected_output="A 4 paragraph article about AI.",
|
|
||||||
agent=researcher,
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
crew = Crew(agents=[researcher], tasks=tasks, process=Process.sequential, verbose=1)
|
|
||||||
|
|
||||||
crew.kickoff()
|
|
||||||
captured = capsys.readouterr()
|
|
||||||
expected_strings = ["Working Agent: Researcher", "[Researcher] Task output:"]
|
|
||||||
|
|
||||||
for expected_string in expected_strings:
|
|
||||||
assert expected_string in captured.out
|
|
||||||
|
|
||||||
# Now test with verbose set to 2
|
|
||||||
crew._logger = Logger(verbose_level=2)
|
|
||||||
crew.kickoff()
|
|
||||||
captured = capsys.readouterr()
|
|
||||||
expected_strings = [
|
|
||||||
"Working Agent: Researcher",
|
|
||||||
"Starting Task: Write about AI advancements.",
|
|
||||||
"[Researcher] Task output:",
|
|
||||||
]
|
|
||||||
|
|
||||||
for expected_string in expected_strings:
|
|
||||||
assert expected_string in captured.out
|
|
||||||
|
|
||||||
|
|
||||||
@pytest.mark.vcr(filter_headers=["authorization"])
|
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||||
def test_cache_hitting_between_agents():
|
def test_cache_hitting_between_agents():
|
||||||
from unittest.mock import call, patch
|
from unittest.mock import call, patch
|
||||||
@@ -562,7 +530,7 @@ def test_api_calls_throttling(capsys):
|
|||||||
agent=agent,
|
agent=agent,
|
||||||
)
|
)
|
||||||
|
|
||||||
crew = Crew(agents=[agent], tasks=[task], max_rpm=2, verbose=2)
|
crew = Crew(agents=[agent], tasks=[task], max_rpm=2, verbose=True)
|
||||||
|
|
||||||
with patch.object(RPMController, "_wait_for_next_minute") as moveon:
|
with patch.object(RPMController, "_wait_for_next_minute") as moveon:
|
||||||
moveon.return_value = True
|
moveon.return_value = True
|
||||||
@@ -619,7 +587,7 @@ def test_agents_rpm_is_never_set_if_crew_max_RPM_is_not_set():
|
|||||||
agent=agent,
|
agent=agent,
|
||||||
)
|
)
|
||||||
|
|
||||||
Crew(agents=[agent], tasks=[task], verbose=2)
|
Crew(agents=[agent], tasks=[task], verbose=True)
|
||||||
|
|
||||||
assert agent._rpm_controller is None
|
assert agent._rpm_controller is None
|
||||||
|
|
||||||
@@ -2565,3 +2533,49 @@ def test_crew_testing_function(mock_kickoff, crew_evaluator):
|
|||||||
mock.call().print_crew_evaluation_result(),
|
mock.call().print_crew_evaluation_result(),
|
||||||
]
|
]
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||||
|
def test_hierarchical_verbose_manager_agent():
|
||||||
|
from langchain_openai import ChatOpenAI
|
||||||
|
|
||||||
|
task = Task(
|
||||||
|
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.",
|
||||||
|
)
|
||||||
|
|
||||||
|
crew = Crew(
|
||||||
|
agents=[researcher, writer],
|
||||||
|
tasks=[task],
|
||||||
|
process=Process.hierarchical,
|
||||||
|
manager_llm=ChatOpenAI(temperature=0, model="gpt-4o"),
|
||||||
|
verbose=True,
|
||||||
|
)
|
||||||
|
|
||||||
|
crew.kickoff()
|
||||||
|
|
||||||
|
assert crew.manager_agent is not None
|
||||||
|
assert crew.manager_agent.verbose
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.vcr(filter_headers=["authorization"])
|
||||||
|
def test_hierarchical_verbose_false_manager_agent():
|
||||||
|
from langchain_openai import ChatOpenAI
|
||||||
|
|
||||||
|
task = Task(
|
||||||
|
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.",
|
||||||
|
)
|
||||||
|
|
||||||
|
crew = Crew(
|
||||||
|
agents=[researcher, writer],
|
||||||
|
tasks=[task],
|
||||||
|
process=Process.hierarchical,
|
||||||
|
manager_llm=ChatOpenAI(temperature=0, model="gpt-4o"),
|
||||||
|
verbose=False,
|
||||||
|
)
|
||||||
|
|
||||||
|
crew.kickoff()
|
||||||
|
|
||||||
|
assert crew.manager_agent is not None
|
||||||
|
assert not crew.manager_agent.verbose
|
||||||
|
|||||||
@@ -434,7 +434,7 @@ def test_output_pydantic_to_another_task():
|
|||||||
agent=scorer,
|
agent=scorer,
|
||||||
)
|
)
|
||||||
|
|
||||||
crew = Crew(agents=[scorer], tasks=[task1, task2], verbose=2)
|
crew = Crew(agents=[scorer], tasks=[task1, task2], verbose=True)
|
||||||
result = crew.kickoff()
|
result = crew.kickoff()
|
||||||
pydantic_result = result.pydantic
|
pydantic_result = result.pydantic
|
||||||
assert isinstance(
|
assert isinstance(
|
||||||
|
|||||||
Reference in New Issue
Block a user