AutomationFlowsAI & RAG › Agent Ia Projet Client

Agent Ia Projet Client

Agent IA Projet Client. Uses executeWorkflowTrigger, lmChatOpenAi, toolWorkflow, vectorStoreQdrant. Event-driven trigger; 79 nodes.

Event trigger★★★★★ complexityAI-powered79 nodesExecute Workflow TriggerOpenAI ChatTool WorkflowQdrant Vector StoreOpenAI EmbeddingsTelegram TriggerOpenAITelegram
AI & RAG Trigger: Event Nodes: 79 Complexity: ★★★★★ AI nodes: yes Added:

This workflow follows the Agent → Documentdefaultdataloader recipe pattern — see all workflows that pair these two integrations.

The workflow JSON

Copy or download the full n8n JSON below. Paste it into a new n8n workflow, add your credentials, activate. Full import guide →

Download .json
{
  "name": "Agent IA Projet Client",
  "nodes": [
    {
      "parameters": {
        "inputSource": "jsonExample",
        "jsonExample": "{\n  \"contexte\": {},\n  \"contenu\": {}\n}"
      },
      "type": "n8n-nodes-base.executeWorkflowTrigger",
      "typeVersion": 1.1,
      "position": [
        740,
        -300
      ],
      "id": "bb10eea0-8185-4b74-b1ba-7d098c764a8a",
      "name": "Workflow Input Trigger"
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.1,
      "position": [
        1040,
        -80
      ],
      "id": "3a138e65-f736-42fc-b8ac-779434050f98",
      "name": "OpenAI Chat Model",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "name": "Agent_Email",
        "description": "Cet Agent permet de gerer tous ce qui est li\u00e9 au mail.",
        "workflowId": {
          "__rl": true,
          "value": "MP7KJlj42dhEcAtw",
          "mode": "list",
          "cachedResultName": "Agent Email Projet Client"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "contexte": "={{$fromAI(\"contexte\")}}",
            "email_metadata": "={{$fromAI(\"email_metadata\",\"email_metadata au format JSON\")}}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "contexte",
              "displayName": "contexte",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "email_metadata",
              "displayName": "email_metadata",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2,
      "position": [
        1600,
        -40
      ],
      "id": "3002b086-86c5-4f80-888b-4d22677ae5d2",
      "name": "Email Agent"
    },
    {
      "parameters": {
        "mode": "retrieve-as-tool",
        "toolName": "bases_de_connaissances_entreprise",
        "toolDescription": "Cet base de donn\u00e9es comporte des informations sur l'entreprise concernant toutes l'entreprise : \n- R\u00e9ponses aux mails",
        "qdrantCollection": {
          "__rl": true,
          "value": "rag_test_video",
          "mode": "list",
          "cachedResultName": "rag_test_video"
        },
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.vectorStoreQdrant",
      "typeVersion": 1,
      "position": [
        1160,
        -60
      ],
      "id": "0b183905-64c1-4e07-ab89-fdf60f68c131",
      "name": "Qdrant Vector Store",
      "credentials": {
        "qdrantApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.embeddingsOpenAi",
      "typeVersion": 1.2,
      "position": [
        1160,
        80
      ],
      "id": "c61c09f3-0c3d-4b0a-ba70-a95c6845c562",
      "name": "Embeddings OpenAI",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "name": "calcul_distance_temps",
        "description": "Cet outil te permet de calculer le temps pour arriver \u00e0 une destination d'intervention pr\u00e9cise.",
        "workflowId": {
          "__rl": true,
          "value": "OP6u1SPfJSawxCvm",
          "mode": "list",
          "cachedResultName": "Calcul Distance Temps"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "point_B": "={{$fromAI(\"lieu_intervention\",\"destination de l'intervention \u00e0 calculer le temps le temps de d\u00e9placement. Exemple : 23 Rue Victor Hugo,33000 Bordeaux\")}}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "point_A",
              "displayName": "point_A",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            },
            {
              "id": "point_B",
              "displayName": "point_B",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string",
              "removed": false
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2,
      "position": [
        1500,
        100
      ],
      "id": "6036dfe2-1879-46c5-9e57-f42494534adc",
      "name": "Calcul Distance Temps"
    },
    {
      "parameters": {
        "name": "agen_calendrier",
        "description": "Cet agent g\u00e8re tout ce qui est reli\u00e9 aux calendrier (cr\u00e9ation,supression,modification d'\u00e9venement, v\u00e9rifier la disponibilit\u00e9 pour se d\u00e9placer, etc)",
        "workflowId": {
          "__rl": true,
          "value": "GcCKZhb3s4aRl1W7",
          "mode": "list",
          "cachedResultName": "Agent Calendrier Projet Client"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "action": "={{$fromAI(\"action\",\"d\u00e9taill\u00e9 le plus possible avec toutes les actions \u00e0 r\u00e9aliser\")}}",
            "contexte": "={{$fromAI(\"action\",\"d\u00e9taill\u00e9 le plus possible avec tout le contexte n\u00e9cessaire\")}}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "action",
              "displayName": "action",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            },
            {
              "id": "contexte",
              "displayName": "contexte",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "string"
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        }
      },
      "type": "@n8n/n8n-nodes-langchain.toolWorkflow",
      "typeVersion": 2,
      "position": [
        1760,
        -40
      ],
      "id": "c3c618b7-b99f-4798-89ba-0dd5f25e037a",
      "name": "Agent Calendrier"
    },
    {
      "parameters": {
        "updates": [
          "message"
        ],
        "additionalFields": {}
      },
      "type": "n8n-nodes-base.telegramTrigger",
      "typeVersion": 1.1,
      "position": [
        440,
        -40
      ],
      "id": "8ec28d9a-e2fa-43c2-b59b-27f506e81b30",
      "name": "Telegram Trigger",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "audio",
        "operation": "transcribe",
        "options": {
          "language": "fr"
        }
      },
      "type": "@n8n/n8n-nodes-langchain.openAi",
      "typeVersion": 1.7,
      "position": [
        880,
        -160
      ],
      "id": "1460f85b-9d59-4d1c-927b-b3f344ecb16a",
      "name": "OpenAI",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "file",
        "fileId": "={{ $json.message.voice.file_id }}"
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        740,
        -160
      ],
      "id": "81cfaad1-2dd3-40e0-ae2b-046f8fd3dae8",
      "name": "Telegram",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "rules": {
          "values": [
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "leftValue": "={{ $json.message.voice }}",
                    "rightValue": "",
                    "operator": {
                      "type": "object",
                      "operation": "exists",
                      "singleValue": true
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Audio"
            },
            {
              "conditions": {
                "options": {
                  "caseSensitive": true,
                  "leftValue": "",
                  "typeValidation": "strict",
                  "version": 2
                },
                "conditions": [
                  {
                    "id": "6ce13df7-74d1-46dc-a051-a99a13b9d2e8",
                    "leftValue": "={{ $json.message.text }}",
                    "rightValue": "",
                    "operator": {
                      "type": "string",
                      "operation": "exists",
                      "singleValue": true
                    }
                  }
                ],
                "combinator": "and"
              },
              "renameOutput": true,
              "outputKey": "Texte"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.switch",
      "typeVersion": 3.2,
      "position": [
        600,
        -40
      ],
      "id": "4defecdd-b352-4955-ab9a-4a23d86f6fb1",
      "name": "Switch"
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "f33b9884-736e-4ed8-8823-2c3d98d8c21f",
              "leftValue": "={{ $('Telegram Trigger').isExecuted}}",
              "rightValue": "",
              "operator": {
                "type": "boolean",
                "operation": "false",
                "singleValue": true
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        1500,
        -260
      ],
      "id": "0bb99661-0ff6-460a-9f33-8fdd7a994d6a",
      "name": "If"
    },
    {
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"status\": {\n\t\t\t\"type\": \"string\",\n          \"description\":\"succes ou echec\"\n\t\t},\n\t\t\"message\": {\n\t\t\t\"type\": \"string\",\n\t\t\t\"description\":\"le message de r\u00e9ponse\"\n\t\t}\n\t}\n}"
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.2,
      "position": [
        1940,
        -40
      ],
      "id": "a72f0523-96b8-4d8e-9ff6-7e551859195f",
      "name": "Structured Output Parser"
    },
    {
      "parameters": {
        "chatId": "={{ $('Telegram Trigger').first().json.message.chat.id}}",
        "text": "={{ $json.output.message }}",
        "additionalFields": {
          "appendAttribution": false,
          "reply_to_message_id": "={{ $('Telegram Trigger').first().json.message.message_id}}"
        }
      },
      "type": "n8n-nodes-base.telegram",
      "typeVersion": 1.2,
      "position": [
        1900,
        -220
      ],
      "id": "7c20d25d-a26d-427f-a399-69766fc04fac",
      "name": "Envois Message Telegram",
      "credentials": {
        "telegramApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Message Telegram re\u00e7u : \n\n{{ $('Telegram Trigger').isExecuted ? ($('OpenAI').isExecuted ? $('OpenAI').first().json.text : $json.message.text) : \"Pas de message Telegram re\u00e7u\" }}\n\nInformations sur le mail recu : \n{{ $('Workflow Input Trigger').isExecuted ? $json.contenu?.toJsonString():\"Pas d'informations sur le mail recu Message Telegram\"}}\n\nContexte : \n{{ $('Workflow Input Trigger').isExecuted ?$json.contexte?.toJsonString() :\"Message Telegram\" }}",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "=SYSTEME\nTu es l'assistant personnel de Benoit. Ton objectif est de g\u00e9rer la totalit\u00e9 des emails, le calendrier et le calcul du temps de trajet pour les interventions. Tu disposes de toutes les informations et autorisations de l'entreprise pour r\u00e9pondre aux mails des clients, g\u00e9rer les disponibilit\u00e9s, cr\u00e9er ou modifier des \u00e9v\u00e9nements dans le calendrier et envoyer des emails directement \u00e0 partir des demandes re\u00e7ues par email ou Telegram.\n\nCas Email : Suis la proc\u00e9dure classique incluant l'analyse, la v\u00e9rification et la cr\u00e9ation d'un brouillon ou l'envoi d'un email d\u00e9finitif selon les r\u00e8gles en place.\nCas Telegram : Pour les demandes issues de Telegram, tu peux directement :\nEnvoyer un email \u00e0 n'importe quel destinataire sans passer par la cr\u00e9ation d'un brouillon.\nCr\u00e9er un \u00e9v\u00e9nement dans le calendrier aux dates et heures indiqu\u00e9es.\nModifier un \u00e9v\u00e9nement existant ou d'autres \u00e9l\u00e9ments (selon la demande) sans v\u00e9rification suppl\u00e9mentaire.\nETAPES\n\nAnalyse de la Demande et D\u00e9termination de la Source\n\nIdentifier la source de la demande : email ou message Telegram.\nPour une demande par email :\nIdentifier la localisation (v\u00e9rifier si une adresse pr\u00e9cise est mentionn\u00e9e).\nRelever les informations compl\u00e9mentaires et les \u00e9ventuelles demandes sp\u00e9cifiques.\nD\u00e9terminer si la demande concerne des disponibilit\u00e9s (dans ce cas, utiliser l\u2019Agent Calendrier).\nPour une demande par Telegram :\nExtraire directement les informations pertinentes (destinataire, contenu de l\u2019email, date, heure, description, etc.) n\u00e9cessaires pour l\u2019action demand\u00e9e (envoi d'email, cr\u00e9ation ou modification d\u2019\u00e9v\u00e9nement).\nUtilisation de l'Outil Calcul Distance Temps (Cas Email uniquement)\n\nSi une adresse pr\u00e9cise est fournie dans le mail, utiliser l\u2019outil pour calculer le temps de trajet.\nSi l\u2019adresse est floue ou absente, ne pas d\u00e9clencher cet outil et poursuivre l\u2019analyse.\nR\u00e9cup\u00e9ration des Informations\n\nExtraire les donn\u00e9es pertinentes dans la base de donn\u00e9es pour r\u00e9pondre correctement \u00e0 la demande, en fonction de la source (email ou Telegram).\nValidation et Traitement de l\u2019Intervention\n\nPour une demande Email :\nV\u00e9rifier que l\u2019intervention respecte les conditions d\u00e9finies :\nSi le temps de trajet d\u00e9passe 15 minutes, envoyer un mail sp\u00e9cifique pr\u00e9configur\u00e9 (via la base de donn\u00e9es).\nPour toute demande de disponibilit\u00e9, v\u00e9rifier le calendrier avec l\u2019Agent Calendrier.\nPour une demande Telegram :\nLa demande est consid\u00e9r\u00e9e comme valid\u00e9e automatiquement, et tu ex\u00e9cutes directement l'action demand\u00e9e sans v\u00e9rification suppl\u00e9mentaire.\nSelon la demande, proc\u00e9der \u00e0 l\u2019envoi imm\u00e9diat de l\u2019email, \u00e0 la cr\u00e9ation d\u2019un nouvel \u00e9v\u00e9nement ou \u00e0 la modification d\u2019un \u00e9v\u00e9nement existant.\nValidation de la Date et de l\u2019Heure de l\u2019Intervention (Cas Email)\n\nD\u00e8s que le client a valid\u00e9 la date et l\u2019heure de l\u2019intervention dans le cadre d\u2019un email, effectuer les actions suivantes :\nCr\u00e9ation d\u2019un brouillon de r\u00e9ponse : G\u00e9n\u00e9rer et envoyer un brouillon de r\u00e9ponse par email en confirmant la date, l\u2019heure valid\u00e9es et toutes les informations n\u00e9cessaires.\nCr\u00e9ation d\u2019un \u00e9v\u00e9nement dans le calendrier : Utiliser l\u2019Agent Calendrier pour cr\u00e9er un \u00e9v\u00e9nement correspondant \u00e0 l\u2019intervention.\nSOUS AGENTS IA \u00c0 TA DISPOSITION\n\nAgent Email : Acc\u00e8de \u00e0 l'ensemble des mails de Bruce et r\u00e9alise toutes les actions sur son compte Google Mail (cr\u00e9ation, modification, suppression, tri, etc.).\nAgent Calendrier : Acc\u00e8de \u00e0 l\u2019ensemble du calendrier de Bruce et effectue toutes les actions possibles sur son calendrier Google (v\u00e9rification de disponibilit\u00e9, cr\u00e9ation, modification, suppression d\u2019\u00e9v\u00e8nements).\nOUTILS\n\nCalcul Distance Temps : Permet de calculer le temps de trajet n\u00e9cessaire pour l\u2019intervention, utilis\u00e9 uniquement lorsque l\u2019adresse est suffisamment pr\u00e9cise dans le mail.\nCONTRAINTES\n\nPour les trajets dont la dur\u00e9e est sup\u00e9rieure \u00e0 15 minutes dans les demandes par email, renvoyer un mail sp\u00e9cifique pr\u00e9configur\u00e9 dans la base de donn\u00e9es.\nLes actions et le contexte fournis aux outils doivent \u00eatre pr\u00e9cis et regrouper toutes les informations n\u00e9cessaires pour r\u00e9aliser les actions demand\u00e9es.\nUtilise l\u2019outil Calcul Distance Temps uniquement lorsqu'une adresse pr\u00e9cise est indiqu\u00e9e dans le mail. Si l\u2019adresse est floue ou absente, ne pas d\u00e9clencher cet outil.\nPour toute demande concernant les disponibilit\u00e9s par email, fais syst\u00e9matiquement appel \u00e0 l\u2019Agent Calendrier.\nLors de la validation de la date et de l\u2019heure par le client dans le cadre d\u2019un email, assure-toi de cr\u00e9er simultan\u00e9ment un brouillon de r\u00e9ponse et un \u00e9v\u00e9nement dans le calendrier.\nPour les demandes issues de Telegram, les actions demand\u00e9es (envoi d'email, cr\u00e9ation ou modification d\u2019\u00e9v\u00e9nement) se font automatiquement et directement sans v\u00e9rification interm\u00e9diaire."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        1140,
        -260
      ],
      "id": "fccdf097-b6f7-43a4-b476-d2a3abff4658",
      "name": "Agent IA"
    },
    {
      "parameters": {
        "aggregate": "aggregateAllItemData",
        "options": {}
      },
      "type": "n8n-nodes-base.aggregate",
      "typeVersion": 1,
      "position": [
        940,
        -580
      ],
      "id": "e9fb4658-bbd7-43ef-8857-43927178a730",
      "name": "Aggregate"
    },
    {
      "parameters": {},
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3,
      "position": [
        60,
        -880
      ],
      "id": "ad55c6dc-7868-41f6-9dbb-cf9dabd9829f",
      "name": "Merge"
    },
    {
      "parameters": {
        "operation": "markAsRead",
        "messageId": "={{ $json.id }}"
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        -500,
        -700
      ],
      "id": "958601c2-2e5c-4865-bf7e-6891fbde7161",
      "name": "Mark as Read",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "resource": "thread",
        "operation": "get",
        "threadId": "={{ $json.threadId }}",
        "simple": false,
        "options": {}
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        -60,
        -580
      ],
      "id": "1b4c182a-fb85-4923-be33-232be15b2bfe",
      "name": "Get Thread",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "44d3d98f-ae45-4539-b298-d5209314b25e",
              "name": "from",
              "value": "={{ $json.headers.from }}",
              "type": "string"
            },
            {
              "id": "c1c20f0a-4900-41d2-a028-92c66b2c3a5a",
              "name": "date",
              "value": "={{ $json.headers.date }}",
              "type": "string"
            },
            {
              "id": "3dbf83e9-d29c-4831-bd4a-0c7131811295",
              "name": "to",
              "value": "={{ $json.headers.to }}",
              "type": "string"
            },
            {
              "id": "50019a41-f699-4093-a47a-68c6487990fb",
              "name": "cc",
              "value": "={{$json.headers.cc}}",
              "type": "string"
            },
            {
              "id": "167482f2-bc00-4c6b-b893-8dad367601af",
              "name": "text",
              "value": "={{\n$json.html }}",
              "type": "string"
            },
            {
              "id": "bd9c15d3-a6b7-429f-91fb-13c661441f06",
              "name": "id",
              "value": "={{ $json.id }}",
              "type": "string"
            },
            {
              "id": "0ebc5705-fca0-41db-976f-53ec43e0eeb4",
              "name": "threadId",
              "value": "={{ $json.threadId }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        780,
        -580
      ],
      "id": "eb8471fc-294c-4b57-9cbb-93a823cc9c51",
      "name": "Set Values"
    },
    {
      "parameters": {
        "jsCode": "// On r\u00e9cup\u00e8re la liste des messages (ici, on s'attend \u00e0 ce que chaque message poss\u00e8de une propri\u00e9t\u00e9 \"html\"\n// contenant le message au format HTML. Sinon, on peut utiliser message.text s'il est d\u00e9j\u00e0 en HTML.)\nconst messages = $input.first().json.data;\nlet messageHistory = \"\";\n\nmessages.forEach((message, index) => {\n  // Utiliser le contenu HTML si pr\u00e9sent, sinon le contenu texte\n  let htmlContent = message.html || message.text;\n  \n  // Suppression de la partie cit\u00e9e souvent encapsul\u00e9e dans <blockquote>...</blockquote>\n  htmlContent = htmlContent.replace(/<blockquote[\\s\\S]*?<\\/blockquote>/gi, \"\");\n  \n  // Supprimer \u00e9galement les blocs de Gmail (souvent identifi\u00e9s par la classe \"gmail_quote\")\n  htmlContent = htmlContent.replace(/<div\\s+class=[\"']?gmail_quote[\"']?[\\s\\S]*?<\\/div>/gi, \"\");\n  \n  // Conversion du HTML restant en texte brut en supprimant toutes les balises HTML\n  const plainText = htmlContent.replace(/<[^>]+>/g, '').trim();\n  \n  // Formatage du message\n  messageHistory += `Message ${index}\\n`;\n  messageHistory += `${message.from}\\n`;\n  messageHistory += `${message.date}\\n`;\n  messageHistory += `Contenu : ${plainText}\\n`;\n  messageHistory += `---------------\\n`;\n});\n\nreturn { messageHistory };\n"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1120,
        -580
      ],
      "id": "aded2c75-efae-4819-9b2e-533f8dc9b65c",
      "name": "Reformat"
    },
    {
      "parameters": {
        "aggregate": "aggregateAllItemData",
        "options": {}
      },
      "type": "n8n-nodes-base.aggregate",
      "typeVersion": 1,
      "position": [
        280,
        -880
      ],
      "id": "a4e4306c-44d5-4917-9f5a-7f2e4eae5813",
      "name": "Aggregate1"
    },
    {
      "parameters": {
        "workflowId": {
          "__rl": true,
          "value": "PY7gl6KSkLwrekhB",
          "mode": "list",
          "cachedResultName": "Agent IA Projet Client"
        },
        "workflowInputs": {
          "mappingMode": "defineBelow",
          "value": {
            "contexte": "={{ $json.contexte }}",
            "contenu": "={{ $json.contenu }}"
          },
          "matchingColumns": [],
          "schema": [
            {
              "id": "contexte",
              "displayName": "contexte",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "object"
            },
            {
              "id": "contenu",
              "displayName": "contenu",
              "required": false,
              "defaultMatch": false,
              "display": true,
              "canBeUsedToMatch": true,
              "type": "object"
            }
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": true
        },
        "options": {}
      },
      "type": "n8n-nodes-base.executeWorkflow",
      "typeVersion": 1.2,
      "position": [
        680,
        -880
      ],
      "id": "398add66-e227-4286-ae21-34cffd4fb667",
      "name": "Execute Workflow"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "acc8801e-4d39-4a2f-b56c-be6912b3f18f",
              "name": "threadId",
              "value": "={{ $json.threadId }}",
              "type": "string"
            },
            {
              "id": "8cfa4ad3-fe9b-424c-a4ef-b6dd03741372",
              "name": "messageId",
              "value": "={{ $('New Mail Trigger').item.json.headers['message-id'] }}",
              "type": "string"
            },
            {
              "id": "040c0378-00b3-4d0b-9779-280c2128288f",
              "name": "sujet",
              "value": "={{ $('New Mail Trigger').item.json.subject }}",
              "type": "string"
            },
            {
              "id": "5a567866-8986-40a2-9667-097439a485a3",
              "name": "destinataire",
              "value": "={{ $('New Mail Trigger').item.json.to.value[0].address }}",
              "type": "string"
            },
            {
              "id": "56bbe669-4053-4017-a1fa-fd06dfe972fa",
              "name": "contenu",
              "value": "={{ $('New Mail Trigger').item.json.text }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -240,
        -580
      ],
      "id": "e57614ad-c0ce-4455-8173-82491191c1df",
      "name": "Incoming Values"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "67653682-790c-4967-b373-6e38a11a70f2",
              "name": "Messages",
              "value": "={{ $json.messages}}",
              "type": "array"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        120,
        -580
      ],
      "id": "81a351f0-de7f-482a-8146-3a0861435ab7",
      "name": "Extraire Thread"
    },
    {
      "parameters": {
        "operation": "get",
        "messageId": "={{ $json.id }}",
        "simple": false,
        "options": {}
      },
      "type": "n8n-nodes-base.gmail",
      "typeVersion": 2.1,
      "position": [
        580,
        -580
      ],
      "id": "5663d808-808a-491a-ba15-509bce76efc6",
      "name": "Get Full Messages",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "fieldToSplitOut": "Messages",
        "options": {}
      },
      "type": "n8n-nodes-base.splitOut",
      "typeVersion": 1,
      "position": [
        340,
        -580
      ],
      "id": "3e3e5574-982c-4b7e-882a-ae862dba8d2e",
      "name": "Split Out"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "2fb466a8-5d20-45e0-abfd-1d8b6d42eb8b",
              "name": "contexte.historique_message",
              "value": "={{ $json.data[1].messageHistory }}",
              "type": "string"
            },
            {
              "id": "d14f6d03-f0bd-4929-9a94-729a9f91d006",
              "name": "contenu.threadId",
              "value": "={{ $json.data[0].threadId }}",
              "type": "string"
            },
            {
              "id": "52953ff3-0a45-4e3a-9e5d-2044494d1fe2",
              "name": "contenu.id",
              "value": "={{ $json.data[0].id }}",
              "type": "string"
            },
            {
              "id": "cbedcf48-6049-4799-9361-702e0159e09a",
              "name": "contenu.from",
              "value": "={{ $json.data[0].from }}",
              "type": "string"
            },
            {
              "id": "76bad8c7-eeb4-40bf-b4c5-a18788bc79e4",
              "name": "contenu.sujet",
              "value": "={{ $json.data[0].sujet }}",
              "type": "string"
            },
            {
              "id": "66bca498-2fbe-44fa-9c6a-37feaf20204d",
              "name": "contenu.to",
              "value": "={{ $json.data[0].to }}",
              "type": "string"
            },
            {
              "id": "5ed7c750-d33f-481f-af07-ec55fe3123f5",
              "name": "contenu.cc",
              "value": "={{ $json.data[0].cc }}",
              "type": "string"
            },
            {
              "id": "e727ee55-65bc-4ac0-a0e8-5ee3a69b6109",
              "name": "contenu.text",
              "value": "={{ $json.data[0].text }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        460,
        -880
      ],
      "id": "af03dd65-a3b5-4945-98fa-1a08a2b5f31c",
      "name": "Contenu et Contexte"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "65cfc032-b46e-49b5-ad25-d6c6ddfbf74a",
              "name": "from",
              "value": "={{ $('New Mail Trigger').first().json.headers.from }}",
              "type": "string"
            },
            {
              "id": "78c55e81-06f5-4042-ac74-a9d3409c00a9",
              "name": "to",
              "value": "={{ $('New Mail Trigger').first().json.headers.to }}",
              "type": "string"
            },
            {
              "id": "e41812ca-2c68-4e01-8ce1-236f9546bfd5",
              "name": "sujet",
              "value": "={{ $('New Mail Trigger').first().json.headers.subject }}",
              "type": "string"
            },
            {
              "id": "c09367f6-e71b-4c87-9a2f-4e0d78b30e1a",
              "name": "cc",
              "value": "={{ $('New Mail Trigger').first().json.cc}}",
              "type": "string"
            },
            {
              "id": "7ed66628-e1db-4edc-9a23-e3a146906994",
              "name": "text",
              "value": "={{ $('New Mail Trigger').first().json.text }}",
              "type": "string"
            },
            {
              "id": "a88eb146-9608-4095-9576-ad702a9cb427",
              "name": "id",
              "value": "={{ $('New Mail Trigger').first().json.id }}",
              "type": "string"
            },
            {
              "id": "d3b71891-6aa5-4791-b0ff-f206dda05815",
              "name": "threadId",
              "value": "={{ $('New Mail Trigger').first().json.threadId }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -240,
        -880
      ],
      "id": "614b0c90-67d4-47a2-8012-f1ccaf88b6c1",
      "name": "Valeurs Nouveau Mail"
    },
    {
      "parameters": {
        "pollTimes": {
          "item": [
            {
              "mode": "everyMinute"
            }
          ]
        },
        "simple": false,
        "filters": {
          "labelIds": [
            "Label_8539074419482270668"
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.gmailTrigger",
      "typeVersion": 1.2,
      "position": [
        -640,
        -700
      ],
      "id": "9587bb44-fe81-45d4-8898-f1e085d772d9",
      "name": "New Mail Trigger",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=\nAction : {{ $json.action }}\nContexte : {{ $json.contexte }}\nDate d'aujourd'hui : {{ $now.format('yyyy-MM-dd') }}\nDate Demain : {{ $now.plus(1,\"day\").format('yyyy-MM-dd') }}\n\nSYSTEME \n\nTu es expert en gestion de calendrier. Ton unique but est de g\u00e9rer un calendrier (ajout,modification,supression,v\u00e9rification disponibitit\u00e9, r\u00e9cup\u00e9ration d'informations de r\u00e9union). Toutes ces taches doivent execut\u00e9s a la perfection en fonction d'un contexte et d'un action demand\u00e9. La pertinence et le choix des outils est donc ULTRA IMPORTANT\n\nETAPES\n\n1) Analyser l'action demand\u00e9 et le contexte de la demande\n2) R\u00e9cuperer les outils n\u00e9cessaire pour r\u00e9aliser la t\u00e2che\n3) Utiliser les outils requis\n4) R\u00e9pondre avec un compte rendu d\u00e9taill\u00e9 du succ\u00e8s ou de l\u2019\u00e9chec de la t\u00e2che, en pr\u00e9cisant les raisons et les \u00e9ventuelles solutions.\n\nOUTILS \n\nRecuperer Information Evenement : Cet outil te permet de r\u00e9cuperer les informations sur un evenement pr\u00e9cis.\nCreer Evenement : Cet outil te permet de cr\u00e9er un evenement dans le calendrier de Benoit\nModifier Evenement: Cet outil te permet de modifier un evenement d\u00e9j\u00e0 cr\u00e9\u00e9 dans un calendrier\nSupprimer Evenement : Cet outil te permet de supprimer un evenement dans le calendrier\nVerifier Disponibilite : Cet outil te permet de v\u00e9rifier les disponibilit\u00e9s du calendrier.\nLister Evenements : Cet outil te permet de lister les evenements dans un calendrier dans le but de r\u00e9cuperer l'event ID d'un evenement\n\nCONTRAINTES \n\nBase toi uniquement sur l'action et le contexte n'invente aucune informations\nTa r\u00e9ponse sur le succ\u00e9s et l'\u00e9chec doivent \u00eatre d\u00e9taill\u00e9 et pr\u00e9cise",
        "hasOutputParser": true,
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        1860,
        480
      ],
      "id": "c252a7aa-7c49-481f-a9c6-be20fe596821",
      "name": "Calendrier Agent"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de cr\u00e9er un evenement dans le calendrier de Benoit",
        "calendar": {
          "__rl": true,
          "value": "benoit.ferrere11@gmail.com",
          "mode": "list",
          "cachedResultName": "benoit.ferrere11@gmail.com"
        },
        "start": "={{ $fromAI(\"date_debut\",\"date de debut de l'ev\u00e9nement\") }}",
        "end": "={{ $fromAI(\"date_fin\",\"date de fin de l'ev\u00e9nement\") }}",
        "additionalFields": {
          "attendees": [],
          "description": "={{$fromAI(\"description\")}}",
          "summary": "={{$fromAI(\"titre_evenement\")}}"
        }
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        1960,
        920
      ],
      "id": "425a10e1-e1b6-4a66-a94c-9c1e42c8727b",
      "name": "Creer Evenement",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de modifier un evenement d\u00e9j\u00e0 cr\u00e9\u00e9 dans un calendrier",
        "operation": "update",
        "calendar": {
          "__rl": true,
          "value": "benoit.ferrere11@gmail.com",
          "mode": "list",
          "cachedResultName": "benoit.ferrere11@gmail.com"
        },
        "eventId": "={{$fromAI(\"event_id\",\"event_id de l'ev\u00e9nement \u00e0 modifier\")}}",
        "updateFields": {
          "attendeesUi": {
            "values": {
              "mode": "={{ $fromAI(\"mode_modification_participants\",\"replace ou add\") }}",
              "attendees": [
                "={{ $fromAI(\"nouveau_participants\",\"le mail des participants qui doivent etre ajout\u00e9 ou remplacer s\u00e9par\u00e9s par des virgules. Exemple : nouveau_mail1,nouveau_mail2\") }}"
              ]
            }
          },
          "description": "={{ $fromAI(\"nouvelle_description_evenement\") }}",
          "end": "={{ $fromAI(\"nouvelle_date_fin_evenement\") }}",
          "start": "={{ $fromAI(\"nouvelle_date_debut_evenement\") }}",
          "summary": "={{ $fromAI(\"nouveau_titre_evenement\") }}"
        }
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        2100,
        920
      ],
      "id": "bb9169d4-737f-4d28-a4fe-e96375a3ad91",
      "name": "Modifier Evenement",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de supprimer un evenement dans le calendrier",
        "operation": "delete",
        "calendar": {
          "__rl": true,
          "value": "benoit.ferrere11@gmail.com",
          "mode": "list",
          "cachedResultName": "benoit.ferrere11@gmail.com"
        },
        "eventId": "={{$fromAI(\"event_id\",\"l'event_id de l'ev\u00e9nement \u00e0 supprimer\")}}",
        "options": {
          "sendUpdates": "={{ $fromAI(\"envois_update\",\"all,externalOnly ou none\") }}"
        }
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        2240,
        920
      ],
      "id": "db847a68-627c-4ce8-9e27-6bcb6909b635",
      "name": "Supprimer Evenement",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de v\u00e9rifier les disponibilit\u00e9s du calendrier.",
        "operation": "getAll",
        "calendar": {
          "__rl": true,
          "value": "benoit.ferrere11@gmail.com",
          "mode": "list",
          "cachedResultName": "benoit.ferrere11@gmail.com"
        },
        "returnAll": true,
        "timeMin": "={{ $fromAI(\"date_apres\",\"date de periode pour obtenir tous les evenements apr\u00e8s la date mentionn\u00e9\") }}",
        "timeMax": "={{ $fromAI(\"date_avant\",\"date de periode pour obtenir tous les evenements avant la date mentionne\")}}",
        "options": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        2100,
        760
      ],
      "id": "85b99dd5-04e4-405f-9597-0b9af6220429",
      "name": "Verifier Disponibilite",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9cuperer les informations sur un evenement pr\u00e9cis.",
        "operation": "get",
        "calendar": {
          "__rl": true,
          "value": "benoit.ferrere11@gmail.com",
          "mode": "list",
          "cachedResultName": "benoit.ferrere11@gmail.com"
        },
        "eventId": "={{ $fromAI(\"event_id\",\"l'event ID de l'\u00e9venement \u00e0 r\u00e9cuperer pr\u00e9cisement\") }}",
        "options": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        2240,
        760
      ],
      "id": "b4c5bbf7-d2be-455e-9afb-3cf86b138ab3",
      "name": "Recuperer Information Evenement",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de lister les evenements dans un calendrier dans le but de r\u00e9cuperer l'event ID d'un evenement",
        "operation": "getAll",
        "calendar": {
          "__rl": true,
          "value": "benoit.ferrere11@gmail.com",
          "mode": "list",
          "cachedResultName": "benoit.ferrere11@gmail.com"
        },
        "returnAll": true,
        "timeMin": "={{ $fromAI(\"date_debut_liste\",\"la date apres laquelle on liste les evenements\") }}",
        "timeMax": "={{ $fromAI(\"date_fin_liste\",\"la date de fin ou l'on s'arrete pour lister les evenements\") }}",
        "options": {}
      },
      "type": "n8n-nodes-base.googleCalendarTool",
      "typeVersion": 1.3,
      "position": [
        1960,
        760
      ],
      "id": "dfbab229-addc-443b-acd1-f837088c9c9f",
      "name": "Lister Evenements",
      "credentials": {
        "googleCalendarOAuth2Api": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatOpenAi",
      "typeVersion": 1.1,
      "position": [
        1800,
        760
      ],
      "id": "10393650-8ff1-42ef-b1be-7cea1ea95e9c",
      "name": "OpenAI Chat Model1",
      "credentials": {
        "openAiApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n\t\"type\": \"object\",\n\t\"properties\": {\n\t\t\"status\": {\n\t\t\t\"type\": \"string\",\n          \"description\":\"succes ou echec\"\n\t\t},\n\t\t\"desc\": {\n\t\t\t\"type\":\"string\",\n          \"description\":\"description d\u00e9taill\u00e9 sur l'\u00e9chec ou le succ\u00e9s de la l'action demand\u00e9\"\n\t\t}\n\t}\n}"
      },
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "typeVersion": 1.2,
      "position": [
        2400,
        760
      ],
      "id": "f4f782cd-8e76-42d8-b37b-17a52d837178",
      "name": "Structured Output Parser1"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Contexte :\n{{ $json.contexte }}\n\nEmail metadata : \n{{ $json.email_metadata }}",
        "hasOutputParser": true,
        "options": {
          "systemMessage": "=SYSTEME\nL'agent IA agit en tant que gestionnaire centralis\u00e9 des brouillons de r\u00e9ponses aux emails de l'entreprise. Il dispose d'un acc\u00e8s complet aux outils Gmail via n8n, mais sa fonction se limite \u00e0 la pr\u00e9paration, la cr\u00e9ation et l'enregistrement de brouillons de r\u00e9ponses (sans envoi d\u00e9finitif) pour permettre une validation ou une modification avant toute diffusion. L'agent op\u00e8re en conformit\u00e9 avec les r\u00e8gles de s\u00e9curit\u00e9 et de confidentialit\u00e9 de l'entreprise.\n\nOBJECTIFS\n\nCr\u00e9er et g\u00e9rer efficacement les brouillons de r\u00e9ponses aux emails de l'entreprise.\nAutomatiser la pr\u00e9paration des r\u00e9ponses tout en laissant la possibilit\u00e9 d'intervention humaine avant envoi d\u00e9finitif.\nGarantir une interface coh\u00e9rente et s\u00e9quenc\u00e9e pour l'ex\u00e9cution des t\u00e2ches, assurant un traitement fiable et s\u00e9curis\u00e9 des demandes.\nCONTEXTE\nL'agent IA intervient dans le cadre de la gestion des communications par email de l'entreprise, se focalisant exclusivement sur la pr\u00e9paration des r\u00e9ponses sous forme de brouillons. Bien qu\u2019il ait acc\u00e8s \u00e0 l'ensemble des fonctionnalit\u00e9s Gmail (envoi, r\u00e9cup\u00e9ration, suppression, gestion des labels, etc.) via n8n, son action est strictement limit\u00e9e \u00e0 la cr\u00e9ation et la gestion des brouillons, permettant ainsi une v\u00e9rification pr\u00e9alable par un utilisateur ou un processus de validation interne.\n\nETAPES\n\nR\u00e9ception et Analyse de la Demande\n\nCollecter le contexte et les m\u00e9tadonn\u00e9es de l'email ou de la demande (contexte + email_metadata).\nIdentifier que l'action demand\u00e9e concerne la pr\u00e9paration d\u2019un brouillon de r\u00e9ponse.\nValidation et S\u00e9lection de l'Outil Appropri\u00e9\n\nV\u00e9rifier les autorisations et la validit\u00e9 de la demande pour la cr\u00e9ation d\u2019un brouillon.\nS\u00e9lectionner l\u2019outil Gmail appropri\u00e9 via n8n pour cr\u00e9er ou modifier un brouillon.\nPr\u00e9paration de la R\u00e9ponse\n\nStructurer les param\u00e8tres requis pour le brouillon (destinataires, contenu de la r\u00e9ponse, labels \u00e9ventuels, identifiants de thread ou de brouillon, etc.).\nG\u00e9n\u00e9rer une commande ou requ\u00eate conforme aux API de Gmail via n8n pour cr\u00e9er ou mettre \u00e0 jour le brouillon.\nEx\u00e9cution de l'Action\n\nLancer l\u2019outil s\u00e9lectionn\u00e9 avec les param\u00e8tres pr\u00e9par\u00e9s afin de cr\u00e9er ou mettre \u00e0 jour le brouillon de r\u00e9ponse.\nS\u2019assurer que la s\u00e9quence d\u2019actions respecte l\u2019ordre d\u00e9fini et que le brouillon est enregistr\u00e9 sans \u00eatre envoy\u00e9.\nV\u00e9rification et Retour d'Information\n\nConfirmer la r\u00e9ussite de la cr\u00e9ation ou de la mise \u00e0 jour du brouillon (retour des codes de statut ou des confirmations de succ\u00e8s).\nEn cas d'erreur, identifier le point de d\u00e9faillance et d\u00e9clencher un processus de reprise ou d'alerte.\nCommuniquer le r\u00e9sultat de l'action \u00e0 l'utilisateur ou au syst\u00e8me de monitoring interne.\nArchivage et Journalisation\n\nEnregistrer l'ensemble des actions et m\u00e9tadonn\u00e9es pour une tra\u00e7abilit\u00e9 compl\u00e8te.\nMettre \u00e0 jour les logs et les historiques d'actions pour faciliter les audits futurs.\nCONTRAINTES\n\nRespect strict des r\u00e8gles de s\u00e9curit\u00e9 et de confidentialit\u00e9 des donn\u00e9es de l'entreprise.\nGestion rigoureuse des erreurs et des exceptions afin d\u2019\u00e9viter toute perte de donn\u00e9es ou dysfonctionnement.\nLimitation des actions aux seules op\u00e9rations de gestion de brouillons de r\u00e9ponses, m\u00eame si l\u2019agent a acc\u00e8s aux autres fonctionnalit\u00e9s Gmail.\nSuivi de la s\u00e9quence d\u2019actions pr\u00e9d\u00e9finie pour garantir l\u2019int\u00e9grit\u00e9 du processus (chaque \u00e9tape d\u00e9pend des r\u00e9sultats de l'\u00e9tape pr\u00e9c\u00e9dente).\nOptimisation des performances pour minimiser les d\u00e9lais de traitement tout en assurant la fiabilit\u00e9 des actions."
        }
      },
      "type": "@n8n/n8n-nodes-langchain.agent",
      "typeVersion": 1.7,
      "position": [
        620,
        480
      ],
      "id": "773e41e6-1577-4a3c-aefa-f9d9a5ef8941",
      "name": "Agent EMAIL",
      "onError": "continueErrorOutput"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9cuperer plusieurs messages en fonction de param\u00e8tres (d\u00e9finit ou pas): \n- P\u00e9riode (d\u00e9but et fin)\n- Mail envoy\u00e9 d'une personne pr\u00e9cise",
        "operation": "getAll",
        "filters": {
          "receivedAfter": "={{ $fromAI(\"recu_apres\",\"r\u00e9cuperation de tous les messages apres cette date\") }}",
          "receivedBefore": "={{ $fromAI(\"recu_avant\",\"r\u00e9cuperation de tous les messages avant cette date\") }}",
          "sender": "={{$fromAI(\"mail_envoyeur\",\"r\u00e9cuperation de tous les messages envoy\u00e9s par ce mail\")}}"
        }
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        1180,
        720
      ],
      "id": "2bdd2f02-ca3b-4003-b811-2f9208903663",
      "name": "Recuperer Plusieurs Messages",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9cuperer un mail pr\u00e9cis",
        "operation": "get",
        "messageId": "={{ $fromAI(\"message_id\",\"message_id de l'email qu'on veut r\u00e9cuperer\") }}"
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        1320,
        720
      ],
      "id": "f61fa1eb-f172-43fe-be0c-bcc04aa8ed55",
      "name": "Recuperer Message",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9cuperer plusieurs Label afin de pouvoir les utiliser",
        "resource": "label"
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        700,
        900
      ],
      "id": "1e075eb7-c5f5-4655-8736-4b2c5e41b834",
      "name": "Recuperer Plusieurs Label",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9cuperer un label pr\u00e9cis",
        "resource": "label",
        "operation": "get",
        "labelId": "={{$fromAI(\"label_id\",\"label_id du label \u00e0 r\u00e9cuperer pr\u00e9cisement\")}}"
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        860,
        900
      ],
      "id": "7c0c0093-36e4-4fa6-8579-9c61afbbec48",
      "name": "Recuperer Label",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de cr\u00e9er un label pr\u00e9cis pour les mails",
        "resource": "label",
        "operation": "create",
        "name": "={{$fromAI(\"nom_label\")}}",
        "options": {}
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        980,
        900
      ],
      "id": "d4c4a8ef-2d1c-4bfe-af81-155fda144027",
      "name": "Creer Label",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de suppriemr un label pr\u00e9cis",
        "resource": "label",
        "operation": "delete",
        "labelId": "={{$fromAI(\"label_id\",\"label_id du label que tu dois supprimer\")}}"
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        1140,
        900
      ],
      "id": "c5ccf8bf-d12e-4192-acf2-2e436abdc81c",
      "name": "Supprimer Label",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de cr\u00e9er un brouillon \u00e0 envoyer \u00e0 une personne,r\u00e9pondre \u00e0 un mail ou un thread",
        "resource": "draft",
        "subject": "={{$fromAI(\"titre_brouillon\")}}",
        "message": "={{$fromAI(\"contenu_brouillon\")}}",
        "options": {
          "replyTo": "={{ $fromAI(\"envois_reponse_a\",\"les mails \u00e0 qui est adress\u00e9 ce brouillon de r\u00e9ponse s\u00e9par\u00e9 par des virgules. Exemple: mail1,mail2\") }}",
          "threadId": "={{$fromAI(\"thread_id\",\"thread_id du thread auquelle on envoit le brouillon\")}}",
          "sendTo": "={{$fromAI(\"receveurs_brouillon_email\",\"les mails a qui est adress\u00e9 ce brouillon s\u00e9par\u00e9 par des virgules, Exemple : mail1,mail2\")}}"
        }
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        700,
        720
      ],
      "id": "2d1f5c3d-5dce-474a-a9d3-e5942cbb1eaf",
      "name": "Creer Brouillon",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9cuperer pluieurs brouillons ",
        "resource": "draft",
        "operation": "getAll",
        "options": {}
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        1000,
        720
      ],
      "id": "1770f32c-f4cf-4464-8874-dab1d097697d",
      "name": "Recuperer Plusieurs Brouillons",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9cuperer un brouillon pr\u00e9cis",
        "resource": "draft",
        "operation": "get",
        "messageId": "={{$fromAI(\"draft_id\",\"draft_id du brouillon \u00e0 r\u00e9cuperer pr\u00e9cisement\")}}",
        "options": {}
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        860,
        720
      ],
      "id": "47bdd813-968a-43c1-bf73-8f13fea08e62",
      "name": "Recuperer Brouillon",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de supprimer un brouillon pr\u00e9cis",
        "resource": "draft",
        "operation": "delete",
        "messageId": "={{$fromAI(\"draft_id\",\"draft_id du brouillon qui doit \u00eatre supprimer pr\u00e9cisement\")}}"
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        1300,
        900
      ],
      "id": "c01965cb-b2ee-4d6a-a72e-ac5dc90df470",
      "name": "Supprimer Brouillon",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "mode": "raw",
        "jsonOutput": "{\n  \"status\": \"echec\",\n  \"desc\": \"echec de l'agent Email\"\n}\n",
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1200,
        480
      ],
      "id": "5aff5853-f0a9-42fe-97a0-421af4ead76c",
      "name": "Reponse Erreur"
    },
    {
      "parameters": {
        "assignments": {
          "assignments": [
            {
              "id": "54bbc7f7-4acb-4bdd-9071-1a8674efd9bb",
              "name": "reponse",
              "value": "={{ $json.output }}",
              "type": "string"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        1220,
        340
      ],
      "id": "f9cffc9a-4b36-44fe-a2cf-36a94ace0619",
      "name": "Reponse Succes"
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de supprimer un mail pr\u00e9cisement",
        "operation": "delete",
        "messageId": "={{ $fromAI(\"message_id\",\"message_id du mail qu'on veut supprimer\") }}"
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        1440,
        840
      ],
      "id": "8c9e0c5a-325a-4502-a07f-d134643013ec",
      "name": "Supprimer Message",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet d'ajouter un Label sur un Thread",
        "resource": "thread",
        "operation": "addLabels",
        "threadId": "={{$fromAI(\"thread_id\",\"thread_id du thread sur lequelle le label doit \u00eatre mis\")}}",
        "labelIds": "={{ $fromAI(\"liste_labels\",\"liste des labels a mettre sur le thread. La liste doit contenir chaque label_id pertinent pour le thread\") }}"
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        700,
        1080
      ],
      "id": "2e9415ff-d32e-4273-b763-d48704696508",
      "name": "Ajouter Label sur Conversation",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de supprimer un ou des labels sur un tread",
        "resource": "thread",
        "operation": "removeLabels",
        "threadId": "={{$fromAI(\"thread_id\",\"thread_id du thread ou l'on supprimer l'un ou les labels\")}}",
        "labelIds": "={{ $fromAI(\"liste_label_a_supprimer\",\"liste des labels \u00e0 supprimer sur le thread. Doit contenir les labels_id de chaque label \u00e0 supprimer\")}}"
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        980,
        1060
      ],
      "id": "44cf3eb8-e008-47f4-b27d-22b899bbce8d",
      "name": "Supprimer Labels sur Conversation",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9pondre \u00e0 un Thread",
        "resource": "thread",
        "operation": "reply",
        "threadId": "={{$fromAI(\"thread_id\",\"thread_id du thread qui doit \u00eatre r\u00e9pondu par le message\")}}",
        "message": "={{$fromAI(\"contenu_reponse_thread\",\"r\u00e9ponse au thread\")}}",
        "options": {}
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        1120,
        1060
      ],
      "id": "0c66cb41-73da-4846-9ead-a241311f0c39",
      "name": "Repond a une Conversation",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9cuperer plusieurs Threads en fonction de paramatres (d\u00e9fini ou pas) :\n-P\u00e9riode avec une date de d\u00e9but et une date de fin",
        "resource": "thread",
        "filters": {
          "receivedAfter": "={{ $fromAI(\"recu_apres\",\"r\u00e9cuperation de tous les threads apres cette date\") }}",
          "receivedBefore": "={{ $fromAI(\"recu_avant\",\"r\u00e9cuperation de tous les threads avant cette date\") }}"
        }
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        1280,
        1060
      ],
      "id": "748676af-f46b-45cf-9f80-6504c54da862",
      "name": "Recuperer Plusieurs Conversations",
      "credentials": {
        "gmailOAuth2": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "descriptionType": "manual",
        "toolDescription": "Cet outil te permet de r\u00e9cuperer un thread pr\u00e9cis",
        "resource": "thread",
        "operation": "get",
        "threadId": "={{$fromAI(\"thread_id\",\"thread_id du thread \u00e0 r\u00e9cuperer pr\u00e9cisement\")}}",
        "options": {}
      },
      "type": "n8n-nodes-base.gmailTool",
      "typeVersion": 2.1,
      "position": [
        840,
        1060
      ],
      "id": "bd912cff-9e5b-4add-b9d7-c389d07a81e4",
   

