From 051e9e4fedfe68062cebe06bb0d512ce8f270ae0 Mon Sep 17 00:00:00 2001 From: Renato Nitta Date: Tue, 21 Apr 2026 12:49:21 -0300 Subject: [PATCH] fix: preserve explicit name inside @crew-decorated methods --- lib/crewai/src/crewai/project/annotations.py | 6 ++++- lib/crewai/tests/test_project.py | 25 ++++++++++++++++++++ 2 files changed, 30 insertions(+), 1 deletion(-) diff --git a/lib/crewai/src/crewai/project/annotations.py b/lib/crewai/src/crewai/project/annotations.py index 77e57f912..72747cfc2 100644 --- a/lib/crewai/src/crewai/project/annotations.py +++ b/lib/crewai/src/crewai/project/annotations.py @@ -238,7 +238,11 @@ def crew( crew_instance: Crew = _call_method(meth, self, *args, **kwargs) - crew_instance.name = getattr(self, "_crew_name", None) or crew_instance.name + # Override only when the Crew's name is the auto-resolved class-name + # fallback, so an explicit `Crew(name=...)` inside the factory wins. + crewbase_name = getattr(self, "_crew_name", None) + if crewbase_name and crew_instance.name == type(crew_instance).__name__: + crew_instance.name = crewbase_name def callback_wrapper( hook: Callable[Concatenate[CrewInstance, P2], R2], instance: CrewInstance diff --git a/lib/crewai/tests/test_project.py b/lib/crewai/tests/test_project.py index bc433c2de..c2f134730 100644 --- a/lib/crewai/tests/test_project.py +++ b/lib/crewai/tests/test_project.py @@ -268,6 +268,31 @@ def test_crew_decorator_propagates_class_name_to_instance(): assert crew_instance.name == "InternalCrew" +def test_crew_decorator_preserves_explicit_name(): + """Explicit Crew(name=...) inside @crew should win over the @CrewBase class name.""" + sample_agent = Agent(role="r", goal="g", backstory="b") + sample_task = Task(description="d", expected_output="o", agent=sample_agent) + + @CrewBase + class NamedCrewFactory: + agents_config = None + tasks_config = None + agents: list[BaseAgent] = [sample_agent] + tasks: list[Task] = [sample_task] + + @crew + def crew(self): + return Crew( + name="My Explicit Name", + agents=[sample_agent], + tasks=[sample_task], + ) + + factory_cls = cast(type[Any], NamedCrewFactory) + crew_instance: Crew = cast(Any, factory_cls()).crew() + assert crew_instance.name == "My Explicit Name" + + @tool def simple_tool(): """Return 'Hi!'"""