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,83 @@
platform: facebook
display_name: "Facebook"
description: "Plataforma de comunidad. Contenido más extenso y profesional."
limits:
max_characters: 63206 # Prácticamente ilimitado
recommended_characters: 400-800
max_hashtags: 3 # Menos importantes en FB
max_mentions: 50
max_links: unlimited
media_optional: true
tone:
style: professional_community
emoji_usage: moderate
formality: medium_to_high
energy: informative
audience: broader_age_range
formatting:
line_breaks: important
use_bullets: yes
bullet_style: "• ✓ →"
paragraphs: medium # 3-4 oraciones OK
whitespace: moderate
structure:
hook: attention_in_first_line
body: detailed_valuable_content
cta: clear_next_step
link: if_relevant
hashtags: minimal_at_end
hooks:
preferred:
- pregunta_comunidad # "¿Qué opinan sobre...?"
- anuncio_valor # "Nueva guía disponible:"
- insight_profesional # "Después de 5 años..."
- contenido_largo_preview # "Escribí sobre..."
avoid:
- demasiado_casual
- solo_emojis
- clickbait_obvio
cta:
frequency: 0.5
types:
- comment: "Cuéntanos en comentarios"
- share: "Comparte si te fue útil"
- click: "Más información en el link"
- message: "Escríbenos por Messenger"
- visit: "Visita nuestro sitio"
supports_links: true
hashtags:
count: 2-3
importance: low # Menos relevantes en FB
placement: end
style: professional
best_practices:
- Contenido más largo está bien
- Links clicables son ventaja vs otras plataformas
- Audiencia más amplia en edad y tech-savviness
- Posts informativos/educativos funcionan bien
- Grupos y comunidades son poderosos
- Responder comentarios aumenta alcance
audience_considerations:
- Rango de edad más amplio que otras plataformas
- No asumir conocimiento técnico avanzado
- Explicar términos cuando sea necesario
- Tono más profesional que casual
adaptation_rules: |
Cuando adaptes contenido para Facebook:
1. Puedes expandir y dar más contexto
2. Incluye links si aportan valor
3. Tono más profesional que en Threads
4. Hashtags opcionales y mínimos (2-3 max)
5. Piensa en audiencia más amplia/diversa
6. CTAs pueden ser más directos
7. Formato legible con párrafos cortos

View File

@@ -0,0 +1,86 @@
platform: instagram
display_name: "Instagram"
description: "Plataforma visual. El texto complementa la imagen."
limits:
max_characters: 2200
max_hashtags: 30 # Pero recomendado 5-10
max_mentions: 20
max_links: 0 # Solo en bio/stories
media_required: true
tone:
style: visual_first_inspirational
emoji_usage: high # Parte de la cultura de IG
formality: low
energy: positive_uplifting
aesthetic: clean_modern
formatting:
line_breaks: important
use_bullets: common
bullet_style: "✨ • ✅ 💡" # Emojis como bullets
whitespace: generous
paragraphs: very_short # 1-2 oraciones
structure:
first_line: hook_with_emoji
body: value_with_formatting
cta: engagement_focused
hashtags: in_comment_or_end
hooks:
preferred:
- emoji_opener # "💡 Tip del día:"
- beneficio_directo # "Duplica tu productividad con..."
- transformación # "De [antes] a [después]"
- lista_preview # "3 formas de..."
avoid:
- texto_puro_largo
- sin_emojis
- demasiado_técnico
cta:
frequency: 0.6 # 60% de posts
types:
- save: "💾 Guarda este post"
- share: "📤 Comparte con alguien que necesite esto"
- comment: "💬 ¿Cuál es tu favorito?"
- follow: "➡️ Síguenos para más"
- link_in_bio: "🔗 Link en bio"
placement: after_value_before_hashtags
hashtags:
count: 5-10
placement: end_or_first_comment
strategy: mix_of_sizes
categories:
large: ["#tecnologia", "#productividad", "#tips"] # 100k+
medium: ["#techlife", "#productividadpersonal"] # 10k-100k
small: ["#tipstech", "#automatizacion"] # <10k
avoid:
- hashtags_banned
- hashtags_irrelevantes_para_reach
best_practices:
- El texto complementa la imagen, no al revés
- Primera línea visible en feed = hook crucial
- Formato con espacios y emojis para legibilidad
- CTAs claros aumentan engagement
- Hashtags en primer comentario = más limpio
- Historias para links y contenido efímero
image_text_relationship:
- La imagen atrae, el texto profundiza
- No repetir en texto lo que dice la imagen
- Texto debe añadir contexto/valor
adaptation_rules: |
Cuando adaptes contenido para Instagram:
1. Piensa primero en qué imagen acompañará
2. Primera línea MUY importante (es lo que se ve)
3. Usa emojis como estructura visual (💡 ✅ ➡️)
4. Separa ideas con saltos de línea
5. CTA explícito (guardar/compartir/comentar)
6. Hashtags al final o en primer comentario
7. Más extenso está bien, la gente scrollea

