feat(memory): Add task result sanitization for JSON serialization

- Remove unused TaskStatusResponse import from memory_api_schema
- Add _sanitize_task_result() helper function to convert non-serializable types (UUID, datetime) to strings
- Update get_write_task_status endpoint to use sanitization instead of TaskStatusResponse validation
- Update get_read_task_status endpoint to use sanitization instead of TaskStatusResponse validation
- Ensures Celery task results are properly JSON-serializable before returning to clients
This commit is contained in:
Ke Sun
2026-04-02 14:49:46 +08:00
parent 010eff17cf
commit 2f0bb793d8

View File

@@ -15,7 +15,6 @@ from app.schemas.memory_api_schema import (
MemoryWriteRequest,
MemoryWriteResponse,
MemoryWriteSyncResponse,
TaskStatusResponse,
)
from app.services.memory_api_service import MemoryAPIService
@@ -23,6 +22,34 @@ router = APIRouter(prefix="/memory", tags=["V1 - Memory API"])
logger = get_business_logger()
def _sanitize_task_result(result: dict) -> dict:
"""Make Celery task result JSON-serializable.
Converts UUID and other non-serializable values to strings.
Args:
result: Raw task result dict from task_service
Returns:
JSON-safe dict
"""
import uuid as _uuid
from datetime import datetime
def _convert(obj):
if isinstance(obj, dict):
return {k: _convert(v) for k, v in obj.items()}
if isinstance(obj, list):
return [_convert(i) for i in obj]
if isinstance(obj, _uuid.UUID):
return str(obj)
if isinstance(obj, datetime):
return obj.isoformat()
return obj
return _convert(result)
@router.get("")
async def get_memory_info():
"""获取记忆服务信息(占位)"""
@@ -80,7 +107,7 @@ async def get_write_task_status(
from app.services.task_service import get_task_memory_write_result
result = get_task_memory_write_result(task_id)
return success(data=TaskStatusResponse(**result).model_dump(), msg="Task status retrieved")
return success(data=_sanitize_task_result(result), msg="Task status retrieved")
@router.post("/read")
@@ -135,7 +162,7 @@ async def get_read_task_status(
from app.services.task_service import get_task_memory_read_result
result = get_task_memory_read_result(task_id)
return success(data=TaskStatusResponse(**result).model_dump(), msg="Task status retrieved")
return success(data=_sanitize_task_result(result), msg="Task status retrieved")
@router.post("/write/sync")