AI Agent + Code node OOM crash com ~1-2MB binary no Cloud Starter — ponto de crash não-determinístico, zero crashes em self-hosted

Resumo

Estou enfrentando crashes OOM reproduzíveis no n8n Cloud Starter com payloads muito pequenos (~1-2 MB binários). O ponto de crash flutua entre o nó Code e AI Agent em execuções com a mesma entrada, o que sugere fortemente flutuação de recursos de worker compartilhado, em vez de um bug no código do usuário.

O mesmo workflow JSON funciona perfeitamente em self-hosted (Docker, host com 8 GB) — mais de 30 execuções sem nenhum crash.

Ambiente

  • Plano: Cloud Starter
  • Instância: verma-digital.app.n8n.cloud
  • Versão n8n: 2.20.7 (Cloud)
  • Nó: @n8n/n8n-nodes-langchain.agent v1.8
  • Modelo: gpt-4.1-mini

Teste reproduzível — workflow minimal com 8 nós

Manual Trigger
  → Code "Prepare Test Data"
      (buscar cada URL via helpers.httpRequest({encoding:'arraybuffer'})
       + helpers.prepareBinaryData, emite 1 item por arquivo com binário)
  → Switch by MIME (PDF / Image / Fallback)
  → Extract from PDF (somente branch PDF)  → Merge (append, 3 entradas)
  → Code "Aggregate"
      (coletar items em uma única saída: json.text + binary.data_0,
       data_1, ... para AI Agent)
  → AI Agent (passthroughBinaryImages: true)
  → OpenAI Chat Model

Sem memória Postgres, sem tools, sem save subworkflows. Tão minimal quanto possível enquanto ainda reproduz o problema.

Fico feliz em compartilhar o workflow JSON completo.

Resultados dos testes

Entrada Binary total Resultado
2 ícones pequenos (webp) ~40 KB :white_check_mark: Sempre tem sucesso
2 PDFs pequenos (176 + 63 KB) ~240 KB :white_check_mark: Sempre tem sucesso
1 PDF (2,6 MB, 5 páginas) ~2,6 MB :cross_mark: Crashes
2 imagens (1,56 MB + 810 KB webp) ~2,4 MB :cross_mark: Crashes

O limite está em algum lugar entre ~240 KB e ~2,4 MB de binário total em uma única execução. O crash acontece mesmo com um único binário de 2,6 MB (apenas uma chamada helpers.httpRequest), então isso não é um vazamento multi-fetch cumulativo.

A parte interessante — ponto de crash não determinístico

Mesma entrada exata, mesmo workflow, mesmo caminho de execução:

  • Execução 1: crash no nó Code Prepare Test Data (durante helpers.httpRequest / prepareBinaryData)
  • Execução 2: crash no nó AI Agent (durante processamento base64 de passthroughBinaryImages)
  • Execução 3: crash no nó Code novamente
  • (etc.)

Ambos os modos de crash produzem o mesmo erro na UI:

Execution stopped at this node
n8n may have run out of memory while running this execution.

“Other info” expandido mostra apenas versão n8n + timestamp. Nenhum stack trace visível.

Se fosse um bug no código do usuário, o crash seria determinístico no mesmo nó em cada execução. O fato de o ponto de crash flutuar com entrada idêntica sugere fortemente pressão de recursos de worker compartilhado.

Teste de controle — self-hosted funciona bem

Importei o mesmo workflow JSON para n8n self-hosted (Docker, n8n 2.20.7, host com 8 GB), com os mesmos serviços externos (Supabase, OpenAI).

Resultado: mais de 30 execuções em todos os cenários que falhavam acima — zero crashes. Incluindo um PDF de 4,7 MB + 2 imagens grandes simultaneamente.

Isso isolava a causa à infraestrutura Cloud, não ao workflow ou ao meu código.

Perguntas

  1. Alguém mais enfrentou isso no Cloud Starter? Especificamente OOM intermitente com payloads de sub-MB a low-MB em workflows usando binary fetch + AI Agent passthroughBinaryImages?

  2. Existe um orçamento de memória por execução não documentado no Starter que seja menor que a memória de worker de 1 GB anunciada? Crash observado em ~2 MB binários está três ordens de magnitude abaixo disso.

  3. O helpers.httpRequest({encoding:'arraybuffer'}) ou prepareBinaryData tem overhead de memória conhecido além do tamanho do buffer?

  4. Há um problema conhecido com LangChain Agent v1.8 passthroughBinaryImages aumentando memória para entradas > 1 MB?

  5. Fazer upgrade para Pro mudaria significativamente a situação, ou a mesma infraestrutura compartilhada afetaria Pro também?

Eu realmente preferiria ficar no Cloud (queremos evitar o overhead de manutenção de self-hosting), mas agora Starter não é estável para nosso caso de uso.

Fico feliz em fornecer:

  • Workflow JSON completo
  • IDs de execução com falha (para o time n8n extrair logs do lado do servidor)
  • Pontos de dados de teste adicionais (payloads menores, bisection, etc.)

Obrigado por qualquer insight!

@sawsew467 seu diagnóstico está correto — Starter tem um limite rigoroso de memória por execução e você está acumulando imagens binárias + codificadas em base64 (passthroughBinaryImages inflaciona ~33%) + agregação de nó Code, tudo na memória ao mesmo tempo. self-hosted com 8GB tem muito mais espaço disponível. workaround mais rápido sem fazer upgrade do plano: remova passthroughBinaryImages e passe URLs de imagem para o agent — o modelo busca elas, sua memória de execução fica plana. quantas imagens por execução normalmente? muda se url-pass funciona ou você precisa de uma forma diferente completamente.

Oi @sawsew467

Os travamentos estão acontecendo porque o plano Starter do n8n Cloud tem um limite de memória muito menor do que você esperava—apenas 320 MB de RAM, não 1 GB. Quando você processa arquivos (como PDFs ou imagens), o n8n não usa apenas o tamanho real do arquivo; ele cria várias cópias em segundo plano e as converte em um formato baseado em texto (Base64) para o IA ler, o que aumenta enormemente o uso de memória. Como você está operando bem no limite desse limite, o sistema trava aleatoriamente em qualquer nó que aconteça de ultrapassar a memória durante essa execução específica.

Como seu workflow funciona perfeitamente no seu servidor auto-hospedado com mais RAM, seu código não é o problema—o “container” na nuvem é simplesmente muito pequeno para essa tarefa. Para corrigir isso, a solução mais eficaz é fazer upgrade para um plano Pro, que oferece significativamente mais memória (até 1,2 GB). Alternativamente, você poderia evitar fazer upload dos arquivos diretamente para o n8n Agent e, em vez disso, fornecer ao IA um link web para o arquivo, o que contorna completamente o processo de conversão que consome muita memória.