AKIRA-SOFTEDGE / PLANO_IMPLEMENTACAO_APIS_AGRUPADAS.md
akra35567's picture
Upload 55 files
13091b9 verified
|
Raw
History Blame
17.3 kB

📋 Plano de Implementação - APIs Agrupadas com Fallbacks

Documento de Planejamento Estratégico
Data: Maio 2026
Scope: Integração de 8+ APIs públicas em skills agrupadas com mecanismo de fallback
Objetivo: Expandir capacidades de Akira mantendo resiliência e coesão de resposta


1. Executive Summary (Resumo Executivo)

Este documento descreve a estratégia de integração de múltiplas APIs públicas no sistema Akira, transformando-as em skills agrupadas com mecanismo de fallback automático. Em vez de uma skill por API, cada domínio (clima, entretenimento, arte, etc.) terá uma skill que tenta múltiplas fontes de dados.

Benefícios:

  • ✅ Maior resiliência (se uma API cai, tenta a próxima)
  • ✅ Resposta mais rica (combina dados de múltiplas fontes)
  • ✅ Melhor UX (usuário recebe sempre algo válido)
  • ✅ Escalável (fácil adicionar mais fallbacks)

Timeline Estimado: 6-8 horas de implementação total


2. Análise de APIs e Agrupamento por Domínio

2.1 Domínio: Informações Gerais

A. Weather API (Clima)

Endpoint: https://wttr.in/{location}?format=j1 (ou similar) Response: JSON com temp, umidade, vento, previsão Latência Típica: 200-500ms Limite: Sem limite explícito Integração Akira:

  • Primary: Web search (análise em tempo real)
  • Fallback 1: Weather Data API
  • Fallback 2: wttr.in (sem autenticação)

Casos de Uso:

"qual é o clima em Lisboa?"
"vai chover hoje?"
"quanto graus em São Paulo?"

Estrutura de Resposta Esperada:

{
  "location": "Lisboa, Portugal",
  "temperature": "22°C",
  "condition": "Parcialmente nublado",
  "humidity": "65%",
  "wind_speed": "12 km/h",
  "forecast": [
    {"day": "Hoje", "high": "24°C", "low": "18°C", "condition": "Ensolarado"}
  ]
}

Tratamento de Erro:

  • Se ambas falharem, mensagem neutra: "Não consegui dados de clima agora, tente depois"

B. Advice Slip API (Dicas/Conselhos)

Endpoint: https://api.adviceslip.com/advice Response: {"slip_id": 123, "advice": "...texto..."} Latência Típica: 100-300ms Limite: ~500 requests/dia (verificar) Integração Akira:

  • Primary: Advice Slip API
  • Fallback 1: Cached quotes (local)

Casos de Uso:

"me dá uma dica"
"preciso de conselho"
"me inspira"

2.2 Domínio: Entretenimento

A. Joke API (Piadas)

Endpoint: https://v2.jokeapi.dev/joke/Any Response: JSON com setup + delivery ou single joke Latência: 50-200ms Integração:

  • Primary: Joke API v2
  • Fallback: Local joke library (hardcoded)

Casos de Uso:

"me conta uma piada"
"humor, eu preciso"
"piada de programador"

B. Genrenator API (Gêneros Musicais)

Endpoint: https://binaryjazz.us/genrenator/api.php?type=genre Response: String simples com gênero música Latência: 100-400ms

Casos de Uso Avançados:

"que tipo de música você gosta?"
"me recomenda um gênero"
"cria um gênero aleatório"

C. Quote API (Citações)

Endpoint: https://api.quotable.io/random Response: JSON com quote, author, tags Integração:

  • Primary: Quotable API
  • Fallback: Local quotes database

2.3 Domínio: Criatividade & Arte

A. Museum API (Museu Metropolitano)

Endpoint: https://collectionapi.metmuseum.org/public/collection/v1/search?q={query} Response: Artwork metadata com image URLs Features:

  • 470K+ obras de arte
  • Busca por keyword
  • Imagens de alta resolução
  • Sem API key necessário

Casos de Uso:

"mostra uma obra de arte sobre natureza"
"busca uma pintura renascentista"
"qual é a obra mais famosa do Monet?"

Estrutura:

{
  "objectID": 12345,
  "title": "Starry Night",
  "artistDisplayName": "Vincent van Gogh",
  "objectDate": "1889",
  "primaryImage": "https://...",
  "medium": "Oil on canvas"
}

