From d84c8be21107adccc752202aae0022518bceca5a Mon Sep 17 00:00:00 2001 From: ZeroKrazy Date: Fri, 19 Jun 2026 02:20:24 -0500 Subject: [PATCH 1/2] fix: force output visibility for human_input when verbose is False --- .../src/crewai/experimental/agent_executor.py | 26 ++++++++++++++----- test_bug.py | 23 ++++++++++++++++ 2 files changed, 43 insertions(+), 6 deletions(-) create mode 100644 test_bug.py diff --git a/lib/crewai/src/crewai/experimental/agent_executor.py b/lib/crewai/src/crewai/experimental/agent_executor.py index c026c7509e..4f3b98b414 100644 --- a/lib/crewai/src/crewai/experimental/agent_executor.py +++ b/lib/crewai/src/crewai/experimental/agent_executor.py @@ -2802,8 +2802,15 @@ def invoke( ) if self.state.ask_for_human_input: - formatted_answer = self._handle_human_feedback(formatted_answer) - + # Force output display using standard print & console utilities + if formatted_answer and hasattr(formatted_answer, "output"): + print(f"\n[FORCED OUTPUT] Final Answer: {formatted_answer.output}\n") + try: + self._console.print(f"[bold purple]Final Answer:[/bold purple] {formatted_answer.output}") + except Exception: + pass + + formatted_answer = self._handle_human_feedback(formatted_answer) self._save_to_memory(formatted_answer) return {"output": formatted_answer.output} @@ -2908,10 +2915,17 @@ 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 - ) - + # Force output display using standard print & console utilities + if formatted_answer and hasattr(formatted_answer, "output"): + print(f"\n[FORCED OUTPUT] Final Answer: {formatted_answer.output}\n") + try: + self._console.print(f"[bold purple]Final Answer:[/bold purple] {formatted_answer.output}") + except Exception: + pass + + formatted_answer = await self._ahandle_human_feedback( + formatted_answer + ) self._save_to_memory(formatted_answer) return {"output": formatted_answer.output} 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 From 08d009a1d593dff54756a341dd305d8ede2bfa5f Mon Sep 17 00:00:00 2001 From: ZeroKrazy Date: Fri, 19 Jun 2026 02:42:05 -0500 Subject: [PATCH 2/2] fix: resolve duplicate human feedback call in synchronous invoke --- .../src/crewai/experimental/agent_executor.py | 32 ++++++++----------- 1 file changed, 13 insertions(+), 19 deletions(-) diff --git a/lib/crewai/src/crewai/experimental/agent_executor.py b/lib/crewai/src/crewai/experimental/agent_executor.py index 4f3b98b414..74a9168224 100644 --- a/lib/crewai/src/crewai/experimental/agent_executor.py +++ b/lib/crewai/src/crewai/experimental/agent_executor.py @@ -2802,13 +2802,8 @@ def invoke( ) if self.state.ask_for_human_input: - # Force output display using standard print & console utilities - if formatted_answer and hasattr(formatted_answer, "output"): - print(f"\n[FORCED OUTPUT] Final Answer: {formatted_answer.output}\n") - try: - self._console.print(f"[bold purple]Final Answer:[/bold purple] {formatted_answer.output}") - except Exception: - pass + 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) @@ -2915,17 +2910,10 @@ async def invoke_async(self, inputs: dict[str, Any]) -> dict[str, Any]: ) if self.state.ask_for_human_input: - # Force output display using standard print & console utilities - if formatted_answer and hasattr(formatted_answer, "output"): - print(f"\n[FORCED OUTPUT] Final Answer: {formatted_answer.output}\n") - try: - self._console.print(f"[bold purple]Final Answer:[/bold purple] {formatted_answer.output}") - except Exception: - pass - - 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} @@ -2944,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)