diff --git a/backend/packages/harness/deerflow/agents/memory/queue.py b/backend/packages/harness/deerflow/agents/memory/queue.py index d78c643f8..1db8c63dc 100644 --- a/backend/packages/harness/deerflow/agents/memory/queue.py +++ b/backend/packages/harness/deerflow/agents/memory/queue.py @@ -4,7 +4,7 @@ import logging import threading import time from dataclasses import dataclass, field -from datetime import datetime +from datetime import UTC, datetime from typing import Any from deerflow.config.memory_config import get_memory_config @@ -18,7 +18,7 @@ class ConversationContext: thread_id: str messages: list[Any] - timestamp: datetime = field(default_factory=datetime.utcnow) + timestamp: datetime = field(default_factory=lambda: datetime.now(UTC)) agent_name: str | None = None correction_detected: bool = False reinforcement_detected: bool = False diff --git a/backend/packages/harness/deerflow/agents/memory/storage.py b/backend/packages/harness/deerflow/agents/memory/storage.py index ba941a7a4..3d57d059b 100644 --- a/backend/packages/harness/deerflow/agents/memory/storage.py +++ b/backend/packages/harness/deerflow/agents/memory/storage.py @@ -4,7 +4,7 @@ import abc import json import logging import threading -from datetime import datetime +from datetime import UTC, datetime from pathlib import Path from typing import Any @@ -15,11 +15,16 @@ from deerflow.config.paths import get_paths logger = logging.getLogger(__name__) +def utc_now_iso_z() -> str: + """Current UTC time as ISO-8601 with ``Z`` suffix (matches prior naive-UTC output).""" + return datetime.now(UTC).isoformat().removesuffix("+00:00") + "Z" + + def create_empty_memory() -> dict[str, Any]: """Create an empty memory structure.""" return { "version": "1.0", - "lastUpdated": datetime.utcnow().isoformat() + "Z", + "lastUpdated": utc_now_iso_z(), "user": { "workContext": {"summary": "", "updatedAt": ""}, "personalContext": {"summary": "", "updatedAt": ""}, @@ -137,7 +142,7 @@ class FileMemoryStorage(MemoryStorage): try: file_path.parent.mkdir(parents=True, exist_ok=True) - memory_data["lastUpdated"] = datetime.utcnow().isoformat() + "Z" + memory_data["lastUpdated"] = utc_now_iso_z() temp_path = file_path.with_suffix(".tmp") with open(temp_path, "w", encoding="utf-8") as f: diff --git a/backend/packages/harness/deerflow/agents/memory/updater.py b/backend/packages/harness/deerflow/agents/memory/updater.py index 5f459b47a..d1f124d4c 100644 --- a/backend/packages/harness/deerflow/agents/memory/updater.py +++ b/backend/packages/harness/deerflow/agents/memory/updater.py @@ -5,14 +5,17 @@ import logging import math import re import uuid -from datetime import datetime from typing import Any from deerflow.agents.memory.prompt import ( MEMORY_UPDATE_PROMPT, format_conversation_for_update, ) -from deerflow.agents.memory.storage import create_empty_memory, get_memory_storage +from deerflow.agents.memory.storage import ( + create_empty_memory, + get_memory_storage, + utc_now_iso_z, +) from deerflow.config.memory_config import get_memory_config from deerflow.models import create_chat_model @@ -86,7 +89,7 @@ def create_memory_fact( normalized_category = category.strip() or "context" validated_confidence = _validate_confidence(confidence) - now = datetime.utcnow().isoformat() + "Z" + now = utc_now_iso_z() memory_data = get_memory_data(agent_name) updated_memory = dict(memory_data) facts = list(memory_data.get("facts", [])) @@ -376,7 +379,7 @@ class MemoryUpdater: Updated memory data. """ config = get_memory_config() - now = datetime.utcnow().isoformat() + "Z" + now = utc_now_iso_z() # Update user sections user_updates = update_data.get("user", {})