Workflow n8n

Automatisation Webhook avec n8n : gestion des discussions en temps réel

Ce workflow n8n a pour objectif d'automatiser la gestion des discussions en temps réel via un webhook. Il s'adresse aux équipes de développement et aux entreprises qui souhaitent améliorer leur communication interne en intégrant des outils comme OpenAI pour analyser les changements de fichiers et générer des notes de synthèse. En utilisant ce workflow, les utilisateurs peuvent facilement suivre les modifications apportées à des fichiers et déclencher des notifications en cas de besoin d'examen.

  • Étape 1 : le workflow commence par un déclencheur Webhook qui reçoit des données.
  • Étape 2 : les données sont ensuite traitées par un nœud de code qui exécute une logique personnalisée.
  • Étape 3 : les changements sont récupérés via une requête HTTP, et les résultats sont analysés.
  • Étape 4 : si un changement nécessite une attention particulière, une condition est vérifiée pour déterminer si une note de synthèse doit être créée.
  • Étape 5 : enfin, les résultats sont postés dans un canal de discussion approprié. Grâce à cette automatisation n8n, les équipes peuvent réduire le temps consacré à la gestion des discussions et améliorer la réactivité face aux modifications, ce qui se traduit par une efficacité accrue et une meilleure collaboration.
Tags clés :automatisationwebhookOpenAIcollaborationcommunication
Catégorie: Webhook · Tags: automatisation, webhook, OpenAI, collaboration, communication0

Workflow n8n webhook, OpenAI, collaboration, communication : vue d'ensemble

Schéma des nœuds et connexions de ce workflow n8n, généré à partir du JSON n8n.

Workflow n8n webhook, OpenAI, collaboration, communication : détail des nœuds

  • Sticky Note

    Ce noeud crée une note autocollante avec le contenu spécifié.

  • Sticky Note2

    Ce noeud crée une deuxième note autocollante avec le contenu spécifié.

  • Sticky Note3

    Ce noeud crée une troisième note autocollante avec le contenu spécifié.

  • Webhook

    Ce noeud configure un webhook pour recevoir des requêtes HTTP sur un chemin donné.

  • Code

    Ce noeud exécute du code JavaScript personnalisé selon le mode spécifié.

  • Split Out1

    Ce noeud permet de diviser des données en fonction des options et du champ spécifié.

  • OpenAI Chat Model1

    Ce noeud interroge un modèle de chat OpenAI avec les options fournies.

  • Get Changes1

    Ce noeud effectue une requête HTTP pour obtenir des changements à partir d'une URL spécifiée.

  • Skip File Change1

    Ce noeud évalue des conditions pour décider de passer à l'étape suivante ou non.

  • Parse Last Diff Line1

    Ce noeud exécute du code JavaScript pour analyser la dernière ligne de différence.

  • Post Discussions1

    Ce noeud envoie une requête HTTP pour poster des discussions à une URL spécifiée.

  • Need Review1

    Ce noeud évalue des conditions pour déterminer si une révision est nécessaire.

  • Basic LLM Chain1

    Ce noeud exécute une chaîne de modèles de langage avec un prompt et des messages fournis.

  • Sticky Note4

    Ce noeud crée une quatrième note autocollante avec le contenu spécifié.

Inscris-toi pour voir l'intégralité du workflow

Inscription gratuite

