feat: Add Content Generation Engine v2 with quality scoring

Major improvements to AI content generation:

## New Components (app/services/ai/)
- PromptLibrary: YAML-based prompt templates with inheritance
- ContextEngine: Anti-repetition and best performers tracking
- ContentGeneratorV2: Enhanced generation with dynamic parameters
- PlatformAdapter: Platform-specific content adaptation
- ContentValidator: AI-powered quality scoring (0-100)

## Prompt Library (app/prompts/)
- 3 personalities: default, educational, promotional
- 5 templates: tip_tech, product_post, service_post, thread, response
- 4 platform configs: x, threads, instagram, facebook
- Few-shot examples by category: ia, productividad, seguridad

## Database Changes
- New table: content_memory (tracks generated content)
- New columns in posts: quality_score, score_breakdown, generation_attempts

## New API Endpoints (/api/v2/generate/)
- POST /generate - Generation with quality check
- POST /generate/batch - Batch generation
- POST /quality/evaluate - Evaluate content quality
- GET /templates, /personalities, /platforms - List configs

## Celery Tasks
- update_engagement_scores (every 6h)
- cleanup_old_memory (monthly)
- refresh_best_posts_yaml (weekly)

## Tests
- Comprehensive tests for all AI engine components

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2026-01-28 20:55:28 +00:00
parent f458f809ca
commit 11b0ba46fa
36 changed files with 6266 additions and 55 deletions

View File

@@ -0,0 +1,82 @@
name: product_post
description: Posts promocionales para productos
personality: promotional
purpose: |
Presentar productos de forma atractiva enfocándose en cómo
resuelven problemas reales del cliente.
requirements:
- Liderar con el problema que resuelve
- Destacar 2-3 beneficios clave
- Incluir precio como inversión
- CTA claro pero no agresivo
- NO inventar especificaciones
structure:
hook: problem_or_benefit_hook
benefits: 2_3_key_benefits
specs: relevant_specs_only
price: price_as_investment
cta: soft_call_to_action
hashtags: 2_3_relevant
variables:
- name: product_name
type: string
required: true
- name: product_description
type: string
required: true
- name: price
type: number
required: true
- name: category
type: string
required: true
- name: specs
type: object
required: false
- name: highlights
type: array
required: false
parameters:
temperature: 0.7
max_tokens: 400
template: |
Genera un post promocional para este producto:
PRODUCTO: {product_name}
DESCRIPCIÓN: {product_description}
PRECIO: ${price:,.2f} MXN
CATEGORÍA: {category}
ESPECIFICACIONES: {specs}
PUNTOS DESTACADOS: {highlights}
ESTRUCTURA:
1. HOOK: Problema que resuelve O beneficio principal
2. BENEFICIOS: 2-3 beneficios clave (no características)
3. PRECIO: Presentado como inversión
4. CTA: Invitación a saber más (no presión)
5. HASHTAGS: 2-3 relevantes
REGLAS:
- Beneficios > Características (no "8GB RAM", sino "edita video sin lag")
- El precio es una inversión, no un gasto
- CTA suave: "Más info en DM", "Conoce más", etc.
- NO inventes especificaciones que no están en los datos
- Usa emojis con propósito (máximo 3-4)
Responde SOLO con el texto del post.
tone_guidelines:
do:
- "Edita videos 4K sin esperar renderizados eternos"
- "Inversión que se paga sola en productividad"
- "¿Te interesa? Escríbenos para más detalles"
dont:
- "¡¡¡OFERTA INCREÍBLE!!!"
- "ÚLTIMAS UNIDADES" (a menos que sea verdad)
- "Compra ahora antes de que se acabe"

View File

