Skip to content

Commit e83e46e

Browse files
abrookinsclaude
andcommitted
Optimize memory hash generation and improve timezone handling
- Add efficient field-based memory hash generation to avoid temporary object creation - Enhance event_date parsing to handle Z suffix and other timezone formats - Bump server version to 0.10.0 and client version to 0.11.0 - Auto-format code with ruff 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude <[email protected]>
1 parent a781461 commit e83e46e

File tree

4 files changed

+53
-8
lines changed

4 files changed

+53
-8
lines changed

agent-memory-client/agent_memory_client/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
memory management capabilities for AI agents and applications.
66
"""
77

8-
__version__ = "0.10.0"
8+
__version__ = "0.11.0"
99

1010
from .client import MemoryAPIClient, MemoryClientConfig, create_memory_client
1111
from .exceptions import (

agent_memory_server/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
"""Redis Agent Memory Server - A memory system for conversational AI."""
22

3-
__version__ = "0.9.4"
3+
__version__ = "0.10.0"

agent_memory_server/long_term_memory.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1476,9 +1476,15 @@ async def extract_memories_from_messages(
14761476
event_date = None
14771477
if memory_data.get("event_date"):
14781478
try:
1479-
event_date = datetime.fromisoformat(
1480-
memory_data["event_date"].replace("Z", "+00:00")
1481-
)
1479+
event_date_str = memory_data["event_date"]
1480+
# Handle 'Z' suffix (UTC indicator)
1481+
if event_date_str.endswith("Z"):
1482+
event_date = datetime.fromisoformat(
1483+
event_date_str.replace("Z", "+00:00")
1484+
)
1485+
else:
1486+
# Let fromisoformat handle other timezone formats like +05:00, -08:00, etc.
1487+
event_date = datetime.fromisoformat(event_date_str)
14821488
except (ValueError, TypeError) as e:
14831489
logger.warning(
14841490
f"Could not parse event_date '{memory_data.get('event_date')}': {e}"

agent_memory_server/utils/recency.py

Lines changed: 42 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,39 @@ def generate_memory_hash(memory: MemoryRecord) -> str:
3535
return hashlib.sha256(content_json.encode()).hexdigest()
3636

3737

38+
def generate_memory_hash_from_fields(
39+
text: str,
40+
user_id: str | None,
41+
session_id: str | None,
42+
namespace: str | None,
43+
memory_type: str,
44+
) -> str:
45+
"""
46+
Generate a memory hash directly from field values without creating a memory object.
47+
48+
This is more efficient than creating a temporary MemoryRecord just for hashing.
49+
50+
Args:
51+
text: Memory text content
52+
user_id: User ID
53+
session_id: Session ID
54+
namespace: Namespace
55+
memory_type: Memory type
56+
57+
Returns:
58+
A stable hash string
59+
"""
60+
content_fields = {
61+
"text": text,
62+
"user_id": user_id,
63+
"session_id": session_id,
64+
"namespace": namespace,
65+
"memory_type": memory_type,
66+
}
67+
content_json = json.dumps(content_fields, sort_keys=True)
68+
return hashlib.sha256(content_json.encode()).hexdigest()
69+
70+
3871
def update_memory_hash_if_text_changed(memory: MemoryRecord, updates: dict) -> dict:
3972
"""
4073
Helper function to regenerate memory hash if text field was updated.
@@ -51,10 +84,16 @@ def update_memory_hash_if_text_changed(memory: MemoryRecord, updates: dict) -> d
5184
"""
5285
result_updates = dict(updates)
5386

54-
# If text was updated, regenerate the hash
87+
# If text was updated, regenerate the hash efficiently
5588
if "text" in updates:
56-
temp_memory = memory.model_copy(update=updates)
57-
result_updates["memory_hash"] = generate_memory_hash(temp_memory)
89+
# Use efficient field-based hashing instead of creating temporary object
90+
result_updates["memory_hash"] = generate_memory_hash_from_fields(
91+
text=updates.get("text", memory.text),
92+
user_id=updates.get("user_id", memory.user_id),
93+
session_id=updates.get("session_id", memory.session_id),
94+
namespace=updates.get("namespace", memory.namespace),
95+
memory_type=updates.get("memory_type", memory.memory_type),
96+
)
5897

5998
return result_updates
6099

0 commit comments

Comments
 (0)