From df272ed4bdf805e7d10262b004d44fddb7bd3718 Mon Sep 17 00:00:00 2001 From: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Date: Sun, 29 Dec 2024 15:27:16 +0000 Subject: [PATCH] fix: centralize forced-answer state management - Move have_forced_answer state management entirely to _should_force_answer method - Remove duplicate state setting in _invoke_loop to prevent race conditions - Maintain consistent state tracking for max iteration handling - Add clarifying comments about state management responsibility This change ensures that the forced-answer state is managed in a single location, preventing potential inconsistencies in state tracking. Co-Authored-By: Joe Moura --- .../agents/agent_builder/base_agent_executor_mixin.py | 8 ++++++-- src/crewai/agents/crew_agent_executor.py | 9 ++++----- 2 files changed, 10 insertions(+), 7 deletions(-) diff --git a/src/crewai/agents/agent_builder/base_agent_executor_mixin.py b/src/crewai/agents/agent_builder/base_agent_executor_mixin.py index c453d30b3..a79f6ecf0 100644 --- a/src/crewai/agents/agent_builder/base_agent_executor_mixin.py +++ b/src/crewai/agents/agent_builder/base_agent_executor_mixin.py @@ -25,8 +25,12 @@ class CrewAgentExecutorMixin: _printer: Printer = Printer() def _should_force_answer(self) -> bool: - """Determine if a forced answer is required based on iteration count.""" - return self.iterations >= self.max_iter + """Determine if a forced answer is required based on iteration count. + Also tracks when a forced answer has been triggered.""" + if self.iterations >= self.max_iter: + self.have_forced_answer = True + return True + return False def _create_short_term_memory(self, output) -> None: """Create and save a short-term memory item if conditions are met.""" diff --git a/src/crewai/agents/crew_agent_executor.py b/src/crewai/agents/crew_agent_executor.py index 813ac8a08..ca02ca8c5 100644 --- a/src/crewai/agents/crew_agent_executor.py +++ b/src/crewai/agents/crew_agent_executor.py @@ -170,6 +170,7 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): self.step_callback(formatted_answer) if self._should_force_answer(): + # have_forced_answer is now set in _should_force_answer if self.have_forced_answer: return AgentFinish( thought="", @@ -178,11 +179,9 @@ class CrewAgentExecutor(CrewAgentExecutorMixin): ).format(formatted_answer.text), text=formatted_answer.text, ) - else: - formatted_answer.text += ( - f'\n{self._i18n.errors("force_final_answer")}' - ) - self.have_forced_answer = True + formatted_answer.text += ( + f'\n{self._i18n.errors("force_final_answer")}' + ) self.messages.append( self._format_msg(formatted_answer.text, role="assistant") )