Como conectar vários modelos de IA ao n8n com uma única API?
Conectar modelos de IA provedor por provedor pode funcionar em um protótipo, mas se torna frágil conforme o uso cresce. Cada provedor traz credenciais, endpoints, formatos de requisição, limites de taxa, cobrança e estruturas de resposta separados. No n8n, isso frequentemente cria nós HTTP duplicados e ramificações específicas do provedor; assim, adicionar um modelo ou alterar um caminho de fallback significa editar várias partes do fluxo.
n8n e CometAPI resolvem camadas diferentes desse problema. O n8n controla quando um job roda, valida entradas, roteia tarefas síncronas e assíncronas, faz retentativas em falhas e armazena resultados. O CometAPI centraliza o acesso aos modelos por trás de uma única chave de API e uma única URL base. Juntos, mantêm as mudanças de provedor fora da camada de orquestração: você pode alternar um ID de modelo preservando a mesma fila, polling, armazenamento e lógica de monitoramento.
Essa combinação é especialmente útil para jobs mistos de imagem e vídeo vindos de planilhas ou ferramentas internas. O fluxo permanece visual e auditável no n8n, enquanto credenciais, disponibilidade de modelos e custos de uso ficam mais fáceis de gerenciar por meio de uma única camada de API.
A forma mais simples de integrar vários provedores de IA em um único app é separar orquestração do acesso a modelos. Deixe o n8n lidar com gatilhos, ramificações, retentativas e armazenamento, enquanto o CometAPI dá a cada ramificação uma única chave de API e uma única URL base. O ID do modelo passa a ser um campo em cada job, em vez de uma conta de provedor, SDK e configuração de cobrança separados.
Neste guia, você construirá um pipeline low-code funcional que lê jobs de imagem e vídeo do Google Sheets, envia-os para modelos da OpenAI e ByteDance via CometAPI, salva IDs de tarefas de vídeo assíncronas, faz polling até a conclusão e faz upsert do resultado final em uma Data Table do n8n.
O que você vai construir
O fluxo final segue este caminho:
Google Sheets Trigger → Normalizar Job → Switch por tipo de mídia → Requisição de imagem ou vídeo no CometAPI → Aguardar e fazer polling de tarefas de vídeo → Enviar upload ou referenciar o output → Upsert na Data Table.
Use estas colunas na planilha de origem:
job_id | media_type | model | prompt | size | seconds | status
Uma linha típica de imagem usa image, gpt-image-2 e 1024x1024. Uma linha de vídeo usa video, seedance-2-5, 1280x720 e uma duração de 4 a 30 segundos.
Antes de começar
Você precisa de uma instância do n8n, uma planilha do Google, uma chave de API do CometAPI e uma Data Table do n8n chamada ai_jobs. Crie estas colunas na Data Table: job_id, media_type, model, status, task_id, result_url, error e updated_at.
Para n8n self-hosted, adicione os seguintes valores ao ambiente usado pelo seu processo do n8n:
COMETAPI_BASE_URL=https://api.cometapi.com/v1COMETAPI_KEY=your_cometapi_key
Reinicie o n8n após alterar o ambiente. No n8n Cloud, ou quando você não quiser expor variáveis de ambiente em expressões de nós, crie uma credencial HTTP Header Auth chamada CometAPI Bearer. Defina o nome do header como Authorization e o valor como Bearer your_cometapi_key. Os exemplos abaixo usam essa credencial e a URL base compatível com OpenAI fixa https://api.cometapi.com/v1.
Use IDs de modelos atuais
| Job | Provedor e modelo | Requisição | Resultado |
|---|---|---|---|
| Image | OpenAI · gpt-image-2 | POST /v1/images/generations | Imagem base64 síncrona |
| Video | ByteDance · seedance-2-5 | POST /v1/videos | Tarefa assíncrona, depois polling |
Ambos os IDs e capacidades estavam disponíveis na API de diretório de modelos ao vivo da CometAPI em 11 de agosto de 2026. O modelo de imagem suporta geração de texto-para-imagem. Seedance 2.5 suporta geração de texto-para-vídeo e imagem-para-vídeo, clipes de 4 a 30 segundos e os tamanhos documentados 480p e 720p.
Preços em 11 de agosto de 2026: a página do modelo GPT Image 2 lista US$ 4 por milhão de tokens de entrada e US$ 24 por milhão de tokens de saída. A página do modelo Seedance 2.5 lista US$ 0,103 por segundo em 480p e US$ 0,231 por segundo em 720p. Preços podem mudar, então use o diretório de modelos ao vivo ou a página do modelo como a fonte de verdade em tempo de execução.
A diferença arquitetural importante é que a geração de imagem pode ser tratada como uma operação request-response, enquanto a geração de vídeo deve ser tratada como um job com estado. Persistir o ID da tarefa de vídeo antes do polling evita que uma reinicialização da execução do n8n perca o job.
Construa o fluxo no n8n
1. Dispare novos jobs a partir do Google Sheets
Adicione um nó Google Sheets Trigger e escolha Row added or updated. Aponte para a worksheet que contém sua fila de jobs. Adicione um nó IF imediatamente após o gatilho e continue apenas quando status estiver vazio ou igual a queued. Isso evita que linhas concluídas sejam reenviadas quando a planilha mudar.
2. Normalize e valide cada linha
Adicione um nó Code chamado Normalize Job. Esse nó aplica padrões seguros, restringe o fluxo a IDs de modelos aprovados e produz os mesmos campos para ambas as ramificações.
const row = $json;const allowedModels = { image: new Set(['gpt-image-2']), video: new Set(['seedance-2-5']),};const mediaType = String(row.media_type || '').trim().toLowerCase();if (!allowedModels[mediaType]) { throw new Error(`media_type must be image or video; received: ${row.media_type}`);}const defaultModel = mediaType === 'image' ? 'gpt-image-2' : 'seedance-2-5';const model = String(row.model || defaultModel).trim();if (!allowedModels[mediaType].has(model)) { throw new Error(`Model ${model} is not allowed for ${mediaType} jobs`);}const prompt = String(row.prompt || '').trim();if (!prompt) throw new Error('prompt is required');const seconds = mediaType === 'video' ? Number(row.seconds || 4) : null;if (mediaType === 'video' && (!Number.isInteger(seconds) || seconds < 4 || seconds > 30)) { throw new Error('Seedance 2.5 seconds must be an integer from 4 to 30');}return [{ json: { job_id: String(row.job_id || $execution.id), media_type: mediaType, model, prompt, size: String(row.size || (mediaType === 'image' ? '1024x1024' : '1280x720')), seconds, status: 'processing', updated_at: new Date().toISOString(), },}];
Adicione um nó Switch após Normalize Job. Direcione image para a ramificação de imagem e video para a ramificação de vídeo.
3. Gere imagens através de um único endpoint
Adicione um nó HTTP Request chamado Create Image com estas configurações:
- Method:
POST - URL:
https://api.cometapi.com/v1/images/generations - Authentication: a credencial Header Auth
CometAPI Bearer - Body Content Type: JSON
{ "model": "={{ $('Normalize Job').item.json.model }}", "prompt": "={{ $('Normalize Job').item.json.prompt }}", "size": "={{ $('Normalize Job').item.json.size }}"}
GPT Image 2 retorna dados de imagem base64. Adicione um nó Code chamado Prepare Image File para transformar esses dados em um item binário do n8n:
const job = $('Normalize Job').item.json;const b64 = $json.data?.[0]?.b64_json;if (!b64) throw new Error('CometAPI returned no image data');return [{ json: { ...job, status: 'completed', task_id: '', result_url: '', error: '', updated_at: new Date().toISOString(), }, binary: { media: { data: b64, mimeType: 'image/png', fileName: `${job.job_id}.png`, }, },}];
Conecte esse nó ao seu nó de armazenamento de objetos preferido, como S3 ou Google Drive. Armazene a URL do arquivo retornado em result_url, depois faça upsert da linha em ai_jobs. Mantenha payloads base64 grandes fora da Data Table.
4. Crie uma tarefa de vídeo assíncrona
Adicione um nó HTTP Request chamado Create Video:
- Method:
POST - URL:
https://api.cometapi.com/v1/videos - Authentication:
CometAPI Bearer - Body Content Type: Form-Data
Adicione quatro campos de formulário: model, prompt, seconds e size. Faça o mapeamento a partir de Normalize Job.
Em seguida, adicione um nó Code chamado Save Video Task:
const job = $('Normalize Job').item.json;const taskId = $json.id || $json.task_id;if (!taskId) throw new Error('Video task ID missing from create response');return [{ json: { ...job, task_id: taskId, status: $json.status || 'queued', result_url: '', error: '', updated_at: new Date().toISOString(), },}];
Faça upsert desse item em ai_jobs antes do polling. Salvar o ID da tarefa imediatamente significa que um reinício ou timeout não perde o job.
5. Aguarde, faça polling e armazene a URL do vídeo
Adicione um nó Wait configurado para 15 segundos. Depois adicione um nó HTTP Request chamado Get Video:
- Method:
GET - URL:
=https://api.cometapi.com/v1/videos/{{ $json.task_id }} - Authentication:
CometAPI Bearer
Após a requisição, use um nó Switch no campo status:
queuedouin_progress: retorne ao nó Wait.completed: continue paraFinalize Video.failedouerror: escreva o erro emai_jobse pare.
Adicione este nó Code para a ramificação concluída:
const prior = $('Save Video Task').item.json;const resultUrl = $json.video_url || $json.url || $json.data?.video_url;if (!resultUrl) throw new Error('Completed video response has no video URL');return [{ json: { ...prior, status: 'completed', result_url: resultUrl, error: '', updated_at: new Date().toISOString(), },}];
Faça upsert do item final em ai_jobs por job_id. URLs de vídeo do CometAPI podem ser assinadas e temporárias, então fluxos de produção devem baixar e re-hospedar o arquivo antes de salvar a URL permanente. Se o seu app puder receber requisições de entrada, substitua o polling por um webhook onde o modelo selecionado suportar callbacks.
Mapa completo de nós
O fluxo completo pode ser montado com os seguintes nós:
- Google Sheets Trigger — Row added or updated
- IF — Processar apenas linhas novas ou em fila
- Code — Normalize Job
- Switch — Imagem ou vídeo
- Ramificação de imagem: HTTP Request → Prepare Image File → Object Storage → Data Table Upsert
- Ramificação de vídeo: HTTP Request → Save Video Task → Data Table Upsert → Wait → HTTP Request → Status Switch
- Vídeo concluído: Finalize Video → Object Storage ou URL permanente → Data Table Upsert
- Vídeo com falha: Set Error → Data Table Upsert
Para uma ramificação de falha, use esta expressão em um nó Edit Fields:
{ "job_id": "={{ $('Save Video Task').item.json.job_id }}", "status": "failed", "task_id": "={{ $('Save Video Task').item.json.task_id }}", "result_url": "", "error": "={{ $json.error?.message || $json.message || 'Video generation failed' }}", "updated_at": "={{ $now.toISO() }}"}
Teste o fluxo
Adicione estas duas linhas à planilha de origem:
img-001 | image | gpt-image-2 | A cinematic product photo of a glass robot on a dark desk | 1024x1024 | | queuedvid-001 | video | seedance-2-5 | A paper airplane flies through a sunlit studio, smooth tracking shot | 1280x720 | 4 | queued
A requisição de imagem deve retornar uma estrutura similar a:
{ "created": 1786400000, "data": [ { "b64_json": "iVBORw0KGgoAAA..." } ]}
A requisição de criação de vídeo deve retornar uma estrutura de tarefa similar a:
{ "id": "video_task_abc123", "object": "video", "status": "queued", "progress": 0}
Após o polling, uma resposta concluída deve conter o mesmo ID de tarefa, status: completed e um video_url. Campos opcionais exatos podem variar por modelo, razão pela qual o código de normalização lê o status de tarefa estável e a URL de resultado em vez de copiar toda a resposta do provedor para o seu banco de dados.
Erros comuns e correções
| Erro | Correção |
|---|---|
| 401 Unauthorized | Confirme que o valor do Header Auth começa com Bearer e que a chave está ativa. |
| 404 model or task not found | Verifique o diretório de modelos ao vivo e confirme que o ID de tarefa armazenado é usado no GET /v1/videos/{id}. |
| 400 invalid size or seconds | Use um tamanho compatível e mantenha a duração do Seedance 2.5 entre 4 e 30 segundos. |
| 429 rate limited | Reduza a concorrência no n8n e tente novamente com backoff exponencial e jitter. |
| Polling never ends | Persista a contagem de tentativas e pare após um timeout definido; trate failed e error como terminais. |
| Image payload is too large | Converta base64 para binário, faça upload e armazene apenas a URL permanente. |
Checklist de produção
- Proteja credenciais. Mantenha a chave de API em credenciais do n8n ou variáveis de ambiente no servidor. Nunca a coloque na planilha nem a retorne para um navegador.
- Faça cada job idempotente. Use
job_idcomo a chave de upsert na Data Table. Antes de criar uma nova tarefa, pule linhas já marcadas comoprocessingoucompleted. - Controle polling e concorrência. Faça polling de jobs de vídeo a cada 10–20 segundos, limite o número de tentativas e limite execuções simultâneas. Faça backoff em respostas 429, 500 e 503 em vez de criar tarefas duplicadas.
- Valide a política de modelos antes de cada requisição. Mantenha uma allowlist por tipo de mídia. Atualize a disponibilidade e os preços dos modelos a partir do diretório ao vivo em uma agenda, mas implemente mudanças de modelos por meio de revisão em vez de deixar usuários de planilha enviarem IDs arbitrários.
- Acompanhe o custo por job. Armazene modelo, resolução, duração e campos de uso com cada resultado. Um job Seedance 2.5 de quatro segundos em 720p custa cerca de US$ 0,924 na taxa listada em 11 de agosto de 2026; os mesmos quatro segundos em 480p custam cerca de US$ 0,412. Faça cumprir a duração e a resolução máximas antes de enviar a requisição.
- Re-hospede mídia gerada. Trate URLs assinadas do provedor como links de entrega, não armazenamento permanente. Baixe a mídia concluída, faça upload para seu bucket controlado e salve a URL durável mais o checksum.
- Mantenha trilha de auditoria. Armazene o modelo de requisição, parâmetros sanitizados, ID de tarefa, transições de status, contagem de retentativas, tempo de resposta e local do ativo final. Não registre chaves de API nem prompts privados completos.
Por que esse padrão escala
O fluxo permanece simples porque cada novo provedor ou modelo é uma decisão de roteamento, não uma nova integração de conta. A planilha continua sendo a fila de jobs, o n8n continua sendo a camada de orquestração e o CometAPI continua sendo a camada única de acesso. Adicione um modelo estendendo a allowlist e a configuração da ramificação; o gatilho, a persistência de tarefas, o polling, o armazenamento e a lógica de monitoramento permanecem inalterados.
Essa é a resposta prática para integração de IA com múltiplos provedores: um endpoint e chave controlados, roteamento explícito de modelos, caminhos síncronos e assíncronos separados e um registro durável para cada job.
FAQs
O n8n pode chamar vários provedores de IA por uma única API?
Sim. Com uma camada de API unificada como o CometAPI, o n8n pode enviar requisições para diferentes modelos suportados enquanto mantém a credencial do provedor e a integração HTTP centralizadas.
Posso usar o CometAPI com o nó HTTP Request do n8n?
Sim. O nó HTTP Request pode enviar requisições para o endpoint do CometAPI com a autenticação requerida e os parâmetros específicos do modelo.
O n8n pode alternar automaticamente modelos de IA quando um falha?
Sim. Use uma ramificação IF/Switch após a requisição da API e direcione falhas re-tentáveis ou específicas de modelo para um modelo de fallback. O fallback deve suportar a mesma modalidade e capacidades necessárias.
