-
Notifications
You must be signed in to change notification settings - Fork 45
FAQ
Esta seção contém as perguntas mais frequentes sobre o projeto Mangaba AI, organizadas por categoria para facilitar sua consulta. Se você não encontrar sua dúvida aqui, consulte nosso Glossário ou abra uma discussion no GitHub.
- 🚀 Primeiros Passos
- ⚙️ Configuração e Instalação
- 📦 UV vs pip - Qual usar?
- 🤖 Uso do Agente
- 🌐 Protocolos A2A e MCP
- 🐛 Problemas Comuns
- 🔧 Desenvolvimento e Contribuição
- 💰 Custos e Limites
- 🔐 Segurança e Privacidade
O Mangaba AI é um framework brasileiro para criação de agentes de inteligência artificial que combina:
- 🤖 Agente Principal: Baseado no Google Generative AI (Gemini)
- 🔗 Protocolo A2A: Para comunicação entre múltiplos agentes
- 🧠 Protocolo MCP: Para gerenciamento inteligente de contexto
- ⚡ Performance: Otimizado para alta escalabilidade
O Mangaba AI é ideal para:
- 📄 Análise de documentos: Contratos, relatórios, artigos
- 🤝 Assistentes virtuais: Atendimento ao cliente, suporte técnico
- 🔄 Automação de processos: Fluxos de trabalho complexos
- 🌐 Tradução: Textos técnicos e especializados
- 📊 Análise de dados: Insights e relatórios automatizados
Depende do seu objetivo:
- 🟢 Uso básico: Exemplos prontos, scripts de configuração automática
- 🟡 Personalização: Conhecimento básico de Python é recomendado
- 🔴 Desenvolvimento avançado: Conhecimento sólido de Python e APIs
Sim e não:
- ✅ Código do Mangaba AI: Totalmente gratuito (MIT License)
- 💰 API do Google: Paga por uso (mas tem limite gratuito generoso)
- 📊 Custos típicos: R$ 10-50/mês para uso pessoal/pequeno
Sistema:
- 🐍 Python: 3.8 ou superior
- 💾 RAM: 2GB mínimo, 4GB recomendado
- 💿 Espaço: 1GB para instalação completa
- 🌐 Internet: Conexão estável para API calls
Conta Google:
- 🔑 Google Cloud Account: Para obter API key
- 💳 Billing ativado: Para usar além do limite gratuito
Passo a passo:
- 🌐 Acesse Google AI Studio
- 🔑 Faça login com sua conta Google
- ➕ Clique em "Create API Key"
- 📋 Copie a chave gerada
- 🔐 Configure no arquivo
.env:GOOGLE_API_KEY=sua_chave_aqui
Soluções comuns:
1. Problema com dependências:
# Com UV (mais rápido):
uv sync --reinstall
# Com pip (tradicional):
# Atualizar pip
python -m pip install --upgrade pip
# Instalar com verbose para ver erros
pip install -r requirements.txt -v2. Python muito antigo:
# Verificar versão (precisa ser 3.9+)
python --version
# Se menor que 3.9, instalar versão mais nova3. Problemas de permissão:
# Use ambiente virtual (UV ou pip):
# Opção A: UV
uv venv
source .venv/bin/activate # Linux/Mac
.\.venv\Scripts\Activate.ps1 # Windows
uv sync
# Opção B: pip
python -m venv .venv
source .venv/bin/activate # Linux/Mac
.\.venv\Scripts\Activate.ps1 # Windows
pip install -r requirements.txtExecute nosso script de validação:
python scripts/validate_env.pyTeste básico:
python examples/basic_example.pySe ambos funcionarem, está tudo certo! ✅
UV é um gerenciador de pacotes Python moderno, escrito em Rust, que é 10-100x mais rápido que o pip tradicional. Veja a comparação:
| Característica | UV | pip |
|---|---|---|
| Velocidade | ⚡ 10-100x mais rápido | 🐢 Tradicional |
| Resolução de dependências | 🎯 Muito mais rápida | ⏳ Pode ser lenta |
| Lock file | ✅ uv.lock (determinístico) | ❌ Não nativo |
| Cache inteligente | ✅ Global e eficiente | 🔄 Básico |
| Compatibilidade | ✅ 100% compatível com pip | ✅ Padrão Python |
| Maturidade | 🆕 Novo (2024+) | 🏛️ Estabelecido |
Use UV se:
- ⚡ Você quer velocidade máxima
- 🔄 Trabalha com CI/CD
- 📦 Gerencia muitos projetos
- 🆕 Está confortável com ferramentas modernas
Use pip se:
- 🏢 Seu ambiente corporativo exige pip
- 🛠️ Você prefere ferramentas estabelecidas
- 📚 Quer máxima compatibilidade histórica
- 🎯 Simplicidade é prioridade
Ambos funcionam perfeitamente com Mangaba AI! 🎉
# 1. Instalar UV
pip install uv
# 2. Criar .venv com UV
uv venv
# 3. Ativar ambiente
# Windows
.\.venv\Scripts\Activate.ps1
# Linux/Mac
source .venv/bin/activate
# 4. Sincronizar dependências
uv sync
# Pronto! Tudo instalado 10-100x mais rápido 🚀# 1. Desativar ambiente atual
deactivate
# 2. Remover .venv
rm -rf .venv # Linux/Mac
Remove-Item -Recurse -Force .venv # Windows
# 3. Criar novo .venv com venv padrão
python -m venv .venv
# 4. Ativar
source .venv/bin/activate # Linux/Mac
.\.venv\Scripts\Activate.ps1 # Windows
# 5. Instalar com pip
pip install -r requirements.txtSim! Cada projeto pode usar o gerenciador que preferir:
# Projeto A com UV
cd projeto-a
uv sync
# Projeto B com pip
cd ../projeto-b
pip install -r requirements.txtMangaba AI suporta ambos igualmente! 🎯
Exemplo mais simples:
from mangaba_agent import MangabaAgent
# Criar agente
agente = MangabaAgent(
api_key="sua_chave_google",
agent_id="meu_primeiro_agente"
)
# Usar
resposta = agente.chat("Olá! Como você pode me ajudar?")
print(resposta)O contexto MCP faz isso automaticamente:
# Primeira interação
agente.chat("Meu nome é João e trabalho com marketing")
# Segunda interação - ele lembrará do contexto
agente.chat("Que estratégias você recomenda para minha área?")
# Resposta considerará que você trabalha com marketing!Sim, desabilitando o MCP:
# Sem contexto
resposta = agente.chat("Sua pergunta", use_context=False)
# Ou criando agente sem MCP
agente = MangabaAgent(
api_key="sua_chave",
enable_mcp=False
)Para textos longos:
# Ler arquivo
with open("documento.txt", "r", encoding="utf-8") as f:
texto = f.read()
# Análise especializada
resultado = agente.analyze_text(
text=texto,
instruction="Faça um resumo executivo destacando pontos principais"
)
print(resultado)Tradução especializada:
# Texto técnico
texto_original = "Machine learning algorithms require extensive data preprocessing"
# Tradução contextualizada
traducao = agente.translate(
text=texto_original,
target_language="português brasileiro técnico"
)
print(traducao)
# Output: "Algoritmos de aprendizado de máquina requerem pré-processamento extensivo de dados"A2A (Agent-to-Agent) permite que múltiplos agentes se comuniquem:
- 🔄 Comunicação bidirecional: Agentes podem conversar entre si
- 📡 Broadcast: Um agente pode falar com vários simultaneamente
- 🎯 Handlers específicos: Cada agente pode ter especialidades
- 🌐 Rede distribuída: Agentes podem estar em máquinas diferentes
Exemplo prático:
# Agente 1 (Analista)
agente1 = MangabaAgent(agent_id="analista_financeiro")
agente1.setup_a2a_protocol(port=8080)
# Agente 2 (Redator)
agente2 = MangabaAgent(agent_id="redator_relatorios")
agente2.setup_a2a_protocol(port=8081)
# Conectar agente1 ao agente2
agente1.a2a_protocol.connect_to_agent("localhost", 8081)
# Comunicação
resultado = agente1.send_agent_request(
target_agent_id="redator_relatorios",
action="chat",
params={"message": "Preciso de um resumo executivo dos dados financeiros"}
)
print(resultado)MCP (Model Context Protocol) gerencia o contexto das conversas:
- 🧠 Memória inteligente: Lembra informações relevantes
- 🏷️ Tags e categorias: Organiza contextos por tipo
- 🔍 Busca avançada: Encontra contextos relevantes automaticamente
- ⏰ Gestão temporal: Remove contextos antigos automaticamente
Operações básicas:
# Ver contexto atual
resumo = agente.get_context_summary()
print(resumo)
# Limpar contexto da sessão
agente.mcp.clear_session(agente.current_session_id)
# Adicionar contexto específico
from protocols.mcp import MCPContext, ContextType
contexto = MCPContext.create(
context_type=ContextType.USER,
content="Usuário é desenvolvedor Python sênior",
tags=["perfil", "usuario", "desenvolvedor"]
)
agente.mcp.add_context(contexto, agente.current_session_id)Sim! Exemplo de especialização:
class AgenteMedico(MangabaAgent):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
# Handler especializado
@self.a2a_protocol.register_handler("diagnosticar")
def handle_diagnostico(message):
sintomas = message.content.get("sintomas")
return self.analyze_text(
sintomas,
"Análise médica: liste possíveis diagnósticos"
)
class AgenteJuridico(MangabaAgent):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@self.a2a_protocol.register_handler("analisar_contrato")
def handle_contrato(message):
contrato = message.content.get("texto")
return self.analyze_text(
contrato,
"Análise jurídica: identifique cláusulas importantes e riscos"
)Soluções:
1. Verificar a chave:
# No terminal
echo $GOOGLE_API_KEY2. Testar a chave manualmente:
import google.generativeai as genai
genai.configure(api_key="sua_chave")
model = genai.GenerativeModel('gemini-pro')
response = model.generate_content("Teste")
print(response.text)3. Problemas comuns:
- ❌ Chave com espaços ou caracteres especiais
- ❌ Chave expirada ou desativada
- ❌ Billing não configurado no Google Cloud
Estratégias de otimização:
1. Use cache:
# Cache automático para respostas repetidas
from utils.cache import ResponseCache
cache = ResponseCache()
agente = CachedMangabaAgent(cache=cache)2. Reduza o contexto:
# Chat sem contexto para respostas rápidas
resposta = agente.chat("pergunta", use_context=False)3. Use modelo mais rápido:
agente = MangabaAgent(
model="gemini-pro", # Mais rápido que gemini-pro-vision
api_key="sua_chave"
)Troubleshooting A2A:
1. Verificar portas:
# Usar portas diferentes para cada agente
agente1.setup_a2a_protocol(port=8080)
agente2.setup_a2a_protocol(port=8081)2. Verificar firewall:
# Linux: verificar se portas estão abertas
sudo ufw status
sudo ufw allow 8080
sudo ufw allow 80813. Teste de conectividade:
# Testar se agente está respondendo
import requests
response = requests.get("http://localhost:8080/health")
print(response.status_code) # Deve ser 200Gestão de contexto:
# Verificar tamanho do contexto
contextos = agente.mcp.get_contexts(agente.current_session_id)
print(f"Total de contextos: {len(contextos)}")
# Limpar contextos antigos (mais de 24h)
agente.mcp.cleanup_old_contexts(max_age_hours=24)
# Resumir contextos de baixa prioridade
agente.mcp.summarize_low_priority_contexts()
# Limpar tudo se necessário
agente.mcp.clear_session(agente.current_session_id)Controle de rate limiting:
import time
from functools import wraps
def rate_limit(calls_per_minute=30):
def decorator(func):
last_called = [0.0]
@wraps(func)
def wrapper(*args, **kwargs):
elapsed = time.time() - last_called[0]
left_to_wait = 60.0 / calls_per_minute - elapsed
if left_to_wait > 0:
time.sleep(left_to_wait)
ret = func(*args, **kwargs)
last_called[0] = time.time()
return ret
return wrapper
return decorator
# Uso
@rate_limit(calls_per_minute=20)
def fazer_requisicao_limitada():
return agente.chat("sua pergunta")Consulte nosso guia completo: CONTRIBUICAO.md
Primeiros passos:
- 🍴 Faça fork do repositório
- 📥 Clone localmente
- 🔧 Configure ambiente de desenvolvimento
- 🧪 Execute testes
- ✨ Implemente melhorias
- 📤 Abra Pull Request
Testes básicos:
# Instalar dependências de teste
pip install -r requirements-test.txt
# Executar todos os testes
python -m pytest tests/ -v
# Executar testes específicos
python -m pytest tests/test_agent.py -v
# Com cobertura
coverage run -m pytest tests/
coverage report -mEstrutura básica:
# protocols/meu_protocolo.py
from abc import ABC, abstractmethod
from typing import Dict, Any
class MeuProtocolo(ABC):
def __init__(self, config: Dict[str, Any]):
self.config = config
self.ativo = False
@abstractmethod
def start(self) -> bool:
"""Inicializar protocolo"""
pass
@abstractmethod
def stop(self) -> bool:
"""Parar protocolo"""
pass
@abstractmethod
def send_message(self, message: str, target: str) -> Dict:
"""Enviar mensagem"""
pass
# Implementação específica
class ProtocoloWebSocket(MeuProtocolo):
def start(self):
# Implementar lógica de WebSocket
self.ativo = True
return True
def stop(self):
self.ativo = False
return True
def send_message(self, message, target):
# Implementar envio via WebSocket
return {"success": True, "response": "Message sent"}Debug do agente:
import logging
# Habilitar debug
logging.basicConfig(level=logging.DEBUG)
# Criar agente com debug
agente = MangabaAgent(
api_key="sua_chave",
agent_id="debug_agent"
)
# Log detalhado será exibido
agente.chat("teste de debug")Debug A2A:
# Habilitar logs A2A
agente.a2a_protocol.enable_debug = True
# Ver mensagens trocadas
agente.send_agent_request("outro_agente", "chat", {"message": "teste"})Custo do Mangaba AI: Gratuito (MIT License)
Custo da API Google (Dezembro 2024):
- 🆓 Limite gratuito: 15 RPM (requests por minuto)
- 💰 Pago: US$ 0.000125 por 1K caracteres de input
- 💰 Output: US$ 0.000375 por 1K caracteres de output
Estimativa de uso típico:
📱 Uso pessoal: R$ 0-10/mês
🏢 Pequena empresa: R$ 50-200/mês
🏭 Empresa média: R$ 500-2000/mês
1. No Google Cloud Console:
- 💰 Billing → View detailed charges
- 📊 APIs & Services → Quotas
2. No código:
# Contador simples de tokens
class CostTracker:
def __init__(self):
self.total_input_chars = 0
self.total_output_chars = 0
def track_request(self, input_text: str, output_text: str):
self.total_input_chars += len(input_text)
self.total_output_chars += len(output_text)
def estimate_cost(self):
input_cost = (self.total_input_chars / 1000) * 0.000125
output_cost = (self.total_output_chars / 1000) * 0.000375
return input_cost + output_cost
# Uso
tracker = CostTracker()
# Integrar com agente
class CostAwareMangabaAgent(MangabaAgent):
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
self.cost_tracker = CostTracker()
def chat(self, message: str, **kwargs) -> str:
response = super().chat(message, **kwargs)
self.cost_tracker.track_request(message, response)
return responseEstratégias de economia:
1. Cache inteligente:
# Evita chamar API para respostas idênticas
agente = CachedMangabaAgent(
cache_duration=3600 # 1 hora
)2. Contexto otimizado:
# Limitar contexto quando não necessário
agente.chat("pergunta simples", use_context=False)3. Rate limiting:
# Controlar frequência de chamadas
@rate_limit(calls_per_minute=10)
def usar_agente_economico():
return agente.chat("pergunta")4. Batch processing:
# Processar múltiplas perguntas de uma vez
perguntas = ["pergunta1", "pergunta2", "pergunta3"]
prompt = "Responda todas as perguntas:\n" + "\n".join(perguntas)
resposta_batch = agente.chat(prompt)Fluxo de dados:
- 📱 Seu dispositivo → Envia texto para API Google
- 🌐 Google AI → Processa e retorna resposta
- 💾 Contexto MCP → Armazenado localmente (opcional)
Dados NÃO são:
- ❌ Enviados para servidores do Mangaba AI
- ❌ Compartilhados com terceiros
- ❌ Usados para treinamento por padrão
1. Sanitização de dados:
import re
def sanitizar_dados_sensiveis(texto):
"""Remove informações sensíveis do texto"""
# CPF
texto = re.sub(r'\d{3}\.\d{3}\.\d{3}-\d{2}', '[CPF_REMOVIDO]', texto)
# Email
texto = re.sub(r'\S+@\S+\.\S+', '[EMAIL_REMOVIDO]', texto)
# Telefone
texto = re.sub(r'\(\d{2}\)\s*\d{4,5}-?\d{4}', '[TELEFONE_REMOVIDO]', texto)
return texto
# Uso
texto_original = "Meu CPF é 123.456.789-00"
texto_limpo = sanitizar_dados_sensiveis(texto_original)
resposta = agente.chat(texto_limpo)2. Contexto temporário:
# Usar sessão temporária para dados sensíveis
sessao_temp = agente.mcp.create_temporary_session()
agente.current_session_id = sessao_temp
# Usar agente normalmente
resposta = agente.chat("análise de dados sensíveis")
# Limpar sessão após uso
agente.mcp.delete_session(sessao_temp)3. Modo offline (futuro):
# Planejado para próximas versões
agente = MangabaAgent(
mode="offline", # Usar modelo local
model_path="./models/gemini-local"
)Log sanitizado:
import logging
import re
class SecureLogFormatter(logging.Formatter):
def format(self, record):
# Sanitizar mensagem do log
if hasattr(record, 'msg'):
record.msg = self.sanitize_message(str(record.msg))
return super().format(record)
def sanitize_message(self, message):
# Remover informações sensíveis
message = re.sub(r'\d{3}\.\d{3}\.\d{3}-\d{2}', '[CPF]', message)
message = re.sub(r'\S+@\S+\.\S+', '[EMAIL]', message)
return message
# Configurar logger seguro
logger = logging.getLogger('mangaba.secure')
handler = logging.StreamHandler()
handler.setFormatter(SecureLogFormatter())
logger.addHandler(handler)Sistema de permissões básico:
from enum import Enum
from typing import Set
class Permission(Enum):
READ = "read"
WRITE = "write"
ADMIN = "admin"
class SecureAgent:
def __init__(self, agent: MangabaAgent, user_permissions: Set[Permission]):
self.agent = agent
self.permissions = user_permissions
def require_permission(self, required: Permission):
if required not in self.permissions:
raise PermissionError(f"Permissão {required.value} necessária")
def chat(self, message: str) -> str:
self.require_permission(Permission.READ)
return self.agent.chat(message)
def analyze_text(self, text: str, instruction: str) -> str:
self.require_permission(Permission.WRITE)
return self.agent.analyze_text(text, instruction)
def clear_context(self):
self.require_permission(Permission.ADMIN)
self.agent.mcp.clear_session(self.agent.current_session_id)
# Uso
user_permissions = {Permission.READ, Permission.WRITE}
secure_agent = SecureAgent(agente, user_permissions)
# Funcionará
response = secure_agent.chat("pergunta")
# Falhará - sem permissão admin
# secure_agent.clear_context() # PermissionError| Canal | Melhor Para | Tempo de Resposta |
|---|---|---|
| 📚 Wiki | Consulta geral | Imediato |
| 📖 Documentação | Referência técnica | Imediato |
| 💬 GitHub Discussions | Perguntas da comunidade | 1-3 dias |
| 🐛 GitHub Issues | Bugs e problemas | 1-7 dias |
- 🎓 Iniciante: Comece pelo Curso Básico
- 🔧 Configuração: Consulte Setup Detalhado
- ⭐ Avançado: Leia Melhores Práticas
- 🤝 Contribuir: Veja Como Contribuir
- 📝 Termos: Consulte o Glossário
- 📖 Sempre consulte a documentação primeiro
- 🧪 Teste em ambiente de desenvolvimento
- 💰 Monitore custos da API Google
- 🔐 Proteja informações sensíveis
- 🤝 Contribua com a comunidade
💡 Lembrete: Esta FAQ é atualizada regularmente. Marque nos favoritos!
🆘 Não encontrou sua dúvida? Abra uma discussion - sua pergunta pode ajudar outros usuários!
Última atualização: Dezembro 2024 | Versão: 1.0