S'inscrire gratuitementBesoin d'aide ?
{
  "nodes": [
    {
      "name": "Sticky Note",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        880,
        540
      ],
      "parameters": {
        "content": "## Edit your own prompt ⬇️\n"
      },
      "typeVersion": 1
    },
    {
      "name": "Sticky Note2",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -380,
        580
      ],
      "parameters": {
        "content": "## Filter comments and customize your trigger words ⬇️"
      },
      "typeVersion": 1
    },
    {
      "name": "Sticky Note3",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        -120,
        560
      ],
      "parameters": {
        "content": "## Replace your gitlab URL and token ⬇️"
      },
      "typeVersion": 1
    },
    {
      "name": "Webhook",
      "type": "n8n-nodes-base.webhook",
      "position": [
        -540,
        760
      ],
      "webhookId": "6cfd2f23-6f45-47d4-9fe0-8f6f1c05829a",
      "parameters": {
        "path": "e21095c0-1876-4cd9-9e92-a2eac737f03e",
        "options": {},
        "httpMethod": "POST"
      },
      "typeVersion": 1.1
    },
    {
      "name": "Code",
      "type": "n8n-nodes-base.code",
      "position": [
        720,
        540
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "// Loop over input items and add a new field called 'myNewField' to the JSON of each one\nvar diff = $input.item.json.gitDiff\n\nlet lines = diff.trimEnd().split('\\n');\n\nlet originalCode = '';\nlet newCode = '';\n\nlines.forEach(line => {\n console.log(line)\n if (line.startsWith('-')) {\n originalCode += line + \"\\n\";\n } else if (line.startsWith('+')) {\n newCode += line + \"\\n\";\n } else {\n originalCode += line + \"\\n\";\n newCode += line + \"\\n\";\n }\n});\n\nreturn {\n originalCode:originalCode,\n newCode:newCode\n};\n\n"
      },
      "typeVersion": 2
    },
    {
      "name": "Split Out1",
      "type": "n8n-nodes-base.splitOut",
      "position": [
        140,
        740
      ],
      "parameters": {
        "options": {},
        "fieldToSplitOut": "changes"
      },
      "typeVersion": 1
    },
    {
      "name": "OpenAI Chat Model1",
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "position": [
        900,
        860
      ],
      "parameters": {
        "options": {
          "baseURL": ""
        }
      },
      "typeVersion": 1
    },
    {
      "name": "Get Changes1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        -60,
        740
      ],
      "parameters": {
        "url": "=https://gitlab.com/api/v4/projects/{{ $json[\"body\"][\"project_id\"] }}/merge_requests/{{ $json[\"body\"][\"merge_request\"][\"iid\"] }}/changes",
        "options": {},
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "PRIVATE-TOKEN"
            }
          ]
        }
      },
      "typeVersion": 4.1
    },
    {
      "name": "Skip File Change1",
      "type": "n8n-nodes-base.if",
      "position": [
        340,
        740
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.renamed_file }}",
              "rightValue": ""
            },
            {
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              },
              "leftValue": "={{ $json.deleted_file }}",
              "rightValue": ""
            },
            {
              "operator": {
                "type": "string",
                "operation": "startsWith"
              },
              "leftValue": "={{ $json.diff }}",
              "rightValue": "@@"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "name": "Parse Last Diff Line1",
      "type": "n8n-nodes-base.code",
      "position": [
        540,
        540
      ],
      "parameters": {
        "mode": "runOnceForEachItem",
        "jsCode": "const parseLastDiff = (gitDiff) => {\n gitDiff = gitDiff.replace(/\\n\\\\ No newline at end of file/, '')\n \n const diffList = gitDiff.trimEnd().split('\\n').reverse();\n const lastLineFirstChar = diffList?.[0]?.[0];\n const lastDiff =\n diffList.find((item) => {\n return /^@@ \\-\\d+,\\d+ \\+\\d+,\\d+ @@/g.test(item);\n }) || '';\n\n const [lastOldLineCount, lastNewLineCount] = lastDiff\n .replace(/@@ \\-(\\d+),(\\d+) \\+(\\d+),(\\d+) @@.*/g, ($0, $1, $2, $3, $4) => {\n return `${+$1 + +$2},${+$3 + +$4}`;\n })\n .split(',');\n \n if (!/^\\d+$/.test(lastOldLineCount) || !/^\\d+$/.test(lastNewLineCount)) {\n return {\n lastOldLine: -1,\n lastNewLine: -1,\n gitDiff,\n };\n }\n\n\n const lastOldLine = lastLineFirstChar === '+' ? null : (parseInt(lastOldLineCount) || 0) - 1;\n const lastNewLine = lastLineFirstChar === '-' ? null : (parseInt(lastNewLineCount) || 0) - 1;\n\n return {\n lastOldLine,\n lastNewLine,\n gitDiff,\n };\n};\n\nreturn parseLastDiff($input.item.json.diff)\n"
      },
      "typeVersion": 2
    },
    {
      "name": "Post Discussions1",
      "type": "n8n-nodes-base.httpRequest",
      "position": [
        1280,
        720
      ],
      "parameters": {
        "url": "=https://gitlab.com/api/v4/projects/{{ $('Webhook').item.json[\"body\"][\"project_id\"] }}/merge_requests/{{ $('Webhook').item.json[\"body\"][\"merge_request\"][\"iid\"] }}/discussions",
        "method": "POST",
        "options": {},
        "sendBody": true,
        "contentType": "multipart-form-data",
        "sendHeaders": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "body",
              "value": "={{ $('Basic LLM Chain1').item.json[\"text\"] }}"
            },
            {
              "name": "position[position_type]",
              "value": "text"
            },
            {
              "name": "position[old_path]",
              "value": "={{ $('Split Out1').item.json.old_path }}"
            },
            {
              "name": "position[new_path]",
              "value": "={{ $('Split Out1').item.json.new_path }}"
            },
            {
              "name": "position[start_sha]",
              "value": "={{ $('Get Changes1').item.json.diff_refs.start_sha }}"
            },
            {
              "name": "position[head_sha]",
              "value": "={{ $('Get Changes1').item.json.diff_refs.head_sha }}"
            },
            {
              "name": "position[base_sha]",
              "value": "={{ $('Get Changes1').item.json.diff_refs.base_sha }}"
            },
            {
              "name": "position[new_line]",
              "value": "={{ $('Parse Last Diff Line1').item.json.lastNewLine || '' }}"
            },
            {
              "name": "position[old_line]",
              "value": "={{ $('Parse Last Diff Line1').item.json.lastOldLine || '' }}"
            }
          ]
        },
        "headerParameters": {
          "parameters": [
            {
              "name": "PRIVATE-TOKEN"
            }
          ]
        }
      },
      "typeVersion": 4.1
    },
    {
      "name": "Need Review1",
      "type": "n8n-nodes-base.if",
      "position": [
        -320,
        760
      ],
      "parameters": {
        "options": {},
        "conditions": {
          "options": {
            "leftValue": "",
            "caseSensitive": true,
            "typeValidation": "strict"
          },
          "combinator": "and",
          "conditions": [
            {
              "operator": {
                "name": "filter.operator.equals",
                "type": "string",
                "operation": "equals"
              },
              "leftValue": "={{ $json.body.object_attributes.note }}",
              "rightValue": "+0"
            }
          ]
        }
      },
      "typeVersion": 2
    },
    {
      "name": "Basic LLM Chain1",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "position": [
        880,
        720
      ],
      "parameters": {
        "prompt": "=File path:{{ $('Skip File Change1').item.json.new_path }}\n\n```Original code\n {{ $json.originalCode }}\n```\nchange to\n```New code\n {{ $json.newCode }}\n```\nPlease review the code changes in this section:",
        "messages": {
          "messageValues": [
            {
              "message": "# Overview:\n You are a senior programming expert Bot, responsible for reviewing code changes and providing review recommendations.\n At the beginning of the suggestion, it is necessary to clearly make a decision to \"reject\" or \"accept\" the code change, and rate the change in the format \"Change Score: Actual Score\", with a score range of 0-100 points.\n Then, point out the existing problems in concise language and a stern tone.\n If you feel it is necessary, you can directly provide the modified content.\n Your review proposal must use rigorous Markdown format."
            }
          ]
        }
      },
      "typeVersion": 1.2
    },
    {
      "name": "Sticky Note4",
      "type": "n8n-nodes-base.stickyNote",
      "position": [
        1200,
        540
      ],
      "parameters": {
        "content": "## Replace your gitlab URL and token ⬇️"
      },
      "typeVersion": 1
    }
  ],
  "pinData": {},
  "connections": {
    "Code": {
      "main": [
        [
          {
            "node": "Basic LLM Chain1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Webhook": {
      "main": [
        [
          {
            "node": "Need Review1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Split Out1": {
      "main": [
        [
          {
            "node": "Skip File Change1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Get Changes1": {
      "main": [
        [
          {
            "node": "Split Out1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Need Review1": {
      "main": [
        [
          {
            "node": "Get Changes1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Basic LLM Chain1": {
      "main": [
        [
          {
            "node": "Post Discussions1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Skip File Change1": {
      "main": [
        [
          {
            "node": "Parse Last Diff Line1",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "OpenAI Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain1",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Parse Last Diff Line1": {
      "main": [
        [
          {
            "node": "Code",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  }
}

Workflow n8n webhook, OpenAI, collaboration, communication : pour qui est ce workflow ?

Ce workflow s'adresse principalement aux équipes de développement, aux chefs de projet et aux entreprises cherchant à automatiser la gestion des discussions et à améliorer leur communication interne. Un niveau technique intermédiaire est recommandé pour la mise en place et la personnalisation de ce workflow.

Workflow n8n webhook, OpenAI, collaboration, communication : problème résolu

Ce workflow résout le problème de la gestion manuelle des discussions autour des changements de fichiers, qui peut être chronophage et source de confusion. En automatisant ce processus, il élimine les risques d'erreurs humaines et garantit que les membres de l'équipe sont informés des modifications importantes en temps réel. Les utilisateurs peuvent ainsi se concentrer sur des tâches à plus forte valeur ajoutée, tout en maintenant une communication fluide.

Workflow n8n webhook, OpenAI, collaboration, communication : étapes du workflow

Étape 1 : le workflow est déclenché par un webhook qui reçoit des données relatives aux modifications de fichiers.

  • Étape 1 : un nœud de code traite ces données pour appliquer une logique personnalisée.
  • Étape 2 : les changements sont récupérés via une requête HTTP pour obtenir les dernières modifications.
  • Étape 3 : une condition vérifie si ces changements nécessitent une attention particulière.
  • Étape 4 : si nécessaire, une note de synthèse est générée et postée dans un canal de discussion approprié, assurant ainsi que toutes les parties prenantes sont informées.

Workflow n8n webhook, OpenAI, collaboration, communication : guide de personnalisation

Pour personnaliser ce workflow, vous pouvez modifier l'URL du webhook pour l'adapter à votre système. Il est également possible d'ajuster les paramètres des nœuds de code pour répondre à vos besoins spécifiques. Si vous souhaitez intégrer d'autres outils, vous pouvez ajouter des nœuds supplémentaires pour des notifications par email ou des mises à jour dans des outils de gestion de projet. Assurez-vous de sécuriser le flux en configurant les autorisations d'accès appropriées et en surveillant les performances via les outils de suivi intégrés.