Credentials you'll need

Each integration node will prompt for credentials when you import. We strip credential IDs before publishing — you'll add your own.

Pro

For the full experience including quality scoring and batch install features for each workflow upgrade to Pro

About this workflow

Agent IA Projet Client. Uses executeWorkflowTrigger, lmChatOpenAi, toolWorkflow, vectorStoreQdrant. Event-driven trigger; 79 nodes.

Source: https://github.com/Stirito/N8N_Workflow_Template/blob/3a287db93553c1da2bac6454d4792cdc8bdbc4d1/Agent_IA_Projet_Client.json — original creator credit. Request a take-down →

More AI & RAG workflows → · Browse all categories →

Related workflows

Workflows that share integrations, category, or trigger type with this one. All free to copy and import.

AI & RAG

Api Schema Extractor. Uses manualTrigger, httpRequest, splitOut, textSplitterRecursiveCharacterTextSplitter. Event-driven trigger; 88 nodes.

HTTP Request, Text Splitter Recursive Character Text Splitter, Document Default Data Loader +9
AI & RAG

Wait Splitout. Uses manualTrigger, httpRequest, splitOut, textSplitterRecursiveCharacterTextSplitter. Event-driven trigger; 88 nodes.

HTTP Request, Text Splitter Recursive Character Text Splitter, Document Default Data Loader +9
AI & RAG

This workflow automates the process of discovering and extracting APIs from various services, followed by generating custom schemas. It works in three distinct stages: research, extraction, and schema

HTTP Request, Text Splitter Recursive Character Text Splitter, Document Default Data Loader +9
AI & RAG

A lightweight, self-hosted AI assistant built entirely in n8n. Multi-channel messaging (Telegram, WhatsApp, Gmail), persistent memory, task management, and autonomous work — all in a single visual wor

Telegram Trigger, OpenRouter Chat, Data Table +20
AI & RAG

This workflow implements an advanced AI automation agent (OpenClaw Agent) that interacts with users through Telegram and integrates multiple AI models, external tools, and cloud services to automate c

Telegram Trigger, Telegram, OpenAI +21