Descrição
Estou usando um nó AI Agent no n8n com Vertex AI (Gemini) como modelo de chat, combinado com uma ferramenta de sub-workflow chamada search_rag que pesquisa um banco de dados de vetores Qdrant.
Cada vez que o AI Agent chama a ferramenta e recebe a resposta de volta, o agente falha imediatamente com:
Bad request - please check your parameters Google request failed with status code 400
Não há detalhes de erro adicionais — nenhum rastreamento de stack, nenhum erro em nível de campo do Google.
Causa Raiz Identificada
Após depuração extensiva, identifiquei a seguinte causa raiz:
1. Vertex AI/Gemini requer functionResponse como um objeto JSON {}, não um array JSON []
A API do Gemini tem requisitos mais rigorosos do que o OpenAI em relação ao formato de functionResponse. Especificamente, o Gemini espera que a resposta da ferramenta seja um objeto, não um array. Quando o sub-workflow retorna [{...}] (array contendo um objeto), o Gemini identifica isso como um payload inválido e retorna um erro 400 na etapa de validação de requisição — antes mesmo do modelo processar o conteúdo. É por isso que o erro 400 é “silencioso” sem detalhes em nível de campo.
2. Sub-workflow do n8n sempre retorna um array — isso não pode ser alterado
Este é o comportamento padrão do n8n: todas as saídas de workflow são encapsuladas em um array [{...}]. A única maneira de retornar um objeto em vez de um array no n8n é usar Respond to Webhook com First Incoming Item — mas essa abordagem não pode ser aplicada a ferramentas de sub-workflow dentro de um AI Agent.
3. LangChain serializa o formato errado para Vertex AI
O nó Agent do n8n usa um wrapper LangChain para se comunicar com o Vertex AI. LangChain serializa a saída da ferramenta em uma string JSON e a coloca em functionResponse, mas se a estrutura de nível superior for um array, algumas versões do SDK do Vertex AI a rejeitam na etapa de validação antes do modelo processá-la.
Exemplo Concreto
O que o sub-workflow atualmente retorna (array — inválido para Vertex AI):
[
{
"message": "Found 3 result(s) for collection_type: media.",
"searchResults": [...],
"count": 3
}
]
O que o Vertex AI espera (objeto — válido):
{
"message": "Found 3 result(s) for collection_type: media.",
"searchResults": [...],
"count": 3
}
O Que Foi Confirmado
- O sub-workflow é executado com sucesso e retorna uma resposta válida
- O erro ocorre depois que o Agent recebe a resposta da ferramenta, não antes
- O erro ocorre em ambos os casos: quando resultados são encontrados E quando nenhum resultado é encontrado
- Não há valores null ou undefined na resposta
- Vertex AI não requer um nome de campo específico —
message,result,outputsão todos aceitáveis - Vertex AI não proíbe arrays aninhados —
searchResults: [...]dentro de um objeto é aceitável - A única restrição é: o nível superior deve ser um objeto
{}, não um array[]
Perguntas
- Existe alguma maneira de fazer um sub-workflow do n8n retornar um objeto JSON em vez de um array JSON para o Vertex AI?
- Esta é uma limitação conhecida da integração n8n + Vertex AI?
- O time do n8n tem planos de corrigir o wrapper LangChain para desencapsular automaticamente o array em um objeto quando usado com Vertex AI?