Skip to content

Commit 1b6073d

Browse files
committed
Refactor vector storage logic in VectorStore and add logging utility
This commit refines the vector storage process in the VectorStore class by consolidating the storage logic into a dedicated function for better maintainability and error handling. It also introduces a new logging utility to set up logging configurations, ensuring consistent logging practices across the application. The changes enhance the clarity and robustness of vector storage operations.
1 parent 5d0f7ac commit 1b6073d

2 files changed

Lines changed: 98 additions & 19 deletions

File tree

memory/embeddings/vector_store.py

Lines changed: 15 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -556,30 +556,26 @@ def store_memory_vectors(
556556
embeddings = memory_entry.get("embeddings", {})
557557
metadata = memory_entry.get("metadata", {})
558558

559+
def store_vector(index, memory_id: str, vector: List[float], metadata: Dict[str, Any], tier: str) -> bool:
560+
try:
561+
logger.debug(f"Storing {tier.upper()} vector for memory {memory_id}")
562+
return index.add(memory_id, vector, metadata)
563+
except Exception as e:
564+
logger.error(f"Failed to store {tier.upper()} vector for memory {memory_id}: {e}")
565+
return False
566+
559567
success = True
560568

561-
# Store in STM index
569+
# Store in appropriate index based on tier
562570
if tier == "stm":
563-
logger.debug("Storing STM vector for memory %s", memory_id)
564-
success = success and self.stm_index.add(
565-
memory_id, embeddings["full_vector"], metadata
566-
)
567-
568-
# Store in IM index
569-
if tier == "im":
571+
success = store_vector(self.stm_index, memory_id, embeddings["full_vector"], metadata, "stm")
572+
elif tier == "im":
570573
#! TODO: Use compressed vector
571-
logger.debug("Storing IM vector for memory %s", memory_id)
572-
success = success and self.im_index.add(
573-
memory_id, embeddings["full_vector"], metadata
574-
)
575-
576-
# Store in LTM index
577-
if tier == "ltm":
574+
success = store_vector(self.im_index, memory_id, embeddings["full_vector"], metadata, "im")
575+
logger.debug(f"Result of storing IM vector: {success}")
576+
elif tier == "ltm":
578577
#! TODO: Use abstract vector
579-
logger.debug("Storing LTM vector for memory %s", memory_id)
580-
success = success and self.ltm_index.add(
581-
memory_id, embeddings["full_vector"], metadata
582-
)
578+
success = store_vector(self.ltm_index, memory_id, embeddings["full_vector"], metadata, "ltm")
583579

584580
return success
585581

memory/utils/logging.py

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
import os
2+
import logging
3+
import sys
4+
5+
# Use current working directory for logs
6+
LOGS_DIR = os.path.join(os.getcwd(), "logs")
7+
8+
print(f"Current working directory: {os.getcwd()}")
9+
print(f"Logs directory: {LOGS_DIR}")
10+
11+
12+
def setup_logging(demo_name: str) -> logging.Logger:
13+
"""Set up logging to both console and file.
14+
15+
Args:
16+
demo_name: Name of the demo for log file naming
17+
18+
Returns:
19+
Configured logger instance
20+
"""
21+
try:
22+
# Create logs directory if it doesn't exist
23+
os.makedirs(LOGS_DIR, exist_ok=True)
24+
print(f"Created logs directory at: {LOGS_DIR}")
25+
26+
# Use a fixed log filename based on demo name (without timestamp)
27+
log_file = os.path.join(LOGS_DIR, f"{demo_name}.log")
28+
print(f"Log file will be created at: {log_file}")
29+
30+
# Clear the existing log file if it exists
31+
with open(log_file, "w") as f:
32+
# Empty the file by opening it in write mode
33+
pass
34+
print(f"Initialized log file: {log_file}")
35+
36+
# Configure logging
37+
logger = logging.getLogger()
38+
logger.setLevel(logging.DEBUG)
39+
40+
# Clear existing handlers if any
41+
if logger.handlers:
42+
logger.handlers.clear()
43+
44+
# File handler for logging to file
45+
file_handler = logging.FileHandler(log_file)
46+
file_formatter = logging.Formatter("%(asctime)s - %(levelname)s - %(message)s")
47+
file_handler.setFormatter(file_formatter)
48+
file_handler.setLevel(logging.DEBUG)
49+
50+
# Console handler for logging to console
51+
console_handler = logging.StreamHandler()
52+
console_formatter = logging.Formatter("%(message)s")
53+
console_handler.setFormatter(console_formatter)
54+
console_handler.setLevel(logging.INFO)
55+
56+
# Create a filter to exclude embedding-related log messages
57+
class EmbeddingFilter(logging.Filter):
58+
def filter(self, record):
59+
# Skip any log messages containing "embedding" or "vector"
60+
return not any(
61+
term in record.getMessage().lower()
62+
for term in ["embedding", "vector", "encoded"]
63+
)
64+
65+
# Add the filter to both handlers
66+
embedding_filter = EmbeddingFilter()
67+
file_handler.addFilter(embedding_filter)
68+
console_handler.addFilter(embedding_filter)
69+
70+
# Add handlers to logger
71+
logger.addHandler(file_handler)
72+
logger.addHandler(console_handler)
73+
74+
# Log a test message to verify logging is working
75+
logger.info(f"Logging initialized for {demo_name}")
76+
print(f"Logging setup complete for {demo_name}")
77+
78+
return logger
79+
except Exception as e:
80+
print(f"Error setting up logging: {e}")
81+
# Fallback to basic console logging
82+
logging.basicConfig(level=logging.INFO)
83+
return logging.getLogger()

0 commit comments

Comments
 (0)