diff --git a/metagpt/actions/di/detect_intent.py b/metagpt/actions/di/detect_intent.py index 8f56f4ae8..9109c01bb 100644 --- a/metagpt/actions/di/detect_intent.py +++ b/metagpt/actions/di/detect_intent.py @@ -7,6 +7,7 @@ from typing import Tuple from pydantic import BaseModel from metagpt.actions import Action +from metagpt.schema import Message class SOPItemDef(BaseModel): @@ -89,7 +90,8 @@ You should follow the following Standard Operating Procedure: class DetectIntent(Action): - async def run(self, user_requirement: str) -> Tuple[str, str]: + async def run(self, with_message: Message, **kwargs) -> Tuple[str, str]: + user_requirement = with_message.content intentions = "\n".join([f"{si.type_name}: {si.value.description}" for si in SOPItem]) prompt = DETECT_PROMPT.format(user_requirement=user_requirement, intentions=intentions) @@ -111,7 +113,7 @@ async def main(): detect_intent = DetectIntent() for user_requirement in user_requirements: - req_with_sop, sop_type = await detect_intent.run(user_requirement) + req_with_sop, sop_type = await detect_intent.run(Message(role="user", content=user_requirement)) print(req_with_sop) print(f"Detected SOP Type: {sop_type}") diff --git a/metagpt/roles/di/mgx.py b/metagpt/roles/di/mgx.py index b2caa930b..1002a559c 100644 --- a/metagpt/roles/di/mgx.py +++ b/metagpt/roles/di/mgx.py @@ -2,7 +2,7 @@ # @Author : stellahong (stellahong@fuzhi.ai) # @Desc : import asyncio -from typing import Dict, List +from typing import Dict from metagpt.actions.di.detect_intent import DetectIntent from metagpt.logs import logger @@ -14,9 +14,9 @@ class MGX(DataInterpreter): use_intent: bool = True intents: Dict = {} - async def _detect_intent(self, user_msgs: List[Message] = None, **kwargs): + async def _detect_intent(self, user_msg: Message): todo = DetectIntent(context=self.context) - request_with_sop, sop_type = await todo.run(user_msgs) + request_with_sop, sop_type = await todo.run(user_msg) logger.info(f"{sop_type} {request_with_sop}") return request_with_sop @@ -27,7 +27,7 @@ class MGX(DataInterpreter): goal = self.rc.memory.get()[-1].content # retreive latest user requirement if self.use_intent: # add mode user_message = Message(content=goal, role="user") - goal = await self._detect_intent(user_msgs=[user_message]) + goal = await self._detect_intent(user_message) logger.info(f"Goal is {goal}") await self.planner.update_plan(goal=goal) diff --git a/tests/metagpt/actions/di/test_detect_intent.py b/tests/metagpt/actions/di/test_detect_intent.py index 7c9cf9eba..e555680ef 100644 --- a/tests/metagpt/actions/di/test_detect_intent.py +++ b/tests/metagpt/actions/di/test_detect_intent.py @@ -1,6 +1,7 @@ import pytest from metagpt.actions.di.detect_intent import DetectIntent +from metagpt.schema import Message SOFTWARE_DEV_REQ1 = """ I'd like to create a personalized website that features the 'Game of Life' simulation. @@ -51,5 +52,5 @@ git clone 'https://github.com/spec-first/connexion' and format to MetaGPT projec ) async def test_detect_intent(requirement, expected_intent_type): di = DetectIntent() - _, intent_type = await di.run(requirement) + _, intent_type = await di.run(Message(role="user", content=requirement)) assert intent_type == expected_intent_type