|
|
|
|
|
|
|
|
""" |
|
|
@Time : 2023/5/12 00:30 |
|
|
@Author : alexanderwu |
|
|
@Modified From : https://github.com/geekan/MetaGPT/blob/main/metagpt/software_company.py |
|
|
""" |
|
|
from pydantic import BaseModel, Field |
|
|
|
|
|
from .roles import Role |
|
|
from .actions import Requirement |
|
|
from .environment import Environment |
|
|
|
|
|
import cfg |
|
|
from .system.logs import logger |
|
|
from .system.schema import Message |
|
|
from .system.utils.common import NoMoneyException |
|
|
|
|
|
|
|
|
class Explorer(BaseModel): |
|
|
environment: Environment = Field(default_factory=Environment) |
|
|
investment: float = Field(default=10.0) |
|
|
|
|
|
class Config: |
|
|
arbitrary_types_allowed = True |
|
|
|
|
|
def hire(self, roles: list[Role]): |
|
|
self.environment.add_roles(roles) |
|
|
|
|
|
def invest(self, investment: float): |
|
|
self.investment = investment |
|
|
cfg.MAX_BUDGET = investment |
|
|
logger.info(f'Investment: ${investment}.') |
|
|
|
|
|
def _check_balance(self): |
|
|
if cfg.TOTAL_COST > cfg.MAX_BUDGET: |
|
|
raise NoMoneyException(cfg.TOTAL_COST, f'Insufficient funds: {cfg.MAX_BUDGET}') |
|
|
|
|
|
async def start_project(self, idea=None, llm_api_key=None, proxy=None, serpapi_key=None, task_id=None, alg_msg_queue=None): |
|
|
self.environment.llm_api_key = llm_api_key |
|
|
self.environment.proxy = proxy |
|
|
self.environment.task_id = task_id |
|
|
self.environment.alg_msg_queue = alg_msg_queue |
|
|
self.environment.serpapi_key = serpapi_key |
|
|
|
|
|
await self.environment.publish_message(Message(role="Question/Task", content=idea, cause_by=Requirement)) |
|
|
|
|
|
def _save(self): |
|
|
logger.info(self.json()) |
|
|
|
|
|
async def run(self, n_round=3): |
|
|
while n_round > 0: |
|
|
|
|
|
n_round -= 1 |
|
|
logger.debug(f"{n_round=}") |
|
|
self._check_balance() |
|
|
await self.environment.run() |
|
|
return self.environment.history |
|
|
|