/*
* Copyright (c) Huawei Technologies Co., Ltd. 2024-2025. All rights reserved.
*/
package magic.agent_group
import magic.core.agent.*
import std.collection.ArrayList
public enum FreeGroupMode {
| Auto // The speaker will be selected by LLM automatically
| RoundRobin
}
public class FreeGroup <: AgentGroup {
private let members = ArrayList<Agent>()
public init(a: Agent, b: Agent) {
members.append(a)
members.append(b)
}
override public func chat(request: AgentRequest): AgentResponse {
return chat(request, maxRound: DISCUSSION_MAX_ROUND)
}
override public func chat(request: AgentRequest, maxRound!: Int64): AgentResponse {
let dGroup = AutoDiscussGroup(topic: request.question, members: members)
return dGroup.discuss(maxRound: maxRound)
}
override public func asyncChat(request: AgentRequest): AsyncAgentResponse {
throw UnsupportedException()
}
public func discuss(topic!: String, initiator!: String, speech!: String,
mode!: FreeGroupMode = FreeGroupMode.Auto,
maxRound!: Int64 = DISCUSSION_MAX_ROUND): String {
let dGroup = match (mode) {
case FreeGroupMode.Auto => AutoDiscussGroup(topic: topic, members: members)
case FreeGroupMode.RoundRobin => RoundRobinDiscussGroup(topic: topic, members: members)
}
let resp = dGroup.discuss(initiator, speech, maxRound: maxRound)
return resp.content
}
override public operator func [](memberName: String): Agent {
for (agent in members) {
if (agent.name == memberName) {
return agent
}
}
throw Exception("Access unknown agent member")
}
public operator func |(member: Agent): FreeGroup {
members.append(member)
return this
}
}