|
|
|
|
|
""" |
|
@Time : 2023/5/12 00:30 |
|
@Author : alexanderwu |
|
@File : software_company.py |
|
""" |
|
from pydantic import BaseModel, Field |
|
|
|
from metagpt.actions import BossRequirement |
|
from metagpt.config import CONFIG |
|
from metagpt.environment import Environment |
|
from metagpt.logs import logger |
|
from metagpt.roles import Role |
|
from metagpt.schema import Message |
|
from metagpt.utils.common import NoMoneyException |
|
|
|
|
|
class SoftwareCompany(BaseModel): |
|
""" |
|
Software Company: Possesses a team, SOP (Standard Operating Procedures), and a platform for instant messaging, |
|
dedicated to writing executable code. |
|
""" |
|
environment: Environment = Field(default_factory=Environment) |
|
investment: float = Field(default=10.0) |
|
idea: str = Field(default="") |
|
|
|
class Config: |
|
arbitrary_types_allowed = True |
|
|
|
def hire(self, roles: list[Role]): |
|
"""Hire roles to cooperate""" |
|
self.environment.add_roles(roles) |
|
|
|
def invest(self, investment: float): |
|
"""Invest company. raise NoMoneyException when exceed max_budget.""" |
|
self.investment = investment |
|
CONFIG.cost_manager.max_budget = investment |
|
logger.info(f'Investment: ${investment}.') |
|
|
|
def _check_balance(self): |
|
if CONFIG.cost_manager.total_cost > CONFIG.cost_manager.max_budget: |
|
raise NoMoneyException(CONFIG.cost_manager.total_cost, |
|
f'Insufficient funds: {CONFIG.cost_manager.max_budget}') |
|
|
|
def start_project(self, idea, role="BOSS", cause_by=BossRequirement, **kwargs): |
|
"""Start a project from publishing boss requirement.""" |
|
self.idea = idea |
|
self.environment.publish_message(Message(content=idea, role=role, cause_by=cause_by)) |
|
|
|
def _save(self): |
|
logger.info(self.json()) |
|
|
|
async def run(self, n_round=3): |
|
"""Run company until target round or no money""" |
|
while n_round > 0: |
|
|
|
n_round -= 1 |
|
logger.debug(f"{n_round=}") |
|
self._check_balance() |
|
await self.environment.run() |
|
return self.environment.history |
|
|