Skip to main content
Glama
ai_content_generator.py7.71 kB
""" Generador de Contenido con IA usando Claude (Anthropic) Crea contenido para WordPress usando inteligencia artificial """ import os import logging from typing import Dict, Optional from anthropic import Anthropic logger = logging.getLogger(__name__) class AIContentGenerator: """Generador de contenido usando Claude de Anthropic""" def __init__(self): """Inicializa el generador de contenido con IA""" self.client = None self.model = "claude-3-5-sonnet-20241022" # Modelo más reciente y potente # Inicializar cliente de Anthropic si la API key está disponible api_key = os.getenv('ANTHROPIC_API_KEY') if api_key: try: self.client = Anthropic(api_key=api_key) logger.info("✅ Generador de contenido con Claude inicializado correctamente") except Exception as e: logger.error(f"❌ Error al inicializar cliente de Anthropic: {e}") self.client = None else: logger.warning("⚠️ ANTHROPIC_API_KEY no encontrada - generación de contenido IA deshabilitada") def is_available(self) -> bool: """Verifica si el generador de IA está disponible""" return self.client is not None def generate_post_content( self, prompt: str, style: str = "profesional", tone: str = "informativo", language: str = "español", max_tokens: int = 4000 ) -> Optional[Dict[str, str]]: """ Genera contenido completo para un post usando Claude Args: prompt: El tema o descripción del post a crear style: Estilo de escritura (profesional, casual, técnico, creativo) tone: Tono del contenido (informativo, persuasivo, educativo, entretenido) language: Idioma del contenido max_tokens: Máximo de tokens a generar Returns: Dict con title, content, excerpt, categories, tags """ if not self.is_available(): logger.error("❌ Generador de IA no disponible") return None try: # Construir el prompt del sistema system_prompt = f"""Eres un experto creador de contenido para WordPress. Tu tarea es generar artículos de alta calidad, SEO-optimizados y bien estructurados. Estilo: {style} Tono: {tone} Idioma: {language} IMPORTANTE: Debes responder SOLO con un objeto JSON válido con la siguiente estructura: {{ "title": "Título atractivo y optimizado para SEO (máximo 60 caracteres)", "content": "Contenido completo del artículo en formato HTML con etiquetas <h2>, <h3>, <p>, <ul>, <li>, <strong>, <em>. Debe ser extenso, informativo y bien estructurado. Mínimo 800 palabras.", "excerpt": "Resumen breve y atractivo del artículo (máximo 160 caracteres)", "categories": ["Categoría 1", "Categoría 2"], "tags": ["tag1", "tag2", "tag3", "tag4", "tag5"] }} NO incluyas ningún texto adicional fuera del JSON. El contenido debe estar en formato HTML válido.""" # Llamar a Claude logger.info(f"🤖 Generando contenido con Claude para: {prompt[:50]}...") response = self.client.messages.create( model=self.model, max_tokens=max_tokens, system=system_prompt, messages=[ { "role": "user", "content": prompt } ] ) # Extraer el contenido content = response.content[0].text logger.info(f"✅ Contenido generado exitosamente ({len(content)} caracteres)") logger.debug(f"📄 Contenido: {content[:200]}...") # Parsear el JSON import json try: result = json.loads(content) # Validar que tenga los campos necesarios required_fields = ['title', 'content', 'excerpt'] if not all(field in result for field in required_fields): logger.error("❌ La respuesta no contiene todos los campos requeridos") return None # Asegurar que categories y tags existan if 'categories' not in result: result['categories'] = [] if 'tags' not in result: result['tags'] = [] logger.info(f"✅ Contenido parseado correctamente") logger.info(f"📝 Título: {result['title']}") logger.info(f"📊 Categorías: {result['categories']}") logger.info(f"🏷️ Tags: {result['tags']}") return result except json.JSONDecodeError as e: logger.error(f"❌ Error al parsear JSON de Claude: {e}") logger.error(f"📄 Respuesta recibida: {content[:500]}") return None except Exception as e: logger.error(f"❌ Error generando contenido con Claude: {e}") return None def generate_simple_content( self, prompt: str, max_tokens: int = 2000 ) -> Optional[str]: """ Genera contenido simple basado en un prompt Args: prompt: Instrucción o pregunta para Claude max_tokens: Máximo de tokens a generar Returns: Texto generado por Claude """ if not self.is_available(): logger.error("❌ Generador de IA no disponible") return None try: logger.info(f"🤖 Generando respuesta simple con Claude...") response = self.client.messages.create( model=self.model, max_tokens=max_tokens, messages=[ { "role": "user", "content": prompt } ] ) content = response.content[0].text logger.info(f"✅ Respuesta generada: {len(content)} caracteres") return content except Exception as e: logger.error(f"❌ Error generando respuesta simple: {e}") return None def improve_content( self, original_content: str, improvements: str = "mejorar SEO, claridad y estructura" ) -> Optional[str]: """ Mejora contenido existente usando Claude Args: original_content: Contenido original a mejorar improvements: Qué aspectos mejorar Returns: Contenido mejorado """ if not self.is_available(): logger.error("❌ Generador de IA no disponible") return None try: prompt = f"""Mejora el siguiente contenido enfocándote en: {improvements} Contenido original: {original_content} Devuelve el contenido mejorado en formato HTML válido, manteniendo la estructura pero optimizando el texto.""" logger.info(f"🤖 Mejorando contenido con Claude...") response = self.client.messages.create( model=self.model, max_tokens=4000, messages=[ { "role": "user", "content": prompt } ] ) improved = response.content[0].text logger.info(f"✅ Contenido mejorado exitosamente") return improved except Exception as e: logger.error(f"❌ Error mejorando contenido: {e}") return None

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/JRafael2023/mcpwp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server