|
import asyncio |
|
from python.helpers.extension import Extension |
|
from python.helpers.memory import Memory |
|
from agent import LoopData |
|
|
|
DATA_NAME_TASK = "_recall_memories_task" |
|
|
|
class RecallMemories(Extension): |
|
|
|
INTERVAL = 3 |
|
HISTORY = 10000 |
|
RESULTS = 3 |
|
THRESHOLD = 0.6 |
|
|
|
async def execute(self, loop_data: LoopData = LoopData(), **kwargs): |
|
|
|
|
|
if loop_data.iteration % RecallMemories.INTERVAL == 0: |
|
task = asyncio.create_task(self.search_memories(loop_data=loop_data, **kwargs)) |
|
else: |
|
task = None |
|
|
|
|
|
self.agent.set_data(DATA_NAME_TASK, task) |
|
|
|
|
|
async def search_memories(self, loop_data: LoopData, **kwargs): |
|
|
|
|
|
extras = loop_data.extras_persistent |
|
if "memories" in extras: |
|
del extras["memories"] |
|
|
|
|
|
|
|
self.agent.context.log.log( |
|
type="info", content="Searching memories...", temp=True |
|
) |
|
|
|
|
|
log_item = self.agent.context.log.log( |
|
type="util", |
|
heading="Searching memories...", |
|
) |
|
|
|
|
|
|
|
|
|
|
|
msgs_text = self.agent.history.output_text()[-RecallMemories.HISTORY:] |
|
system = self.agent.read_prompt( |
|
"memory.memories_query.sys.md", history=msgs_text |
|
) |
|
|
|
|
|
async def log_callback(content): |
|
log_item.stream(query=content) |
|
|
|
|
|
query = await self.agent.call_utility_model( |
|
system=system, |
|
message=loop_data.user_message.output_text() if loop_data.user_message else "", |
|
callback=log_callback, |
|
) |
|
|
|
|
|
db = await Memory.get(self.agent) |
|
|
|
memories = await db.search_similarity_threshold( |
|
query=query, |
|
limit=RecallMemories.RESULTS, |
|
threshold=RecallMemories.THRESHOLD, |
|
filter=f"area == '{Memory.Area.MAIN.value}' or area == '{Memory.Area.FRAGMENTS.value}'", |
|
) |
|
|
|
|
|
if not isinstance(memories, list) or len(memories) == 0: |
|
log_item.update( |
|
heading="No useful memories found", |
|
) |
|
return |
|
else: |
|
log_item.update( |
|
heading=f"{len(memories)} memories found", |
|
) |
|
|
|
|
|
memories_text = "" |
|
for memory in memories: |
|
memories_text += memory.page_content + "\n\n" |
|
memories_text = memories_text.strip() |
|
|
|
|
|
log_item.update(memories=memories_text) |
|
|
|
|
|
memories_prompt = self.agent.parse_prompt( |
|
"agent.system.memories.md", memories=memories_text |
|
) |
|
|
|
|
|
extras["memories"] = memories_prompt |
|
|
|
|
|
|
|
|
|
|
|
|
|
|