B. Pollinations AI (Geração de Imagens - Fallback)

Endpoint: https://image.pollinations.ai/prompt/{prompt} Response: Direct image binary (PNG) Casos de Uso:

"gera uma imagem de um gato cósmico"
"cria uma imagem cyberpunk"

Integração com Akira:

  • Primary: Flux (via CellCog)
  • Fallback: Pollinations AI
  • Error Handling: Se ambas falharem, retorna descrição textual

2.4 Domínio: Música (NOVO - Detalhado)

A. Spotify API (Recomendações)

Requer: OAuth (um pouco complexo, optional) Alternativa: Last.fm API (simpler)

B. Genius API (Letras)

Endpoint: https://api.genius.com/searches?q={song} Features: Busca músicas, artistas, letras API Key: Necessário (gratuito)

C. Jikan API (Anime OST)

Endpoint: https://api.jikan.moe/v4/anime/{id} Features: OST de animes Casos de Uso: "Qual música toca em Naruto?"


3. Arquitetura de Skill Agrupada com Fallback

3.1 Padrão de Implementação

BaseSkill
├── Primary Provider (implementação preferida)
├── Fallback Chain (fallbacks ordenadas)
├── Cache Layer (respostas em cache)
├── Error Handling (tratamento gracioso)
└── Response Formatting (unificar resposta)

3.2 Pseudo-código Genérico

class WeatherSkill(BaseSkill):
    """Weather com fallbacks"""
    
    def execute(self, location: str):
        # 1. Tenta web search (tem em contexto)
        try:
            result = self.web_search(f"weather {location}")
            if result:
                return self.format_response("websearch", result)
        except Exception as e:
            logger.info(f"Web search falhou: {e}")
        
        # 2. Fallback 1: Weather API
        try:
            result = self.weather_api(location)
            if result:
                return self.format_response("weather_api", result)
        except Exception as e:
            logger.info(f"Weather API falhou: {e}")
        
        # 3. Fallback 2: wttr.in
        try:
            result = requests.get(f"https://wttr.in/{location}?format=j1")
            if result.status_code == 200:
                return self.format_response("wttr", result.json())
        except Exception as e:
            logger.info(f"wttr.in falhou: {e}")
        
        # 4. Erro final
        return {
            "erro": True,
            "mensagem": f"Não consegui encontrar clima de {location}",
            "sugestao": "Tenta com nome de cidade mais comum"
        }
    
    def format_response(self, provider, data):
        """Formata resposta independente da fonte"""
        return {
            "provider": provider,
            "location": data.get("location"),
            "temperature": data.get("temp"),
            # ... etc
        }

3.3 Integração em Skills Registry

# skills_registry.py

SKILLS_MAP = {
    "weather": WeatherSkill(),           # Agrupa: web search + Weather API
    "entertain": EntertainmentSkill(),   # Agrupa: Jokes + Advice + Quotes
    "art": ArtSkill(),                   # Agrupa: Museum + Pollinations
    "music": MusicSkill(),               # Agrupa: Genius + Jikan + Genrenator
}

4. Especificação de Cada Skill Agrupada

4.1 Skill: get_weather

Purpose: Retornar informações de clima com fallbacks automáticos

Parâmetros:

location: str (obrigatório) - "Lisboa", "São Paulo", etc
unit: str (opcional) - "celsius" (default) ou "fahrenheit"
include_forecast: bool (opcional) - true para previsão

Fallback Chain:

  1. Web search (se tiver contexto web)
  2. Weather Data API
  3. wttr.in JSON
  4. Mensagem de erro

Response Format:

{
  "sucesso": true,
  "provider": "weather_api",
  "dados": {
    "local": "Lisboa, Portugal",
    "temperatura_atual": "22°C",
    "condicao": "Parcialmente nublado",
    "humidade": "65%",
    "vento": "12 km/h",
    "sensacao_termica": "20°C",
    "previsao": [
      {
        "dia": "Hoje",
        "maxima": "24°C",
        "minima": "18°C",
        "condicao": "Ensolarado",
        "probabilidade_chuva": "10%"
      }
    ]
  },
  "timestamp": "2026-05-05T14:30:00Z"
}

4.2 Skill: get_entertainment

Purpose: Piadas, dicas, citações em uma resposta unificada

Parâmetros:

