Bastidores

Desenvolvimento· Construindo o Garfim · parte 17

Como depurei um erro de API sem log no registro do Garfim.

O caso da API que falhava silenciosamente em voz e texto enquanto a foto funcionava, a mudança súbita no provedor e a lição de nunca esconder a causa no log.

Foto de um prato funcionando ao lado de voz e texto com erro e um log vazio.

A foto funcionava no Garfim, mas voz e texto falhavam e o log não mostrava a causa. O registro por foto retornava resultados, mas tentativas de registrar refeições por áudio ou digitação retornavam erro entre 6 e 9 segundos após o envio. No dia anterior, em 29 de outubro de 2026, uma refeição por voz havia sido salva em produção.

Ao abrir o terminal para examinar os registros do servidor, o painel estava limpo. Não havia registro de exceção, rastreamento de pilha ou qualquer aviso de falha. A API respondia com código HTTP 503 e entregava uma mensagem amigável no celular, mas a causa técnica permanecia invisível.

A investigação desse caso mostrou na prática como o cuidado excessivo em tratar mensagens de erro pode cegar a engenharia. Quando um sistema esconde a origem técnica de uma falha para proteger a interface, ele impede que você descubra o que realmente quebrou.

O registro por foto funcionava enquanto voz e texto falhavam

O comportamento do sistema parecia contraditório à primeira vista. A análise de imagens depende de modelos visuais complexos e continuava retornando resultados. Já as rotas de texto e voz, que teoricamente executavam tarefas mais leves, falhavam de forma sistemática.

O fluxo de voz passa pela rota de processamento de texto. Ambas as entradas precisam extrair os nomes dos alimentos descritos e pesquisar os itens correspondentes na base nutricional por meio de comparação vetorial.

Quando a requisição encerrava com erro 503, o aplicativo exibia um código amigável de falha de reconhecimento. Para quem utilizava o produto no celular, a sensação era de uma instabilidade passageira de conexão. Nos bastidores, porém, nenhuma refeição falada ou digitada conseguia ultrapassar a etapa de processamento.

O erro amigável na tela escondia a falha real nos servidores

A ausência de informações no log aconteceu por causa de uma decisão arquitetural da API. As falhas retornadas pelos provedores de inteligência artificial eram capturadas por blocos de tratamento e convertidas diretamente em códigos internos de retorno do aplicativo.

Como o framework de rotas só registrava automaticamente falhas graves não tratadas do servidor, respostas tratadas eram consideradas desfechos esperados do negócio. A falha tratada não gerava uma linha que mostrasse sua causa.

O primeiro passo para resolver o mistério foi instrumentar a captura da causa real. Adicionei um registro estruturado de falha de reconhecimento que permitiu identificar o erro de embedding e a latência da requisição. Imediatamente após a publicação desse ajuste em homologação, o terminal começou a falar: a chamada ao modelo de embedding da Google falhava após apenas 58 milissegundos.

O log estruturado revelou a mudança repentina no provedor

O registro inicial comprovou que a etapa de extração dos nomes dos alimentos ocorria com sucesso. O problema real acontecia na etapa seguinte, quando a API tentava transformar esses nomes em vetores para buscar alimentos equivalentes no banco.

Para aprofundar o diagnóstico, alterei o cliente de integração para reter o status HTTP original devolvido pelo provedor intermediário. Ao enviar uma frase de teste com dois alimentos, o log exibiu com clareza um erro de resposta com código HTTP 404 após 47 milissegundos. Ao testar uma frase com um único alimento, a resposta retornava normal.

A causa raiz estava desvendada: em 30 de outubro de 2026, o OpenRouter respondia 404 para requisições de embeddings contendo múltiplos textos sob as restrições de provedor e retenção zero usadas pelo Garfim, sem sequer encaminhar a solicitação para a Google. Como a análise por foto pesquisava cada alimento detectado individualmente, ela permaneceu imune. Já o texto agrupava todos os termos da frase em uma única chamada. Nenhuma linha de código do Garfim havia mudado: tratava-se de uma alteração silenciosa de comportamento no provedor externo.

