Spaces:
Runtime error
Runtime error
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
@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: | |
# self._save() | |
n_round -= 1 | |
logger.debug(f"{n_round=}") | |
self._check_balance() | |
await self.environment.run() | |
return self.environment.history | |