From c25d2423a0b335917b35859c5ae3b927e106ff7a Mon Sep 17 00:00:00 2001 From: Vadym Samoilenko Date: Fri, 29 May 2026 15:13:38 +0100 Subject: [PATCH] fix(enrichment): handle ObjectId/datetime in persona dict before LLM call Co-Authored-By: Claude Sonnet 4.6 --- backend/scripts/enrich_old_personas.py | 20 ++++++++++++++++++-- 1 file changed, 18 insertions(+), 2 deletions(-) diff --git a/backend/scripts/enrich_old_personas.py b/backend/scripts/enrich_old_personas.py index ab29fd3e..c631c0a2 100644 --- a/backend/scripts/enrich_old_personas.py +++ b/backend/scripts/enrich_old_personas.py @@ -14,6 +14,7 @@ import asyncio import json import os import sys +from datetime import datetime sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) @@ -60,6 +61,21 @@ async def enrich_persona(db, persona: dict) -> bool: print(f"\n→ Enriching: {name} ({pid})") print(f" Missing fields: {missing}") + # Strip non-serializable MongoDB types (ObjectId, datetime) before passing to LLM service + def _to_plain(obj): + name = type(obj).__name__ + if name == 'ObjectId': + return str(obj) + if isinstance(obj, datetime): + return obj.isoformat() + if isinstance(obj, dict): + return {k: _to_plain(v) for k, v in obj.items()} + if isinstance(obj, list): + return [_to_plain(i) for i in obj] + return obj + + clean = {k: _to_plain(v) for k, v in persona.items() if k != '_id'} + update = {} # Summary fields (aiSynthesizedBio, qualitativeAttributes, topPersonalityTraits) @@ -67,7 +83,7 @@ async def enrich_persona(db, persona: dict) -> bool: if summary_missing: try: print(f" šŸ¤– Generating summary...") - summary = await generate_persona_summary(persona, llm_model="gpt-5.4-mini") + summary = await generate_persona_summary(clean, llm_model="gpt-5.4-mini") for f in summary_missing: if f in summary: update[f] = summary[f] @@ -80,7 +96,7 @@ async def enrich_persona(db, persona: dict) -> bool: if detail_missing: try: print(f" šŸ¤– Generating detailed enrichment...") - detailed = await generate_persona(basic_persona=persona, llm_model="gpt-5.4") + detailed = await generate_persona(basic_persona=clean, llm_model="gpt-5.4") for f in detail_missing: if f in detailed and f not in persona: update[f] = detailed[f]