Solucao de Problemas
Solucao de Problemas
Seção intitulada “Solucao de Problemas”Problemas comuns encontrados durante desenvolvimento e operacao em producao, com passos de diagnostico e solucoes.
Conectividade com Bancos de Dados
Seção intitulada “Conectividade com Bancos de Dados”Neo4j retorna 503 nos endpoints de grafo
Seção intitulada “Neo4j retorna 503 nos endpoints de grafo”Sintoma: Endpoints de analitico de grafo (/v1/graph/*) retornam 503 Service Unavailable.
Causa: O Neo4j nao esta incluido no docker-compose.yml por design. Ele deve ser configurado separadamente.
Solucao:
Opcao A — Neo4j local:
# Instalar e iniciar Neo4j localmentebrew install neo4j # macOSneo4j startOpcao B — Neo4j Aura (cloud):
# Defina estes valores no seu arquivo .envNEO4J_URI=neo4j+s://your-instance.databases.neo4j.ioNEO4J_USERNAME=neo4jNEO4J_PASSWORD=your-passwordConexao recusada do Redis
Seção intitulada “Conexao recusada do Redis”Sintoma: ConnectionRefusedError ao iniciar ou redis.exceptions.ConnectionError durante requests.
Causa: O container do Redis nao esta rodando.
Solucao:
# Iniciar containers de infraestrutura (PostgreSQL, Redis, Qdrant)make docker-up
# Verificar se o Redis esta rodandodocker compose ps redisImpacto se o Redis estiver fora:
- Cache desabilitado (requests consultam o banco diretamente)
- Rate limiting falha fechado — todas as requests sao bloqueadas (v1.0 corrigira para fail-open)
- Workers ARQ em background nao conseguem processar jobs
Falhas de migracao do PostgreSQL
Seção intitulada “Falhas de migracao do PostgreSQL”Sintoma: alembic upgrade head falha com conflitos de schema ou erros de conexao.
Causa: Banco nao esta rodando, ou historico de migracoes esta fora de sincronia.
Solucao:
# Garantir que o PostgreSQL esta rodandomake docker-up
# Rodar migracoesmake migrate
# Se houver conflitos, verificar o historico de migracoesalembic -c migrations/alembic.ini history
# Para ver a revisao atual do bancoalembic -c migrations/alembic.ini currentSe uma migracao falhar no meio:
- Verifique em qual revisao o banco esta com
alembic current - Revise a migracao que falhou em
migrations/versions/ - Se a migracao tem uma funcao
downgrade(), voce pode reverter:alembic -c migrations/alembic.ini downgrade -1 - Se a migracao e marcada como irreversivel, consulte o PR que a introduziu para um plano de contingencia
Modelo de Embedding
Seção intitulada “Modelo de Embedding”Download do modelo falha ou esta lento
Seção intitulada “Download do modelo falha ou esta lento”Sintoma: make download-model trava, atinge timeout ou falha com erro de rede.
Causa: Downloads de modelos do Hugging Face podem ser grandes (~500MB para Legal-BERTimbau) e sao afetados por condicoes de rede.
Solucao:
# Tentar novamente o downloadmake download-model
# Se o download continua falhando, verifique sua rede e o status do HuggingFacecurl -I https://huggingface.co
# Alternativa: usar um servico de embedding remoto em vez do modelo local# Defina no .env:VALTER_EMBEDDING_SERVICE_URL=https://your-embedding-service/encodeO modelo e cacheado em ~/.cache/huggingface/ apos o primeiro download bem-sucedido. Inicializacoes subsequentes usarao o cache.
Incompatibilidade de dimensao no Qdrant
Seção intitulada “Incompatibilidade de dimensao no Qdrant”Sintoma: A busca retorna um erro sobre dimensoes de vetor nao coincidindo com a configuracao da collection.
Causa: A collection do Qdrant foi criada com uma dimensao de embedding diferente da que o modelo atual produz. Isso acontece ao trocar modelos de embedding (ex: de um modelo 384d para o Legal-BERTimbau 768d).
Solucao:
- Verificar a dimensao do modelo atual:
python -c "from sentence_transformers import SentenceTransformer; m = SentenceTransformer('rufimelo/Legal-BERTimbau-sts-base'); print(m.get_sentence_embedding_dimension())"# Saida esperada: 768- Verificar se a variavel de ambiente
VALTER_EMBEDDING_DIMENSIONcorresponde:
# No .envVALTER_EMBEDDING_DIMENSION=768- Se a collection foi criada com a dimensao errada, ela deve ser recriada:
# ATENCAO: Isso deleta todos os vetores indexados. Voce precisara re-indexar.python -c "from qdrant_client import QdrantClient; c = QdrantClient('localhost', port=6333); c.delete_collection('valter_documents')"Apos deletar a collection, reinicie a aplicacao — ela recriara a collection com a dimensao correta ao iniciar.
Problemas de OCR
Seção intitulada “Problemas de OCR”OCR falha com ImportError
Seção intitulada “OCR falha com ImportError”Sintoma: ImportError: No module named 'pytesseract' ou FileNotFoundError: tesseract is not installed.
Causa: OCR tem duas dependencias — o pacote Python e o binario do sistema. Ambos devem estar instalados.
Solucao:
# Instalar os extras de OCR do Pythonpip install -e ".[ocr]"
# Instalar o binario Tesseract do sistema# macOS:brew install tesseract tesseract-lang
# Ubuntu/Debian:sudo apt-get install tesseract-ocr tesseract-ocr-por
# Verificar instalacaotesseract --versionServidor MCP
Seção intitulada “Servidor MCP”MCP stdio nao conecta ao Claude Desktop
Seção intitulada “MCP stdio nao conecta ao Claude Desktop”Sintoma: O Claude Desktop nao lista as tools do Valter, ou mostra um erro de conexao.
Causa: Configuracao incorreta do claude_desktop_config.json.
Solucao:
- Verifique seu arquivo de configuracao do Claude Desktop (localizacao depende do SO):
{ "mcpServers": { "valter": { "command": "python", "args": ["-m", "valter.mcp.stdio_server"], "env": { "PYTHONPATH": "/path/to/Valter/src" } } }}-
Problemas comuns a verificar:
- O
commanddeve apontar para o binario Python correto (use o caminho completo se estiver usando um ambiente virtual:/path/to/Valter/.venv/bin/python) PYTHONPATHdeve incluir o diretoriosrc/- Variaveis de ambiente necessarias pelo Valter (URLs de banco, API keys) devem estar presentes no bloco
envou serem herdadas do shell
- O
-
Reinicie o Claude Desktop apos alterar a configuracao.
MCP remote retorna 401 Unauthorized
Seção intitulada “MCP remote retorna 401 Unauthorized”Sintoma: Cliente MCP remoto recebe 401 Unauthorized ao chamar tools.
Causa: API key invalida ou ausente na request.
Solucao:
- Verifique se as API keys estao configuradas no servidor:
# No .env — lista separada por virgula de keys validasVALTER_MCP_SERVER_API_KEYS=key1,key2-
Verifique se o cliente esta enviando a key corretamente (como Bearer token ou no header configurado).
-
Inicie o servidor MCP remote e verifique os logs para erros de autenticacao:
make mcp-remote# Observe entradas 401 na saida de log estruturadoDesenvolvimento
Seção intitulada “Desenvolvimento”ruff nao encontrado
Seção intitulada “ruff nao encontrado”Sintoma: make lint falha com ruff: command not found.
Causa: O ambiente virtual nao esta ativado, ou ruff nao esta instalado.
Solucao:
# Ativar o ambiente virtualsource .venv/bin/activate
# Se ruff nao esta instaladopip install ruff
# Entao execute o lintmake lintTestes falham com erros de async
Seção intitulada “Testes falham com erros de async”Sintoma: Testes falham com RuntimeError: no current event loop ou PytestUnraisableExceptionWarning relacionado a asyncio.
Causa: O modo do pytest-asyncio nao esta configurado corretamente.
Solucao:
Verifique se o pyproject.toml tem o modo asyncio correto:
[tool.pytest.ini_options]asyncio_mode = "auto"Se a configuracao esta correta mas os testes ainda falham, verifique se pytest-asyncio esta instalado:
pip install pytest-asyncioErros de verificacao de tipo com mypy
Seção intitulada “Erros de verificacao de tipo com mypy”Sintoma: make quality falha na etapa do mypy com erros de tipo.
Causa: Type stubs faltando ou violacoes de tipagem estrita.
Solucao:
O target quality executa mypy apenas em um subconjunto de arquivos definido (definido em MYPY_QUALITY_SCOPE no Makefile). Se voce esta adicionando novos arquivos ao escopo, garanta que eles tenham anotacoes de tipo completas em todas as funcoes publicas.
# Executar mypy apenas nos arquivos no escopomypy --follow-imports=silent src/valter/api/deps.py src/valter/api/routes/ingest.py src/valter/mcp/tools.pyProducao
Seção intitulada “Producao”Rate limiting bloqueia todas as requests
Seção intitulada “Rate limiting bloqueia todas as requests”Sintoma: Todas as requests de API retornam 429 Too Many Requests ou 503 Service Unavailable, mesmo com trafego baixo.
Causa: Redis esta fora e o rate limiter esta configurado para fail-closed. Quando o Redis esta inacessivel, nenhuma verificacao de rate limit pode passar, entao todas as requests sao rejeitadas.
Solucao (imediata):
# Reiniciar Redisdocker compose restart redis
# Verificar se o Redis esta respondendodocker compose exec redis redis-cli ping# Esperado: PONGSolucao (permanente): Isto esta rastreado como a correcao de maior prioridade para v1.0 — mudar o rate limiter para fail-open para API keys validas quando o Redis estiver indisponivel.
Alta latencia nos endpoints de grafo
Seção intitulada “Alta latencia nos endpoints de grafo”Sintoma: Endpoints de analitico de grafo levam > 10s para responder ou atingem timeout.
Causa: Travessias complexas de grafo em subgrafos grandes, ou o Neo4j esta sob pressao de memoria.
Solucao:
- Verifique a alocacao de memoria do Neo4j — o padrao pode ser insuficiente para o grafo de ~28.000 nos / ~207.000 relacionamentos
- Verifique se indices de grafo existem para propriedades frequentemente consultadas (numero da decisao, nome do ministro, dispositivo legal)
- Para Neo4j Aura: verifique o tier da instancia e se voce esta atingindo limites de query
Feature Planejada — v1.1 adicionara um circuit breaker que abre apos o Neo4j travar por > 5s, permitindo que requests prossigam sem features de grafo em vez de bloquear indefinidamente.