Comment connecter plusieurs modèles d’IA à n8n via une seule API ?
Connecter des modèles d’IA fournisseur par fournisseur peut suffire pour un prototype, mais devient fragile à mesure que l’usage augmente. Chaque fournisseur apporte des identifiants, des endpoints, des formats de requête, des limites de débit, une facturation et des structures de réponse distincts. Dans n8n, cela crée souvent des nœuds HTTP dupliqués et des branches spécifiques à chaque fournisseur, si bien qu’ajouter un modèle ou changer un chemin de repli signifie modifier plusieurs parties du workflow.
n8n et CometAPI résolvent différentes couches de ce problème. n8n contrôle le moment d’exécution d’une tâche, valide les entrées, route les tâches synchrones et asynchrones, réessaie en cas d’échec et stocke les résultats. CometAPI centralise l’accès aux modèles derrière une seule clé API et une seule base URL. Ensemble, ils isolent les changements de fournisseur de la couche d’orchestration : vous pouvez changer un ID de modèle tout en conservant la même logique de file d’attente, de polling, de stockage et de monitoring.
Cette combinaison est particulièrement utile pour des tâches mixtes image et vidéo provenant de feuilles de calcul ou d’outils internes. Le workflow reste visuel et auditable dans n8n, tandis que les identifiants, la disponibilité des modèles et les coûts d’usage restent plus faciles à gérer via une seule couche API.
La manière la plus simple d’intégrer plusieurs fournisseurs d’IA dans une même application est de séparer l’orchestration de l’accès aux modèles. Laissez n8n gérer les déclencheurs, le branching, les réessais et le stockage, tandis que CometAPI donne à chaque branche une seule clé API et une seule base URL. L’ID du modèle devient un champ de chaque tâche plutôt qu’un compte fournisseur séparé, un SDK et une configuration de facturation distincts.
Dans ce guide, vous allez construire un pipeline low-code fonctionnel qui lit des tâches image et vidéo depuis Google Sheets, les envoie vers des modèles OpenAI et ByteDance via CometAPI, enregistre les ID de tâches vidéo asynchrones, poll pour la complétion, puis upsert le résultat final dans une Data Table n8n.
Ce que vous allez construire
Le workflow final suit ce chemin :
Google Sheets Trigger → Normalize Job → Switch by media type → CometAPI image or video request → Wait and poll video tasks → Upload or reference the output → Data Table upsert.
Utilisez ces colonnes dans la feuille source :
job_id | media_type | model | prompt | size | seconds | status
Une ligne image typique utilise image, gpt-image-2 et 1024x1024. Une ligne vidéo utilise video, seedance-2-5, 1280x720 et une durée de 4 à 30 secondes.
Avant de commencer
Vous avez besoin d’une instance n8n, d’une feuille Google, d’une clé API CometAPI et d’une Data Table n8n nommée ai_jobs. Créez ces colonnes dans la Data Table : job_id, media_type, model, status, task_id, result_url, error et updated_at.
Pour n8n auto-hébergé, ajoutez les valeurs suivantes à l’environnement utilisé par votre processus n8n :
COMETAPI_BASE_URL=https://api.cometapi.com/v1COMETAPI_KEY=your_cometapi_key
Redémarrez n8n après modification de son environnement. Dans n8n Cloud, ou lorsque vous ne souhaitez pas exposer des variables d’environnement dans les expressions des nœuds, créez une crédential HTTP Header Auth nommée CometAPI Bearer. Définissez le nom d’en-tête sur Authorization et la valeur sur Bearer your_cometapi_key. Les exemples ci-dessous utilisent cette crédential et la base URL compatible OpenAI fixe https://api.cometapi.com/v1.
Utiliser les ID de modèle actuels
| Tâche | Fournisseur et modèle | Requête | Résultat |
|---|---|---|---|
| Image | OpenAI · gpt-image-2 | POST /v1/images/generations | Image base64 synchronisée |
| Vidéo | ByteDance · seedance-2-5 | POST /v1/videos | Tâche asynchrone, puis sondage |
Les ID et capacités étaient disponibles dans l’API d’annuaire des modèles CometAPI en direct le 11 août 2026. Le modèle image prend en charge la génération texte-vers-image. Seedance 2.5 prend en charge la génération texte-vers-vidéo et image-vers-vidéo, des clips de 4 à 30 secondes, et les tailles documentées 480p et 720p.
Tarification au 11 août 2026 : la page du modèle GPT Image 2 indique 4 $ par million de tokens en entrée et 24 $ par million de tokens en sortie. La page du modèle Seedance 2.5 indique 0,103 $ par seconde en 480p et 0,231 $ par seconde en 720p. Les prix peuvent changer, utilisez donc l’annuaire des modèles en direct ou la page du modèle comme source de vérité à l’exécution.
La différence architecturale importante est que la génération d’images peut être gérée en requête-réponse, tandis que la génération vidéo doit être traitée comme un job stateful. Persister l’ID de tâche vidéo avant le polling empêche la perte du job en cas de redémarrage de l’exécution n8n.
Construire le workflow dans n8n
1. Déclencher les nouvelles tâches depuis Google Sheets
Ajoutez un nœud Google Sheets Trigger et choisissez Row added or updated. Pointez-le vers la feuille qui contient votre file de travaux. Ajoutez un nœud IF immédiatement après le déclencheur et continuez uniquement lorsque status est vide ou égal à queued. Cela évite que des lignes déjà terminées soient soumises à nouveau lorsque la feuille change.
2. Normaliser et valider chaque ligne
Ajoutez un nœud Code nommé Normalize Job. Ce nœud applique des valeurs par défaut sûres, limite le workflow aux ID de modèles approuvés et produit les mêmes champs pour les deux branches.
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(), },}];
Ajoutez un nœud Switch après Normalize Job. Routez image vers la branche image et video vers la branche vidéo.
3. Générer des images via un seul endpoint
Ajoutez un nœud HTTP Request nommé Create Image avec ces paramètres :
- Method:
POST - URL:
https://api.cometapi.com/v1/images/generations - Authentication: la crédential 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 renvoie des données d’image en base64. Ajoutez un nœud Code nommé Prepare Image File pour transformer ces données en élément binaire 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`, }, },}];
Connectez ce nœud à votre nœud de stockage objet préféré, tel que S3 ou Google Drive. Stockez l’URL de fichier renvoyée dans result_url, puis upsert la ligne dans ai_jobs. Évitez de placer de gros payloads base64 dans la Data Table.
4. Créer une tâche vidéo asynchrone
Ajoutez un nœud HTTP Request nommé Create Video :
- Method:
POST - URL:
https://api.cometapi.com/v1/videos - Authentication:
CometAPI Bearer - Body Content Type: Form-Data
Ajoutez quatre champs de formulaire : model, prompt, seconds et size. Mappez leurs valeurs depuis Normalize Job.
Ensuite, ajoutez un nœud Code nommé 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(), },}];
Upsert cet élément dans ai_jobs avant le polling. Sauver immédiatement l’ID de tâche signifie qu’un redémarrage ou un timeout ne fait pas perdre le job.
5. Attendre, poll et stocker l’URL vidéo
Ajoutez un nœud Wait réglé sur 15 secondes. Puis ajoutez un nœud HTTP Request nommé Get Video :
- Method:
GET - URL:
=https://api.cometapi.com/v1/videos/{{ $json.task_id }} - Authentication:
CometAPI Bearer
Après la requête, utilisez un nœud Switch sur status :
queuedouin_progress: retournez au nœud Wait.completed: continuez versFinalize Video.failedouerror: écrivez l’erreur dansai_jobset arrêtez.
Ajoutez ce nœud Code pour la branche complétée :
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(), },}];
Upsert l’élément final dans ai_jobs par job_id. Les URLs vidéo CometAPI peuvent être signées et temporaires, donc les workflows de production devraient télécharger et réhéberger le fichier avant de sauvegarder l’URL permanente. Si votre application peut recevoir des requêtes entrantes, remplacez le polling par un webhook là où le modèle sélectionné supporte les callbacks.
Carte complète des nœuds
Le workflow complet peut être assemblé avec les nœuds suivants :
- Google Sheets Trigger — Row added or updated
- IF — Process only new or queued rows
- Code — Normalize Job
- Switch — Image or video
- Image branch: HTTP Request → Prepare Image File → Object Storage → Data Table Upsert
- Video branch: HTTP Request → Save Video Task → Data Table Upsert → Wait → HTTP Request → Status Switch
- Completed video: Finalize Video → Object Storage or permanent URL → Data Table Upsert
- Failed video: Set Error → Data Table Upsert
Pour une branche d’échec, utilisez cette expression dans un nœud 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() }}"}
Tester le workflow
Ajoutez ces deux lignes à la feuille source :
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
La requête image devrait renvoyer une structure similaire à :
{ "created": 1786400000, "data": [ { "b64_json": "iVBORw0KGgoAAA..." } ]}
La création de vidéo devrait renvoyer une structure de tâche similaire à :
{ "id": "video_task_abc123", "object": "video", "status": "queued", "progress": 0}
Après le polling, une réponse complétée devrait contenir le même ID de tâche, status: completed, et une video_url. Les champs optionnels exacts peuvent varier selon le modèle, c’est pourquoi le code de normalisation lit l’état de tâche stable et l’URL de résultat au lieu de copier toute la réponse du fournisseur dans votre base de données.
Erreurs fréquentes et correctifs
| Erreur | Correctif |
|---|---|
| 401 Unauthorized | Confirmez que la valeur Header Auth commence par Bearer et que la clé est active. |
| 404 model or task not found | Vérifiez l’annuaire des modèles en direct et confirmez que l’ID de tâche stocké est utilisé dans GET /v1/videos/{id}. |
| 400 invalid size or seconds | Utilisez une taille prise en charge et gardez la durée Seedance 2.5 entre 4 et 30 secondes. |
| 429 rate limited | Réduisez la concurrence n8n et réessayez avec backoff exponentiel et jitter. |
| Polling never ends | Persistez le compteur d’essais et arrêtez après un délai défini ; traitez failed et error comme terminaux. |
| Image payload is too large | Convertissez le base64 en binaire, uploadez-le et stockez uniquement l’URL permanente. |
Checklist de production
- Protégez les identifiants. Conservez la clé API dans les crédentials n8n ou des variables d’environnement côté serveur. Ne la placez jamais dans la feuille de calcul ni ne la retournez à un navigateur.
- Rendez chaque tâche idempotente. Utilisez
job_idcomme clé d’upsert dans la Data Table. Avant de créer une nouvelle tâche, ignorez les lignes déjà marquéesprocessingoucompleted. - Contrôlez le polling et la concurrence. Faites du polling des jobs vidéo toutes les 10–20 secondes, limitez le nombre de tentatives et restreignez les exécutions simultanées. Reculez (backoff) sur les réponses 429, 500 et 503 au lieu de créer des tâches en double.
- Validez la politique de modèle avant chaque requête. Maintenez une liste blanche par type de média. Actualisez la disponibilité des modèles et les prix depuis l’annuaire en direct selon une planification, mais déployez les changements de modèles via revue plutôt que de laisser les utilisateurs de feuille soumettre des ID arbitraires.
- Suivez le coût par tâche. Stockez le modèle, la résolution, la durée et les champs d’usage avec chaque résultat. Une tâche Seedance 2.5 de quatre secondes en 720p coûte environ 0,924 $ au tarif indiqué le 11 août 2026 ; les mêmes quatre secondes en 480p coûtent environ 0,412 $. Appliquez une durée et une résolution maximales avant de soumettre la requête.
- Réhébergez les médias générés. Traitez les URLs signées du fournisseur comme des liens de livraison, pas un stockage permanent. Téléchargez les médias complétés, uploadez-les dans votre bucket contrôlé, et sauvegardez l’URL durable plus le checksum.
- Maintenez une piste d’audit. Stockez le modèle de requête, les paramètres nettoyés, l’ID de tâche, les transitions d’état, le nombre de réessais, le temps de réponse et l’emplacement final de l’asset. Ne logguez pas les clés API ni les prompts privés complets.
Pourquoi ce pattern est scalable
Le workflow reste simple car chaque nouveau fournisseur ou modèle est une décision de routage, pas une nouvelle intégration de compte. La feuille de calcul reste la file des tâches, n8n reste la couche d’orchestration, et CometAPI reste la couche d’accès unique. Ajoutez un modèle en étendant la liste blanche et la configuration des branches ; le déclencheur, la persistance des tâches, le polling, le stockage et la logique de monitoring restent inchangés.
C’est la réponse pratique à l’intégration multi-fournisseurs d’IA : un endpoint et une clé contrôlés, un routage explicite des modèles, des parcours distincts synchrone et asynchrone, et un enregistrement durable pour chaque tâche.
FAQs
n8n peut-il appeler plusieurs fournisseurs d’IA via une seule API ?
Oui. Avec une couche API unifiée telle que CometAPI, n8n peut envoyer des requêtes à différents modèles pris en charge tout en gardant l’identifiant de fournisseur et l’intégration HTTP centralisés.
Puis-je utiliser CometAPI avec le nœud HTTP Request de n8n ?
Oui. Le nœud HTTP Request peut envoyer des requêtes vers l’endpoint de l’API CometAPI avec l’authentification requise et les paramètres spécifiques au modèle.
n8n peut-il basculer automatiquement de modèle quand l’un échoue ?
Oui. Utilisez une branche IF/Switch après la requête API et routez les échecs réessayables ou spécifiques au modèle vers un modèle de repli. Le modèle de repli doit prendre en charge la même modalité et les capacités requises.