A correção em paralelo e o teste de regressão restabeleceram o fluxo

Identificada a origem, a correção exigiu mudar a estratégia de envio das requisições. O cliente de embeddings foi reescrito para enviar estritamente um único texto por chamada, disparando até seis requisições simultâneas para respeitar a cota de conexões concorrentes da infraestrutura de Workers.

Para detectar a regressão, escrevi um teste na camada de adaptadores. Esse teste reproduz exatamente o comportamento da falha: simula o erro 404 diante de requisições com múltiplos textos e valida a geração do vetor quando os textos descem em chamadas individuais. Se esse teste for executado contra o código anterior, ele falha imediatamente.

Após a execução bem-sucedida de todas as suítes de teste de integração e tipagem, o pacote foi publicado em homologação e em produção. O teste real com a frase clássica “comi arroz e feijão” voltou a responder código HTTP 200 de imediato, combinando os dois itens com os alimentos da base sem gerar novas ocorrências de falha.

Tratar o erro para o usuário exige preservar a causa técnica

A grande lição desse incidente reside na separação entre experiência do usuário e visibilidade operacional. Entregar uma mensagem limpa e compreensiva na tela do celular é obrigação de qualquer bom produto, mas proteger a interface não autoriza silenciar a engenharia.

Quando uma exceção de terceiro é engolida para gerar uma resposta bonita, o sistema transforma um defeito de infraestrutura em uma incógnita. Sem um log estruturado que preserve a causa original e o código de retorno, a depuração depende de adivinhação.

Manter a causa diagnosticável nos registros do servidor dá um ponto de partida para investigar falhas de provedores. Para entender como integro essa governança com o bloqueio seguro de versões em caso de incidentes graves, leia sobre como forçar atualização no React Native.

