diff --git a/metagpt/memory/memory.py b/metagpt/memory/memory.py index 580361d33..b11b780c3 100644 --- a/metagpt/memory/memory.py +++ b/metagpt/memory/memory.py @@ -81,7 +81,7 @@ class Memory(BaseModel): return self.storage[-k:] def find_news(self, observed: list[Message], k=0) -> list[Message]: - """find news (previously unseen messages) from the the most recent k memories, from all memories when k=0""" + """find news (previously unseen messages) from the most recent k memories, from all memories when k=0""" already_observed = self.get(k) news: list[Message] = [] for i in observed: diff --git a/metagpt/roles/role.py b/metagpt/roles/role.py index 5ecc7ae33..6e2f61f32 100644 --- a/metagpt/roles/role.py +++ b/metagpt/roles/role.py @@ -422,8 +422,8 @@ class Role(SerializationMixin, ContextMixin, BaseModel): """Prepare new messages for processing from the message buffer and other sources.""" # Read unprocessed messages from the msg buffer. news = [] - if self.recovered: - news = [self.latest_observed_msg] if self.latest_observed_msg else [] + if self.recovered and self.latest_observed_msg: + news = self.rc.memory.find_news(observed=[self.latest_observed_msg], k=10) if not news: news = self.rc.msg_buffer.pop_all() # Store the read messages in your own memory to prevent duplicate processing. diff --git a/tests/metagpt/roles/test_role.py b/tests/metagpt/roles/test_role.py index 8b11e2d4a..47d1fc6de 100644 --- a/tests/metagpt/roles/test_role.py +++ b/tests/metagpt/roles/test_role.py @@ -5,6 +5,7 @@ import pytest from metagpt.provider.human_provider import HumanProvider from metagpt.roles.role import Role +from metagpt.schema import Message, UserMessage def test_role_desc(): @@ -18,5 +19,15 @@ def test_role_human(context): assert isinstance(role.llm, HumanProvider) +@pytest.mark.asyncio +async def test_recovered(): + role = Role(profile="Tester", desc="Tester", recovered=True) + role.put_message(UserMessage(content="2")) + role.latest_observed_msg = Message(content="1") + await role._observe() + await role._observe() + assert role.rc.msg_buffer.empty() + + if __name__ == "__main__": pytest.main([__file__, "-s"])