0

Pitch: iSomor — quatro problemas que apareceram depois de colocar no ar um tradutor de PDF que mantém o layout

Sou o Greg, da equipe do iSomor, um serviço web que traduz PDFs com texto mantendo o layout e mostra o original e a tradução lado a lado, página por página. Como é um Pitch, aviso logo: estou falando do meu próprio projeto. Em vez de listar funcionalidades, quero contar quatro problemas que só apareceram em produção e como a gente lidou com eles. Acho que valem para qualquer SaaS pequeno que depende de uma API de IA.

Como funciona, em uma frase

Você envia um PDF com texto selecionável, escolhe o idioma, um worker processa o documento e manda o texto para o Google Gemini, e o resultado aparece num visualizador com o original de um lado e a tradução do outro. Dá para baixar o PDF traduzido ou uma versão bilíngue.

A stack é simples: web em Next.js, API em Flask, fila com Celery, um serviço separado para processar o PDF, MySQL e armazenamento de objetos com links temporários. Tudo roda numa única máquina virtual.

1. Documento longo, prazo curto

Um PDF de 25 páginas falhou depois de uns 30 minutos. O problema não estava no arquivo. A gente limitava as chamadas ao modelo a 1 requisição por segundo, e um documento longo gera muitas chamadas. Com esse limite, o orçamento de 30 minutos por job acabava antes do fim. Para piorar, o registro dizia só "falhou", sem indicar que tinha sido tempo esgotado, e o usuário via uma mensagem genérica.

O que mudou: o limite subiu para 10 requisições por segundo, e um documento do mesmo tamanho passou a terminar em pouco mais de 8 minutos. Tempo esgotado virou um motivo de término próprio, com código e mensagem específicos, que sugere tentar de novo mais tarde ou dividir o PDF por páginas.

A lição: calcule o tempo máximo de um job a partir do rate limit do provedor, não da latência média, e trate timeout como um estado de primeira classe.

2. Robôs virando usuários

Nas duas primeiras semanas, a tabela de usuários ganhou 868 visitantes. Pelo User-Agent, cerca de 87% eram crawlers. O motivo: a página chamava GET /user/me ao renderizar e, sem sessão, o servidor criava um visitante na hora. Todo bot que executava JavaScript virava "usuário". O mesmo acontecia com o registro de consentimento de analytics.

A correção: o visitante só é criado quando alguém clica em "Iniciar tradução", por um POST com proteção CSRF de mesma origem. O consentimento só é sincronizado na primeira interação real. Navegar anonimamente não grava mais nada no banco.

A lição: não crie estado em GET e não confie no número de "usuários" antes de separar os robôs.

3. O Googlebot gastando o rastreamento com prefetch

No Search Console, quase metade das requisições do Googlebot ia para URLs com ?_rsc=, que o Next.js usa para pré-carregar rotas. HTML era só 11% do total. Para um domínio novo, com pouco orçamento de rastreamento, isso é desperdício.

Bloqueamos /*?_rsc= no robots.txt, depois de confirmar no teste ao vivo do Search Console que as páginas continuavam renderizando normalmente. Também corrigimos links internos que apontavam para URLs com redirecionamento. Ainda estamos medindo o efeito.

A lição: além do relatório de indexação, olhe as estatísticas de rastreamento.

4. Custo sob controle sem plano pago

Ainda não existe plano pago. Para o custo com o modelo não fugir do controle:

  • visitantes só pré-visualizam as 2 primeiras páginas;
  • contas verificadas recebem 50 créditos a cada 7 dias, 1 crédito por página;
  • existe um orçamento diário de 1.000 créditos para o site inteiro, que zera à meia-noite UTC. Quando ele acaba, novas traduções pausam, mas downloads de resultados já prontos continuam funcionando.

O que ainda não funciona bem

Para ninguém achar que é propaganda, estes são defeitos que vemos em artigos reais, sem correção manual:

  • rótulos dentro de diagramas às vezes ficam no idioma original;
  • algumas palavras são quebradas no meio ("r esultante");
  • em fórmulas no meio do texto, o acento de ĥ pode se soltar da letra;
  • links longos em notas de rodapé quebram;
  • não há OCR, então PDF escaneado não funciona.

Também temos MCP e API, com OAuth 2.0 e PKCE, para usar com agentes de IA. Por enquanto eles só traduzem para inglês e chinês.

Exemplos reais, com os PDFs originais e traduzidos para baixar: https://tryisomor.com/pt-br/use-cases/research-paper-translation?utm_source=tabnews&utm_medium=community&utm_campaign=outreach

Se você já traduziu artigo em PDF, quero saber onde o layout mais quebra para você e como você confere a tradução. Críticas técnicas são bem-vindas.

Carregando publicação patrocinada...