@@ -0,0 +1,97 @@
name: response
description: Respuestas a interacciones de usuarios
personality: default
purpose: |
Generar respuestas apropiadas a comentarios, menciones y mensajes,
manteniendo la voz de marca y fomentando la relación con el usuario.
requirements:
- Responder al contexto específico del usuario
- Mantener tono de marca
- Fomentar continuación de conversación cuando apropiado
- Ser útil sin ser condescendiente
response_types:
question:
priority: high
goal: answer_helpfully
follow_up: offer_more_help
compliment:
priority: medium
goal: thank_genuinely
follow_up: invite_engagement
complaint:
priority: critical
goal: acknowledge_and_solve
follow_up: take_to_dm_if_complex
mention:
priority: medium
goal: engage_positively
follow_up: depends_on_context
variables:
- name: interaction_content
type: string
required: true
- name: interaction_type
type: string
required: true
options: ["comment", "mention", "reply", "dm"]
- name: sentiment
type: string
required: false
options: ["positive", "neutral", "negative", "question"]
- name: context
type: string
required: false
description: "Contexto adicional (post original, historial, etc.)"
parameters:
temperature: 0.8
max_tokens: 500
template: |
Un usuario escribió esto en redes sociales:
"{interaction_content}"
TIPO DE INTERACCIÓN: {interaction_type}
SENTIMIENTO DETECTADO: {sentiment}
CONTEXTO: {context}
Genera 3 opciones de respuesta diferentes:
1. RESPUESTA CORTA: Directa y amigable (máx 100 caracteres)
2. RESPUESTA CONVERSACIONAL: Invita a continuar el diálogo (máx 200 caracteres)
3. RESPUESTA CON CTA: Dirige a más info o contacto (máx 200 caracteres)
REGLAS SEGÚN TIPO:
Si es PREGUNTA:
- Responde de forma útil y específica
- Si no sabes algo, admítelo honestamente
- Ofrece investigar más si es necesario
Si es QUEJA:
- Empatiza primero, no te defiendas
- Ofrece solución o escalación
- Sugiere continuar por DM si es complejo
Si es CUMPLIDO:
- Agradece genuinamente (no genérico)
- Comparte crédito si aplica
- Invita a más engagement
Si es MENCIÓN:
- Reconoce la mención
- Aporta valor si es posible
- Sé natural, no forzado
TONO:
- Humano, no robótico
- Amigable pero profesional
- Útil sin ser condescendiente
- Nunca defensivo o pasivo-agresivo
Responde con las 3 opciones numeradas, una por línea.

View File

@@ -0,0 +1,87 @@
name: service_post
description: Posts promocionales para servicios
personality: promotional
purpose: |
Presentar servicios enfocándose en el problema que resuelven
y los resultados que el cliente puede esperar.
requirements:
- Enfocarse en el problema/dolor del cliente
- Mostrar resultados, no procesos
- Incluir prueba social si está disponible
- CTA consultivo (no de venta directa)
structure:
hook: pain_point_or_result
problem: what_client_struggles_with
solution: how_service_helps
results: expected_outcomes
cta: consultative_invitation
hashtags: 2_3_relevant
variables:
- name: service_name
type: string
required: true
- name: service_description
type: string
required: true
- name: category
type: string
required: true
- name: target_sectors
type: array
required: false
- name: benefits
type: array
required: false
- name: call_to_action
type: string
required: false
default: "Contáctanos para una consulta sin compromiso"
parameters:
temperature: 0.7
max_tokens: 400
template: |
Genera un post promocional para este servicio:
SERVICIO: {service_name}
DESCRIPCIÓN: {service_description}
CATEGORÍA: {category}
SECTORES OBJETIVO: {target_sectors}
BENEFICIOS: {benefits}
CTA DESEADO: {call_to_action}
ESTRUCTURA:
1. HOOK: Dolor del cliente O resultado transformador
2. PROBLEMA: Lo que el cliente enfrenta (empatía)
3. SOLUCIÓN: Cómo el servicio ayuda (sin tecnicismos)
4. RESULTADOS: Qué puede esperar el cliente
5. CTA: Invitación consultiva
6. HASHTAGS: 2-3 relevantes
TONO:
- Consultivo, no vendedor
- Empático con el problema del cliente
- Confiado pero no arrogante
- Enfocado en resultados medibles
REGLAS:
- Usa "tú" no "usted" (cercano)
- Evita jerga técnica innecesaria
- Si mencionas resultados, que sean realistas
- CTA debe ser bajo compromiso
Responde SOLO con el texto del post.
examples:
hooks:
good:
- "¿Tu equipo pierde 10+ horas/semana en tareas repetitivas?"
- "Empresas que automatizan reducen errores un 80%"
bad:
- "Ofrecemos servicios de automatización"
- "Somos expertos en IA"

View File