Teste local verde até no S23, e o staging ainda achou um defeito.08 nov · DesenvolvimentoOutra IA revisou 4.170 traduções da IA em inglês e corrigiu 307.08 nov · Inteligência artificialA conta live do Stripe estava ativa, mas falhou na minha conferência.08 nov · LançamentoTrês regras de HSTS num só domínio: por que deixei o preload de fora.08 nov · DesenvolvimentoUma palavra a menos derrubou 13 páginas que já estavam no ar.08 nov · DesenvolvimentoOutro agente de IA revisou meu código 71 vezes e criou dois defeitos.08 nov · Inteligência artificialDepois de 20 anos de carreira, publiquei meu primeiro pacote no npm.08 nov · LançamentoSozinho com IA: iPhone, Android, SaaS com MCP e CLI, e já faturando.07 nov · BastidoresCopiei a mecânica dos líderes e recusei a mentira deles.07 nov · BastidoresA pergunta de LGPD que trava a venda: e o backup?07 nov · ProdutoA IA calibrou minha câmera pelos números. Ficou cara de lanterna.07 nov · BastidoresUm usuário não via o dia de ontem. Abri todo o passado do Garfim.07 nov · Produto62% baixavam o Garfim. O problema estava antes da página.07 nov · LançamentoO idioma certo na tela pode virar o errado no servidor.07 nov · DesenvolvimentoO limite de 10 por minuto que deixou passar muito mais.07 nov · DesenvolvimentoUm PR do Dependabot travou meu banco e as rotas voltaram 500.07 nov · DesenvolvimentoMeus produtos novos não começam do zero. Começam de um clone.07 nov · DesenvolvimentoTirei uma trava da minha IA e a resposta caiu de 5,5 s para 3,7 s.07 nov · DesenvolvimentoTroquei velocidade por uma auditora que confere cada frase.07 nov · Inteligência artificialEscrevi o método CERNE lendo seis especificações reais.07 nov · Inteligência artificialComo anunciar na Meta e vender online no CPF sem abrir empresa.05 nov · BastidoresPausei anúncios depois de ignorar o resultado anterior.05 nov · BastidoresComo depurei um erro de API sem log no registro do Garfim.05 nov · DesenvolvimentoComo forçar atualização no React Native antes de um defeito grave.05 nov · DesenvolvimentoComo levei o LCP do ClipLeve de 9,9 s para menos de 1,5 s.05 nov · DesenvolvimentoPubliquei 650 páginas contra a regra do meu método.05 nov · Inteligência artificialUma conta para organizar erros, métricas e IA dos meus produtos.05 nov · BastidoresSeparei o painel do site e pus o Access na porta.05 nov · DesenvolvimentoUma lista de 69 itens encontrou requisitos só no papel.05 nov · BastidoresO antispam esperou tanto que parou o formulário.05 nov · DesenvolvimentoCortei a publicação de 17 minutos para 4 na minha máquina.05 nov · DesenvolvimentoEu gravo. A IA corta, legenda e entrega o vídeo curto.05 nov · Inteligência artificialComo criar anúncios UGC com IA usando o método PROVA.05 nov · Inteligência artificialA IA disse que usou as skills. A página provou o contrário.05 nov · Inteligência artificialNove páginas reprovadas antes de encontrar uma identidade.05 nov · Inteligência artificialEm 48 horas, juntei domínios, e‑mail, sites e medição num padrão só.30 out · BastidoresPor que tirei os três sites do GPT Sites.30 out · DesenvolvimentoComo troquei o luisjunior.ai com cerca de 10 segundos fora do ar.30 out · DesenvolvimentoRefiz o luisjunior.ai do zero: cada afirmação com prova.30 out · LançamentoUm padrão para todos os domínios, inclusive os de produtos futuros.30 out · BastidoresTodo o e‑mail dos meus domínios saiu do VPS num só dia.30 out · DesenvolvimentoDecidi mover o envio do Garfim do Resend para a Cloudflare.30 out · DesenvolvimentoO método FONTE para aparecer no Google e nas respostas de IA.30 out · Inteligência artificialTrês sites, três decisões de busca, e uma delas é não gerar páginas.30 out · Inteligência artificialMedição de vários sites num painel só, com consentimento.30 out · BastidoresComo a IA me apresenta mídias para aprovação29 out · Inteligência artificialO Garfim chegou ao Google Play. Agora tem Android e iPhone.22 out · LançamentoConseguir testadores e esperar 14 dias: a reta final do Garfim no Android.22 out · BastidoresO ClipLeve chegou à App Store. O que aprendi até aqui.20 out · LançamentoO ClipLeve foi rejeitado de novo. Dessa vez, por uma palavra.20 out · ProdutoO Garfim foi aprovado. E já está na App Store.16 out · LançamentoA última negativa do Garfim: câmera, assinatura e o caminho inteiro.16 out · LançamentoClipLeve: o cuidado por trás de um vídeo mais leve.12 out · ProdutoPor que restaurar uma assinatura pode falhar em outra conta.12 out · ProdutoQuando um aplicativo pode dizer que sua conta foi excluída?12 out · ProdutoO que a primeira negativa da App Store me fez explicar.08 out · LançamentoO que quero aprender com o teste fechado do Garfim.08 out · ProdutoO trabalho de uma assinatura continua depois da compra.03 out · DesenvolvimentoPor que o Garfim ganhou um plano gratuito.03 out · ProdutoO login funcionou. Por que a tela do Garfim não saiu do lugar?03 out · LançamentoPagenello: um site começa pelo que o visitante veio fazer.03 out · LançamentoComo uma foto do almoço vira um produto.27 set · ConcepçãoAs decisões que continuo tomando ao desenvolver com IA.27 set · DesenvolvimentoApresentar o Garfim ao público também é um teste do produto.27 set · Lançamento

GET luisjunior.ai/llms.txt

Esta é a versão do site escrita para modelos de linguagem: os mesmos fatos, sem layout, prontos para um assistente de IA ler e citar. Agentes no Chrome também encontram aqui ferramentas WebMCP para consultar produtos, textos e contato.

conectando…0 tokens · 0 tok/s