From a5084198c9369f481a9417423792a296e4e2ea32 Mon Sep 17 00:00:00 2001 From: Samir mlika <105347215+mlikasam-askui@users.noreply.github.com> Date: Fri, 8 Aug 2025 13:27:24 +0200 Subject: [PATCH] Switch multi-tool execution from sequential to parallel with ThreadPoolExecutor --- src/askui/models/shared/agent.py | 3 +++ src/askui/models/shared/tools.py | 9 +++++---- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/askui/models/shared/agent.py b/src/askui/models/shared/agent.py index dc537d49..1ca7a835 100644 --- a/src/askui/models/shared/agent.py +++ b/src/askui/models/shared/agent.py @@ -165,6 +165,9 @@ def _use_tools( for content_block in message.content if content_block.type == "tool_use" ] + if len(tool_use_content_blocks) == 0: + return None + content = tool_collection.run(tool_use_content_blocks) if len(content) == 0: return None diff --git a/src/askui/models/shared/tools.py b/src/askui/models/shared/tools.py index 355a9aae..3ea6aadb 100644 --- a/src/askui/models/shared/tools.py +++ b/src/askui/models/shared/tools.py @@ -1,4 +1,5 @@ from abc import ABC, abstractmethod +from concurrent.futures import ThreadPoolExecutor from typing import Any from anthropic.types.beta import BetaToolParam, BetaToolUnionParam @@ -132,10 +133,10 @@ def reset_tools(self, tools: list[Tool] | None = None) -> "Self": def run( self, tool_use_block_params: list[ToolUseBlockParam] ) -> list[ContentBlockParam]: - return [ - self._run_tool(tool_use_block_param) - for tool_use_block_param in tool_use_block_params - ] + if len(tool_use_block_params) == 1: + return [self._run_tool(tool_use_block_params[0])] + with ThreadPoolExecutor() as executor: + return list(executor.map(self._run_tool, tool_use_block_params)) def _run_tool( self, tool_use_block_param: ToolUseBlockParam