From 21d3cc1f0b1459119fd697ecfbbec1e9ed0e1a06 Mon Sep 17 00:00:00 2001 From: Manthan Gupta Date: Mon, 16 Dec 2024 23:30:52 +0530 Subject: [PATCH 1/3] Fix: deep copy agent memory --- phi/memory/agent.py | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/phi/memory/agent.py b/phi/memory/agent.py index 6bfd6c1851..212d5f7ee8 100644 --- a/phi/memory/agent.py +++ b/phi/memory/agent.py @@ -1,5 +1,6 @@ from enum import Enum from typing import Dict, List, Any, Optional, Tuple +from copy import deepcopy from pydantic import BaseModel, ConfigDict @@ -357,8 +358,22 @@ def clear(self) -> None: self.summary = None self.memories = None - def deep_copy(self, *, update: Optional[Dict[str, Any]] = None) -> "AgentMemory": - new_memory = self.model_copy(deep=True, update=update) - # clear the new memory to remove any references to the old memory - new_memory.clear() - return new_memory + def deep_copy(self): + # Create a shallow copy of the object + copied_obj = self.__class__(**self.model_dump()) + + # Manually deepcopy fields that are known to be safe + for field_name, field_value in self.__dict__.items(): + if field_name not in ['db', 'classifier', 'manager', 'summarizer']: + try: + setattr(copied_obj, field_name, deepcopy(field_value)) + except Exception as e: + logger.warning(f"Failed to deepcopy field: {field_name} - {e}") + setattr(copied_obj, field_name, field_value) + + copied_obj.db = self.db + copied_obj.classifier = self.classifier + copied_obj.manager = self.manager + copied_obj.summarizer = self.summarizer + + return copied_obj From c604b4e670aa1ff25c9552cbe80f30c89d037a23 Mon Sep 17 00:00:00 2001 From: Manthan Gupta Date: Mon, 16 Dec 2024 23:33:44 +0530 Subject: [PATCH 2/3] fix formatting --- cookbook/playground/tryout.py | 22 ++++++++++++++++++++++ phi/memory/agent.py | 6 +++--- 2 files changed, 25 insertions(+), 3 deletions(-) create mode 100644 cookbook/playground/tryout.py diff --git a/cookbook/playground/tryout.py b/cookbook/playground/tryout.py new file mode 100644 index 0000000000..4f5f5650ff --- /dev/null +++ b/cookbook/playground/tryout.py @@ -0,0 +1,22 @@ +from phi.agent.agent import Agent +from phi.memory.agent import AgentMemory +from phi.memory.db.postgres import PgMemoryDb +from phi.model.ollama import Ollama +from phi.playground.playground import Playground +from phi.playground.serve import serve_playground_app + +agent = Agent( + name="Test", + agent_id="test-agent", + model=Ollama(id="llama3.1:8b"), + memory=AgentMemory( + db=PgMemoryDb(table_name="agent_memory", db_url="postgresql+psycopg://ai:ai@localhost:5532/ai"), + create_user_memories=True, + create_session_summary=True, + ), +) + +app = Playground(agents=[agent]).get_app() + +if __name__ == "__main__": + serve_playground_app("tryout:app", reload=True) diff --git a/phi/memory/agent.py b/phi/memory/agent.py index 212d5f7ee8..5f3a7dea19 100644 --- a/phi/memory/agent.py +++ b/phi/memory/agent.py @@ -361,16 +361,16 @@ def clear(self) -> None: def deep_copy(self): # Create a shallow copy of the object copied_obj = self.__class__(**self.model_dump()) - + # Manually deepcopy fields that are known to be safe for field_name, field_value in self.__dict__.items(): - if field_name not in ['db', 'classifier', 'manager', 'summarizer']: + if field_name not in ["db", "classifier", "manager", "summarizer"]: try: setattr(copied_obj, field_name, deepcopy(field_value)) except Exception as e: logger.warning(f"Failed to deepcopy field: {field_name} - {e}") setattr(copied_obj, field_name, field_value) - + copied_obj.db = self.db copied_obj.classifier = self.classifier copied_obj.manager = self.manager From f7ec821fe38d5a04336110c70a170e403260063c Mon Sep 17 00:00:00 2001 From: Manthan Gupta Date: Mon, 16 Dec 2024 23:34:06 +0530 Subject: [PATCH 3/3] update --- cookbook/playground/tryout.py | 22 ---------------------- 1 file changed, 22 deletions(-) delete mode 100644 cookbook/playground/tryout.py diff --git a/cookbook/playground/tryout.py b/cookbook/playground/tryout.py deleted file mode 100644 index 4f5f5650ff..0000000000 --- a/cookbook/playground/tryout.py +++ /dev/null @@ -1,22 +0,0 @@ -from phi.agent.agent import Agent -from phi.memory.agent import AgentMemory -from phi.memory.db.postgres import PgMemoryDb -from phi.model.ollama import Ollama -from phi.playground.playground import Playground -from phi.playground.serve import serve_playground_app - -agent = Agent( - name="Test", - agent_id="test-agent", - model=Ollama(id="llama3.1:8b"), - memory=AgentMemory( - db=PgMemoryDb(table_name="agent_memory", db_url="postgresql+psycopg://ai:ai@localhost:5532/ai"), - create_user_memories=True, - create_session_summary=True, - ), -) - -app = Playground(agents=[agent]).get_app() - -if __name__ == "__main__": - serve_playground_app("tryout:app", reload=True)