import os from typing import List, Sequence import pytest from autogen_agentchat.agents import AssistantAgent from autogen_agentchat.base import TaskResult from autogen_agentchat.messages import BaseAgentEvent, BaseChatMessage from autogen_agentchat.teams import SelectorGroupChat from autogen_agentchat.ui import Console from autogen_core.models import ChatCompletionClient from autogen_ext.models.openai import OpenAIChatCompletionClient async def _test_selector_group_chat(model_client: ChatCompletionClient) -> None: assistant = AssistantAgent( "assistant", description="A helpful assistant agent.", model_client=model_client, system_message="You are a helpful assistant.", ) critic = AssistantAgent( "critic", description="A critic agent to provide feedback.", model_client=model_client, system_message="Provide feedback.", ) team = SelectorGroupChat([assistant, critic], model_client=model_client, max_turns=2) await Console(team.run_stream(task="Draft a short email about organizing a holiday party for new year.")) async def _test_selector_group_chat_with_candidate_func(model_client: ChatCompletionClient) -> None: filtered_participants = ["developer", "tester"] def dummy_candidate_func(thread: Sequence[BaseAgentEvent | BaseChatMessage]) -> List[str]: # Dummy candidate function that will return # only return developer and reviewer return filtered_participants developer = AssistantAgent( "developer", description="Writes and implements code based on requirements.", model_client=model_client, system_message="You are a software developer working on a new feature.", ) tester = AssistantAgent( "tester", description="Writes and executes test cases to validate the implementation.", model_client=model_client, system_message="You are a software tester ensuring the feature works correctly.", ) project_manager = AssistantAgent( "project_manager", description="Oversees the project and ensures alignment with the broader goals.", model_client=model_client, system_message="You are a project manager ensuring the team meets the project goals.", ) team = SelectorGroupChat( participants=[developer, tester, project_manager], model_client=model_client, max_turns=3, candidate_func=dummy_candidate_func, ) task = "Create a detailed implementation plan for adding dark mode in a React app and review it for feasibility and improvements." async for message in team.run_stream(task=task): if not isinstance(message, TaskResult): if message.source == "user": # ignore the first 'user' message continue assert message.source in filtered_participants, "Candidate function didn't filter the participants" @pytest.mark.asyncio async def test_selector_group_chat_gemini() -> None: try: api_key = os.environ["GEMINI_API_KEY"] except KeyError: pytest.skip("GEMINI_API_KEY not set in environment variables.") model_client = OpenAIChatCompletionClient( model="gemini-1.5-flash", api_key=api_key, ) await _test_selector_group_chat(model_client) await _test_selector_group_chat_with_candidate_func(model_client) @pytest.mark.asyncio async def test_selector_group_chat_openai() -> None: try: api_key = os.environ["OPENAI_API_KEY"] except KeyError: pytest.skip("OPENAI_API_KEY not set in environment variables.") model_client = OpenAIChatCompletionClient( model="gpt-4.1-nano", api_key=api_key, ) await _test_selector_group_chat(model_client) await _test_selector_group_chat_with_candidate_func(model_client)