diff --git a/lib/crewai/src/crewai/experimental/agent_executor.py b/lib/crewai/src/crewai/experimental/agent_executor.py index c026c7509e..74a9168224 100644 --- a/lib/crewai/src/crewai/experimental/agent_executor.py +++ b/lib/crewai/src/crewai/experimental/agent_executor.py @@ -2802,8 +2802,10 @@ def invoke( ) if self.state.ask_for_human_input: - formatted_answer = self._handle_human_feedback(formatted_answer) + self._force_display_final_answer(formatted_answer) + formatted_answer = self._handle_human_feedback(formatted_answer) + formatted_answer = self._handle_human_feedback(formatted_answer) self._save_to_memory(formatted_answer) return {"output": formatted_answer.output} @@ -2908,10 +2910,10 @@ async def invoke_async(self, inputs: dict[str, Any]) -> dict[str, Any]: ) if self.state.ask_for_human_input: - formatted_answer = await self._ahandle_human_feedback( - formatted_answer - ) - + self._force_display_final_answer(formatted_answer) + formatted_answer = await self._ahandle_human_feedback( + formatted_answer + ) self._save_to_memory(formatted_answer) return {"output": formatted_answer.output} @@ -2930,7 +2932,13 @@ async def invoke_async(self, inputs: dict[str, Any]) -> dict[str, Any]: raise finally: self._is_executing = False - + def _force_display_final_answer(self, formatted_answer: Any) -> None: + """Forces display of the agent's final answer before human feedback loop.""" + if formatted_answer and hasattr(formatted_answer, "output"): + try: + self._console.print(f"[bold purple]Final Answer:[/bold purple] {formatted_answer.output}") + except Exception: + print(f"\nFinal Answer: {formatted_answer.output}\n") async def ainvoke(self, inputs: dict[str, Any]) -> dict[str, Any]: """Async version of invoke. Alias for invoke_async.""" return await self.invoke_async(inputs) diff --git a/test_bug.py b/test_bug.py new file mode 100644 index 0000000000..eda5e93c40 --- /dev/null +++ b/test_bug.py @@ -0,0 +1,23 @@ +import sys +# Forcing Python to read the precise source directories for both components +sys.path.insert(0, r"C:\Users\zero\crewAI\lib\crewai\src") +sys.path.insert(0, r"C:\Users\zero\crewAI\lib\crewai-core\src") + +from crewai import Agent, Crew, Task, Process +from crewai.llms.base_llm import BaseLLM + +class StubLLM(BaseLLM): + def call(self, messages, tools=None, callbacks=None, available_functions=None, + from_task=None, from_agent=None, response_model=None): + return "Thought: I know it.\nFinal Answer: The sky is blue." + + def supports_function_calling(self) -> bool: + return False + +agent = Agent(role="Tester", goal="Be a Minimal Reproduction", backstory="bg", + llm=StubLLM(model="stub"), verbose=False) + +task = Task(description="Sky colour?", expected_output="a colour", + agent=agent, human_input=True) + +Crew(agents=[agent], tasks=[task], process=Process.sequential, verbose=False).kickoff() \ No newline at end of file