@@ -0,0 +1,84 @@
name: thread
description: Hilos educativos de múltiples posts
personality: educational
purpose: |
Crear hilos educativos que expliquen un tema en profundidad,
manteniendo engagement a lo largo de todos los posts.
requirements:
- Cada post debe poder funcionar solo pero mejor en conjunto
- Progresión lógica de información
- Hooks internos para mantener lectura
- Valor concreto en cada post
structure:
post_1: hook_and_promise
posts_middle: educational_content
post_final: conclusion_and_cta
variables:
- name: topic
type: string
required: true
- name: num_posts
type: integer
required: false
default: 5
min: 3
max: 10
- name: depth
type: string
required: false
default: "intermedio"
options: ["básico", "intermedio", "avanzado"]
parameters:
temperature: 0.7
max_tokens: 1500
template: |
Genera un hilo educativo de {num_posts} posts sobre: {topic}
NIVEL DE PROFUNDIDAD: {depth}
ESTRUCTURA DEL HILO:
POST 1 (HOOK):
- Captura atención con dato sorprendente, pregunta provocadora, o promesa de valor
- Indica que es un hilo: "🧵 Hilo:"
- Anticipa lo que van a aprender
POSTS 2 a {num_posts-1} (CONTENIDO):
- Cada post = 1 concepto/punto
- Empieza cada post con conexión al anterior
- Incluye ejemplo práctico cuando sea posible
- Usa formato escaneable (bullets, numeración)
POST {num_posts} (CIERRE):
- Resume los puntos clave
- Da un paso accionable
- CTA de engagement (guardar, compartir, seguir)
- Hashtags relevantes
REGLAS POR POST:
- Máximo 280 caracteres cada uno
- Numera cada post (1/, 2/, etc.)
- Emojis con propósito (1-2 por post)
- El último post lleva los hashtags
TÉCNICAS DE ENGAGEMENT:
- "Pero aquí viene lo interesante..." (transiciones)
- Preguntas retóricas entre posts
- "La mayoría no sabe esto..." (curiosidad)
- Ejemplos concretos y relatable
FORMATO DE RESPUESTA:
Responde con cada post separado por una línea vacía.
No incluyas explicaciones, solo los posts.
example_structure:
post_1: "🧵 Hilo: 5 errores de productividad que cometes sin darte cuenta (y cómo evitarlos)"
post_2: "1/ El primero: revisar email como primera tarea del día..."
post_3: "2/ El segundo error es más sutil..."
post_n: "5/ Para resumir: [puntos clave]. ¿Cuál vas a cambiar primero? #Productividad"

View File

@@ -0,0 +1,85 @@
name: tip_tech
description: Tips de tecnología cortos y accionables
personality: default
purpose: |
Generar tips prácticos que el lector pueda aplicar inmediatamente.
El valor está en la accionabilidad, no en la teoría.
requirements:
- Accionable en menos de 5 minutos
- Un solo concepto por tip
- Incluye el "por qué" importa
- Específico, no genérico
structure:
hook: attention_grabbing_first_line
body: the_tip_with_context
why: why_it_matters
close: hashtags_only
variables:
- name: category
type: string
required: true
examples: ["productividad", "ia", "seguridad", "python", "automatización"]
- name: difficulty_level
type: string
required: false
default: "principiante"
options: ["principiante", "intermedio", "avanzado"]
- name: target_audience
type: string
required: false
default: "profesionales tech"
parameters:
temperature: 0.8
max_tokens: 300
template: |
Genera un tip de tecnología sobre: {category}
NIVEL DE DIFICULTAD: {difficulty_level}
AUDIENCIA: {target_audience}
ESTRUCTURA REQUERIDA:
1. HOOK: Primera línea que capture atención (pregunta, dato sorprendente, o afirmación bold)
2. TIP: El consejo concreto y específico
3. POR QUÉ: Una línea explicando el beneficio
4. HASHTAGS: 2-3 hashtags relevantes
CRITERIOS DE CALIDAD:
- El lector debe poder aplicarlo HOY
- Debe ser específico (no "usa IA para ser más productivo", sino "usa ChatGPT para resumir emails largos")
- El hook debe generar curiosidad o resonar con un dolor común
EVITAR:
- Tips genéricos que todos conocen
- Consejos que requieran comprar algo
- Jerga técnica sin explicación
Responde SOLO con el texto del post, sin explicaciones ni meta-comentarios.
examples:
good:
- |
¿Pasas horas en reuniones improductivas?
La regla 2-2-2: máximo 2 temas, 2 decisiones, 2 acciones.
Mis reuniones ahora duran la mitad.
#Productividad #Tips
- |
El 90% ignora esto en Python:
Usa enumerate() en lugar de range(len()).
Código más limpio y 0 errores de índice.
#Python #Programming
bad:
- "Usa IA para ser más productivo" # Muy genérico
- "Compra una segunda pantalla para trabajar mejor" # Requiere compra
- "El machine learning es útil" # No es accionable