|
import chainlit as cl |
|
from init_setup import ChainlitEnv |
|
|
|
from metagpt.roles import ( |
|
Architect, |
|
Engineer, |
|
ProductManager, |
|
ProjectManager, |
|
QaEngineer, |
|
) |
|
from metagpt.team import Team |
|
|
|
|
|
|
|
@cl.set_chat_profiles |
|
async def chat_profile() -> list[cl.ChatProfile]: |
|
"""Generates a chat profile containing starter messages which can be triggered to run MetaGPT |
|
|
|
Returns: |
|
list[chainlit.ChatProfile]: List of Chat Profile |
|
""" |
|
return [ |
|
cl.ChatProfile( |
|
name="MetaGPT", |
|
icon="/public/MetaGPT-new-log.jpg", |
|
markdown_description="It takes a **one line requirement** as input and outputs **user stories / competitive analysis / requirements / data structures / APIs / documents, etc.**, But `everything in UI`.", |
|
starters=[ |
|
cl.Starter( |
|
label="Create a 2048 Game", |
|
message="Create a 2048 game", |
|
icon="/public/2048.jpg", |
|
), |
|
cl.Starter( |
|
label="Write a cli Blackjack Game", |
|
message="Write a cli Blackjack Game", |
|
icon="/public/blackjack.jpg", |
|
), |
|
], |
|
) |
|
] |
|
|
|
|
|
|
|
@cl.on_message |
|
async def startup(message: cl.Message) -> None: |
|
"""On Message in UI, Create a MetaGPT software company |
|
|
|
Args: |
|
message (chainlit.Message): message by chainlist |
|
""" |
|
idea = message.content |
|
company = Team(env=ChainlitEnv()) |
|
|
|
|
|
company.hire( |
|
[ |
|
ProductManager(), |
|
Architect(), |
|
ProjectManager(), |
|
Engineer(n_borg=5, use_code_review=True), |
|
QaEngineer(), |
|
] |
|
) |
|
|
|
company.invest(investment=3.0) |
|
company.run_project(idea=idea) |
|
|
|
await company.run(n_round=5) |
|
|
|
workdir = company.env.context.git_repo.workdir |
|
files = company.env.context.git_repo.get_files(workdir) |
|
files = "\n".join([f"{workdir}/{file}" for file in files if not file.startswith(".git")]) |
|
|
|
await cl.Message( |
|
content=f""" |
|
Codes can be found here: |
|
{files} |
|
|
|
--- |
|
|
|
Total cost: `{company.cost_manager.total_cost}` |
|
""" |
|
).send() |
|
|