mirror of
https://github.com/agentscope-ai/ReMe.git
synced 2026-09-14 23:21:04 +00:00
52 lines
1.8 KiB
Python
52 lines
1.8 KiB
Python
"""Retrieve most recent memories from vector store"""
|
|
|
|
from loguru import logger
|
|
|
|
from .base_memory_tool import BaseMemoryTool
|
|
from .memory_handler import MemoryHandler
|
|
from ...core.schema import ToolCall, MemoryNode
|
|
from ...core.utils import deduplicate_memories
|
|
|
|
|
|
class RetrieveRecentMemory(BaseMemoryTool):
|
|
"""Tool to retrieve most recent memories sorted by time"""
|
|
|
|
def __init__(self, top_k: int = 20, **kwargs):
|
|
kwargs["enable_multiple"] = False
|
|
super().__init__(**kwargs)
|
|
self.top_k: int = top_k
|
|
|
|
def _build_tool_call(self) -> ToolCall:
|
|
return ToolCall(
|
|
**{
|
|
"description": "retrieve the most recent memories sorted by message time (newest first).",
|
|
"parameters": {
|
|
"type": "object",
|
|
"properties": {},
|
|
"required": [],
|
|
},
|
|
},
|
|
)
|
|
|
|
async def execute(self):
|
|
handler = MemoryHandler(self.memory_target, self.service_context)
|
|
|
|
memory_nodes: list[MemoryNode] = await handler.list(
|
|
limit=self.top_k,
|
|
sort_key="message_time",
|
|
reverse=True,
|
|
)
|
|
memory_nodes = deduplicate_memories(memory_nodes)
|
|
|
|
retrieved_ids = {n.memory_id for n in self.retrieved_nodes if n.memory_id}
|
|
new_nodes = [n for n in memory_nodes if n.memory_id not in retrieved_ids]
|
|
self.retrieved_nodes.extend(new_nodes)
|
|
self.memory_nodes.extend(new_nodes)
|
|
|
|
if not new_nodes:
|
|
output = "No new memories found."
|
|
else:
|
|
output = "\n".join([n.format(ref_memory_id_key="history_id") for n in new_nodes])
|
|
|
|
logger.info(f"Retrieved {len(memory_nodes)} memories, {len(new_nodes)} new after deduplication")
|
|
return output
|