From 2637bb91986a7fb4139ada1e976fa5dfa1cc2475 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Sat, 3 Aug 2024 13:24:20 +0800 Subject: [PATCH 1/2] fixbug: #1422 --- metagpt/roles/role.py | 3 ++- tests/metagpt/serialize_deserialize/test_environment.py | 9 ++++++++- .../metagpt/serialize_deserialize/test_serdeser_base.py | 6 +++--- 3 files changed, 13 insertions(+), 5 deletions(-) diff --git a/metagpt/roles/role.py b/metagpt/roles/role.py index e0f8a7ea6..7fbf98e73 100644 --- a/metagpt/roles/role.py +++ b/metagpt/roles/role.py @@ -170,7 +170,8 @@ class Role(SerializationMixin, ContextMixin, BaseModel): self._check_actions() self.llm.system_prompt = self._get_prefix() self.llm.cost_manager = self.context.cost_manager - self._watch(kwargs.pop("watch", [UserRequirement])) + if not self.rc.watch: + self._watch(kwargs.pop("watch", [UserRequirement])) if self.latest_observed_msg: self.recovered = True diff --git a/tests/metagpt/serialize_deserialize/test_environment.py b/tests/metagpt/serialize_deserialize/test_environment.py index 4e6ea93b5..3138346d6 100644 --- a/tests/metagpt/serialize_deserialize/test_environment.py +++ b/tests/metagpt/serialize_deserialize/test_environment.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # @Desc : - +import pytest from metagpt.actions.action_node import ActionNode from metagpt.actions.add_requirement import UserRequirement @@ -55,6 +55,7 @@ def test_environment_serdeser(context): assert isinstance(list(environment.roles.values())[0].actions[0], ActionOK) assert type(list(new_env.roles.values())[0].actions[0]) == ActionOK assert type(list(new_env.roles.values())[0].actions[1]) == ActionRaise + assert list(new_env.roles.values())[0].rc.watch == role_c.rc.watch def test_environment_serdeser_v2(context): @@ -69,6 +70,7 @@ def test_environment_serdeser_v2(context): assert isinstance(role, ProjectManager) assert isinstance(role.actions[0], WriteTasks) assert isinstance(list(new_env.roles.values())[0].actions[0], WriteTasks) + assert list(new_env.roles.values())[0].rc.watch == pm.rc.watch def test_environment_serdeser_save(context): @@ -85,3 +87,8 @@ def test_environment_serdeser_save(context): new_env: Environment = Environment(**env_dict, context=context) assert len(new_env.roles) == 1 assert type(list(new_env.roles.values())[0].actions[0]) == ActionOK + assert list(new_env.roles.values())[0].rc.watch == role_c.rc.watch + + +if __name__ == "__main__": + pytest.main([__file__, "-s"]) diff --git a/tests/metagpt/serialize_deserialize/test_serdeser_base.py b/tests/metagpt/serialize_deserialize/test_serdeser_base.py index 62ab26d72..ccc582f65 100644 --- a/tests/metagpt/serialize_deserialize/test_serdeser_base.py +++ b/tests/metagpt/serialize_deserialize/test_serdeser_base.py @@ -10,7 +10,7 @@ from pydantic import BaseModel, Field from metagpt.actions import Action, ActionOutput from metagpt.actions.action_node import ActionNode -from metagpt.actions.add_requirement import UserRequirement +from metagpt.actions.fix_bug import FixBug from metagpt.roles.role import Role, RoleReactMode serdeser_path = Path(__file__).absolute().parent.joinpath("..", "..", "data", "serdeser_storage") @@ -68,7 +68,7 @@ class RoleA(Role): def __init__(self, **kwargs): super(RoleA, self).__init__(**kwargs) self.set_actions([ActionPass]) - self._watch([UserRequirement]) + self._watch([FixBug]) class RoleB(Role): @@ -93,7 +93,7 @@ class RoleC(Role): def __init__(self, **kwargs): super(RoleC, self).__init__(**kwargs) self.set_actions([ActionOK, ActionRaise]) - self._watch([UserRequirement]) + self._watch([FixBug]) self.rc.react_mode = RoleReactMode.BY_ORDER self.rc.memory.ignore_id = True From 945c24ae157cd116516cd267af3c1541dde03ee9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Wed, 7 Aug 2024 14:53:37 +0800 Subject: [PATCH 2/2] fixbug: unit test --- metagpt/actions/design_api_an.py | 4 ++-- metagpt/utils/make_sk_kernel.py | 4 ++-- tests/metagpt/serialize_deserialize/test_role.py | 4 ++-- tests/metagpt/serialize_deserialize/test_serdeser_base.py | 6 +++--- tests/metagpt/serialize_deserialize/test_sk_agent.py | 4 ++++ .../metagpt/serialize_deserialize/test_write_code_review.py | 4 ++++ 6 files changed, 17 insertions(+), 9 deletions(-) diff --git a/metagpt/actions/design_api_an.py b/metagpt/actions/design_api_an.py index cffb09c76..ca7aea95a 100644 --- a/metagpt/actions/design_api_an.py +++ b/metagpt/actions/design_api_an.py @@ -5,7 +5,7 @@ @Author : alexanderwu @File : design_api_an.py """ -from typing import List,Optional +from typing import List, Optional from metagpt.actions.action_node import ActionNode from metagpt.utils.mermaid import MMC1, MMC2 @@ -45,7 +45,7 @@ REFINED_FILE_LIST = ActionNode( example=["main.py", "game.py", "new_feature.py"], ) -#optional,because low success reproduction of class diagram in non py project. +# optional,because low success reproduction of class diagram in non py project. DATA_STRUCTURES_AND_INTERFACES = ActionNode( key="Data structures and interfaces", expected_type=Optional[str], diff --git a/metagpt/utils/make_sk_kernel.py b/metagpt/utils/make_sk_kernel.py index 283a682d6..67d865b37 100644 --- a/metagpt/utils/make_sk_kernel.py +++ b/metagpt/utils/make_sk_kernel.py @@ -21,12 +21,12 @@ def make_sk_kernel(): if llm := config.get_azure_llm(): kernel.add_chat_service( "chat_completion", - AzureChatCompletion(llm.model, llm.base_url, llm.api_key), + AzureChatCompletion(deployment_name=llm.model, base_url=llm.base_url, api_key=llm.api_key), ) elif llm := config.get_openai_llm(): kernel.add_chat_service( "chat_completion", - OpenAIChatCompletion(llm.model, llm.api_key), + OpenAIChatCompletion(ai_model_id=llm.model, api_key=llm.api_key), ) return kernel diff --git a/tests/metagpt/serialize_deserialize/test_role.py b/tests/metagpt/serialize_deserialize/test_role.py index aaf7c1935..807849751 100644 --- a/tests/metagpt/serialize_deserialize/test_role.py +++ b/tests/metagpt/serialize_deserialize/test_role.py @@ -28,9 +28,9 @@ from tests.metagpt.serialize_deserialize.test_serdeser_base import ( def test_roles(context): role_a = RoleA() - assert len(role_a.rc.watch) == 1 + assert len(role_a.rc.watch) == 2 role_b = RoleB() - assert len(role_a.rc.watch) == 1 + assert len(role_a.rc.watch) == 2 assert len(role_b.rc.watch) == 1 role_d = RoleD(actions=[ActionOK()]) diff --git a/tests/metagpt/serialize_deserialize/test_serdeser_base.py b/tests/metagpt/serialize_deserialize/test_serdeser_base.py index ccc582f65..84058925e 100644 --- a/tests/metagpt/serialize_deserialize/test_serdeser_base.py +++ b/tests/metagpt/serialize_deserialize/test_serdeser_base.py @@ -8,7 +8,7 @@ from typing import Optional from pydantic import BaseModel, Field -from metagpt.actions import Action, ActionOutput +from metagpt.actions import Action, ActionOutput, UserRequirement from metagpt.actions.action_node import ActionNode from metagpt.actions.fix_bug import FixBug from metagpt.roles.role import Role, RoleReactMode @@ -68,7 +68,7 @@ class RoleA(Role): def __init__(self, **kwargs): super(RoleA, self).__init__(**kwargs) self.set_actions([ActionPass]) - self._watch([FixBug]) + self._watch([FixBug, UserRequirement]) class RoleB(Role): @@ -93,7 +93,7 @@ class RoleC(Role): def __init__(self, **kwargs): super(RoleC, self).__init__(**kwargs) self.set_actions([ActionOK, ActionRaise]) - self._watch([FixBug]) + self._watch([FixBug, UserRequirement]) self.rc.react_mode = RoleReactMode.BY_ORDER self.rc.memory.ignore_id = True diff --git a/tests/metagpt/serialize_deserialize/test_sk_agent.py b/tests/metagpt/serialize_deserialize/test_sk_agent.py index 97c0ade99..a4bf4ec6d 100644 --- a/tests/metagpt/serialize_deserialize/test_sk_agent.py +++ b/tests/metagpt/serialize_deserialize/test_sk_agent.py @@ -15,3 +15,7 @@ async def test_sk_agent_serdeser(): new_role = SkAgent(**ser_role_dict) assert new_role.name == "Sunshine" assert len(new_role.actions) == 1 + + +if __name__ == "__main__": + pytest.main([__file__, "-s"]) diff --git a/tests/metagpt/serialize_deserialize/test_write_code_review.py b/tests/metagpt/serialize_deserialize/test_write_code_review.py index 32a017a97..4ced53ce8 100644 --- a/tests/metagpt/serialize_deserialize/test_write_code_review.py +++ b/tests/metagpt/serialize_deserialize/test_write_code_review.py @@ -29,3 +29,7 @@ def div(a: int, b: int = 0): assert new_action.name == "WriteCodeReview" await new_action.run() + + +if __name__ == "__main__": + pytest.main([__file__, "-s"])