""" ArtSkill - Busca de arte e geração de imagens com fallbacks """ from modules.skills.base_skill import BaseSkill from modules.api_integrations.art_providers import ArtProviders class ArtSkill(BaseSkill): """ Skill de arte que pode: 1. Buscar no Museu Metropolitano (470k+ obras) 2. Gerar imagens via Pollinations AI 3. Retornar ASCII art como fallback criativo """ def __init__(self): super().__init__( name="get_art", description="Busca obras de arte ou gera imagens com fallbacks automáticos" ) def get_primary_provider(self): """Tipo depende se é search ou generate""" return self.art_primary def get_fallback_chain(self): """Fallbacks criativos""" return [ self.art_fallback, ] def art_primary(self, tipo: str = "search", query: str = None, **kwargs) -> dict: """ Provider primário dependendo do tipo: - search: Museu Metropolitano - generate: Pollinations AI (fallback de Flux) """ tipo = tipo.lower().strip() if tipo == "search": if not query: return {"sucesso": False, "erro": "Parâmetro 'query' obrigatório para busca"} result = ArtProviders.search_metropolitan_museum(query, max_results=3) if result and result.get("sucesso"): return result return {"sucesso": False, "erro": "Museu não encontrou obras"} elif tipo == "generate": if not query: return {"sucesso": False, "erro": "Parâmetro 'query' obrigatório para gerar imagem"} style = kwargs.get("style") prompt = f"{query}" if style: prompt = f"{query} in {style} style" result = ArtProviders.generate_with_pollinations(prompt) if result and result.get("sucesso"): return result return {"sucesso": False, "erro": "Geração de imagem falhou"} else: return {"sucesso": False, "erro": f"Tipo '{tipo}' desconhecido (use 'search' ou 'generate')"} def art_fallback(self, tipo: str = "search", query: str = None, **kwargs) -> dict: """ Fallback: ASCII art criativo """ tipo = tipo.lower().strip() if tipo == "generate": # Para geração, retorna ASCII art theme = kwargs.get("theme", "cat") return ArtProviders.generate_simple_ascii_art(theme) # Para busca, retorna descrição poética return { "sucesso": True, "tipo": "poetic_description", "descricao": f"A arte não pode ser capturada em palavras, apenas sentida. '{query}' evoca emoções e sensações únicas em cada observador.", "fonte": "fallback_philosophical" } def _get_error_suggestion(self) -> str: return "Tenta com termo de busca diferente ou mais específico"