diff --git a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_code_executor_agent.py b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_code_executor_agent.py index 2343135a546a..a7e9ef9c72cd 100644 --- a/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_code_executor_agent.py +++ b/python/packages/autogen-agentchat/src/autogen_agentchat/agents/_code_executor_agent.py @@ -664,7 +664,7 @@ async def on_messages_stream( ) # Always reflect on the execution result - async for reflection_response in CodeExecutorAgent._reflect_on_code_block_results_flow( + async for reflection_response in type(self)._reflect_on_code_block_results_flow( system_messages=system_messages, model_client=model_client, model_client_stream=model_client_stream, diff --git a/python/packages/autogen-agentchat/tests/test_code_executor_agent.py b/python/packages/autogen-agentchat/tests/test_code_executor_agent.py index 1ed98c89e1d5..2b323ca12ea4 100644 --- a/python/packages/autogen-agentchat/tests/test_code_executor_agent.py +++ b/python/packages/autogen-agentchat/tests/test_code_executor_agent.py @@ -632,3 +632,39 @@ async def test_approval_functionality_async( assert result.exit_code == expected_exit_code assert expected_in_output in result.output + + +@pytest.mark.asyncio +async def test_subclass_reflection_override_is_called() -> None: + """Regression test: ensures type(self) dispatch so subclass overrides of + _reflect_on_code_block_results_flow are honored (issue #7205).""" + + override_called = False + + class _CustomAgent(CodeExecutorAgent): + @classmethod + async def _reflect_on_code_block_results_flow(cls, **kwargs): # type: ignore[override] + nonlocal override_called + override_called = True + yield Response( + chat_message=TextMessage(content="custom reflection response", source=kwargs["agent_name"]) + ) + + model_client = ReplayChatCompletionClient(["```python\nprint('hello')\n```"]) + + agent = _CustomAgent( + name="test_agent", + code_executor=LocalCommandLineCodeExecutor(), + model_client=model_client, + ) + + async for _ in agent.on_messages_stream( + [TextMessage(content="Run something", source="user")], + CancellationToken(), + ): + pass + + assert override_called, ( + "Subclass _reflect_on_code_block_results_flow was not called; " + "base class CodeExecutorAgent._reflect_on_code_block_results_flow was dispatched instead" + )