From cfabc29f74e1b154e2170b45eb1014c789dd7ac5 Mon Sep 17 00:00:00 2001 From: Felix Date: Sun, 24 May 2026 12:47:02 +0800 Subject: [PATCH] fix(agent): propagate maxConcurrentSubagents config to SubagentManager MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The maxConcurrentSubagents field in AgentDefaults was never wired through AgentLoop.from_config() → AgentLoop.__init__() → SubagentManager.__init__(), causing it to always fall back to the hardcoded default of 1 regardless of the user's config. --- nanobot/agent/loop.py | 3 +++ nanobot/agent/subagent.py | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/nanobot/agent/loop.py b/nanobot/agent/loop.py index e396212ab..f50583119 100644 --- a/nanobot/agent/loop.py +++ b/nanobot/agent/loop.py @@ -164,6 +164,7 @@ class AgentLoop: workspace: Path, model: str | None = None, max_iterations: int | None = None, + max_concurrent_subagents: int | None = None, context_window_tokens: int | None = None, context_block_limit: int | None = None, max_tool_result_chars: int | None = None, @@ -262,6 +263,7 @@ class AgentLoop: restrict_to_workspace=restrict_to_workspace, disabled_skills=disabled_skills, max_iterations=self.max_iterations, + max_concurrent_subagents=max_concurrent_subagents, llm_wall_timeout_for_session=lambda sk: runner_wall_llm_timeout_s(self.sessions, sk), ) self._unified_session = unified_session @@ -347,6 +349,7 @@ class AgentLoop: workspace=config.workspace_path, model=model, max_iterations=defaults.max_tool_iterations, + max_concurrent_subagents=defaults.max_concurrent_subagents, context_window_tokens=context_window_tokens, context_block_limit=defaults.context_block_limit, max_tool_result_chars=defaults.max_tool_result_chars, diff --git a/nanobot/agent/subagent.py b/nanobot/agent/subagent.py index 54c0a4cb3..6b39f66d0 100644 --- a/nanobot/agent/subagent.py +++ b/nanobot/agent/subagent.py @@ -79,6 +79,7 @@ class SubagentManager: restrict_to_workspace: bool = False, disabled_skills: list[str] | None = None, max_iterations: int | None = None, + max_concurrent_subagents: int | None = None, llm_wall_timeout_for_session: Callable[[str | None], float | None] | None = None, ): defaults = AgentDefaults() @@ -95,7 +96,11 @@ class SubagentManager: if max_iterations is not None else defaults.max_tool_iterations ) - self.max_concurrent_subagents = defaults.max_concurrent_subagents + self.max_concurrent_subagents = ( + max_concurrent_subagents + if max_concurrent_subagents is not None + else defaults.max_concurrent_subagents + ) self.runner = AgentRunner(provider) self._llm_wall_timeout_for_session = llm_wall_timeout_for_session self._running_tasks: dict[str, asyncio.Task[None]] = {}