fix(prod): sync serverless function logic with vector and numeric fixes
This commit is contained in:
@ -69,95 +69,30 @@ export default async function handler(req, res) {
|
|||||||
|
|
||||||
// ── PASO 6: Guardar en Supabase ───────────────────────
|
// ── PASO 6: Guardar en Supabase ───────────────────────
|
||||||
paso = 'guardado'
|
paso = 'guardado'
|
||||||
const { data: guion, error: errorSupabase } = await supabase
|
const payload = {
|
||||||
.from('guiones')
|
cliente_id, niche, sub_niche, mercado_objetivo, idioma,
|
||||||
.insert({
|
proyecto_nombre, competidor_referente,
|
||||||
// Organización
|
url_origen: url, plataforma, duracion_segundos: duracion,
|
||||||
cliente_id,
|
vistas: vistas ? Number(vistas) : null,
|
||||||
niche,
|
likes: likes ? Number(likes) : null,
|
||||||
sub_niche,
|
compartidos: compartidos ? Number(compartidos) : null,
|
||||||
mercado_objetivo,
|
|
||||||
idioma,
|
|
||||||
proyecto_nombre,
|
|
||||||
competidor_referente,
|
|
||||||
|
|
||||||
// Metadata del video
|
|
||||||
url_origen: url,
|
|
||||||
plataforma,
|
|
||||||
duracion_segundos: duracion,
|
|
||||||
vistas,
|
|
||||||
likes,
|
|
||||||
compartidos,
|
|
||||||
fecha_publicacion,
|
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,
|
contexto_video: contexto_video || null,
|
||||||
|
...analisis,
|
||||||
// Diagnóstico
|
transcript,
|
||||||
fortalezas: analisis.fortalezas,
|
embedding_vector: vector, // Array nativo para pgvector
|
||||||
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,
|
procesado_ok: true,
|
||||||
version_prompt: 'v1.0',
|
version_prompt: 'v1.0',
|
||||||
})
|
}
|
||||||
|
|
||||||
|
const { data: guion, error: errorSupabase } = await supabase
|
||||||
|
.from('guiones')
|
||||||
|
.insert(payload)
|
||||||
.select('id, niche, score_virabilidad, resumen_patron')
|
.select('id, niche, score_virabilidad, resumen_patron')
|
||||||
.single()
|
.single()
|
||||||
|
|
||||||
if (errorSupabase) {
|
if (errorSupabase) {
|
||||||
|
console.error('[Supabase Error]:', errorSupabase)
|
||||||
throw new Error(`Supabase error: ${errorSupabase.message}`)
|
throw new Error(`Supabase error: ${errorSupabase.message}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user