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:
83
app/prompts/platforms/facebook.yaml
Normal file
83
app/prompts/platforms/facebook.yaml
Normal 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
|
||||
86
app/prompts/platforms/instagram.yaml
Normal file
86
app/prompts/platforms/instagram.yaml
Normal 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
|
||||
81
app/prompts/platforms/threads.yaml
Normal file
81
app/prompts/platforms/threads.yaml
Normal 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
|
||||
79
app/prompts/platforms/x.yaml
Normal file
79
app/prompts/platforms/x.yaml
Normal 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
|
||||
Reference in New Issue
Block a user