View File

@@ -0,0 +1,81 @@
platform: threads
display_name: "Threads"
description: "Plataforma conversacional de Meta. Tono más casual y auténtico."
limits:
max_characters: 500
max_hashtags: 5
max_mentions: 5
max_links: 1
media_optional: true
tone:
style: conversational_authentic
emoji_usage: moderate # 2-4
formality: low_to_medium
energy: friendly
personal_voice: true # Más "yo" menos "nosotros"
formatting:
line_breaks: true
use_bullets: optional
bullet_style: "•"
whitespace: natural
paragraphs: short # 2-3 oraciones máximo
hooks:
preferred:
- pregunta_personal # "¿Alguna vez te ha pasado...?"
- historia_corta # "Ayer me di cuenta..."
- opinión_honesta # "Honestamente, creo que..."
- reflexión # "He estado pensando en..."
avoid:
- demasiado_corporativo
- hooks_de_ventas
- formalidad_excesiva
cta:
frequency: 0.4 # 40% de posts
types:
- engage: "¿Qué piensan?"
- share: "¿Les ha pasado?"
- follow: "Más contenido así aquí"
- discuss: "Debatamos en comentarios"
style: natural_not_forced
hashtags:
count: 3-5
placement: end
style: trending_relevant
recommended:
- "#Tech"
- "#Threads"
- "#Productividad"
- "#IA"
- "#Tips"
best_practices:
- Tono como si hablaras con un amigo
- Okay ser vulnerable/honesto sobre errores
- Engagement genuino en comentarios
- Contenido que invita a conversación
- Menos "profesional", más "persona real"
voice_examples:
good:
- "Voy a ser honesto: tardé años en entender esto..."
- "¿Solo a mí me pasa que...?"
- "Unpopular opinion: la productividad está sobrevalorada"
bad:
- "Nuestra empresa ofrece soluciones innovadoras..."
- "Estimados seguidores..."
- "Les compartimos información importante..."
adaptation_rules: |
Cuando adaptes contenido para Threads:
1. Hazlo más personal y conversacional
2. Añade opinión o experiencia propia
3. Invita a la conversación genuinamente
4. Puedes ser más extenso que X
5. Emojis naturales, no decorativos
6. Está bien mostrar vulnerabilidad

View File

@@ -0,0 +1,79 @@
platform: x
display_name: "X (Twitter)"
description: "Plataforma de microblogging. Contenido conciso y directo."
limits:
max_characters: 280
max_hashtags: 2
max_mentions: 3
max_links: 1
media_optional: true
tone:
style: direct_punchy
emoji_usage: minimal # 1-2 máximo
formality: medium
energy: high
formatting:
line_breaks: true
use_bullets: true
bullet_style: "→"
numbered_lists: false
whitespace: strategic # Usa espacios para legibilidad
hooks:
preferred:
- dato_impactante # "El 90% de..."
- pregunta_retórica # "¿Sabías que...?"
- afirmación_bold # "La productividad no es..."
- tip_directo # "Tip: usa..."
avoid:
- historia_larga # No hay espacio
- introducción_suave # Pierde caracteres
- múltiples_ideas # Un concepto solo
cta:
frequency: 0.3 # 30% de posts
types:
- follow: "Síguenos para más tips"
- save: "Guarda este tip"
- share: "RT si te fue útil"
- engage: "¿Qué opinas?"
placement: end_before_hashtags
hashtags:
count: 1-2
placement: end
style: no_spaces # #IA no # IA
avoid:
- hashtags_largos_incomprensibles
- más_de_2_palabras
recommended:
- "#Tech"
- "#IA"
- "#Productividad"
- "#Tips"
- "#Python"
best_practices:
- Primera línea es crucial (aparece en preview)
- Usa saltos de línea para escaneo rápido
- Un solo mensaje/idea por post
- Threads para contenido largo (no comprimir)
- Los posts con datos específicos performan mejor
avoid:
- Comprimir contenido largo en 280 chars
- Más de 2 hashtags
- Emojis excesivos
- Links en el medio del texto
- "Hilo:" sin contenido de hilo real
adaptation_rules: |
Cuando adaptes contenido para X:
1. Extrae la idea principal únicamente
2. Usa formato de lista con → si hay múltiples puntos
3. Hook en primera línea obligatorio
4. Si no cabe, sugiere crear hilo en su lugar
5. Hashtags al final, máximo 2