From cc3567a4a1bdb5442b5373d328a296c54ffc642d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8E=98=E6=9D=83=20=E9=A9=AC?= Date: Sat, 30 Mar 2024 17:55:30 +0800 Subject: [PATCH] feat: +software company test pass --- examples/mgx/run_mgx.py | 2 +- metagpt/roles/di/mgx.py | 14 ++++++++++---- metagpt/tools/tool_recommend.py | 2 +- metagpt/utils/common.py | 4 ++-- tests/metagpt/roles/di/test_mgx.py | 2 +- 5 files changed, 15 insertions(+), 9 deletions(-) diff --git a/examples/mgx/run_mgx.py b/examples/mgx/run_mgx.py index 39b496631..db396ea03 100644 --- a/examples/mgx/run_mgx.py +++ b/examples/mgx/run_mgx.py @@ -11,7 +11,7 @@ requirement = ( async def main(requirement: str = ""): - mgx = MGX(ususe_intent=True) + mgx = MGX(use_intent=True) await mgx.run(requirement) diff --git a/metagpt/roles/di/mgx.py b/metagpt/roles/di/mgx.py index 64b06b702..d7618778a 100644 --- a/metagpt/roles/di/mgx.py +++ b/metagpt/roles/di/mgx.py @@ -4,7 +4,7 @@ import asyncio from typing import Dict, List -from metagpt.actions.intent_detect import IntentDetect +from metagpt.actions.intent_detect import LightIntentDetect from metagpt.logs import logger from metagpt.roles.di.data_interpreter import DataInterpreter from metagpt.schema import Message @@ -15,7 +15,7 @@ class MGX(DataInterpreter): intents: Dict = {} async def _intent_detect(self, user_msgs: List[Message] = None, **kwargs): - todo = IntentDetect(context=self.context) + todo = LightIntentDetect(context=self.context) await todo.run(user_msgs) logger.info(f"intent_desp is {todo.result.model_dump_json()}") @@ -27,8 +27,14 @@ class MGX(DataInterpreter): intention_ref = "\n".join(i.intention.refs) self.intents[intention_ref] = i.sop.sop logger.debug(f"refs: {intention_ref}, sop: {i.sop.sop}") - sop_str = "\n".join(i.sop.sop) - return f"{intention_ref}\n---\n{sop_str}" + sop_str = "\n".join([f"- {i}" for i in i.sop.sop]) + markdown = ( + f"### User Requirement Detail\n```text\n{intention_ref}\n````\n" + f"### Knowledge\nTo meet user requirements, the following standard operating procedure(SOP)" + f" must be used:\n" + f"{sop_str}" + ) + return markdown return intention_ref async def _plan_and_act(self) -> Message: diff --git a/metagpt/tools/tool_recommend.py b/metagpt/tools/tool_recommend.py index 69b9a4b5d..c4e324a0b 100644 --- a/metagpt/tools/tool_recommend.py +++ b/metagpt/tools/tool_recommend.py @@ -132,7 +132,7 @@ class ToolRecommender(BaseModel): available_tools=available_tools, topk=topk, ) - rsp = await LLM().aask(prompt) + rsp = await LLM().aask(prompt, stream=False) rsp = CodeParser.parse_code(block=None, text=rsp) ranked_tools = json.loads(rsp) diff --git a/metagpt/utils/common.py b/metagpt/utils/common.py index f7b0cbff5..1340f32cb 100644 --- a/metagpt/utils/common.py +++ b/metagpt/utils/common.py @@ -26,7 +26,7 @@ import sys import traceback from io import BytesIO from pathlib import Path -from typing import Any, Callable, List, Literal, Tuple, Union +from typing import Any, Callable, List, Literal, Optional, Tuple, Union from urllib.parse import quote, unquote import aiofiles @@ -271,7 +271,7 @@ class CodeParser: return block_dict @classmethod - def parse_code(cls, block: str, text: str, lang: str = "") -> str: + def parse_code(cls, block: Optional[str], text: str, lang: str = "") -> str: if block: text = cls.parse_block(block, text) pattern = rf"```{lang}.*?\s+(.*?)```" diff --git a/tests/metagpt/roles/di/test_mgx.py b/tests/metagpt/roles/di/test_mgx.py index 59392e8d7..a835be414 100644 --- a/tests/metagpt/roles/di/test_mgx.py +++ b/tests/metagpt/roles/di/test_mgx.py @@ -14,7 +14,7 @@ from tests.metagpt.actions.test_intent_detect import DEMO_CONTENT @pytest.mark.parametrize("user_messages", [[Message.model_validate(i) for i in DEMO_CONTENT if i["role"] == "user"]]) async def test_mgx(user_messages: List[Message]): ctx = Context() - mgx = MGX(context=ctx) + mgx = MGX(context=ctx, tools=[""]) for i in user_messages: await mgx.run(i)