mirror of
https://github.com/FoundationAgents/MetaGPT.git
synced 2026-04-30 03:16:23 +02:00
145 lines
4.7 KiB
Python
145 lines
4.7 KiB
Python
import asyncio
|
|
import platform
|
|
import fire
|
|
|
|
from metagpt.software_company import SoftwareCompany
|
|
from metagpt.actions import Action, BossRequirement
|
|
from metagpt.roles import Role
|
|
from metagpt.schema import Message
|
|
from metagpt.logs import logger
|
|
|
|
class Shout(Action):
|
|
|
|
PROMPT_TEMPLATE = """
|
|
## BACKGROUND
|
|
Suppose you are {name}, you are in a debate with {opponent_name}.
|
|
## DEBATE HISTORY
|
|
Previous rounds:
|
|
{context}
|
|
## YOUR TURN
|
|
Now it's your turn, you should closely respond to your opponent's latest argument, state your position, defend your arguments, and attack your opponent's arguments,
|
|
craft a strong and emotional response in 80 words, in {name}'s rhetoric and viewpoints, your will argue:
|
|
"""
|
|
|
|
def __init__(self, name="Shout", context=None, llm=None):
|
|
super().__init__(name, context, llm)
|
|
|
|
async def run(self, context: str, name: str, opponent_name: str):
|
|
|
|
prompt = self.PROMPT_TEMPLATE.format(context=context, name=name, opponent_name=opponent_name)
|
|
# logger.info(prompt)
|
|
|
|
rsp = await self._aask(prompt)
|
|
|
|
return rsp
|
|
|
|
class Trump(Role):
|
|
def __init__(
|
|
self,
|
|
name: str = "Trump",
|
|
profile: str = "Trump",
|
|
**kwargs,
|
|
):
|
|
super().__init__(name, profile, **kwargs)
|
|
self._init_actions([Shout])
|
|
self._watch([Shout])
|
|
self.name = "Trump"
|
|
self.opponent_name = "Biden"
|
|
|
|
async def _observe(self) -> int:
|
|
await super()._observe()
|
|
self._rc.news = [
|
|
msg for msg in self._rc.news if msg.send_to == self.name
|
|
] # only relevant msgs count as observed news
|
|
return len(self._rc.news)
|
|
|
|
async def _act(self) -> Message:
|
|
logger.info(f"{self._setting}: ready to {self._rc.todo}")
|
|
|
|
msg_history = self._rc.memory.get_by_actions([Shout])
|
|
context = []
|
|
for m in msg_history:
|
|
context.append(str(m))
|
|
context = "\n".join(context)
|
|
|
|
rsp = await Shout().run(context=context, name=self.name, opponent_name=self.opponent_name)
|
|
|
|
msg = Message(
|
|
content=rsp,
|
|
role=self.profile,
|
|
cause_by=Shout,
|
|
sent_from=self.name,
|
|
send_to=self.opponent_name,
|
|
)
|
|
self._publish_message(msg)
|
|
|
|
return msg
|
|
|
|
class Biden(Role):
|
|
def __init__(
|
|
self,
|
|
name: str = "Biden",
|
|
profile: str = "Biden",
|
|
**kwargs,
|
|
):
|
|
super().__init__(name, profile, **kwargs)
|
|
self._init_actions([Shout])
|
|
self._watch([BossRequirement, Shout])
|
|
self.name = "Biden"
|
|
self.opponent_name = "Trump"
|
|
|
|
async def _observe(self) -> int:
|
|
await super()._observe()
|
|
self._rc.news = [
|
|
msg for msg in self._rc.news if msg.send_to == self.name or msg.cause_by == BossRequirement
|
|
] # only relevant msgs count as observed news
|
|
return len(self._rc.news)
|
|
|
|
async def _act(self) -> Message:
|
|
logger.info(f"{self._setting}: ready to {self._rc.todo}")
|
|
|
|
msg_history = self._rc.memory.get_by_actions([BossRequirement, Shout])
|
|
context = []
|
|
for m in msg_history:
|
|
context.append(str(m))
|
|
context = "\n".join(context)
|
|
|
|
rsp = await Shout().run(context=context, name=self.name, opponent_name=self.opponent_name)
|
|
|
|
msg = Message(
|
|
content=rsp,
|
|
role=self.profile,
|
|
cause_by=Shout,
|
|
sent_from=self.name,
|
|
send_to=self.opponent_name,
|
|
)
|
|
self._publish_message(msg)
|
|
|
|
return msg
|
|
|
|
async def startup(idea: str, investment: float = 3.0, n_round: int = 5,
|
|
code_review: bool = False, run_tests: bool = False):
|
|
"""Run a startup of presidents. Watch they quarrel. :) """
|
|
company = SoftwareCompany()
|
|
company.hire([Biden(), Trump()])
|
|
company.invest(investment)
|
|
company.start_project(idea)
|
|
await company.run(n_round=n_round)
|
|
|
|
|
|
def main(idea: str, investment: float = 3.0, n_round: int = 10, code_review: bool = False, run_tests: bool = False):
|
|
"""
|
|
We are a software startup comprised of AI. By investing in us, you are empowering a future filled with limitless possibilities.
|
|
:param idea: Your innovative idea, such as "Creating a snake game."
|
|
:param investment: As an investor, you have the opportunity to contribute a certain dollar amount to this AI company.
|
|
:param n_round:
|
|
:param code_review: Whether to use code review.
|
|
:return:
|
|
"""
|
|
if platform.system() == "Windows":
|
|
asyncio.set_event_loop_policy(asyncio.WindowsSelectorEventLoopPolicy())
|
|
asyncio.run(startup(idea, investment, n_round, code_review, run_tests))
|
|
|
|
|
|
if __name__ == '__main__':
|
|
fire.Fire(main)
|