feat: análisis extendido (10 campos nuevos) + generador de guiones con GPT-4o
Análisis extendido: - Nuevos campos: apertura_exacta, cierre_exacto, tecnica_retencion, momento_pico_seg - Copywriting: nivel_consciencia (Schwartz), objecion_principal, avatar_descripcion - Replicabilidad: ingredientes_clave, replicabilidad, ratio_emocion_logica - analizador.js: prompt extendido con metodología Schwartz + retención - validador.js: schema Zod actualizado con 6 nuevos enums - Migración SQL 05: ALTER TABLE + nuevos ENUMs + índices Generador de guiones: - generador.js: lib GPT-4o con temperatura 0.7 y contexto de patrones - server.js: endpoints POST /api/generar, GET /api/generados, GET /api/generados/:id - backend/api/generar.js + api/generar.js + api/generados.js: Vercel handlers - Migración SQL 06: tabla guiones_generados con score_estimado, variantes, notas - GenerateView.vue: formulario completo + preview del guion con copy al portapapeles - SideNavBar: nueva entrada "Generar" con ícono auto_fix_high - Router: ruta /generate → GenerateView - api.js: api.generar() + api.generados.listar/obtener() Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
67
database/migrations/05_analisis_extendido.sql
Normal file
67
database/migrations/05_analisis_extendido.sql
Normal file
@ -0,0 +1,67 @@
|
||||
-- ============================================================
|
||||
-- MIGRACIÓN 05 — Análisis Extendido
|
||||
-- Nuevos campos de retención, copywriting y replicabilidad
|
||||
-- Ejecutar en Supabase SQL Editor
|
||||
-- ============================================================
|
||||
|
||||
-- ── Nuevos ENUMS ─────────────────────────────────────────────
|
||||
|
||||
create type tecnica_retencion_enum as enum (
|
||||
'open_loop', 'cliffhanger', 'curiosity_gap', 'countdown', 'pregunta_abierta', 'ninguna'
|
||||
);
|
||||
|
||||
create type ratio_emocion_enum as enum ('emocional', 'logico', 'equilibrado');
|
||||
|
||||
create type nivel_consciencia_enum as enum (
|
||||
'inconsciente', 'problema_consciente', 'solucion_consciente',
|
||||
'producto_consciente', 'mas_consciente'
|
||||
);
|
||||
|
||||
create type replicabilidad_enum as enum ('alta', 'media', 'baja');
|
||||
|
||||
-- ── Bloque Storytelling Extendido ────────────────────────────
|
||||
|
||||
alter table guiones
|
||||
add column if not exists apertura_exacta text,
|
||||
add column if not exists cierre_exacto text,
|
||||
add column if not exists tecnica_retencion tecnica_retencion_enum,
|
||||
add column if not exists momento_pico_seg integer check (momento_pico_seg >= 0);
|
||||
|
||||
-- ── Bloque Neuropublicidad Extendido ─────────────────────────
|
||||
|
||||
alter table guiones
|
||||
add column if not exists ratio_emocion_logica ratio_emocion_enum;
|
||||
|
||||
-- ── Bloque Copywriting / Avatar ──────────────────────────────
|
||||
|
||||
alter table guiones
|
||||
add column if not exists nivel_consciencia nivel_consciencia_enum,
|
||||
add column if not exists objecion_principal text,
|
||||
add column if not exists avatar_descripcion text,
|
||||
add column if not exists ingredientes_clave text[],
|
||||
add column if not exists replicabilidad replicabilidad_enum;
|
||||
|
||||
-- ── Índices útiles para la generación de guiones ─────────────
|
||||
|
||||
-- Filtrar rápido por replicabilidad alta (para el generador)
|
||||
create index if not exists idx_guiones_replicabilidad
|
||||
on guiones(replicabilidad)
|
||||
where procesado_ok = true;
|
||||
|
||||
-- Filtrar por nivel de consciencia (segmentación de copywriting)
|
||||
create index if not exists idx_guiones_nivel_consciencia
|
||||
on guiones(nivel_consciencia)
|
||||
where procesado_ok = true;
|
||||
|
||||
-- ── Comentarios de columna ────────────────────────────────────
|
||||
|
||||
comment on column guiones.apertura_exacta is 'Primeras ~15 palabras exactas del video según la transcripción';
|
||||
comment on column guiones.cierre_exacto is 'Últimas ~10 palabras exactas del video según la transcripción';
|
||||
comment on column guiones.tecnica_retencion is 'Técnica principal que hace al espectador quedarse hasta el final';
|
||||
comment on column guiones.momento_pico_seg is 'Segundo estimado del mayor pico emocional o de tensión del video';
|
||||
comment on column guiones.ratio_emocion_logica is 'Balance entre apelaciones emocionales y argumentos lógicos';
|
||||
comment on column guiones.nivel_consciencia is 'Nivel de consciencia del avatar según escala Eugene Schwartz';
|
||||
comment on column guiones.objecion_principal is 'Objeción del espectador que el video anticipa o desmonta';
|
||||
comment on column guiones.avatar_descripcion is 'Perfil de la persona a quien está dirigido el video';
|
||||
comment on column guiones.ingredientes_clave is 'Elementos que no pueden faltar al replicar este guion';
|
||||
comment on column guiones.replicabilidad is 'Qué tan fácil es replicar este patrón en otro contexto';
|
||||
62
database/migrations/06_guiones_generados.sql
Normal file
62
database/migrations/06_guiones_generados.sql
Normal file
@ -0,0 +1,62 @@
|
||||
-- ============================================================
|
||||
-- MIGRACIÓN 06 — Tabla de Guiones Generados
|
||||
-- Almacena los guiones creados por el generador IA
|
||||
-- Ejecutar en Supabase SQL Editor después de la migración 05
|
||||
-- ============================================================
|
||||
|
||||
create type objetivo_guion_enum as enum (
|
||||
'awareness', 'engagement', 'conversion', 'educacion', 'entretenimiento'
|
||||
);
|
||||
|
||||
create table guiones_generados (
|
||||
|
||||
-- Identificadores
|
||||
id uuid primary key default gen_random_uuid(),
|
||||
cliente_id uuid references clientes(id) on delete set null,
|
||||
|
||||
-- Parámetros de entrada
|
||||
niche text not null,
|
||||
tema text not null,
|
||||
audiencia text not null,
|
||||
plataforma plataforma_enum not null,
|
||||
duracion_objetivo integer, -- segundos objetivo
|
||||
tono tono_enum,
|
||||
objetivo objetivo_guion_enum,
|
||||
estructura_usada estructura_narrativa_enum,
|
||||
instrucciones_extra text,
|
||||
|
||||
-- Referencias usadas para generar
|
||||
referencias_ids uuid[], -- IDs de guiones analizados usados como base
|
||||
num_referencias integer generated always as (
|
||||
coalesce(array_length(referencias_ids, 1), 0)
|
||||
) stored,
|
||||
|
||||
-- Contenido generado
|
||||
titulo_sugerido text,
|
||||
gancho text not null,
|
||||
desarrollo text not null,
|
||||
cta text,
|
||||
guion_completo text not null,
|
||||
variantes_gancho text[],
|
||||
tecnicas_aplicadas text[],
|
||||
notas_produccion text,
|
||||
duracion_estimada_seg integer,
|
||||
score_estimado integer check (score_estimado between 1 and 100),
|
||||
|
||||
-- Auditoría
|
||||
fecha_generacion timestamp with time zone default now(),
|
||||
version_prompt text default 'v1.0',
|
||||
aprobado boolean default false, -- marcado manualmente cuando el guion se usa
|
||||
notas_usuario text -- feedback del usuario sobre el guion
|
||||
|
||||
);
|
||||
|
||||
-- Índices
|
||||
create index idx_gg_niche on guiones_generados(niche);
|
||||
create index idx_gg_cliente on guiones_generados(cliente_id);
|
||||
create index idx_gg_fecha on guiones_generados(fecha_generacion desc);
|
||||
create index idx_gg_aprobado on guiones_generados(aprobado) where aprobado = true;
|
||||
|
||||
comment on table guiones_generados is 'Guiones creados por el generador IA a partir de patrones analizados';
|
||||
comment on column guiones_generados.referencias_ids is 'IDs de guiones analizados que se usaron como patrones de referencia';
|
||||
comment on column guiones_generados.aprobado is 'True cuando el usuario marca el guion como usado/aprobado';
|
||||
Reference in New Issue
Block a user