Skip to content

Commit d704a6e

Browse files
committed
Tests pass
1 parent 958a252 commit d704a6e

19 files changed

+2310
-1403
lines changed

CLAUDE.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ Working Memory (Session-scoped) → Long-term Memory (Persistent)
6565
```python
6666
# Correct - Use RedisVL queries
6767
from redisvl.query import VectorQuery, FilterQuery
68-
query = VectorQuery(vector=embedding, vector_field_name="embedding", return_fields=["text"])
68+
query = VectorQuery(vector=embedding, vector_field_name="vector", return_fields=["text"])
6969

7070
# Avoid - Direct redis client searches
7171
# redis.ft().search(...) # Don't do this

agent-memory-client/agent_memory_client/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,8 @@
1212
from typing import Any, Literal
1313

1414
import httpx
15-
import ulid
1615
from pydantic import BaseModel
16+
from ulid import ULID
1717

1818
from .exceptions import MemoryClientError, MemoryServerError, MemoryValidationError
1919
from .filters import (
@@ -362,7 +362,7 @@ async def add_memories_to_working_memory(
362362
# Auto-generate IDs for memories that don't have them
363363
for memory in final_memories:
364364
if not memory.id:
365-
memory.id = str(ulid.new())
365+
memory.id = str(ULID())
366366

367367
# Create new working memory with the memories
368368
working_memory = WorkingMemory(

agent-memory-client/agent_memory_client/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
from enum import Enum
1010
from typing import Any, Literal
1111

12-
import ulid
1312
from pydantic import BaseModel, Field
13+
from ulid import ULID
1414

1515
# Model name literals for model-specific window sizes
1616
ModelNameLiteral = Literal[
@@ -122,7 +122,7 @@ class ClientMemoryRecord(MemoryRecord):
122122
"""A memory record with a client-provided ID"""
123123

124124
id: str = Field(
125-
default_factory=lambda: str(ulid.new()),
125+
default_factory=lambda: str(ULID()),
126126
description="Client-provided ID generated by the client (ULID)",
127127
)
128128

agent-memory-client/pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ classifiers = [
2828
dependencies = [
2929
"httpx>=0.25.0",
3030
"pydantic>=2.0.0",
31-
"ulid-py>=1.1.0",
31+
"python-ulid>=3.0.0",
3232
]
3333

3434
[project.optional-dependencies]

agent-memory-client/uv.lock

Lines changed: 0 additions & 473 deletions
This file was deleted.

agent_memory_server/api.py

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
import tiktoken
2-
import ulid
32
from fastapi import APIRouter, Depends, HTTPException
43
from mcp.server.fastmcp.prompts import base
54
from mcp.types import TextContent
5+
from ulid import ULID
66

77
from agent_memory_server import long_term_memory, working_memory
88
from agent_memory_server.auth import UserInfo, get_current_user
@@ -279,7 +279,7 @@ async def put_session_memory(
279279

280280
memories = [
281281
MemoryRecord(
282-
id=str(ulid.new()),
282+
id=str(ULID()),
283283
session_id=session_id,
284284
text=f"{msg.role}: {msg.content}",
285285
namespace=updated_memory.namespace,
@@ -539,6 +539,16 @@ async def memory_prompt(
539539
),
540540
)
541541
)
542+
else:
543+
# Always include a system message about long-term memories, even if empty
544+
_messages.append(
545+
SystemMessage(
546+
content=TextContent(
547+
type="text",
548+
text="## Long term memories related to the user's query\n No relevant long-term memories found.",
549+
),
550+
)
551+
)
542552

543553
_messages.append(
544554
base.UserMessage(

agent_memory_server/config.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -98,8 +98,8 @@ class Settings(BaseSettings):
9898
# RedisVL Settings (kept for backwards compatibility)
9999
redisvl_distance_metric: str = "COSINE"
100100
redisvl_vector_dimensions: str = "1536"
101-
redisvl_index_name: str = "memory"
102-
redisvl_index_prefix: str = "memory"
101+
redisvl_index_name: str = "memory_idx"
102+
redisvl_index_prefix: str = "memory_idx"
103103

104104
# Docket settings
105105
docket_name: str = "memory-server"

agent_memory_server/long_term_memory.py

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55
from datetime import UTC, datetime
66
from typing import Any
77

8-
import ulid
98
from redis.asyncio import Redis
109
from redis.commands.search.query import Query
1110
from redisvl.query import VectorRangeQuery
1211
from redisvl.utils.vectorize import OpenAITextVectorizer
12+
from ulid import ULID
1313

1414
from agent_memory_server.config import settings
1515
from agent_memory_server.dependencies import get_background_tasks
@@ -244,7 +244,7 @@ async def merge_memories_with_llm(memories: list[dict], llm_client: Any = None)
244244
# Create the merged memory
245245
merged_memory = {
246246
"text": merged_text.strip(),
247-
"id_": str(ulid.new()),
247+
"id_": str(ULID()),
248248
"user_id": user_id,
249249
"session_id": session_id,
250250
"namespace": namespace,
@@ -666,7 +666,7 @@ async def index_long_term_memories(
666666

667667
# Schedule background tasks for topic/entity extraction
668668
for memory in processed_memories:
669-
memory_id = memory.id or str(ulid.new())
669+
memory_id = memory.id or str(ULID())
670670
await background_tasks.add_task(
671671
extract_memory_structure, memory_id, memory.text, memory.namespace
672672
)
@@ -946,7 +946,7 @@ async def count_long_term_memories(
946946
namespace: Optional namespace filter
947947
user_id: Optional user ID filter
948948
session_id: Optional session ID filter
949-
redis_client: Optional Redis client (kept for compatibility)
949+
redis_client: Optional Redis client (for compatibility - not used by adapter)
950950
951951
Returns:
952952
Total count of memories matching filters
@@ -1230,7 +1230,7 @@ async def deduplicate_by_semantic_search(
12301230

12311231
# Convert back to LongTermMemory
12321232
merged_memory_obj = MemoryRecord(
1233-
id=memory.id or str(ulid.new()),
1233+
id=memory.id or str(ULID()),
12341234
text=merged_memory["text"],
12351235
user_id=merged_memory["user_id"],
12361236
session_id=merged_memory["session_id"],
@@ -1450,7 +1450,7 @@ async def extract_memories_from_messages(
14501450

14511451
# Create a new memory record from the extraction
14521452
extracted_memory = MemoryRecord(
1453-
id=str(ulid.new()), # Server-generated ID
1453+
id=str(ULID()), # Server-generated ID
14541454
text=memory_data["text"],
14551455
memory_type=memory_data.get("type", "semantic"),
14561456
topics=memory_data.get("topics", []),

agent_memory_server/models.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,9 @@
33
from enum import Enum
44
from typing import Literal
55

6-
import ulid
76
from mcp.server.fastmcp.prompts import base
87
from pydantic import BaseModel, Field
8+
from ulid import ULID
99

1010
from agent_memory_server.config import settings
1111
from agent_memory_server.filters import (
@@ -143,7 +143,7 @@ class ClientMemoryRecord(MemoryRecord):
143143
"""A memory record with a client-provided ID"""
144144

145145
id: str = Field(
146-
default_factory=lambda: str(ulid.new()),
146+
default_factory=lambda: str(ULID()),
147147
description="Client-provided ID for deduplication and overwrites",
148148
)
149149

@@ -383,4 +383,4 @@ class MemoryPromptResponse(BaseModel):
383383
class LenientMemoryRecord(MemoryRecord):
384384
"""A memory record that can be created without an ID"""
385385

386-
id: str | None = Field(default_factory=lambda: str(ulid.new()))
386+
id: str | None = Field(default_factory=lambda: str(ULID()))

agent_memory_server/utils/redis.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,8 @@ def get_search_index(
4141
distance_metric: str = settings.redisvl_distance_metric,
4242
) -> AsyncSearchIndex:
4343
global _index
44-
if _index is None:
44+
# Check if we need to create a new index (no cached index or different Redis client)
45+
if _index is None or _index._redis_client != redis:
4546
schema = {
4647
"index": {
4748
"name": index_name,

0 commit comments

Comments
 (0)