ADR 0005 — O serviço Python sai do ar, e o Render sai do mapa
Status: canônico · Escopo: Onde o apps/llm-service roda, e por que ele não roda em lugar nenhum agora · Atualizado em: 2026-08-11
Contexto
Seção intitulada “Contexto”O apps/llm-service — 10 mil linhas de Python, FastAPI com pydantic-ai — rodava no Render no plano
gratuito. Existiam duas implantações possíveis no repositório e nenhum registro da escolha: só um
comentário de uma linha no workflow de deploy dizendo que produção usava o Render.
A pergunta que abriu esta decisão foi: a Cloudflare roda Python em Workers, por que estamos no Render? Investigando, a resposta mudou de “qual hospedagem” para “isto precisa estar no ar?”.
O que foi medido
Seção intitulada “O que foi medido”Nada que vendemos hoje passa pelo serviço.
| Caminho | Usa o serviço Python? |
|---|---|
| Ligação ao vivo | Não — a Vapi conversa com a OpenAI direto (provider: 'openai') |
Chat hospedado e /lab | Sim — e o chat saiu do foco comercial |
| Follow-up 30 min após ligação | Sim — mas entrega por SMS, e o Twilio não está configurado |
O serviço sustentava uma superfície engavetada e um follow-up sem canal de entrega.
As três opções
Seção intitulada “As três opções”Python Workers (Pyodide) — rejeitada. A Cloudflare roda Python compilado para WebAssembly e
aceita apenas pacote puro ou PyEmscripten; extensão C nativa não roda. O psycopg até tem
contorno — existe driver Neon HTTP no código —, mas pydantic-ai e logfire/OpenTelemetry num
runtime que a própria documentação descreve como “estágios iniciais” transformam a migração em
semanas de reescrita com risco de descobrir no fim que uma dependência não compila.
Cloudflare Containers — adiada, e é o caminho quando voltar. O apps/llm-edge-worker já está
inteiro configurado: instância basic, máximo 3, dorme em 10 min. Roda a imagem Docker que já
existe, sem reescrever nada. Custa o Workers Paid (US$ 5/mês, com 25 GiB-hora inclusas) e tira um
fornecedor do mapa.
Desligar — escolhida. Manter no ar de graça também não custava dinheiro, mas custava um fornecedor a mais, uma issue viva (#97, hibernação) e a impressão de que o chat funciona.
Decisão
Seção intitulada “Decisão”- O serviço sai do ar. O Render deixa de existir na arquitetura:
render.yamle o workflow de publicação de imagem foram removidos. - O código fica. São 10 mil linhas de trabalho real, com testes e evals; apagar seria destruir valor por uma decisão de hospedagem.
- Quando voltar, volta em Cloudflare Containers, pelo
apps/llm-edge-worker. LLM_SERVICE_URLvira opcional, e quem depende dela recusa alto em vez de estourar.
⚠️ O chat hospedado para de responder. chat.tactflow.io/book/:slug continua abrindo e o
agendamento continua de pé, mas o turno de conversa devolve 503 com motivo explícito. Era o link de
demonstração citado no runbook — quem for demonstrar hoje demonstra a ligação, que é o produto.
Consequências
Seção intitulada “Consequências”- Um fornecedor a menos, e o custo continua zero
- A #97 (hibernação do LLM no Render) perde o objeto
- Voltar ao chat passa a ter um preço explícito: US$ 5/mês e ligar o
llm-edge-worker - ⚠️ Enquanto estiver desligado,
/labe a ingestão de conhecimento também não funcionam
Onde continuar
Seção intitulada “Onde continuar”- Como o sistema é montado: arquitetura
- Estado de produção: deploy