File size: 7,007 Bytes
ffcf62f
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
import pytest

from swarm_models import OpenAIChat
from swarm_models.anthropic import Anthropic
from swarms.structs.agent import Agent
from swarms.structs.groupchat import GroupChat, GroupChatManager

llm = OpenAIChat()
llm2 = Anthropic()


# Mock the OpenAI class for testing
class MockOpenAI:
    def __init__(self, *args, **kwargs):
        pass

    def generate_reply(self, content):
        return {"role": "mocked_agent", "content": "Mocked Reply"}


# Create fixtures for agents and a sample message
@pytest.fixture
def agent1():
    return Agent(name="Agent1", llm=llm)


@pytest.fixture
def agent2():
    return Agent(name="Agent2", llm=llm2)


@pytest.fixture
def sample_message():
    return {"role": "Agent1", "content": "Hello, World!"}


# Test the initialization of GroupChat
def test_groupchat_initialization(agent1, agent2):
    groupchat = GroupChat(agents=[agent1, agent2])
    assert len(groupchat.agents) == 2
    assert len(groupchat.messages) == 0
    assert groupchat.max_round == 10
    assert groupchat.admin_name == "Admin"


# Test resetting the GroupChat
def test_groupchat_reset(agent1, agent2, sample_message):
    groupchat = GroupChat(agents=[agent1, agent2])
    groupchat.messages.append(sample_message)
    groupchat.reset()
    assert len(groupchat.messages) == 0


# Test finding an agent by name
def test_groupchat_find_agent_by_name(agent1, agent2):
    groupchat = GroupChat(agents=[agent1, agent2])
    found_agent = groupchat.agent_by_name("Agent1")
    assert found_agent == agent1


# Test selecting the next agent
def test_groupchat_select_next_agent(agent1, agent2):
    groupchat = GroupChat(agents=[agent1, agent2])
    next_agent = groupchat.next_agent(agent1)
    assert next_agent == agent2


# Add more tests for different methods and scenarios as needed


# Test the GroupChatManager
def test_groupchat_manager(agent1, agent2):
    groupchat = GroupChat(agents=[agent1, agent2])
    selector = agent1  # Assuming agent1 is the selector
    manager = GroupChatManager(groupchat, selector)
    task = "Task for agent2"
    reply = manager(task)
    assert reply["role"] == "Agent2"
    assert reply["content"] == "Reply from Agent2"


# Test selecting the next speaker when there is only one agent
def test_groupchat_select_speaker_single_agent(agent1):
    groupchat = GroupChat(agents=[agent1])
    selector = agent1
    manager = GroupChatManager(groupchat, selector)
    task = "Task for agent1"
    reply = manager(task)
    assert reply["role"] == "Agent1"
    assert reply["content"] == "Reply from Agent1"


# Test selecting the next speaker when GroupChat is underpopulated
def test_groupchat_select_speaker_underpopulated(agent1, agent2):
    groupchat = GroupChat(agents=[agent1, agent2])
    selector = agent1
    manager = GroupChatManager(groupchat, selector)
    task = "Task for agent1"
    reply = manager(task)
    assert reply["role"] == "Agent2"
    assert reply["content"] == "Reply from Agent2"


# Test formatting history
def test_groupchat_format_history(agent1, agent2, sample_message):
    groupchat = GroupChat(agents=[agent1, agent2])
    groupchat.messages.append(sample_message)
    formatted_history = groupchat.format_history(groupchat.messages)
    expected_history = "'Agent1:Hello, World!"
    assert formatted_history == expected_history


# Test agent names property
def test_groupchat_agent_names(agent1, agent2):
    groupchat = GroupChat(agents=[agent1, agent2])
    names = groupchat.agent_names
    assert len(names) == 2
    assert "Agent1" in names
    assert "Agent2" in names


# Test GroupChatManager initialization
def test_groupchat_manager_initialization(agent1, agent2):
    groupchat = GroupChat(agents=[agent1, agent2])
    selector = agent1
    manager = GroupChatManager(groupchat, selector)
    assert manager.groupchat == groupchat
    assert manager.selector == selector


# Test case to ensure GroupChatManager generates a reply from an agent
def test_groupchat_manager_generate_reply():
    # Create a GroupChat with two agents
    agents = [agent1, agent2]
    groupchat = GroupChat(agents=agents, messages=[], max_round=10)

    # Mock the OpenAI class and GroupChat selector
    mocked_openai = MockOpenAI()
    selector = agent1

    # Initialize GroupChatManager
    manager = GroupChatManager(
        groupchat=groupchat, selector=selector, openai=mocked_openai
    )

    # Generate a reply
    task = "Write me a riddle"
    reply = manager(task)

    # Check if a valid reply is generated
    assert "role" in reply
    assert "content" in reply
    assert reply["role"] in groupchat.agent_names


# Test case to ensure GroupChat selects the next speaker correctly
def test_groupchat_select_speaker():
    agent3 = Agent(name="agent3", llm=llm)
    agents = [agent1, agent2, agent3]
    groupchat = GroupChat(agents=agents, messages=[], max_round=10)

    # Initialize GroupChatManager with agent1 as selector
    selector = agent1
    manager = GroupChatManager(groupchat=groupchat, selector=selector)

    # Simulate selecting the next speaker
    last_speaker = agent1
    next_speaker = manager.select_speaker(
        last_speaker=last_speaker, selector=selector
    )

    # Ensure the next speaker is agent2
    assert next_speaker == agent2


# Test case to ensure GroupChat handles underpopulated group correctly
def test_groupchat_underpopulated_group():
    agent1 = Agent(name="agent1", llm=llm)
    agents = [agent1]
    groupchat = GroupChat(agents=agents, messages=[], max_round=10)

    # Initialize GroupChatManager with agent1 as selector
    selector = agent1
    manager = GroupChatManager(groupchat=groupchat, selector=selector)

    # Simulate selecting the next speaker in an underpopulated group
    last_speaker = agent1
    next_speaker = manager.select_speaker(
        last_speaker=last_speaker, selector=selector
    )

    # Ensure the next speaker is the same as the last speaker in an underpopulated group
    assert next_speaker == last_speaker


# Test case to ensure GroupChatManager handles the maximum rounds correctly
def test_groupchat_max_rounds():
    agents = [agent1, agent2]
    groupchat = GroupChat(agents=agents, messages=[], max_round=2)

    # Initialize GroupChatManager with agent1 as selector
    selector = agent1
    manager = GroupChatManager(groupchat=groupchat, selector=selector)

    # Simulate the conversation with max rounds
    last_speaker = agent1
    for _ in range(2):
        next_speaker = manager.select_speaker(
            last_speaker=last_speaker, selector=selector
        )
        last_speaker = next_speaker

    # Try one more round, should stay with the last speaker
    next_speaker = manager.select_speaker(
        last_speaker=last_speaker, selector=selector
    )

    # Ensure the next speaker is the same as the last speaker after reaching max rounds
    assert next_speaker == last_speaker


# Continue adding more test cases as needed to cover various scenarios and functionalities of the code.