tipo: str (opcional) - "joke", "advice", "quote", ou "random" (default)
idioma: str (opcional) - "pt-BR", "en-US"
tema: str (opcional) - "programming", "life", etc

Fallback Chain:

  1. API primária (Joke, Advice, Quote API)
  2. Cache local (last 100 jokes)
  3. Resposta fixa de fallback

Response Format:

{
  "sucesso": true,
  "tipo": "joke",
  "conteudo": {
    "setup": "Por que o programador saiu de casa?",
    "punchline": "Porque o router não tinha sinal!",
    "categoria": "programming",
    "source": "jokeapi_v2"
  },
  "alternativas": [
    {
      "tipo": "quote",
      "texto": "Code is poetry written for computers"
    }
  ]
}

4.3 Skill: get_art

Purpose: Retornar obras de arte ou gerar imagens criativas

Parâmetros:

tipo: str - "search" (buscar museu) ou "generate" (criar imagem)
query: str - termo de busca
estilo: str (optional para generate) - "cyberpunk", "renaissance", etc

Fallback Chain para Search:

  1. Met Museum API
  2. Wikiart API (se implementado)
  3. Descrição textual fallback

Fallback Chain para Generate:

  1. Flux (via CellCog)
  2. Pollinations AI
  3. Descrição em ASCII art

Response Format:

{
  "sucesso": true,
  "tipo": "search",
  "obras": [
    {
      "titulo": "Starry Night",
      "artista": "Vincent van Gogh",
      "ano": 1889,
      "tecnica": "Oil on canvas",
      "imagem_url": "https://...",
      "museo": "Museum of Modern Art",
      "descricao": "Uma noite estrelada em Arles..."
    }
  ],
  "total_encontradas": 42
}

4.4 Skill: get_music (NOVO)

Purpose: Informações musicais, recomendações, análise de gêneros

Parâmetros:

tipo: str - "genre", "recommendation", "lyrics", "analysis"
artista: str (opcional)
musica: str (opcional)
mood: str (opcional) - "happy", "sad", "energetic", etc

Sub-Skills Internos:

4.4.1 Music Genre Generator

  • Endpoint: Genrenator API
  • Response: Gênero aleatório + descrição
  • Usar para: "Que tipo de música você gosta?"

4.4.2 Lyrics Finder

  • Endpoint: Genius API
  • Response: Letra + informações da música
  • Usar para: "Qual é a letra de..."

4.4.3 Anime OST Finder

  • Endpoint: Jikan API
  • Response: Lista de OSTs de anime
  • Usar para: "Qual música toca em...?"

4.4.4 Music Recommendation

  • Logic: Combina Genrenator + análise de padrão
  • Response: Recomendação personalizada

Response Format - Genre:

{
  "sucesso": true,
  "tipo": "genre",
  "genero": "Synthwave Noir",
  "descricao": "Combinação de synthwave com elementos noir",
  "artistas_exemplos": ["Carpenter Brut", "Perturbator"],
  "instrumentos": ["sintetizador", "bateria eletrônica"],
  "mood": ["dark", "energetic", "nostalgic"]
}

Response Format - Lyrics:

{
  "sucesso": true,
  "tipo": "lyrics",
  "musica": {
    "titulo": "Bohemian Rhapsody",
    "artista": "Queen",
    "ano": 1975,
    "album": "A Night at the Opera",
    "letra": "[LETRA COMPLETA]",
    "fonte": "genius_api"
  }
}

5. Tratamento de Erros e Resiliência

5.1 Estratégia de Error Handling

class SkillError(Exception):
    """Tipos de erro em skills"""
    pass

class APITimeoutError(SkillError):
    """Timeout em chamada de API"""
    pass

class APIRateLimitError(SkillError):
    """Rate limit atingido"""
    pass

class DataValidationError(SkillError):
    """Dados inválidos retornados"""
    pass

# Em cada skill:
def execute_with_retry(fn, max_retries=2, backoff=1.0):
    for attempt in range(max_retries):
        try:
            return fn()
        except APITimeoutError:
            if attempt < max_retries - 1:
                time.sleep(backoff * (2 ** attempt))
                continue
            return fallback_response()
        except APIRateLimitError:
            logger.warning("Rate limit atingido, usando cache")
            return get_cached_response()
        except Exception as e:
            logger.error(f"Erro inesperado: {e}")
            return fallback_response()

5.2 Logging Estruturado

