// ============================================================ // ANALIZADOR — GPT-4o // Prompt maestro multidisciplinario: Storytelling + Cialdini // + Neuropublicidad → JSON de 55 campos analizables // ============================================================ import OpenAI from 'openai' const openai = new OpenAI({ apiKey: process.env.OPENAI_API_KEY }) const PROMPT_SISTEMA = `Eres un experto en ingeniería de guiones para video corto (TikTok, Reels, YouTube Shorts) con especialización en: - Storytelling y estructura narrativa - Psicología de la persuasión (Cialdini, sesgos cognitivos) - Neuropublicidad y neuromarketing - Marketing de contenidos para múltiples nichos Tu tarea es analizar la transcripción de un video y devolver un JSON con el análisis completo. SOLO devuelve el JSON, sin texto adicional, sin markdown, sin explicaciones.` /** * @param {string} transcript Texto transcrito por Whisper * @param {string} niche Nicho del video (ej: "fitness", "finanzas") * @param {string} plataforma tiktok | reels | shorts * @param {number} duracion Duración en segundos * @returns {object} JSON con todos los campos de análisis */ export async function analizarTranscript(transcript, niche, plataforma, duracion) { const promptUsuario = `Analiza este video de ${plataforma} de ${duracion} segundos del nicho "${niche}". TRANSCRIPCIÓN: """ ${transcript} """ Devuelve EXACTAMENTE este JSON con los valores que correspondan: { "estructura_narrativa": "", "gancho_tipo": "", "gancho_texto": "", "gancho_duracion_seg": , "desarrollo_tipo": "", "cta_tipo": "", "cta_texto": "", "arco_emocional": "", "conflicto_central": "", "resolucion": "", "pacing_ritmo": "", "numero_actos": <1, 2 o 3>, "cialdini_reciprocidad": , "cialdini_escasez": , "cialdini_autoridad": , "cialdini_consistencia": , "cialdini_prueba_social": , "cialdini_simpatia": , "cialdini_unidad": , "sesgo_cognitivo": "", "trigger_emocional": "", "intensidad_emocional": , "atencion_visual": "", "lenguaje_sensorial": , "contraste_narrativo": , "efecto_novedad": , "dolor_placer": "", "personalizacion": , "carga_cognitiva": "", "velocidad_locucion": "", "uso_musica": , "micro_compromisos": , "tema_principal": "", "angulo_unico": "", "palabras_clave": ["", "", "", "", ""], "tono": "", "persona_narradora": "", "promesa_explicita": "", "nivel_especificidad": "", "score_virabilidad": , "resumen_patron": "" }` const completion = await openai.chat.completions.create({ model: 'gpt-4o', temperature: 0.2, // baja temperatura para análisis consistente messages: [ { role: 'system', content: PROMPT_SISTEMA }, { role: 'user', content: promptUsuario }, ], }) const contenido = completion.choices[0]?.message?.content?.trim() if (!contenido) { throw new Error('GPT-4o devolvió una respuesta vacía') } // Limpiar posible markdown que GPT-4o a veces añade const jsonLimpio = contenido .replace(/^```json\n?/, '') .replace(/^```\n?/, '') .replace(/\n?```$/, '') .trim() return JSON.parse(jsonLimpio) }