diff --git a/tests/tools/test_delegate.py b/tests/tools/test_delegate.py index e1e119d919..762654a259 100644 --- a/tests/tools/test_delegate.py +++ b/tests/tools/test_delegate.py @@ -903,6 +903,45 @@ class TestDelegationProviderIntegration(unittest.TestCase): self.assertEqual(call.kwargs.get("override_api_key"), "sk-or-batch") self.assertEqual(call.kwargs.get("override_api_mode"), "chat_completions") + @patch("tools.delegate_tool._load_config") + @patch("tools.delegate_tool._resolve_delegation_credentials") + def test_delegation_acp_runtime_reaches_child_agent(self, mock_creds, mock_cfg): + """Resolved ACP runtime command/args must be forwarded to child agents.""" + mock_cfg.return_value = { + "max_iterations": 45, + "model": "copilot-model", + "provider": "copilot-acp", + } + mock_creds.return_value = { + "model": "copilot-model", + "provider": "copilot-acp", + "base_url": "acp://copilot", + "api_key": "copilot-acp", + "api_mode": "chat_completions", + "command": "custom-copilot", + "args": ["--stdio-custom"], + } + parent = _make_mock_parent(depth=0) + + with patch("tools.delegate_tool._build_child_agent") as mock_build, \ + patch("tools.delegate_tool._run_single_child") as mock_run: + mock_child = MagicMock() + mock_build.return_value = mock_child + mock_run.return_value = { + "task_index": 0, "status": "completed", + "summary": "Done", "api_calls": 1, "duration_seconds": 1.0 + } + + delegate_task(goal="ACP delegation test", parent_agent=parent) + + _, kwargs = mock_build.call_args + self.assertEqual(kwargs.get("override_provider"), "copilot-acp") + self.assertEqual(kwargs.get("override_base_url"), "acp://copilot") + self.assertEqual(kwargs.get("override_api_key"), "copilot-acp") + self.assertEqual(kwargs.get("override_api_mode"), "chat_completions") + self.assertEqual(kwargs.get("override_acp_command"), "custom-copilot") + self.assertEqual(kwargs.get("override_acp_args"), ["--stdio-custom"]) + @patch("tools.delegate_tool._load_config") @patch("tools.delegate_tool._resolve_delegation_credentials") def test_model_only_no_provider_inherits_parent_credentials(self, mock_creds, mock_cfg): diff --git a/tools/delegate_tool.py b/tools/delegate_tool.py index 22b132f2c4..1db6c08622 100644 --- a/tools/delegate_tool.py +++ b/tools/delegate_tool.py @@ -768,6 +768,7 @@ def delegate_task( children = [] try: for i, t in enumerate(task_list): + task_acp_args = t.get("acp_args") if "acp_args" in t else None child = _build_child_agent( task_index=i, goal=t["goal"], context=t.get("context"), toolsets=t.get("toolsets") or toolsets, model=creds["model"], @@ -775,8 +776,10 @@ def delegate_task( override_provider=creds["provider"], override_base_url=creds["base_url"], override_api_key=creds["api_key"], override_api_mode=creds["api_mode"], - override_acp_command=t.get("acp_command") or acp_command, - override_acp_args=t.get("acp_args") or acp_args, + override_acp_command=t.get("acp_command") or acp_command or creds.get("command"), + override_acp_args=task_acp_args if task_acp_args is not None else ( + acp_args if acp_args is not None else creds.get("args") + ), ) # Override with correct parent tool names (before child construction mutated global) child._delegate_saved_tool_names = _parent_tool_names