Branches não são executadas de forma assíncrona?

Oi a todos. Então estou construindo esse fluxo de trabalho e consultando múltiplos LLMs simultaneamente. O problema é que as ramificações não são acionadas de forma assíncrona, mas uma após a outra, começando com Gemini, depois GPT e depois Perplexity.

Eu sei que a mesclagem está esperando por todas elas, mas em vez do tempo de execução ser o tempo mais longo de um modelo, é a soma de todos os tempos de execução, que pode ser até 20 segundos no total.

Há alguma forma de fazer as ramificações serem acionadas de forma assíncrona?

Oi @Patrick_Friedl, enquanto você espera por uma resposta, aqui estão algumas coisas que podem ajudar:

Recursos sugeridos

Automaticamente correspondido à sua pergunta.

Documentação:

Fórum:

@fahmiiireza, @Olek, @Anshul_Namdev - vocês já ajudaram com problemas similares, podem dar uma olhada?

Automaticamente sugerido pelo bot de comunidade do n8n. É um piloto - por favor compartilhe seu feedback aqui.

É assim que o n8n funciona. Não há nada que possa ser mudado sobre isso.

Se você fizer os cursos, aprenderá mais sobre como funciona.

Não, mas você poderia usar requisições https! Porém, não há um sistema paralelo. Requisições HTTP podem ser mais rápidas!

Oi @Patrick_Friedl

Complementando o ponto do achamm, há uma forma específica de fazer isso.

O n8n executa um nó por vez, então as ramificações sempre serão sequenciais, essa parte não vai mudar. Mas um único nó HTTP Request alimentado com múltiplos itens dispara essas requisições em paralelo dentro de um lote. Então, em vez de três ramificações, você constrói três itens, um por modelo, e um nó HTTP Request chama todos os três de uma vez. O tempo total se torna o seu modelo mais lento em vez da soma.

A estrutura: um nó Code que produz três itens, cada um carregando a url e o body para seu provedor, depois um nó HTTP Request usando {{ $json.url }} e {{ $json.body }}, com Batching configurado para que todos os três fiquem no mesmo lote. Três itens saem, um por modelo, e você não precisa do nó Merge..

A pegadinha é a autenticação. Cada provedor quer uma chave diferente e um nó tem apenas uma credencial, então você estaria definindo o header de autenticação por expressão. Isso coloca suas chaves de API nos dados de execução em vez de nas credenciais, o que pode ou não ser aceitável dependendo de quem consegue visualizar suas execuções.

Interessante… você tem um exemplo de como isso funciona?

O que você está vendo é esperado. O n8n não trata branches em uma execução como tarefas simultâneas.

Com executionOrder: v1, ele executa as branches de cima para baixo com base em sua posição vertical na tela. Usei esse ordenamento deliberadamente para alertas, mas isso também significa que suas chamadas de modelo estão sendo adicionadas antes do nó Merge ser executado. Mova Perplexity acima de Gemini e você deverá ver a ordem se reverter, o que confirma isso.

Não há uma configuração no nó Merge que torna essas branches upstream paralelas. Para real concorrência, cada chamada de modelo precisa ser executada como uma execução de workflow separada, com os resultados armazenados ou enviados de volta para um workflow de orquestração. Se todos os três resultados devem retornar na mesma execução síncrona, isso adiciona alguma coordenação em vez de ser apenas uma mudança na tela.

Este é o exemplo que acabei de criar no meu n8n, basta copiar o JSON e colar no seu nó.

Nó Code 1 Construir requisições:

// ---- coloque suas chaves aqui ----
const OPENAI_KEY = ‘PUT_OPENAI_KEY_HERE’;
const GEMINI_KEY = ‘PUT_GEMINI_KEY_HERE’;
const PERPLEXITY_KEY = ‘PUT_PERPLEXITY_KEY_HERE’;
// ----------------------------

const prompt = $json.prompt || ‘Explain quantum entanglement in one short paragraph.’;

return [
{
json: {
provider: ‘openai’,
url: ‘https://api.openai.com/v1/chat/completions’,
headers: { Authorization: 'Bearer ’ + OPENAI_KEY },
body: {
model: ‘gpt-4o’,
messages: [{ role: ‘user’, content: prompt }]
}
}
},
{
json: {
provider: ‘gemini’,
url: ‘https://generativelanguage.googleapis.com/v1beta/models/gemini-2.0-flash:generateContent’,
headers: { ‘x-goog-api-key’: GEMINI_KEY },
body: {
contents: [{ parts: [{ text: prompt }] }]
}
}
},
{
json: {
provider: ‘perplexity’,
url: ‘https://api.perplexity.ai/chat/completions’,
headers: { Authorization: 'Bearer ’ + PERPLEXITY_KEY },
body: {
model: ‘sonar’,
messages: [{ role: ‘user’, content: prompt }]
}
}
}
];
Nó HTTP Chamar todos os modelos:

  • URL: {{ $json.url }}
  • Send Headers on, Specify Headers → Using JSON: {{ JSON.stringify($json.headers) }}
  • Send Body on, Specify Body → Using JSON: {{ JSON.stringify($json.body) }}
  • Options → Batching → Items per Batch 3

Essa é a parte que faz o trabalho. Os três saem juntos em vez de um após o outro.

Nó Code 3 Achatar respostas:
const requests = $(‘Build requests’).all();

return $input.all().map((item, i) => {
const provider = requests[i].json.provider;
const r = item.json;

const text = provider === ‘gemini’
? r?.candidates?.[0]?.content?.parts?.[0]?.text
: r?.choices?.[0]?.message?.content;

return { json: { provider, text: text ?? null } };
});

Ajuda?

Fantástico, obrigado!

Bem-vindo @Patrick_Friedl

Isso está incorreto.
Os nós HTTP ainda os executam um por um.
Você pode verificar o código se quiser: n8n/packages/nodes-base/nodes/HttpRequest/V3/HttpRequestV3.node.ts at master · n8n-io/n8n · GitHub