Enregistrement et sauvegarde automatisés des flux de travail avec GPT-4 et Airtable

Avancé

Ceci est unAI Summarization, Multimodal AIworkflow d'automatisation du domainecontenant 38 nœuds.Utilise principalement des nœuds comme If, N8n, Set, Code, Wait. Utiliser GPT-4 et Airtable pour documenter et sauvegarder automatiquement les workflows

Prérequis
  • Clé API Airtable
  • Peut nécessiter les informations d'identification d'authentification de l'API cible
  • Clé API OpenAI
Aperçu du workflow
Visualisation des connexions entre les nœuds, avec support du zoom et du déplacement
Exporter le workflow
Copiez la configuration JSON suivante dans n8n pour importer et utiliser ce workflow
{
  "nodes": [
    {
      "id": "8261a2c4-7000-4eea-950d-8cbcec82a3c9",
      "name": "Déplacer les données binaires",
      "type": "n8n-nodes-base.moveBinaryData",
      "position": [
        -3248,
        16
      ],
      "parameters": {
        "mode": "jsonToBinary",
        "options": {
          "fileName": "=file",
          "useRawData": true
        }
      },
      "typeVersion": 1
    },
    {
      "id": "9ccbe56e-941f-4ad2-9272-54dc8461c4ad",
      "name": "Boucler sur les éléments",
      "type": "n8n-nodes-base.splitInBatches",
      "position": [
        -7024,
        16
      ],
      "parameters": {
        "options": {}
      },
      "typeVersion": 3
    },
    {
      "id": "8020a4d9-3600-42ef-b2bb-6f2f3e3490e3",
      "name": "Extraire depuis le fichier",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -3024,
        16
      ],
      "parameters": {
        "options": {},
        "operation": "binaryToPropery"
      },
      "typeVersion": 1
    },
    {
      "id": "338a4507-94e0-4308-b969-87cf8266bdcb",
      "name": "Rechercher tous les snapshots",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -6480,
        16
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appPFFj6CUUhZyDPT",
          "cachedResultUrl": "https://airtable.com/appPFFj6CUUhZyDPT",
          "cachedResultName": "n8n workflows backup (template)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblavE6Zl51smbyGV",
          "cachedResultUrl": "https://airtable.com/appSYKqZwWcxbEdKq/tblavE6Zl51smbyGV",
          "cachedResultName": "Snapshots"
        },
        "options": {},
        "operation": "search",
        "filterByFormula": "={Workflow ID} = '{{ $('Loop Over Items').item.json.id }}'"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "xSf8osMIdIhLSt91",
          "name": "Duv Airtable"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": true
    },
    {
      "id": "165438d4-3e23-4cf9-9372-d51080fb1969",
      "name": "Re-résumer le workflow",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -4272,
        -304
      ],
      "parameters": {
        "text": "={{ JSON.stringify($('Loop Over Items').first().json, null, 2) }}",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "=Your role is to return a 1 sentence description of what the n8n workflow provided by the user does. You have a deep understanding of how n8n works.\n\nExample shapes of 1-sentence summaries:\nSummarises incoming product feedback from the form or as a subworkflow and sends it to Slack in #general before storing the summary in Airtable and Drive.\nTriggers on a new Gmail message, downloads the PDF attachment, converts it to base64, and uploads it to a Google Drive folder while saving metadata in Airtable.\nDetects new successful Stripe payments, retrieves customer details, creates a HubSpot contact, and sends a templated welcome email via SendGrid."
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "0f83a04c-0979-467d-a4b3-60b8a165e657",
      "name": "Stocker le nouveau résumé de workflow",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -3920,
        -304
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appPFFj6CUUhZyDPT",
          "cachedResultUrl": "https://airtable.com/appPFFj6CUUhZyDPT",
          "cachedResultName": "n8n workflows backup (template)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblfjTaQd9nnVt9WP",
          "cachedResultUrl": "https://airtable.com/appSYKqZwWcxbEdKq/tblfjTaQd9nnVt9WP",
          "cachedResultName": "Workflows"
        },
        "columns": {
          "value": {
            "AI summary": "={{ $json.text }}",
            "Airtable record ID": "={{ $('Create or update workflow').first().json.id }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true
            },
            {
              "id": "Workflow name",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Workflow name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Workflow ID",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Workflow ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Open in n8n",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Open in n8n",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "AI summary",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "AI summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Snapshots",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Snapshots",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Snapshots count",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Snapshots count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last snapshot version ID",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Last snapshot version ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last update time",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Last update time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last version file",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Last version file",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Comment",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Comment",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Creation time",
              "type": "dateTime",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Creation time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Airtable record ID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": true,
              "required": false,
              "displayName": "Airtable record ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Airtable record ID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "xSf8osMIdIhLSt91",
          "name": "Duv Airtable"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": true
    },
    {
      "id": "32ad534c-3b4d-4388-894e-630954153bfa",
      "name": "Obtenir le workflow complet JSON",
      "type": "n8n-nodes-base.n8n",
      "position": [
        -3472,
        16
      ],
      "parameters": {
        "operation": "get",
        "workflowId": {
          "__rl": true,
          "mode": "id",
          "value": "={{ $('Loop Over Items').first().json.id }}"
        },
        "requestOptions": {}
      },
      "credentials": {
        "n8nApi": {
          "id": "HqriyqRC78mQ4sRj",
          "name": "n8n account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "72df750a-b797-4e6b-b0de-4ecf5d6e894e",
      "name": "Ne conserver que les nouveaux snapshots",
      "type": "n8n-nodes-base.filter",
      "position": [
        -7248,
        16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "or",
          "conditions": [
            {
              "id": "34d44462-f09f-4f8c-910a-be361eb56c10",
              "operator": {
                "type": "string",
                "operation": "empty",
                "singleValue": true
              },
              "leftValue": "={{ $json['n8n version ID'] }}",
              "rightValue": ""
            },
            {
              "id": "2b0c4d48-b77c-4dd5-a2bd-6257dcae2f20",
              "operator": {
                "type": "string",
                "operation": "notExists",
                "singleValue": true
              },
              "leftValue": "={{ $json['n8n version ID'] }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "5e310efb-1892-4baa-a7c0-ff3c00523f19",
      "name": "Attendre",
      "type": "n8n-nodes-base.wait",
      "position": [
        -2496,
        384
      ],
      "webhookId": "393a9b19-f641-4876-84a1-379a207a1bc7",
      "parameters": {
        "amount": 3
      },
      "typeVersion": 1.1
    },
    {
      "id": "ebde51ba-5dd3-45c7-87bb-18e5d8770a8a",
      "name": "Obtenir tous les workflows n8n",
      "type": "n8n-nodes-base.n8n",
      "position": [
        -7696,
        -80
      ],
      "parameters": {
        "filters": {
          "excludePinnedData": true
        },
        "requestOptions": {}
      },
      "credentials": {
        "n8nApi": {
          "id": "HqriyqRC78mQ4sRj",
          "name": "n8n account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "5e6d74f2-67c5-4f89-9532-82245f02530f",
      "name": "Correspondre les IDs de snapshot",
      "type": "n8n-nodes-base.merge",
      "position": [
        -7472,
        16
      ],
      "parameters": {
        "mode": "combine",
        "options": {},
        "advanced": true,
        "joinMode": "keepNonMatches",
        "mergeByFields": {
          "values": [
            {
              "field1": "versionId",
              "field2": "n8n version ID"
            }
          ]
        },
        "outputDataFrom": "input1"
      },
      "typeVersion": 3.2
    },
    {
      "id": "e10fab34-aea2-4c08-a1a0-307f1199932c",
      "name": "Déclencheur planifié",
      "type": "n8n-nodes-base.scheduleTrigger",
      "position": [
        -8048,
        16
      ],
      "parameters": {
        "rule": {
          "interval": [
            {
              "triggerAtHour": 8
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "2b9546ed-ba58-48b1-b43d-21572d0fbec8",
      "name": "Rechercher tous les snapshots existants",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -7696,
        112
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appPFFj6CUUhZyDPT",
          "cachedResultUrl": "https://airtable.com/appPFFj6CUUhZyDPT",
          "cachedResultName": "n8n workflows backup (template)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblavE6Zl51smbyGV",
          "cachedResultUrl": "https://airtable.com/appPFFj6CUUhZyDPT/tblavE6Zl51smbyGV",
          "cachedResultName": "Snapshots"
        },
        "options": {
          "fields": [
            "n8n version ID"
          ]
        },
        "operation": "search"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "xSf8osMIdIhLSt91",
          "name": "Duv Airtable"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": true
    },
    {
      "id": "5d3175e6-0f5c-4bd3-92a6-93f97ee0aea9",
      "name": "Télécharger le snapshot précédent",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -5776,
        -320
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appPFFj6CUUhZyDPT",
          "cachedResultUrl": "https://airtable.com/appPFFj6CUUhZyDPT",
          "cachedResultName": "n8n workflows backup (template)"
        },
        "limit": 1,
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblavE6Zl51smbyGV",
          "cachedResultUrl": "https://airtable.com/appSYKqZwWcxbEdKq/tblavE6Zl51smbyGV",
          "cachedResultName": "Snapshots"
        },
        "options": {
          "downloadFields": [
            "Workflow_file"
          ]
        },
        "operation": "search",
        "returnAll": false,
        "filterByFormula": "={n8n version ID} = '{{ $('Create or update workflow').first().json.fields['Last snapshot version ID'][0] }}'"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "xSf8osMIdIhLSt91",
          "name": "Duv Airtable"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": false
    },
    {
      "id": "071d5954-a253-4900-98cb-3ef035855d2a",
      "name": "Extraire depuis le fichier1",
      "type": "n8n-nodes-base.extractFromFile",
      "position": [
        -5552,
        -320
      ],
      "parameters": {
        "options": {},
        "operation": "fromJson",
        "destinationKey": "Previous JSON",
        "binaryPropertyName": "Workflow_file_0"
      },
      "typeVersion": 1
    },
    {
      "id": "ed9bb794-da8c-42df-b9fd-fa169d178db7",
      "name": "Créer ou mettre à jour le workflow",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -6720,
        16
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appPFFj6CUUhZyDPT",
          "cachedResultUrl": "https://airtable.com/appPFFj6CUUhZyDPT",
          "cachedResultName": "n8n workflows backup (template)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblfjTaQd9nnVt9WP",
          "cachedResultUrl": "https://airtable.com/appSYKqZwWcxbEdKq/tblfjTaQd9nnVt9WP",
          "cachedResultName": "Workflows"
        },
        "columns": {
          "value": {
            "Workflow ID": "={{ $('Loop Over Items').item.json.id }}",
            "Creation time": "={{ $('Loop Over Items').item.json.createdAt }}",
            "Workflow name": "={{ $('Loop Over Items').item.json.name }}"
          },
          "schema": [
            {
              "id": "id",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "id",
              "defaultMatch": true
            },
            {
              "id": "Workflow name",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Workflow name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Workflow ID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Workflow ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Open in n8n",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Open in n8n",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "AI summary",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "AI summary",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Snapshots",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Snapshots",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Snapshots count",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Snapshots count",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last snapshot version ID",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Last snapshot version ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last update time",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Last update time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last version file",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Last version file",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Comment",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Comment",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Creation time",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Creation time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Airtable record ID",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Airtable record ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Workflow ID"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "upsert"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "xSf8osMIdIhLSt91",
          "name": "Duv Airtable"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": true
    },
    {
      "id": "9afc3bb4-3923-43de-9695-ea517afb630b",
      "name": "Vérifier le statut du workflow",
      "type": "n8n-nodes-base.code",
      "position": [
        -6256,
        16
      ],
      "parameters": {
        "jsCode": "// Count the number of items from the previous node\nlet numItems = $items().length;\n\n// Check for the specific case where the previous node is empty but returns\n// a single item without the expected 'id' key in its JSON.\nif (numItems === 1 && $items()[0].json && $items()[0].json.id === undefined) {\n  numItems = 0;\n}\n\n// Determine the boolean value.\n// The new rule is to regenerate when the number is 0, 1, 2, or a multiple of 5.\nconst regenerate = (numItems === 0 || numItems === 1 || numItems === 2 || numItems % 5 === 0);\n\n// Return a single item with the renamed keys\nreturn [\n  {\n    json: {\n      \"Number of snapshots\": numItems,\n      \"Re-generate AI summary?\": regenerate\n    }\n  }\n];\n"
      },
      "typeVersion": 2
    },
    {
      "id": "74884b3d-dd8f-4e13-919e-709aa3b32fad",
      "name": "Workflow existant ?",
      "type": "n8n-nodes-base.if",
      "position": [
        -6032,
        16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "273d684c-b737-4dab-9e89-3af3a08f4570",
              "operator": {
                "type": "number",
                "operation": "gt"
              },
              "leftValue": "={{ $json['Number of snapshots'] }}",
              "rightValue": 0
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "8923c1a8-5189-43e1-a599-c51d9652ea24",
      "name": "Préparer les modifications depuis le dernier snapshot",
      "type": "n8n-nodes-base.set",
      "position": [
        -4976,
        -320
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "0f6c8c19-e75e-4cdc-a0fa-49320ba89006",
              "name": "Edits since last snapshot",
              "type": "string",
              "value": "={{ $json.text }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "08e5c6e2-0afe-47bc-82a3-878c809a2b28",
      "name": "Indiquer qu'il s'agit de la première version",
      "type": "n8n-nodes-base.set",
      "position": [
        -5008,
        144
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "0f6c8c19-e75e-4cdc-a0fa-49320ba89006",
              "name": "Edits since last snapshot",
              "type": "string",
              "value": "=N/A - First identified version of the workflow"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "2d8d28df-6cab-419a-93d7-b0d3e78253b8",
      "name": "Consolider les modifications depuis le dernier snapshot",
      "type": "n8n-nodes-base.set",
      "position": [
        -4720,
        16
      ],
      "parameters": {
        "options": {},
        "assignments": {
          "assignments": [
            {
              "id": "0f6c8c19-e75e-4cdc-a0fa-49320ba89006",
              "name": "Edits since last snapshot",
              "type": "string",
              "value": "={{ $json['Edits since last snapshot'] }}"
            }
          ]
        }
      },
      "typeVersion": 3.4
    },
    {
      "id": "1e3c97c4-6685-4e38-8a6b-ef90894dc77c",
      "name": "Nécessite un nouveau résumé de workflow ?",
      "type": "n8n-nodes-base.if",
      "position": [
        -4496,
        16
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "version": 2,
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "id": "c065fb3f-54ce-4f45-8c91-d7f7972adc3b",
              "operator": {
                "type": "boolean",
                "operation": "true",
                "singleValue": true
              },
              "leftValue": "={{ $('Check workflow status').item.json['Re-generate AI summary?'] }}",
              "rightValue": ""
            }
          ]
        }
      },
      "typeVersion": 2.2
    },
    {
      "id": "fb6cd7e8-8ed4-4b8b-a070-151eb4646bc8",
      "name": "Documenter les différences du workflow",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        -5328,
        -320
      ],
      "parameters": {
        "text": "={{ JSON.stringify($json['Previous JSON'], null, 2) }}",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "=Your role is to return a 1 sentence explanation of the difference between 2 n8n workflow versions.\n\nYou are detail-oriented when it comes to analysing and comparing workflows, but your output is rather concise as it is strictly one sentence.\n\nThe user message contains the JSON of the new version, and here is the previous version of the workflow to compare it to:\n\n{{ JSON.stringify($('Loop Over Items').first().json, null, 2) }}"
            }
          ]
        },
        "promptType": "define"
      },
      "typeVersion": 1.7
    },
    {
      "id": "8022caab-0a00-47fd-b25f-659b237ee0dc",
      "name": "Stocker le nouveau snapshot",
      "type": "n8n-nodes-base.airtable",
      "position": [
        -3696,
        16
      ],
      "parameters": {
        "base": {
          "__rl": true,
          "mode": "list",
          "value": "appPFFj6CUUhZyDPT",
          "cachedResultUrl": "https://airtable.com/appPFFj6CUUhZyDPT",
          "cachedResultName": "n8n workflows backup (template)"
        },
        "table": {
          "__rl": true,
          "mode": "list",
          "value": "tblavE6Zl51smbyGV",
          "cachedResultUrl": "https://airtable.com/appSYKqZwWcxbEdKq/tblavE6Zl51smbyGV",
          "cachedResultName": "Snapshots"
        },
        "columns": {
          "value": {
            "Workflow": "={{[ $('Create or update workflow').first().json.id ]}}",
            "n8n version ID": "={{ $('Loop Over Items').first().json.versionId }}",
            "Last update time": "={{ $('Loop Over Items').first().json.updatedAt }}",
            "Edits since last snapshot": "={{ $('Consolidate edits since last snapshot').first().json['Edits since last snapshot'] }}"
          },
          "schema": [
            {
              "id": "Name",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Name",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "n8n version ID",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "n8n version ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Last update time",
              "type": "dateTime",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Last update time",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Time added",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Time added",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Workflow",
              "type": "array",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Workflow",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Workflow ID",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Workflow ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Workflow_file",
              "type": "array",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Workflow_file",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Edits since last snapshot",
              "type": "string",
              "display": true,
              "removed": false,
              "readOnly": false,
              "required": false,
              "displayName": "Edits since last snapshot",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Comment",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": false,
              "required": false,
              "displayName": "Comment",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Airtable record ID",
              "type": "string",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "Airtable record ID",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {
          "typecast": true
        },
        "operation": "create"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "xSf8osMIdIhLSt91",
          "name": "Duv Airtable"
        }
      },
      "typeVersion": 2.1,
      "alwaysOutputData": true
    },
    {
      "id": "19a0d146-27a3-4cbd-8249-bf883cb54862",
      "name": "Stocker le fichier de workflow dans Airtable",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -2768,
        16
      ],
      "parameters": {
        "url": "=https://content.airtable.com/v0/<AIRTABLE-BASE-ID>/{{ $('Store new snapshot').first().json.id }}/Workflow_file/uploadAttachment",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "authentication": "predefinedCredentialType",
        "bodyParameters": {
          "parameters": [
            {
              "name": "contentType",
              "value": "text/plain"
            },
            {
              "name": "file",
              "value": "={{ $json.data }}"
            },
            {
              "name": "filename",
              "value": "={{ $('Loop Over Items').first().json.versionId }}.json"
            }
          ]
        },
        "nodeCredentialType": "airtableTokenApi"
      },
      "credentials": {
        "airtableTokenApi": {
          "id": "xSf8osMIdIhLSt91",
          "name": "Duv Airtable"
        }
      },
      "typeVersion": 4.2
    },
    {
      "id": "f0c35245-4949-41bf-ab9f-1a2b2dccc131",
      "name": "OpenAI Modèle de Chat1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        -4848,
        672
      ],
      "parameters": {
        "model": {
          "__rl": true,
          "mode": "list",
          "value": "gpt-4.1-nano",
          "cachedResultName": "gpt-4.1-nano"
        },
        "options": {}
      },
      "credentials": {
        "openAiApi": {
          "id": "dMiSy27YCK6c6rra",
          "name": "Duv's OpenAI"
        }
      },
      "typeVersion": 1.2
    },
    {
      "id": "8e5f5a92-9111-4891-beb3-cd3d9fe7e923",
      "name": "Note autocollante",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2880,
        -368
      ],
      "parameters": {
        "color": 3,
        "width": 352,
        "height": 576,
        "content": "## Insert your Airtable base ID into the URL\nThe current URL contains <AIRTABLE-BASE-ID>\nwhich should be replaced by the Airtable base ID. \n\nOpen the Airtable base you've prepared for this workflow and get the value starting with \"app...\" in the URL of the page:\nhttps://airtable.com/appxyz/...\n\nThis is your base ID.\n\n*NB: Using this Airtable API endpoint allows to store a file based on b64 file data instead of using workarounds with Drive or Dropbox!*\n"
      },
      "typeVersion": 1
    },
    {
      "id": "75fc1067-486e-4718-9893-7baba3402591",
      "name": "Note autocollante1",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -3504,
        -112
      ],
      "parameters": {
        "color": 7,
        "width": 608,
        "height": 320,
        "content": "## Preparing this workflow version to be imported into Airtable as a file"
      },
      "typeVersion": 1
    },
    {
      "id": "8daa99f7-f960-4675-9a9e-111aba5eebc1",
      "name": "Note autocollante2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4352,
        -608
      ],
      "parameters": {
        "color": 5,
        "width": 608,
        "height": 528,
        "content": "## (re)-summarising the workflow with AI\nIf this is the first, second, third or a multiple of 5 # of snapshot we have for this workflow, we want to let AI re-generate a summary of the workflow as some changes might make the previous summary outdated.\n\nGenerating it at every backup wouldn't be token-efficient, but feel free to update the code of the \"Check workflow status\" node to change the frequency.\n\nNB: LLMs are able to read and understand the workflow based on its JSON which describes all nodes and parameters."
      },
      "typeVersion": 1
    },
    {
      "id": "ae3cb5a1-56be-4a68-8039-0fa5b943df00",
      "name": "Note autocollante3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -5824,
        -480
      ],
      "parameters": {
        "color": 5,
        "width": 992,
        "height": 432,
        "content": "## AI-documenting the edits VS the previous snapshot\nAs we have stored the file of the last snapshot, we might want to store for each new version a summary of the changes compared to the previous one."
      },
      "typeVersion": 1
    },
    {
      "id": "37ddafe2-30ea-40f1-8db1-346a2e09b750",
      "name": "Note autocollante4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6800,
        -32
      ],
      "parameters": {
        "width": 256,
        "height": 416,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nIf the workflow didn't have a record yet in the \"Workflows\" tab in Airtable, this is when it gets created.\nIf it already existed, it resets the name anyway, in case it has changed since the last snapshot."
      },
      "typeVersion": 1
    },
    {
      "id": "4d94c74f-be8d-41a4-870e-149533e303bc",
      "name": "Note autocollante5",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -6336,
        -32
      ],
      "parameters": {
        "color": 6,
        "width": 256,
        "height": 416,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nThis code looks at the result of our search of all past snapshots and returns the number of snapshots and Yes or No, whether it is time to re-generate a summary of the workflow or not."
      },
      "typeVersion": 1
    },
    {
      "id": "4bcc671d-a4d9-4d4f-b616-d7eeed703110",
      "name": "Note autocollante6",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -7792,
        -224
      ],
      "parameters": {
        "color": 4,
        "width": 656,
        "height": 544,
        "content": "## Retrieving all workflows that have new snapshots\nBy comparing the list of the most recent version ID for each workflow and the list of snapshots we have stored in Airtable, we are able to detect the snapshots that need to be saved."
      },
      "typeVersion": 1
    },
    {
      "id": "f9d24d5b-e86e-423b-8d2c-8cb9b096f54f",
      "name": "Note autocollante7",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -4992,
        624
      ],
      "parameters": {
        "color": 5,
        "width": 384,
        "height": 400,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\n\n## Connect your favorite AI provider and model\nIf you tend to have big workflows, their JSON might be long which will consume many Input tokens. As the quality of these AI insights isn't critical, you might want to use a small and efficient model."
      },
      "typeVersion": 1
    },
    {
      "id": "58f05bec-ef7d-4e8b-a8bf-a267ff842cd8",
      "name": "La sauvegarde est terminée !",
      "type": "n8n-nodes-base.noOp",
      "position": [
        -6736,
        -272
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "0de48f62-8638-418d-b7ba-f86746fba33b",
      "name": "Note autocollante8",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -8160,
        -224
      ],
      "parameters": {
        "width": 320,
        "height": 544,
        "content": "## Define your backup frequency\nDaily, weekly, or hourly backup, you decide! Configure this node and activate the workflow to push it live."
      },
      "typeVersion": 1
    },
    {
      "id": "c9fd49c3-5976-419c-aa04-42ee0cff5840",
      "name": "Note autocollante9",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -2528,
        256
      ],
      "parameters": {
        "color": 7,
        "width": 400,
        "height": 288,
        "content": "## Let's give some time to Airtable's API to rest!\nYes, REST APIs need to rest... ;)\n... to not reach rate limits."
      },
      "typeVersion": 1
    },
    {
      "id": "7a3ea014-330c-47f5-a547-4c5b18b6f1be",
      "name": "Note autocollante10",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -8720,
        -336
      ],
      "parameters": {
        "color": 2,
        "width": 512,
        "height": 656,
        "content": "# Automated Workflow Backup & AI Documenter\n\nThis workflow runs on a schedule to find new versions of your workflows. It uses AI to generate a summary and a \"what's new\" changelog, then saves the backup `.json` file and all documentation to a central Airtable base.\n\n## How to use\n\n1.  **Duplicate the Airtable Base:** First, use this link ( https://airtable.com/appPFFj6CUUhZyDPT/shrorM8k6HsUqBACB ) to duplicate the Airtable base into your account.\n2.  **Connect your accounts:**\n    * Add your **n8n**, **Airtable**, and **AI provider** credentials to the relevant nodes in this workflow.\n    * Map the Airtable nodes to the base you just created.\n3.  **Update the Airtable Uploader (Critical):**\n    * In the **Store workflow file into Airtable** (HTTP Request) node, replace `<AIRTABLE-BASE-ID>` in the URL with your own base ID.\n4.  **Set your schedule & activate!** Your workflows are now protected.\n\n\n*This template has been built by Guillaume Duvernay*"
      },
      "typeVersion": 1
    }
  ],
  "connections": {
    "5e310efb-1892-4baa-a7c0-ff3c00523f19": {
      "main": [
        [
          {
            "node": "9ccbe56e-941f-4ad2-9272-54dc8461c4ad",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9ccbe56e-941f-4ad2-9272-54dc8461c4ad": {
      "main": [
        [
          {
            "node": "58f05bec-ef7d-4e8b-a8bf-a267ff842cd8",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "ed9bb794-da8c-42df-b9fd-fa169d178db7",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8261a2c4-7000-4eea-950d-8cbcec82a3c9": {
      "main": [
        [
          {
            "node": "8020a4d9-3600-42ef-b2bb-6f2f3e3490e3",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "e10fab34-aea2-4c08-a1a0-307f1199932c": {
      "main": [
        [
          {
            "node": "ebde51ba-5dd3-45c7-87bb-18e5d8770a8a",
            "type": "main",
            "index": 0
          },
          {
            "node": "2b9546ed-ba58-48b1-b43d-21572d0fbec8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "8020a4d9-3600-42ef-b2bb-6f2f3e3490e3": {
      "main": [
        [
          {
            "node": "19a0d146-27a3-4cbd-8249-bf883cb54862",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "74884b3d-dd8f-4e13-919e-709aa3b32fad": {
      "main": [
        [
          {
            "node": "5d3175e6-0f5c-4bd3-92a6-93f97ee0aea9",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "08e5c6e2-0afe-47bc-82a3-878c809a2b28",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "071d5954-a253-4900-98cb-3ef035855d2a": {
      "main": [
        [
          {
            "node": "fb6cd7e8-8ed4-4b8b-a070-151eb4646bc8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5e6d74f2-67c5-4f89-9532-82245f02530f": {
      "main": [
        [
          {
            "node": "72df750a-b797-4e6b-b0de-4ecf5d6e894e",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "f0c35245-4949-41bf-ab9f-1a2b2dccc131": {
      "ai_languageModel": [
        [
          {
            "node": "fb6cd7e8-8ed4-4b8b-a070-151eb4646bc8",
            "type": "ai_languageModel",
            "index": 0
          },
          {
            "node": "165438d4-3e23-4cf9-9372-d51080fb1969",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "8022caab-0a00-47fd-b25f-659b237ee0dc": {
      "main": [
        [
          {
            "node": "32ad534c-3b4d-4388-894e-630954153bfa",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "338a4507-94e0-4308-b969-87cf8266bdcb": {
      "main": [
        [
          {
            "node": "9afc3bb4-3923-43de-9695-ea517afb630b",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "9afc3bb4-3923-43de-9695-ea517afb630b": {
      "main": [
        [
          {
            "node": "74884b3d-dd8f-4e13-919e-709aa3b32fad",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ebde51ba-5dd3-45c7-87bb-18e5d8770a8a": {
      "main": [
        [
          {
            "node": "5e6d74f2-67c5-4f89-9532-82245f02530f",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "165438d4-3e23-4cf9-9372-d51080fb1969": {
      "main": [
        [
          {
            "node": "0f83a04c-0979-467d-a4b3-60b8a165e657",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "32ad534c-3b4d-4388-894e-630954153bfa": {
      "main": [
        [
          {
            "node": "8261a2c4-7000-4eea-950d-8cbcec82a3c9",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "72df750a-b797-4e6b-b0de-4ecf5d6e894e": {
      "main": [
        [
          {
            "node": "9ccbe56e-941f-4ad2-9272-54dc8461c4ad",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "ed9bb794-da8c-42df-b9fd-fa169d178db7": {
      "main": [
        [
          {
            "node": "338a4507-94e0-4308-b969-87cf8266bdcb",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "5d3175e6-0f5c-4bd3-92a6-93f97ee0aea9": {
      "main": [
        [
          {
            "node": "071d5954-a253-4900-98cb-3ef035855d2a",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "0f83a04c-0979-467d-a4b3-60b8a165e657": {
      "main": [
        [
          {
            "node": "8022caab-0a00-47fd-b25f-659b237ee0dc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "1e3c97c4-6685-4e38-8a6b-ef90894dc77c": {
      "main": [
        [
          {
            "node": "165438d4-3e23-4cf9-9372-d51080fb1969",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "8022caab-0a00-47fd-b25f-659b237ee0dc",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "fb6cd7e8-8ed4-4b8b-a070-151eb4646bc8": {
      "main": [
        [
          {
            "node": "8923c1a8-5189-43e1-a599-c51d9652ea24",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2b9546ed-ba58-48b1-b43d-21572d0fbec8": {
      "main": [
        [
          {
            "node": "5e6d74f2-67c5-4f89-9532-82245f02530f",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "8923c1a8-5189-43e1-a599-c51d9652ea24": {
      "main": [
        [
          {
            "node": "2d8d28df-6cab-419a-93d7-b0d3e78253b8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "19a0d146-27a3-4cbd-8249-bf883cb54862": {
      "main": [
        [
          {
            "node": "5e310efb-1892-4baa-a7c0-ff3c00523f19",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "08e5c6e2-0afe-47bc-82a3-878c809a2b28": {
      "main": [
        [
          {
            "node": "2d8d28df-6cab-419a-93d7-b0d3e78253b8",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "2d8d28df-6cab-419a-93d7-b0d3e78253b8": {
      "main": [
        [
          {
            "node": "1e3c97c4-6685-4e38-8a6b-ef90894dc77c",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}
Foire aux questions

Comment utiliser ce workflow ?

Copiez le code de configuration JSON ci-dessus, créez un nouveau workflow dans votre instance n8n et sélectionnez "Importer depuis le JSON", collez la configuration et modifiez les paramètres d'authentification selon vos besoins.

Dans quelles scénarios ce workflow est-il adapté ?

Avancé - Résumé IA, IA Multimodale

Est-ce payant ?

Ce workflow est entièrement gratuit et peut être utilisé directement. Veuillez noter que les services tiers utilisés dans le workflow (comme l'API OpenAI) peuvent nécessiter un paiement de votre part.

Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds38
Catégorie2
Types de nœuds17
Description de la difficulté

Adapté aux utilisateurs avancés, avec des workflows complexes contenant 16+ nœuds

Auteur
Guillaume Duvernay

Guillaume Duvernay

@duv

AI and automation expert

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34