Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
31 changes: 29 additions & 2 deletions src/basic_memory/schemas/memory.py
Original file line number Diff line number Diff line change
@@ -1,14 +1,21 @@
"""Schemas for memory context."""

from datetime import datetime
from datetime import datetime, timezone
from typing import List, Optional, Annotated, Sequence, Literal, Union

from annotated_types import MinLen, MaxLen
from pydantic import BaseModel, Field, BeforeValidator, TypeAdapter
from pydantic import BaseModel, Field, BeforeValidator, TypeAdapter, field_serializer

from basic_memory.schemas.search import SearchItemType


def ensure_timezone_aware(dt: datetime) -> datetime:
"""Ensure datetime is timezone-aware by converting to UTC if naive."""
if dt.tzinfo is None:
return dt.replace(tzinfo=timezone.utc)
return dt.astimezone(timezone.utc)


def validate_memory_url_path(path: str) -> bool:
"""Validate that a memory URL path is well-formed.

Expand Down Expand Up @@ -125,6 +132,11 @@ class EntitySummary(BaseModel):
file_path: str
created_at: datetime

@field_serializer('created_at')
def serialize_created_at(self, dt: datetime) -> str:
"""Serialize datetime as RFC 3339 compliant string with timezone."""
return ensure_timezone_aware(dt).isoformat()


class RelationSummary(BaseModel):
"""Simplified relation representation."""
Expand All @@ -138,6 +150,11 @@ class RelationSummary(BaseModel):
to_entity: Optional[str] = None
created_at: datetime

@field_serializer('created_at')
def serialize_created_at(self, dt: datetime) -> str:
"""Serialize datetime as RFC 3339 compliant string with timezone."""
return ensure_timezone_aware(dt).isoformat()


class ObservationSummary(BaseModel):
"""Simplified observation representation."""
Expand All @@ -150,6 +167,11 @@ class ObservationSummary(BaseModel):
content: str
created_at: datetime

@field_serializer('created_at')
def serialize_created_at(self, dt: datetime) -> str:
"""Serialize datetime as RFC 3339 compliant string with timezone."""
return ensure_timezone_aware(dt).isoformat()


class MemoryMetadata(BaseModel):
"""Simplified response metadata."""
Expand All @@ -165,6 +187,11 @@ class MemoryMetadata(BaseModel):
total_relations: Optional[int] = None
total_observations: Optional[int] = None

@field_serializer('generated_at')
def serialize_generated_at(self, dt: datetime) -> str:
"""Serialize datetime as RFC 3339 compliant string with timezone."""
return ensure_timezone_aware(dt).isoformat()


class ContextResult(BaseModel):
"""Context result containing a primary item with its observations and related items."""
Expand Down
Loading