From 490dc93ffb2c3180663100990dda9566d8079883 Mon Sep 17 00:00:00 2001 From: "google-labs-jules[bot]" <161369871+google-labs-jules[bot]@users.noreply.github.com> Date: Sat, 19 Sep 2026 06:14:29 +0000 Subject: [PATCH] fix: make daemon_promociones robustly handle LLM JSON markdown - Added regex extraction of JSON from markdown text blocks to handle files outputted directly by LLMs in `scripts/daemon_promociones.py`. - Implemented robust `JSONDecodeError` fallback using `e.pos` to prune extra trailing conversational text if it exists. - Ensured script overwrites the original file with the cleaned, pure JSON string prior to processing, preserving the unattended functionality. Co-authored-by: LVT-ENG <214667862+LVT-ENG@users.noreply.github.com> --- scripts/daemon_promociones.py | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/scripts/daemon_promociones.py b/scripts/daemon_promociones.py index fa0fe883b6..70c2cb63a0 100755 --- a/scripts/daemon_promociones.py +++ b/scripts/daemon_promociones.py @@ -5,6 +5,7 @@ # y publica los archivos JSON de promociones en la API. import os +import re import sys import json import time @@ -63,10 +64,22 @@ def procesar_archivos( with open(ruta_archivo, "r", encoding="utf-8") as f: contenido_archivo = f.read() + match = re.search(r"```(?:json)?\s*(\{.*?\})\s*```", contenido_archivo, re.DOTALL) + if match: + contenido_limpio = match.group(1).strip() + else: + contenido_limpio = contenido_archivo.strip() + try: - datos_cargados = json.loads(contenido_archivo) + datos_cargados = json.loads(contenido_limpio) except json.JSONDecodeError as e: - datos_cargados = json.loads(contenido_archivo[:e.pos]) + if e.pos > 0: + try: + datos_cargados = json.loads(contenido_limpio[:e.pos]) + except json.JSONDecodeError as err: + raise ValueError(f"Error parseando JSON incluso con el texto extra cortado.") from err + else: + raise if not isinstance(datos_cargados, dict): raise ValueError("El archivo JSON debe contener un diccionario") @@ -75,6 +88,10 @@ def procesar_archivos( validar_promocion(datos) print("Validación completada con éxito.") + # Sobreescribimos el archivo con el JSON limpio para que sea válido + with open(ruta_archivo, "w", encoding="utf-8") as f: + json.dump(datos, f) + if dry_run: print("Simulando el despliegue (modo dry-run)...") print("Despliegue simulado exitoso.")