From b956986bf0cdf0fcab3eaebe1b04d05214ef5e2e Mon Sep 17 00:00:00 2001 From: Joao Moura Date: Thu, 14 May 2026 15:01:07 -0400 Subject: [PATCH] refactor: convert synchronous methods to asynchronous in ConversationalAgentExecutor - Updated several methods in ConversationalAgentExecutor to use asyncio.to_thread for improved concurrency. - Ensured that memory persistence and message summarization are handled asynchronously to enhance performance. - Adjusted prompt stack building to run in a separate thread for better responsiveness. --- lib/crewai/src/crewai/new_agent/executor.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/lib/crewai/src/crewai/new_agent/executor.py b/lib/crewai/src/crewai/new_agent/executor.py index a27760e56..518676c90 100644 --- a/lib/crewai/src/crewai/new_agent/executor.py +++ b/lib/crewai/src/crewai/new_agent/executor.py @@ -1347,7 +1347,9 @@ class ConversationalAgentExecutor(BaseModel): self._emit_event_message_received(user_message) await self._emit_status("recalling", "Searching memory for relevant context") - self.prompt_stack = self._build_prompt_stack(user_content=user_message.content) + self.prompt_stack = await asyncio.to_thread( + self._build_prompt_stack, user_content=user_message.content + ) # Handle pending suggestion responses before new detection conv_id = ( @@ -1501,7 +1503,9 @@ class ConversationalAgentExecutor(BaseModel): llm_messages = self._build_llm_messages(user_message) callbacks: list[TokenCalcHandler] = [TokenCalcHandler()] - self._proactive_summarize_messages(llm_messages, callbacks) + await asyncio.to_thread( + self._proactive_summarize_messages, llm_messages, callbacks + ) all_tools = list(self.agent._resolved_tools or []) + list( self.agent._coworker_tools or [] @@ -1790,10 +1794,10 @@ class ConversationalAgentExecutor(BaseModel): ) self.provenance_log.append(prov_entry) # GAP-89: Persist provenance to memory backend - self._persist_provenance_to_memory(prov_entry) + await asyncio.to_thread(self._persist_provenance_to_memory, prov_entry) self._record_token_usage("message", llm_model) - self._save_to_memory(user_message, agent_message) + await asyncio.to_thread(self._save_to_memory, user_message, agent_message) self._emit_event_message_sent(agent_message) if self.provider: @@ -1944,13 +1948,13 @@ class ConversationalAgentExecutor(BaseModel): result = await original_tool._arun(parsed_args) elif isinstance(parsed_args, dict): result = ( - original_tool._run(**parsed_args) + await asyncio.to_thread(original_tool._run, **parsed_args) if original_tool else str(parsed_args) ) else: result = ( - original_tool._run(parsed_args) + await asyncio.to_thread(original_tool._run, parsed_args) if original_tool else str(parsed_args) ) @@ -2023,7 +2027,7 @@ class ConversationalAgentExecutor(BaseModel): ) self.provenance_log.append(tool_prov_entry) # GAP-89: Persist tool call provenance to memory - self._persist_provenance_to_memory(tool_prov_entry) + await asyncio.to_thread(self._persist_provenance_to_memory, tool_prov_entry) # GAP-67: Detect artifacts from tool results try: