From 1b54552feca7eeaa8353d34fdf3e0f6a50e70b35 Mon Sep 17 00:00:00 2001 From: empty Date: Wed, 7 Jan 2026 09:40:21 +0800 Subject: [PATCH] fix: Handle nested JSON structures in VLM response parsing --- .../services/quality/character_analyzer.py | 38 +++++++++++++++++-- 1 file changed, 34 insertions(+), 4 deletions(-) diff --git a/pixelle_video/services/quality/character_analyzer.py b/pixelle_video/services/quality/character_analyzer.py index d793a04..249c255 100644 --- a/pixelle_video/services/quality/character_analyzer.py +++ b/pixelle_video/services/quality/character_analyzer.py @@ -242,13 +242,43 @@ Output ONLY the JSON object, no additional text.""" logger.warning(f"No JSON found in response, trying direct parse") data = json.loads(cleaned) + # Handle nested JSON structures - flatten to strings + appearance = data.get("appearance_description", "") + if isinstance(appearance, dict): + # Flatten nested object to descriptive string + parts = [] + for key, value in appearance.items(): + if isinstance(value, dict): + # Further nested (e.g., hair: {color, length, style}) + details = ", ".join(f"{k}: {v}" for k, v in value.items()) + parts.append(f"{key} ({details})") + else: + parts.append(f"{key}: {value}") + appearance = "; ".join(parts) + + clothing = data.get("clothing_description", "") + if isinstance(clothing, dict): + # Flatten nested clothing description + parts = [] + for person, items in clothing.items(): + if isinstance(items, dict): + details = ", ".join(f"{k}: {v}" for k, v in items.items()) + parts.append(f"{person} ({details})") + else: + parts.append(f"{person}: {items}") + clothing = "; ".join(parts) + + distinctive = data.get("distinctive_features", []) + if not isinstance(distinctive, list): + distinctive = [str(distinctive)] + result = CharacterAnalysisResult( - appearance_description=data.get("appearance_description", ""), - clothing_description=data.get("clothing_description", ""), - distinctive_features=data.get("distinctive_features", []), + appearance_description=appearance, + clothing_description=clothing, + distinctive_features=distinctive, ) - logger.info(f"Character analysis extracted: {result.appearance_description[:80]}...") + logger.info(f"Character analysis extracted: {result.appearance_description[:80] if result.appearance_description else 'empty'}...") return result except (json.JSONDecodeError, KeyError) as e: