fix(enrichment): handle ObjectId/datetime in persona dict before LLM call

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
Vadym Samoilenko 2026-05-29 15:13:38 +01:00
parent 604fdb9458
commit c25d2423a0

View file

@ -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]