Spaces:
Running
Running
#!/usr/bin/env python | |
# -*- coding: utf-8 -*- | |
""" | |
@Time : 2023/5/11 14:43 | |
@Author : alexanderwu | |
@From : https://github.com/geekan/MetaGPT/blob/main/metagpt/actions/write_prd.py | |
""" | |
from typing import List, Tuple | |
from autoagents.actions import Action, ActionOutput | |
from autoagents.actions.action_bank.search_and_summarize import SearchAndSummarize | |
from autoagents.system.logs import logger | |
PROMPT_TEMPLATE = """ | |
# Context | |
## Original Requirements | |
{requirements} | |
## Search Information | |
{search_information} | |
## mermaid quadrantChart code syntax example. DONT USE QUOTO IN CODE DUE TO INVALID SYNTAX. Replace the <Campain X> with REAL COMPETITOR NAME | |
```mermaid | |
quadrantChart | |
title Reach and engagement of campaigns | |
x-axis Low Reach --> High Reach | |
y-axis Low Engagement --> High Engagement | |
quadrant-1 We should expand | |
quadrant-2 Need to promote | |
quadrant-3 Re-evaluate | |
quadrant-4 May be improved | |
"Campaign: A": [0.3, 0.6] | |
"Campaign B": [0.45, 0.23] | |
"Campaign C": [0.57, 0.69] | |
"Campaign D": [0.78, 0.34] | |
"Campaign E": [0.40, 0.34] | |
"Campaign F": [0.35, 0.78] | |
"Our Target Product": [0.5, 0.6] | |
``` | |
## Format example | |
{format_example} | |
----- | |
Role: You are a professional product manager; the goal is to design a concise, usable, efficient product | |
Requirements: According to the context, fill in the following missing information, note that each sections are returned in Python code triple quote form seperatedly. If the requirements are unclear, ensure minimum viability and avoid excessive design | |
ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. AND '## <SECTION_NAME>' SHOULD WRITE BEFORE the code and triple quote. Output carefully referenced "Format example" in format. | |
## Original Requirements: Provide as Plain text, place the polished complete original requirements here | |
## Product Goals: Provided as Python list[str], up to 3 clear, orthogonal product goals. If the requirement itself is simple, the goal should also be simple | |
## User Stories: Provided as Python list[str], up to 5 scenario-based user stories, If the requirement itself is simple, the user stories should also be less | |
## Competitive Analysis: Provided as Python list[str], up to 7 competitive product analyses, consider as similar competitors as possible | |
## Competitive Quadrant Chart: Use mermaid quadrantChart code syntax. up to 14 competitive products. Translation: Distribute these competitor scores evenly between 0 and 1, trying to conform to a normal distribution centered around 0.5 as much as possible. | |
## Requirement Analysis: Provide as Plain text. Be simple. LESS IS MORE. Make your requirements less dumb. Delete the parts unnessasery. | |
## Requirement Pool: Provided as Python list[str, str], the parameters are requirement description, priority(P0/P1/P2), respectively, comply with PEP standards; no more than 5 requirements and consider to make its difficulty lower | |
## UI Design draft: Provide as Plain text. Be simple. Describe the elements and functions, also provide a simple style description and layout description. | |
## Anything UNCLEAR: Provide as Plain text. Make clear here. | |
""" | |
FORMAT_EXAMPLE = """ | |
--- | |
## Original Requirements | |
The boss ... | |
## Product Goals | |
```python | |
[ | |
"Create a ...", | |
] | |
``` | |
## User Stories | |
```python | |
[ | |
"As a user, ...", | |
] | |
``` | |
## Competitive Analysis | |
```python | |
[ | |
"Python Snake Game: ...", | |
] | |
``` | |
## Competitive Quadrant Chart | |
```mermaid | |
quadrantChart | |
title Reach and engagement of campaigns | |
... | |
"Our Target Product": [0.6, 0.7] | |
``` | |
## Requirement Analysis | |
The product should be a ... | |
## Requirement Pool | |
```python | |
[ | |
("End game ...", "P0") | |
] | |
``` | |
## UI Design draft | |
Give a basic function description, and a draft | |
## Anything UNCLEAR | |
There are no unclear points. | |
--- | |
""" | |
OUTPUT_MAPPING = { | |
"Original Requirements": (str, ...), | |
"Product Goals": (List[str], ...), | |
"User Stories": (List[str], ...), | |
"Competitive Analysis": (List[str], ...), | |
"Competitive Quadrant Chart": (str, ...), | |
"Requirement Analysis": (str, ...), | |
"Requirement Pool": (List[Tuple[str, str]], ...), | |
"UI Design draft":(str, ...), | |
"Anything UNCLEAR": (str, ...), | |
} | |
class WritePRD(Action): | |
def __init__(self, name="", context=None, llm=None): | |
super().__init__(name, context, llm) | |
async def run(self, requirements, *args, **kwargs) -> ActionOutput: | |
sas = SearchAndSummarize(llm=self.llm) | |
# rsp = await sas.run(context=requirements, system_text=SEARCH_AND_SUMMARIZE_SYSTEM_EN_US) | |
rsp = "" | |
info = f"### Search Results\n{sas.result}\n\n### Search Summary\n{rsp}" | |
if sas.result: | |
logger.info(sas.result) | |
logger.info(rsp) | |
prompt = PROMPT_TEMPLATE.format(requirements=requirements, search_information=info, | |
format_example=FORMAT_EXAMPLE) | |
logger.debug(prompt) | |
prd = await self._aask_v1(prompt, "prd", OUTPUT_MAPPING) | |
return prd |