Level: DEBUG - "Tentando Provider A"
Level: INFO  - "Provider A falhou, tentando Provider B"
Level: WARN  - "Todos providers falharam, retornando fallback"
Level: ERROR - "Erro crítico: {erro}"

6. Implementação Passo a Passo

6.1 Estrutura de Arquivos

AKIRA-SOFTEDGE/modules/
├── skills/
│   ├── __init__.py
│   ├── base_skill.py          (✨ NOVO - classe base)
│   ├── weather_skill.py       (✨ NOVO - com fallbacks)
│   ├── entertainment_skill.py (✨ NOVO - piadas+dicas+quotes)
│   ├── art_skill.py           (✨ NOVO - museu+geração)
│   └── music_skill.py         (✨ NOVO - gêneros+letras+OST)
├── skills_library.py          (existente - atualizar)
├── skills_registry.py         (existente - integrar novas)
└── api_integrations/          (✨ NOVO)
    ├── __init__.py
    ├── weather_providers.py   (wttr.in, Weather API)
    ├── entertainment_providers.py
    ├── art_providers.py       (Met Museum, Pollinations)
    └── music_providers.py     (Genius, Jikan, Genrenator)

6.2 Fases de Implementação

Fase 1 - Setup Base (1-2h)

  • Criar base_skill.py com framework
  • Criar api_integrations/ package
  • Atualizar skills_registry.py

Fase 2 - Skills Rápidas (1-2h)

  • Weather Skill (web search + fallbacks)
  • Entertainment Skill (piadas + dicas)
  • Art Skill (museu API)

Fase 3 - Music Skill Avançada (2-3h)

  • Genrenator integration
  • Genius API integration
  • Jikan API integration
  • Recomendação inteligente

Fase 4 - Testes & Deploy (1h)

  • Testes unitários
  • Testes de fallback
  • Deploy em Railway

7. Considerações Técnicas

7.1 Rate Limiting & Quotas

API Limite Estratégia
Met Museum Ilimitado Direct calls OK
Genius 10k/hr Cache responses
Jikan 60/min Add delay entre calls
Genrenator Ilimitado Direct calls OK
Weather API ~500/dia Cache 1h
Joke API Ilimitado Direct calls OK
Advice ~500/dia Cache responses

7.2 Caching Strategy

# Cache com TTL
CACHE_CONFIG = {
    "weather": {"ttl": 3600, "max_size": 100},      # 1h
    "art": {"ttl": 86400, "max_size": 500},         # 24h
    "music_genres": {"ttl": 604800, "max_size": 50}, # 7 dias
    "jokes": {"ttl": 86400, "max_size": 100}        # 24h
}

7.3 Resposta Unificada

Todas as skills seguem este padrão:

{
  "sucesso": boolean,
  "tipo": "skill_type",
  "dados": {...},
  "provider": "qual API foi usada",
  "cache_hit": boolean,
  "erro_message": "se houver erro",
  "timestamp": "ISO8601"
}

8. Testes

8.1 Unit Tests

def test_weather_primary_provider():
    """Web search deve ser tentado primeiro"""
    pass

def test_weather_fallback_chain():
    """Se primary falha, tenta fallbacks"""
    pass

def test_entertainment_caching():
    """Piadas devem ser cacheadas"""
    pass

def test_music_genre_generation():
    """Genrenator deve gerar gênero válido"""
    pass

def test_art_museum_search():
    """Met Museum deve retornar obras válidas"""
    pass

8.2 Integration Tests

def test_full_pipeline():
    """User message -> Skill execution -> Response"""
    pass

def test_fallback_on_timeout():
    """Quando API demora >2s, usa fallback"""
    pass

9. Roadmap Futuro

  • Integrar Spotify API (recomendações avançadas)
  • Implementar playlist generation
  • Add Last.fm para scrobbling
  • Lyrics search com mais fontes
  • AI music analysis (mood detection)
  • Real-time trending music

10. Conclusão

Este plano estabelece a base para um sistema robusto, resiliente e escalável de integração de APIs públicas no Akira. O mecanismo de fallback garante que o usuário sempre receba uma resposta válida, enquanto o agrupamento em skills mantém o sistema organizado e manutenível.

Timeline Total Estimado: 6-8 horas
Complexidade: Média-Alta
Risco: Baixo (todas APIs públicas e estáveis)
ROI: Alto (40+ novos casos de uso)


Próximo Passo: Executar implementação seguindo fases descritas acima.