From 6054ea051ac1ebafe2b55d05579a17d888b10bce Mon Sep 17 00:00:00 2001 From: Hanzo_dev <2002samudiojohan@gmail.com> Date: Tue, 31 Mar 2026 18:59:14 -0500 Subject: [PATCH] fix(prod): sync serverless function logic with vector and numeric fixes --- backend/api/analizar.js | 101 +++++++--------------------------------- 1 file changed, 18 insertions(+), 83 deletions(-) diff --git a/backend/api/analizar.js b/backend/api/analizar.js index f838cc1..ea9697f 100644 --- a/backend/api/analizar.js +++ b/backend/api/analizar.js @@ -69,95 +69,30 @@ export default async function handler(req, res) { // ── PASO 6: Guardar en Supabase ─────────────────────── paso = 'guardado' + const payload = { + cliente_id, niche, sub_niche, mercado_objetivo, idioma, + proyecto_nombre, competidor_referente, + url_origen: url, plataforma, duracion_segundos: duracion, + vistas: vistas ? Number(vistas) : null, + likes: likes ? Number(likes) : null, + compartidos: compartidos ? Number(compartidos) : null, + fecha_publicacion, + contexto_video: contexto_video || null, + ...analisis, + transcript, + embedding_vector: vector, // Array nativo para pgvector + procesado_ok: true, + version_prompt: 'v1.0', + } + const { data: guion, error: errorSupabase } = await supabase .from('guiones') - .insert({ - // Organización - cliente_id, - niche, - sub_niche, - mercado_objetivo, - idioma, - proyecto_nombre, - competidor_referente, - - // Metadata del video - url_origen: url, - plataforma, - duracion_segundos: duracion, - vistas, - likes, - compartidos, - fecha_publicacion, - - // Análisis de GPT-4o (campos de storytelling) - estructura_narrativa: analisis.estructura_narrativa, - gancho_tipo: analisis.gancho_tipo, - gancho_texto: analisis.gancho_texto, - gancho_duracion_seg: analisis.gancho_duracion_seg, - desarrollo_tipo: analisis.desarrollo_tipo, - cta_tipo: analisis.cta_tipo, - cta_texto: analisis.cta_texto, - arco_emocional: analisis.arco_emocional, - conflicto_central: analisis.conflicto_central, - resolucion: analisis.resolucion, - pacing_ritmo: analisis.pacing_ritmo, - numero_actos: analisis.numero_actos, - - // Cialdini - cialdini_reciprocidad: analisis.cialdini_reciprocidad, - cialdini_escasez: analisis.cialdini_escasez, - cialdini_autoridad: analisis.cialdini_autoridad, - cialdini_consistencia: analisis.cialdini_consistencia, - cialdini_prueba_social: analisis.cialdini_prueba_social, - cialdini_simpatia: analisis.cialdini_simpatia, - cialdini_unidad: analisis.cialdini_unidad, - sesgo_cognitivo: analisis.sesgo_cognitivo, - trigger_emocional: analisis.trigger_emocional, - intensidad_emocional: analisis.intensidad_emocional, - - // Neuropublicidad - atencion_visual: analisis.atencion_visual, - lenguaje_sensorial: analisis.lenguaje_sensorial, - contraste_narrativo: analisis.contraste_narrativo, - efecto_novedad: analisis.efecto_novedad, - dolor_placer: analisis.dolor_placer, - personalizacion: analisis.personalizacion, - carga_cognitiva: analisis.carga_cognitiva, - velocidad_locucion: analisis.velocidad_locucion, - uso_musica: analisis.uso_musica, - micro_compromisos: analisis.micro_compromisos, - - // Contenido - tema_principal: analisis.tema_principal, - angulo_unico: analisis.angulo_unico, - palabras_clave: analisis.palabras_clave, - transcript, - tono: analisis.tono, - persona_narradora: analisis.persona_narradora, - promesa_explicita: analisis.promesa_explicita, - nivel_especificidad: analisis.nivel_especificidad, - contexto_video: contexto_video || null, - - // Diagnóstico - fortalezas: analisis.fortalezas, - debilidades: analisis.debilidades, - sugerencias_mejora: analisis.sugerencias_mejora, - hashtags_sugeridos: analisis.hashtags_sugeridos, - - // Métricas (score_engagement lo calcula el trigger de Supabase) - score_virabilidad: analisis.score_virabilidad, - resumen_patron: analisis.resumen_patron, - embedding_vector: `[${vector.join(',')}]`, - - // Auditoría - procesado_ok: true, - version_prompt: 'v1.0', - }) + .insert(payload) .select('id, niche, score_virabilidad, resumen_patron') .single() if (errorSupabase) { + console.error('[Supabase Error]:', errorSupabase) throw new Error(`Supabase error: ${errorSupabase.message}`) }