neural-thinker's picture
feat: clean HuggingFace deployment with essential files only
824bf31
raw
history blame
9.24 kB
#!/usr/bin/env python3
"""
Script de teste local para a API de Transparência
Testa se tudo está funcionando antes do deploy
"""
import os
import asyncio
import httpx
from datetime import datetime
# Cores para output
GREEN = '\033[92m'
RED = '\033[91m'
YELLOW = '\033[93m'
BLUE = '\033[94m'
RESET = '\033[0m'
def print_status(message: str, status: str = "info"):
"""Print colorido de status"""
if status == "success":
print(f"{GREEN}{message}{RESET}")
elif status == "error":
print(f"{RED}{message}{RESET}")
elif status == "warning":
print(f"{YELLOW}⚠️ {message}{RESET}")
else:
print(f"{BLUE}ℹ️ {message}{RESET}")
async def test_api_connection():
"""Testa conexão com a API"""
print_status("Testando conexão com API do Portal da Transparência...", "info")
api_key = os.getenv("TRANSPARENCY_API_KEY")
if not api_key:
print_status("TRANSPARENCY_API_KEY não configurada no ambiente", "error")
print_status("Configure a variável de ambiente antes de continuar", "warning")
return False
try:
async with httpx.AsyncClient(timeout=10.0) as client:
headers = {
"chave-api-dados": api_key,
"Content-Type": "application/json"
}
# Teste simples - buscar contratos do ano atual
params = {
"ano": datetime.now().year,
"pagina": 1,
"tamanhoPagina": 1
}
response = await client.get(
"https://api.portaldatransparencia.gov.br/api-de-dados/contratos",
params=params,
headers=headers
)
if response.status_code == 200:
print_status("Conexão com API bem-sucedida!", "success")
data = response.json()
print_status(f"Resposta recebida: {len(str(data))} caracteres", "info")
return True
elif response.status_code == 401:
print_status("API Key inválida ou não autorizada", "error")
return False
else:
print_status(f"Erro na API: Status {response.status_code}", "error")
print(f"Resposta: {response.text}")
return False
except Exception as e:
print_status(f"Erro de conexão: {str(e)}", "error")
return False
def test_backend_dependencies():
"""Testa se as dependências do backend estão instaladas"""
print_status("Verificando dependências do backend...", "info")
try:
import fastapi
import uvicorn
print_status(f"FastAPI backend dependencies available", "success")
return True
except ImportError:
print_status("Backend dependencies não estão instaladas", "error")
print_status("Execute: pip install fastapi uvicorn", "warning")
return False
def test_dependencies():
"""Testa todas as dependências"""
print_status("Verificando dependências...", "info")
deps = {
"httpx": "httpx",
"pydantic": "pydantic",
"fastapi": "fastapi",
"uvicorn": "uvicorn",
"dotenv": "python-dotenv"
}
all_ok = True
for name, package in deps.items():
try:
__import__(name)
print_status(f"{name} ✓", "success")
except ImportError:
print_status(f"{name} ✗ - instale com: pip install {package}", "error")
all_ok = False
return all_ok
def check_env_vars():
"""Verifica variáveis de ambiente"""
print_status("Verificando variáveis de ambiente...", "info")
vars_status = {
"TRANSPARENCY_API_KEY": os.getenv("TRANSPARENCY_API_KEY"),
"GROQ_API_KEY": os.getenv("GROQ_API_KEY")
}
for var, value in vars_status.items():
if value:
print_status(f"{var}: Configurada ({len(value)} caracteres)", "success")
else:
if var == "TRANSPARENCY_API_KEY":
print_status(f"{var}: NÃO configurada (obrigatória)", "error")
else:
print_status(f"{var}: Não configurada (opcional)", "warning")
return bool(vars_status["TRANSPARENCY_API_KEY"])
async def test_sample_query():
"""Faz uma consulta de exemplo"""
print_status("Fazendo consulta de exemplo...", "info")
# Importar a função simplificada
try:
from app_transparency_api import SimplifiedTransparencyAPI
api_key = os.getenv("TRANSPARENCY_API_KEY")
if not api_key:
print_status("Pule este teste - API key não configurada", "warning")
return
async with SimplifiedTransparencyAPI(api_key) as api:
# Buscar contratos do MEC
filters = {
"ano": 2024,
"orgao": "26000", # MEC
"pagina": 1,
"tamanho": 5
}
result = await api.search_contracts(filters)
if result["success"]:
print_status("Consulta bem-sucedida!", "success")
data = result["data"]
if isinstance(data, list):
print_status(f"Encontrados {len(data)} contratos", "info")
elif isinstance(data, dict) and "data" in data:
print_status(f"Encontrados {len(data['data'])} contratos", "info")
else:
print_status(f"Erro na consulta: {result['error']}", "error")
except Exception as e:
print_status(f"Erro ao executar consulta: {str(e)}", "error")
def create_env_template():
"""Cria arquivo .env de exemplo"""
print_status("Criando arquivo .env.example...", "info")
template = """# Cidadão.AI - Variáveis de Ambiente
# Copie este arquivo para .env e preencha com suas chaves
# OBRIGATÓRIO - API do Portal da Transparência
# Obtenha em: https://portaldatransparencia.gov.br/api-de-dados
TRANSPARENCY_API_KEY=sua_chave_aqui
# OPCIONAL - Groq AI para análises
# Obtenha em: https://console.groq.com
GROQ_API_KEY=
# OPCIONAL - Outras configurações
# PORT=7860
# DEBUG=False
"""
with open(".env.example", "w") as f:
f.write(template)
print_status(".env.example criado com sucesso", "success")
async def main():
"""Executa todos os testes"""
print(f"\n{BLUE}{'='*50}{RESET}")
print(f"{BLUE}🇧🇷 Cidadão.AI - Teste de API de Transparência{RESET}")
print(f"{BLUE}{'='*50}{RESET}\n")
# 1. Verificar dependências
print(f"\n{YELLOW}1. VERIFICANDO DEPENDÊNCIAS{RESET}\n")
deps_ok = test_dependencies()
if not deps_ok:
print_status("\nInstale as dependências faltantes antes de continuar", "error")
print_status("Use: pip install -r requirements_hf_api.txt", "warning")
return
# 2. Verificar variáveis de ambiente
print(f"\n{YELLOW}2. VERIFICANDO VARIÁVEIS DE AMBIENTE{RESET}\n")
env_ok = check_env_vars()
if not env_ok:
create_env_template()
print_status("\nConfigure as variáveis de ambiente antes de continuar", "error")
print_status("1. Copie .env.example para .env", "warning")
print_status("2. Adicione sua TRANSPARENCY_API_KEY", "warning")
return
# 3. Testar conexão com API
print(f"\n{YELLOW}3. TESTANDO CONEXÃO COM API{RESET}\n")
api_ok = await test_api_connection()
if not api_ok:
print_status("\nVerifique sua API key e conexão com internet", "error")
return
# 4. Testar Backend Dependencies
print(f"\n{YELLOW}4. TESTANDO DEPENDÊNCIAS BACKEND{RESET}\n")
backend_ok = test_backend_dependencies()
# 5. Fazer consulta de exemplo
if api_ok:
print(f"\n{YELLOW}5. FAZENDO CONSULTA DE EXEMPLO{RESET}\n")
await test_sample_query()
# Resumo final
print(f"\n{BLUE}{'='*50}{RESET}")
print(f"{BLUE}RESUMO DOS TESTES{RESET}")
print(f"{BLUE}{'='*50}{RESET}\n")
all_tests = deps_ok and env_ok and api_ok and backend_ok
if all_tests:
print_status("Todos os testes passaram! ✨", "success")
print_status("Backend está pronto para deployment!", "success")
print_status("\nPróximos passos:", "info")
print("1. Configure variáveis de ambiente no servidor")
print("2. Execute com: uvicorn app:app --host 0.0.0.0 --port 8000")
print("3. Ou use Docker: docker-compose up")
print("4. Acesse a documentação em /docs")
else:
print_status("Alguns testes falharam", "error")
print_status("Corrija os problemas antes do deployment", "warning")
print(f"\n{BLUE}{'='*50}{RESET}\n")
if __name__ == "__main__":
# Carregar .env se existir
try:
from dotenv import load_dotenv
load_dotenv()
except ImportError:
print_status("python-dotenv não instalado - variáveis de ambiente do sistema serão usadas", "warning")
# Executar testes
asyncio.run(main())