Causa do 'Provedor de LLM indisponível' no ambiente com Ollama local foi
externa: OLLAMA_BASE_URL exportada no shell (http://localhost:11434/v1) vence o
.env na interpolação do docker-compose, e localhost dentro do container é o
próprio container. Nada no app indicava a URL em uso.
Dois defeitos de código que tornavam isso indetectável — e um deles produziria a
mesma mensagem mesmo com a URL correta:
- _BaseProvider criava o httpx.AsyncClient com o atributo de classe (120 s) e as
subclasses atribuíam self.timeout depois. O httpx congela o timeout na
construção, então os 300 s pedidos pelo Ollama nunca valeram: um primeiro
atendimento com modelo frio era cortado em 120 s com exatamente a mensagem
'provedor indisponível'. O timeout agora é passado ao super().
- LLMProviderError de conexão não citava o endereço tentado; o log dizia só 'All
connection attempts failed'. Passa a incluir a endpoint, com credenciais
user:pass@ redigidas. /api/health expõe llm_endpoint para comparação direta
com o .env.
README e .env.example documentam a precedência shell > .env, o fato de /v1 ser a
superfície OpenAI-compatível (o adaptador usa /api/chat nativo) e a latência
medida do primeiro atendimento.