Transfer Action usage to ActionNode for subsequent structured reasoning opportunities

- Modifided actions: project_management / design_api / write_prd
This commit is contained in:
geekan 2023-12-14 15:58:05 +08:00
parent 5d7c228539
commit c0bcf57caf
15 changed files with 438 additions and 820 deletions

View file

@ -26,8 +26,8 @@ class Architect(Role):
self,
name: str = "Bob",
profile: str = "Architect",
goal: str = "Design a concise, usable, complete python system",
constraints: str = "Try to specify good open source tools as much as possible",
goal: str = "design a concise, usable, complete software system",
constraints: str = "make sure the architecture is simple enough and use appropriate open source libraries"
) -> None:
"""Initializes the Architect with given attributes."""
super().__init__(name, profile, goal, constraints)

View file

@ -71,14 +71,15 @@ class Engineer(Role):
self,
name: str = "Alex",
profile: str = "Engineer",
goal: str = "Write elegant, readable, extensible, efficient code",
constraints: str = "The code should conform to standards like PEP8 and be modular and maintainable",
goal: str = "write elegant, readable, extensible, efficient code",
constraints: str = "the code should conform to standards like PEP8 and be modular and maintainable",
n_borg: int = 1,
use_code_review: bool = False,
) -> None:
"""Initializes the Engineer role with given attributes."""
super().__init__(name, profile, goal, constraints)
self.use_code_review = use_code_review
self._init_actions([WriteCode])
self._watch([WriteTasks, SummarizeCode, WriteCode, WriteCodeReview, FixBug])
self.code_todos = []
self.summarize_todos = []
@ -198,11 +199,11 @@ class Engineer(Role):
return None
msg = self._rc.news[0]
if msg.cause_by in write_code_filters:
logger.info(f"TODO WriteCode:{msg.json()}")
logger.debug(f"TODO WriteCode:{msg.json()}")
await self._new_code_actions(bug_fix=msg.cause_by == any_to_str(FixBug))
return self._rc.todo
if msg.cause_by in summarize_code_filters and msg.sent_from == any_to_str(self):
logger.info(f"TODO SummarizeCode:{msg.json()}")
logger.debug(f"TODO SummarizeCode:{msg.json()}")
await self._new_summarize_actions()
return self._rc.todo
return None

View file

@ -25,7 +25,8 @@ class ProjectManager(Role):
self,
name: str = "Eve",
profile: str = "Project Manager",
goal: str = "Improve team efficiency and deliver with quality and quantity",
goal: str = "break down tasks according to PRD/technical design, generate a task list, and analyze task "
"dependencies to start with the prerequisite modules",
constraints: str = "",
) -> None:
"""

View file

@ -26,6 +26,7 @@ from typing import Iterable, Set, Type
from pydantic import BaseModel, Field
from metagpt.actions import Action, ActionOutput
from metagpt.actions.action_node import ActionNode
from metagpt.config import CONFIG
from metagpt.llm import LLM, HumanProvider
from metagpt.logs import logger
@ -156,7 +157,7 @@ class Role:
f"as Role's {str(action)} was initialized using LLM, try passing in Action classes instead of initialized instances"
)
i = action
i.set_env(self._rc.env)
# i.set_env(self._rc.env)
i.set_prefix(self._get_prefix(), self.profile)
self._actions.append(i)
self._states.append(f"{idx}. {action}")
@ -278,7 +279,7 @@ class Role:
async def _act(self) -> Message:
logger.info(f"{self._setting}: ready to {self._rc.todo}")
response = await self._rc.todo.run(self._rc.important_memory)
if isinstance(response, ActionOutput):
if isinstance(response, ActionOutput) or isinstance(response, ActionNode):
msg = Message(
content=response.content,
instruct_content=response.instruct_content,

View file

@ -8,6 +8,7 @@
the `cause_by` value in the `Message` to a string to support the new message distribution feature.
"""
from metagpt.actions import ActionOutput, SearchAndSummarize
from metagpt.actions.action_node import ActionNode
from metagpt.logs import logger
from metagpt.roles import Role
from metagpt.schema import Message
@ -58,7 +59,7 @@ class Searcher(Role):
logger.info(f"{self._setting}: ready to {self._rc.todo}")
response = await self._rc.todo.run(self._rc.memory.get(k=0))
if isinstance(response, ActionOutput):
if isinstance(response, ActionOutput) or isinstance(response, ActionNode):
msg = Message(
content=response.content,
instruct_content=response.instruct_content,