From e52957026be06c276251276196ffd8748e3a6efc Mon Sep 17 00:00:00 2001 From: better629 Date: Fri, 29 Dec 2023 04:27:44 +0800 Subject: [PATCH] update ser&deser unittest --- metagpt/actions/debug_error.py | 2 +- metagpt/actions/design_api.py | 2 +- metagpt/actions/design_api_review.py | 2 +- metagpt/actions/execute_task.py | 2 +- metagpt/actions/invoice_ocr.py | 2 +- metagpt/actions/prepare_documents.py | 2 +- metagpt/actions/project_management.py | 2 +- metagpt/actions/research.py | 2 +- metagpt/actions/run_code.py | 2 +- metagpt/actions/search_and_summarize.py | 2 +- metagpt/actions/summarize_code.py | 2 +- metagpt/actions/write_code.py | 2 +- metagpt/actions/write_code_review.py | 2 +- metagpt/actions/write_docstring.py | 2 +- metagpt/actions/write_prd.py | 2 +- metagpt/actions/write_prd_review.py | 2 +- metagpt/actions/write_review.py | 2 +- metagpt/actions/write_teaching_plan.py | 2 +- metagpt/actions/write_test.py | 2 +- metagpt/actions/write_tutorial.py | 2 +- metagpt/schema.py | 2 +- tests/metagpt/serialize_deserialize/test_action.py | 2 +- tests/metagpt/serialize_deserialize/test_environment.py | 3 ++- tests/metagpt/serialize_deserialize/test_write_code.py | 2 -- .../metagpt/serialize_deserialize/test_write_code_review.py | 2 -- tests/metagpt/serialize_deserialize/test_write_design.py | 3 --- tests/metagpt/serialize_deserialize/test_write_prd.py | 2 -- tests/metagpt/utils/test_serialize.py | 6 +++--- 28 files changed, 27 insertions(+), 35 deletions(-) diff --git a/metagpt/actions/debug_error.py b/metagpt/actions/debug_error.py index 1a7c3a7c8..710dff344 100644 --- a/metagpt/actions/debug_error.py +++ b/metagpt/actions/debug_error.py @@ -52,7 +52,7 @@ Now you should start rewriting the code: class DebugError(Action): name: str = "DebugError" context: RunCodeContext = Field(default_factory=RunCodeContext) - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) async def run(self, *args, **kwargs) -> str: output_doc = await FileRepository.get_file( diff --git a/metagpt/actions/design_api.py b/metagpt/actions/design_api.py index 32e2a2a19..e8cf139e8 100644 --- a/metagpt/actions/design_api.py +++ b/metagpt/actions/design_api.py @@ -44,7 +44,7 @@ NEW_REQ_TEMPLATE = """ class WriteDesign(Action): name: str = "" context: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) desc: str = ( "Based on the PRD, think about the system design, and design the corresponding APIs, " "data structures, library tables, processes, and paths. Please provide your design, feedback " diff --git a/metagpt/actions/design_api_review.py b/metagpt/actions/design_api_review.py index 6ea76e2fc..a9ae15ad8 100644 --- a/metagpt/actions/design_api_review.py +++ b/metagpt/actions/design_api_review.py @@ -18,7 +18,7 @@ from metagpt.provider.base_llm import BaseLLM class DesignReview(Action): name: str = "DesignReview" context: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) async def run(self, prd, api_design): prompt = ( diff --git a/metagpt/actions/execute_task.py b/metagpt/actions/execute_task.py index 8577ee275..2c35b541d 100644 --- a/metagpt/actions/execute_task.py +++ b/metagpt/actions/execute_task.py @@ -17,7 +17,7 @@ from metagpt.schema import Message class ExecuteTask(Action): name: str = "ExecuteTask" context: list[Message] = [] - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) async def run(self, *args, **kwargs): pass diff --git a/metagpt/actions/invoice_ocr.py b/metagpt/actions/invoice_ocr.py index 94288d5be..b9eb2c396 100644 --- a/metagpt/actions/invoice_ocr.py +++ b/metagpt/actions/invoice_ocr.py @@ -42,7 +42,7 @@ class InvoiceOCR(Action): name: str = "InvoiceOCR" context: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) @staticmethod async def _check_file_type(file_path: Path) -> str: diff --git a/metagpt/actions/prepare_documents.py b/metagpt/actions/prepare_documents.py index 97d3828bf..5ca6877d4 100644 --- a/metagpt/actions/prepare_documents.py +++ b/metagpt/actions/prepare_documents.py @@ -28,7 +28,7 @@ class PrepareDocuments(Action): name: str = "PrepareDocuments" context: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) def _init_repo(self): """Initialize the Git environment.""" diff --git a/metagpt/actions/project_management.py b/metagpt/actions/project_management.py index a53f13e4c..9c2ec8cda 100644 --- a/metagpt/actions/project_management.py +++ b/metagpt/actions/project_management.py @@ -43,7 +43,7 @@ NEW_REQ_TEMPLATE = """ class WriteTasks(Action): name: str = "CreateTasks" context: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) async def run(self, with_messages, schema=CONFIG.prompt_schema): system_design_file_repo = CONFIG.git_repo.new_file_repository(SYSTEM_DESIGN_FILE_REPO) diff --git a/metagpt/actions/research.py b/metagpt/actions/research.py index a1535a723..41571f776 100644 --- a/metagpt/actions/research.py +++ b/metagpt/actions/research.py @@ -82,7 +82,7 @@ class CollectLinks(Action): name: str = "CollectLinks" context: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) desc: str = "Collect links from a search engine." search_engine: SearchEngine = Field(default_factory=SearchEngine) diff --git a/metagpt/actions/run_code.py b/metagpt/actions/run_code.py index 22d345b85..5b9e26fa9 100644 --- a/metagpt/actions/run_code.py +++ b/metagpt/actions/run_code.py @@ -79,7 +79,7 @@ standard errors: class RunCode(Action): name: str = "RunCode" context: RunCodeContext = Field(default_factory=RunCodeContext) - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) @classmethod @handle_exception diff --git a/metagpt/actions/search_and_summarize.py b/metagpt/actions/search_and_summarize.py index cd3ef7d77..e8276a79e 100644 --- a/metagpt/actions/search_and_summarize.py +++ b/metagpt/actions/search_and_summarize.py @@ -109,7 +109,7 @@ You are a member of a professional butler team and will provide helpful suggesti class SearchAndSummarize(Action): name: str = "" content: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) config: None = Field(default_factory=Config) engine: Optional[SearchEngineType] = CONFIG.search_engine search_func: Optional[Any] = None diff --git a/metagpt/actions/summarize_code.py b/metagpt/actions/summarize_code.py index 4025e0964..5db7a7b0a 100644 --- a/metagpt/actions/summarize_code.py +++ b/metagpt/actions/summarize_code.py @@ -95,7 +95,7 @@ flowchart TB class SummarizeCode(Action): name: str = "SummarizeCode" context: CodeSummarizeContext = Field(default_factory=CodeSummarizeContext) - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) @retry(stop=stop_after_attempt(2), wait=wait_random_exponential(min=1, max=60)) async def summarize_code(self, prompt): diff --git a/metagpt/actions/write_code.py b/metagpt/actions/write_code.py index e3086f03c..3e29a9494 100644 --- a/metagpt/actions/write_code.py +++ b/metagpt/actions/write_code.py @@ -90,7 +90,7 @@ ATTENTION: Use '##' to SPLIT SECTIONS, not '#'. Output format carefully referenc class WriteCode(Action): name: str = "WriteCode" context: Document = Field(default_factory=Document) - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) @retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6)) async def write_code(self, prompt) -> str: diff --git a/metagpt/actions/write_code_review.py b/metagpt/actions/write_code_review.py index a8ed0fd01..138bde289 100644 --- a/metagpt/actions/write_code_review.py +++ b/metagpt/actions/write_code_review.py @@ -123,7 +123,7 @@ REWRITE_CODE_TEMPLATE = """ class WriteCodeReview(Action): name: str = "WriteCodeReview" context: CodingContext = Field(default_factory=CodingContext) - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) @retry(wait=wait_random_exponential(min=1, max=60), stop=stop_after_attempt(6)) async def write_code_review_and_rewrite(self, context_prompt, cr_prompt, filename): diff --git a/metagpt/actions/write_docstring.py b/metagpt/actions/write_docstring.py index 68856c360..462e2d077 100644 --- a/metagpt/actions/write_docstring.py +++ b/metagpt/actions/write_docstring.py @@ -163,7 +163,7 @@ class WriteDocstring(Action): desc: str = "Write docstring for code." context: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) async def run( self, diff --git a/metagpt/actions/write_prd.py b/metagpt/actions/write_prd.py index 9cefb70d8..17b5573ae 100644 --- a/metagpt/actions/write_prd.py +++ b/metagpt/actions/write_prd.py @@ -68,7 +68,7 @@ NEW_REQ_TEMPLATE = """ class WritePRD(Action): name: str = "" content: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) async def run(self, with_messages, schema=CONFIG.prompt_schema, *args, **kwargs) -> ActionOutput | Message: # Determine which requirement documents need to be rewritten: Use LLM to assess whether new requirements are diff --git a/metagpt/actions/write_prd_review.py b/metagpt/actions/write_prd_review.py index 9199e7536..a332d24c3 100644 --- a/metagpt/actions/write_prd_review.py +++ b/metagpt/actions/write_prd_review.py @@ -18,7 +18,7 @@ from metagpt.provider.base_llm import BaseLLM class WritePRDReview(Action): name: str = "" context: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) prd: Optional[str] = None desc: str = "Based on the PRD, conduct a PRD Review, providing clear and detailed feedback" diff --git a/metagpt/actions/write_review.py b/metagpt/actions/write_review.py index d116556ba..64b8450e9 100644 --- a/metagpt/actions/write_review.py +++ b/metagpt/actions/write_review.py @@ -38,7 +38,7 @@ class WriteReview(Action): """Write a review for the given context.""" name: str = "WriteReview" - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) async def run(self, context): return await WRITE_REVIEW_NODE.fill(context=context, llm=self.llm, schema="json") diff --git a/metagpt/actions/write_teaching_plan.py b/metagpt/actions/write_teaching_plan.py index 888627294..dae553b79 100644 --- a/metagpt/actions/write_teaching_plan.py +++ b/metagpt/actions/write_teaching_plan.py @@ -20,7 +20,7 @@ class WriteTeachingPlanPart(Action): """Write Teaching Plan Part""" context: Optional[str] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) topic: str = "" language: str = "Chinese" rsp: Optional[str] = None diff --git a/metagpt/actions/write_test.py b/metagpt/actions/write_test.py index 321d31420..5bff34017 100644 --- a/metagpt/actions/write_test.py +++ b/metagpt/actions/write_test.py @@ -45,7 +45,7 @@ you should correctly import the necessary classes based on these file locations! class WriteTest(Action): name: str = "WriteTest" context: Optional[TestingContext] = None - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) async def write_code(self, prompt): code_rsp = await self._aask(prompt) diff --git a/metagpt/actions/write_tutorial.py b/metagpt/actions/write_tutorial.py index a2a324b41..67bc85eef 100644 --- a/metagpt/actions/write_tutorial.py +++ b/metagpt/actions/write_tutorial.py @@ -27,7 +27,7 @@ class WriteDirectory(Action): """ name: str = "WriteDirectory" - llm: BaseLLM = Field(default_factory=LLM) + llm: BaseLLM = Field(default_factory=LLM, exclude=True) language: str = "Chinese" async def run(self, topic: str, *args, **kwargs) -> Dict: diff --git a/metagpt/schema.py b/metagpt/schema.py index 41303ea46..5dde0ee46 100644 --- a/metagpt/schema.py +++ b/metagpt/schema.py @@ -174,7 +174,7 @@ class Message(BaseModel): role: str = "user" # system / user / assistant cause_by: str = Field(default="", validate_default=True) sent_from: str = Field(default="", validate_default=True) - send_to: set = Field(default={MESSAGE_ROUTE_TO_ALL}, validate_default=True) + send_to: set[str] = Field(default={MESSAGE_ROUTE_TO_ALL}, validate_default=True) @field_validator("id", mode="before") @classmethod diff --git a/tests/metagpt/serialize_deserialize/test_action.py b/tests/metagpt/serialize_deserialize/test_action.py index b3206696b..677988e2f 100644 --- a/tests/metagpt/serialize_deserialize/test_action.py +++ b/tests/metagpt/serialize_deserialize/test_action.py @@ -28,5 +28,5 @@ async def test_action_deserialize(): new_action = Action(**serialized_data) assert new_action.name == "" - assert new_action.llm == LLM() + assert isinstance(new_action.llm, type(LLM())) assert len(await new_action._aask("who are you")) > 0 diff --git a/tests/metagpt/serialize_deserialize/test_environment.py b/tests/metagpt/serialize_deserialize/test_environment.py index 557c3f4cd..5a68288a6 100644 --- a/tests/metagpt/serialize_deserialize/test_environment.py +++ b/tests/metagpt/serialize_deserialize/test_environment.py @@ -13,6 +13,7 @@ from metagpt.schema import Message from metagpt.utils.common import any_to_str from tests.metagpt.serialize_deserialize.test_serdeser_base import ( ActionOK, + ActionRaise, RoleC, serdeser_path, ) @@ -55,9 +56,9 @@ def test_environment_serdeser(): assert len(new_env.roles) == 1 assert list(new_env.roles.values())[0].states == list(environment.roles.values())[0].states - assert list(new_env.roles.values())[0].actions == list(environment.roles.values())[0].actions 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 def test_environment_serdeser_v2(): diff --git a/tests/metagpt/serialize_deserialize/test_write_code.py b/tests/metagpt/serialize_deserialize/test_write_code.py index 2fb669a6b..cb262bb45 100644 --- a/tests/metagpt/serialize_deserialize/test_write_code.py +++ b/tests/metagpt/serialize_deserialize/test_write_code.py @@ -6,7 +6,6 @@ import pytest from metagpt.actions import WriteCode -from metagpt.llm import LLM from metagpt.schema import CodingContext, Document @@ -28,5 +27,4 @@ async def test_write_code_deserialize(): new_action = WriteCode(**serialized_data) assert new_action.name == "WriteCode" - assert new_action.llm == LLM() await action.run() diff --git a/tests/metagpt/serialize_deserialize/test_write_code_review.py b/tests/metagpt/serialize_deserialize/test_write_code_review.py index e9ad4b858..991b3c13b 100644 --- a/tests/metagpt/serialize_deserialize/test_write_code_review.py +++ b/tests/metagpt/serialize_deserialize/test_write_code_review.py @@ -5,7 +5,6 @@ import pytest from metagpt.actions import WriteCodeReview -from metagpt.llm import LLM from metagpt.schema import CodingContext, Document @@ -28,5 +27,4 @@ def div(a: int, b: int = 0): new_action = WriteCodeReview(**serialized_data) assert new_action.name == "WriteCodeReview" - assert new_action.llm == LLM() await new_action.run() diff --git a/tests/metagpt/serialize_deserialize/test_write_design.py b/tests/metagpt/serialize_deserialize/test_write_design.py index d556c144d..a2fce8047 100644 --- a/tests/metagpt/serialize_deserialize/test_write_design.py +++ b/tests/metagpt/serialize_deserialize/test_write_design.py @@ -5,7 +5,6 @@ import pytest from metagpt.actions import WriteDesign, WriteTasks -from metagpt.llm import LLM def test_write_design_serialize(): @@ -28,7 +27,6 @@ async def test_write_design_deserialize(): serialized_data = action.model_dump() new_action = WriteDesign(**serialized_data) assert new_action.name == "" - assert new_action.llm == LLM() await new_action.run(with_messages="write a cli snake game") @@ -38,5 +36,4 @@ async def test_write_task_deserialize(): serialized_data = action.model_dump() new_action = WriteTasks(**serialized_data) assert new_action.name == "CreateTasks" - assert new_action.llm == LLM() await new_action.run(with_messages="write a cli snake game") diff --git a/tests/metagpt/serialize_deserialize/test_write_prd.py b/tests/metagpt/serialize_deserialize/test_write_prd.py index 79b9a8677..69238545f 100644 --- a/tests/metagpt/serialize_deserialize/test_write_prd.py +++ b/tests/metagpt/serialize_deserialize/test_write_prd.py @@ -6,7 +6,6 @@ import pytest from metagpt.actions import WritePRD -from metagpt.llm import LLM from metagpt.schema import Message @@ -23,6 +22,5 @@ async def test_action_deserialize(): serialized_data = action.model_dump() new_action = WritePRD(**serialized_data) assert new_action.name == "" - assert new_action.llm == LLM() action_output = await new_action.run(with_messages=Message(content="write a cli snake game")) assert len(action_output.content) > 0 diff --git a/tests/metagpt/utils/test_serialize.py b/tests/metagpt/utils/test_serialize.py index f027d53f8..0ba3a8d41 100644 --- a/tests/metagpt/utils/test_serialize.py +++ b/tests/metagpt/utils/test_serialize.py @@ -4,7 +4,7 @@ @Desc : the unittest of serialize """ -from typing import List, Tuple +from typing import List from metagpt.actions import WritePRD from metagpt.actions.action_node import ActionNode @@ -27,7 +27,7 @@ def test_actionoutout_schema_to_mapping(): "properties": {"field": {"title": "field", "type": "array", "items": {"type": "string"}}}, } mapping = actionoutout_schema_to_mapping(schema) - assert mapping["field"] == (List[str], ...) + assert mapping["field"] == (list[str], ...) schema = { "title": "test", @@ -46,7 +46,7 @@ def test_actionoutout_schema_to_mapping(): }, } mapping = actionoutout_schema_to_mapping(schema) - assert mapping["field"] == (List[Tuple[str, str]], ...) + assert mapping["field"] == (list[list[str]], ...) assert True, True