Spaces:
Sleeping
Sleeping
File size: 7,742 Bytes
d0c79e9 |
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 |
import logging
import uuid
from typing import Optional, AsyncGenerator
from aworld.memory.main import MemoryFactory
from examples.debate.agent.base import DebateSpeech
from examples.debate.agent.debate_agent import DebateAgent
from examples.debate.agent.moderator_agent import ModeratorAgent
from aworld.core.common import Observation
from aworld.core.memory import MemoryItem, MemoryConfig
from aworld.output import Output, WorkSpace, Artifact, ArtifactType, CodeArtifact
class DebateArena:
"""
DebateArena is platform for debate
"""
affirmative_speaker: DebateAgent
negative_speaker: DebateAgent
moderator: Optional[ModeratorAgent]
speeches: list[DebateSpeech]
display_panel: str
def __init__(self,
affirmative_speaker: DebateAgent,
negative_speaker: DebateAgent,
moderator: ModeratorAgent,
workspace: WorkSpace,
**kwargs
):
self.affirmative_speaker = affirmative_speaker
self.negative_speaker = negative_speaker
self.moderator = moderator
self.speeches = []
self.workspace = workspace
self.affirmative_speaker.set_workspace(workspace)
self.negative_speaker.set_workspace(workspace)
self.moderator.set_workspace(workspace)
self.moderator.memory = MemoryFactory.from_config(MemoryConfig(provider="inmemory", enable_summary=False))
# Event.register("topic", func= );
async def async_run(self, topic: str, rounds: int) \
-> AsyncGenerator[Output, None]:
"""
Start the debate
1. debate will start from round 1
2. each round will have two speeches, one from affirmative_speaker and one from negative_speaker
3. after all rounds finished, the debate will end
Args:
topic: str -> topic of the debate
affirmative_opinion: str -> affirmative speaker's opinion
negative_opinion: str -> negative speaker's opinion
rounds: int -> number of rounds
Returns: list[DebateSpeech]
"""
## 1. generate opinions
moderator_speech = await self.moderator_speech(topic, rounds)
if not moderator_speech:
return
yield moderator_speech
await moderator_speech.wait_until_finished()
self.store_speech(moderator_speech)
affirmative_opinion = moderator_speech.metadata["affirmative_opinion"]
negative_opinion = moderator_speech.metadata["negative_opinion"]
logging.info(f"✈️==================================== opinions =============================================")
logging.info(f"topic: {topic}")
logging.info(f"affirmative_opinion: {affirmative_opinion}")
logging.info(f"negative_opinion: {negative_opinion}")
logging.info(f"✈️==================================== start... =============================================")
## 2. Alternating speeches
for i in range(1, rounds + 1):
logging.info(
f"✈️==================================== round#{i} start =============================================")
loading_speech = DebateSpeech.from_dict({
"content": f"\n\n**round#{i} start** \n\n",
"round": i,
"type": "loading",
"stance": "stage",
"name": "stage",
"finished": True
})
yield loading_speech
loading_speech = DebateSpeech.from_dict({
"content": f"\n\n【affirmative】✅:{self.affirmative_speaker.name()}\n Searching ....\n",
"round": i,
"type": "loading",
"stance": "stage",
"name": "stage",
"finished": True
})
yield loading_speech
# affirmative_speech
speech = await self.affirmative_speech(i, topic, affirmative_opinion, negative_opinion)
yield speech
await speech.wait_until_finished()
self.store_speech(speech)
loading_speech = DebateSpeech.from_dict({
"content": f"\n\n【negative】❌:{self.negative_speaker.name()}\n Searching ....\n",
"round": i,
"type": "loading",
"stance": "stage",
"name": "stage",
"finished": True
})
yield loading_speech
# negative_speech
speech = await self.negative_speech(i, topic, negative_opinion, affirmative_opinion)
yield speech
await speech.wait_until_finished()
self.store_speech(speech)
logging.info(
f"🛬==================================== round#{i} end =============================================")
## 3. Summary speeches
moderator_speech = await self.moderator.summary_speech()
if not moderator_speech:
return
yield moderator_speech
await moderator_speech.wait_until_finished()
await self.workspace.add_artifact(
CodeArtifact.build_artifact(
artifact_type=ArtifactType.CODE,
artifact_id="result",
code_type='html',
content=moderator_speech.content,
metadata={
"topic": topic
}
)
)
logging.info(
f"🛬==================================== total is end =============================================")
async def moderator_speech(self, topic, rounds) -> DebateSpeech | None:
results = await self.moderator.async_policy(Observation(content=topic, info={"rounds": rounds}))
if not results or not results[0] or not results[0].policy_info:
return None
return results[0].policy_info
async def affirmative_speech(self, round: int, topic: str, opinion: str, oppose_opinion: str) -> DebateSpeech:
"""
affirmative_speaker will start speech
"""
affirmative_speaker = self.get_affirmative_speaker()
logging.info(affirmative_speaker.name() + ": " + "start")
speech = await affirmative_speaker.speech(topic, opinion, oppose_opinion, round, self.speeches)
logging.info(affirmative_speaker.name() + ": result: " + speech.content)
return speech
async def negative_speech(self, round: int, topic: str, opinion: str, oppose_opinion: str) -> DebateSpeech:
"""
after affirmative_speaker finished speech, negative_speaker will start speech
"""
negative_speaker = self.get_negative_speaker()
logging.info(negative_speaker.name() + ": " + "start")
speech = await negative_speaker.speech(topic, opinion, oppose_opinion, round, self.speeches)
logging.info(negative_speaker.name() + ": result: " + speech.content)
return speech
def get_affirmative_speaker(self) -> DebateAgent:
"""
return the affirmative speaker
"""
return self.affirmative_speaker
def get_negative_speaker(self) -> DebateAgent:
"""
return the negative speaker
"""
return self.negative_speaker
def store_speech(self, speech: DebateSpeech):
self.moderator.memory.add(MemoryItem.from_dict({
"content": speech.content,
"metadata": {
"round": speech.round,
"speaker": speech.name,
"type": speech.type
}
}))
self.speeches.append(speech)
def gen_closing_statement(self):
pass
|