diff --git a/examples/search_kb.py b/examples/search_kb.py index 7a9911ca22..5d61bbe02b 100644 --- a/examples/search_kb.py +++ b/examples/search_kb.py @@ -31,8 +31,8 @@ async def search(): role = Sales(profile="Sales", store=store) role._watch({Action}) queries = [ - Message("Which facial cleanser is good for oily skin?", cause_by=Action), - Message("Is L'Oreal good to use?", cause_by=Action), + Message(content="Which facial cleanser is good for oily skin?", cause_by=Action), + Message(content="Is L'Oreal good to use?", cause_by=Action), ] for query in queries: logger.info(f"User: {query}") diff --git a/metagpt/roles/researcher.py b/metagpt/roles/researcher.py index e894d1a572..162d72b9b1 100644 --- a/metagpt/roles/researcher.py +++ b/metagpt/roles/researcher.py @@ -54,18 +54,27 @@ async def _act(self) -> Message: research_system_text = self.research_system_text(topic, todo) if isinstance(todo, CollectLinks): links = await todo.run(topic, 4, 4) - ret = Message("", Report(topic=topic, links=links), role=self.profile, cause_by=todo) + ret = Message( + content="", instruct_content=Report(topic=topic, links=links), role=self.profile, cause_by=todo + ) elif isinstance(todo, WebBrowseAndSummarize): links = instruct_content.links todos = (todo.run(*url, query=query, system_text=research_system_text) for (query, url) in links.items()) summaries = await asyncio.gather(*todos) summaries = list((url, summary) for i in summaries for (url, summary) in i.items() if summary) - ret = Message("", Report(topic=topic, summaries=summaries), role=self.profile, cause_by=todo) + ret = Message( + content="", instruct_content=Report(topic=topic, summaries=summaries), role=self.profile, cause_by=todo + ) else: summaries = instruct_content.summaries summary_text = "\n---\n".join(f"url: {url}\nsummary: {summary}" for (url, summary) in summaries) content = await self._rc.todo.run(topic, summary_text, system_text=research_system_text) - ret = Message("", Report(topic=topic, content=content), role=self.profile, cause_by=self._rc.todo) + ret = Message( + content="", + instruct_content=Report(topic=topic, content=content), + role=self.profile, + cause_by=self._rc.todo, + ) self._rc.memory.add(ret) return ret diff --git a/metagpt/schema.py b/metagpt/schema.py index 4a9df7fe24..d3c836d8e1 100644 --- a/metagpt/schema.py +++ b/metagpt/schema.py @@ -110,7 +110,7 @@ class Message(BaseModel): sent_from: str = "" send_to: Set = Field(default_factory={MESSAGE_ROUTE_TO_ALL}) - def __init__(self, **kwargs): + def __init__(self, content: str = "", **kwargs): ic = kwargs.get("instruct_content", None) if ic and not isinstance(ic, BaseModel) and "class" in ic: # compatible with custom-defined ActionOutput @@ -122,6 +122,7 @@ def __init__(self, **kwargs): kwargs["instruct_content"] = ic_new kwargs["id"] = kwargs.get("id", uuid.uuid4().hex) + kwargs["content"] = kwargs.get("content", content) kwargs["cause_by"] = any_to_str( kwargs.get("cause_by", import_class("UserRequirement", "metagpt.actions.add_requirement")) ) diff --git a/metagpt/subscription.py b/metagpt/subscription.py index 0d2b308216..607cbdb8de 100644 --- a/metagpt/subscription.py +++ b/metagpt/subscription.py @@ -19,7 +19,7 @@ class SubscriptionRunner(BaseModel): >>> async def trigger(): ... while True: - ... yield Message("the latest news about OpenAI") + ... yield Message(content="the latest news about OpenAI") ... await asyncio.sleep(3600 * 24) >>> async def callback(msg: Message): diff --git a/tests/metagpt/test_message.py b/tests/metagpt/test_message.py index 04d85d9e40..8f267ba54b 100644 --- a/tests/metagpt/test_message.py +++ b/tests/metagpt/test_message.py @@ -23,7 +23,7 @@ def test_all_messages(): UserMessage(test_content), SystemMessage(test_content), AIMessage(test_content), - Message(test_content, role="QA"), + Message(content=test_content, role="QA"), ] for msg in msgs: assert msg.content == test_content diff --git a/tests/metagpt/test_subscription.py b/tests/metagpt/test_subscription.py index 2e898424dd..75e06411cb 100644 --- a/tests/metagpt/test_subscription.py +++ b/tests/metagpt/test_subscription.py @@ -13,12 +13,12 @@ async def test_subscription_run(): async def trigger(): while True: - yield Message("the latest news about OpenAI") + yield Message(content="the latest news about OpenAI") await asyncio.sleep(3600 * 24) class MockRole(Role): async def run(self, message=None): - return Message("") + return Message(content="") async def callback(message): nonlocal callback_done @@ -61,11 +61,11 @@ async def callback(message): async def test_subscription_run_error(loguru_caplog): async def trigger1(): while True: - yield Message("the latest news about OpenAI") + yield Message(content="the latest news about OpenAI") await asyncio.sleep(3600 * 24) async def trigger2(): - yield Message("the latest news about OpenAI") + yield Message(content="the latest news about OpenAI") class MockRole1(Role): async def run(self, message=None): @@ -73,7 +73,7 @@ async def run(self, message=None): class MockRole2(Role): async def run(self, message=None): - return Message("") + return Message(content="") async def callback(msg: Message): print(msg) diff --git a/tests/metagpt/utils/test_common.py b/tests/metagpt/utils/test_common.py index 4bd38db63c..0ab34437d7 100644 --- a/tests/metagpt/utils/test_common.py +++ b/tests/metagpt/utils/test_common.py @@ -47,7 +47,7 @@ class Input(BaseModel): Input(x=RunCode, want="metagpt.actions.run_code.RunCode"), Input(x=RunCode(), want="metagpt.actions.run_code.RunCode"), Input(x=Message, want="metagpt.schema.Message"), - Input(x=Message(""), want="metagpt.schema.Message"), + Input(x=Message(content=""), want="metagpt.schema.Message"), Input(x="A", want="A"), ] for i in inputs: