Automatisation du tri des candidats avec l'analyse de CV par Mistral OCR et Gemini AI

Avancé

Ceci est unHR, Multimodal AIworkflow d'automatisation du domainecontenant 18 nœuds.Utilise principalement des nœuds comme MistralAi, FormTrigger, GoogleSheets, ManualTrigger, ChainLlm. Automatisation du criblage des candidats avec analyse de CV par Mistral OCR et Gemini AI

Prérequis
  • Informations d'identification Google Sheets API
  • Clé API Google Gemini
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
{
  "meta": {
    "instanceId": "e409ea34548a2afe2dffba31130cd1cf2e98ebe2afaeed2a63caf2a0582d1da0"
  },
  "nodes": [
    {
      "id": "821d52da-591f-44db-b218-ee3974855a05",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Note adhésive - Créer feuille de calcul1",
      "type": "n8n-nodes-base.stickyNote",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -1408,
        608
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 272,
        "content": "Initializes a new Google Sheet with columns for applicant data. Can be replaced with Airtable, Notion, etc."
      },
      "typeVersion": 1
    },
    {
      "id": "72c7af0e-d8f8-4498-a849-b95c323a6cd6",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Note adhésive - Ajouter ligne1",
      "type": "n8n-nodes-base.stickyNote",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -720,
        256
      ],
      "parameters": {
        "color": 7,
        "width": 320,
        "height": 288,
        "content": "Adds the applicant's name and email to the Google Sheet right after they submit the form to have it logged even if the workflow fails."
      },
      "typeVersion": 1
    },
    {
      "id": "b8076a35-fb6e-481d-9d92-3a95e9c3c732",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Note adhésive - Extraire texte1",
      "type": "n8n-nodes-base.stickyNote",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -704,
        576
      ],
      "parameters": {
        "color": 7,
        "width": 224,
        "height": 304,
        "content": "This uses **[Mistral OCR](https://mistral.ai/fr/news/mistral-ocr)**, it extracts the text perfectly from a candidate's CV (PDF).\n\n**[Get your Mistral API key here](https://console.mistral.ai/api-keys)**"
      },
      "typeVersion": 1
    },
    {
      "id": "f7d1f44f-2d84-4a97-adad-2923f6ba1736",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Note adhésive - Chaîne LLM1",
      "type": "n8n-nodes-base.stickyNote",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -464,
        608
      ],
      "parameters": {
        "color": 6,
        "width": 320,
        "height": 248,
        "content": "Adapt the `job requirements` in the prompt to **your position & criteria**."
      },
      "typeVersion": 1
    },
    {
      "id": "a1e153ae-1a1b-4a4f-b901-b999c31b4059",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Note adhésive - Analyseur de sortie1",
      "type": "n8n-nodes-base.stickyNote",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -320,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 368,
        "height": 256,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n\nEnsures the AI's response is perfectly structured as JSON (e.g., `qualificationRate`, `explanation`), making the data reliable and easy to use."
      },
      "typeVersion": 1
    },
    {
      "id": "641d597c-400b-4d6c-a21c-5fc28099c9be",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Note adhésive - Mettre à jour ligne1",
      "type": "n8n-nodes-base.stickyNote",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -128,
        608
      ],
      "parameters": {
        "color": 7,
        "width": 272,
        "height": 256,
        "content": "Check your Google Sheets! You now have the analysis of the candidate."
      },
      "typeVersion": 1
    },
    {
      "id": "704e43dd-ee85-4514-8a41-cb3daaf71eee",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Note adhésive - Objectif du workflow1",
      "type": "n8n-nodes-base.stickyNote",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -1872,
        288
      ],
      "parameters": {
        "width": 448,
        "height": 592,
        "content": "## Automated CV Scanner\n\nThis workflow automates your hiring pipeline:\n1.  **Collects** applications via a web form.\n2.  **Extracts** text from the CV (PDF).\n3.  **Analyzes** the CV with AI against your job description.\n4.  **Stores** the candidate's score and a detailed explanation in Google Sheets.\n\n\n### Questions or Feedback?\nFor feedback, coaching, built-for-you workflows, or any questions, use my unified AI-powered contact form.\n\n➡️ **[Get in Touch Here](https://api.ia2s.app/form/templates/academy)**\n\n*Happy Automating! —Lucas Peyrin*"
      },
      "typeVersion": 1
    },
    {
      "id": "cb5ef831-79f7-4129-9642-6ece79a3603e",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Formulaire de candidature",
      "type": "n8n-nodes-base.formTrigger",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -928,
        704
      ],
      "webhookId": "230e09f7-33df-4266-917d-ce3398cae141",
      "parameters": {
        "options": {
          "path": "230e09f7-33df-4266-917d-ce3398cae141",
          "customCss": "/* --- ROOT VARIABLES (Dark Professional Theme) --- */\n:root {\n\t/* --- FONT MAPPING --- */\n\t--font-family: 'Inter', sans-serif;\n\t--font-weight-normal: 400;\n\t--font-weight-bold: 600;\n\t--font-size-body: 14px;\n\t--font-size-label: 14px;\n\t--font-size-input: 14px;\n\t--font-size-header: 24px;\n\t--line-height-base: 1.6;\n\n\t/* --- COLOR MAPPING (Dark Slate/Purple Theme) --- */\n\t--color-page-bg: #111827; /* Dark Slate */\n\t--color-card-bg-glass: rgba(29, 39, 53, 0.65); /* Darker, less transparent glass */\n\t--color-card-border-glass: rgba(255, 255, 255, 0.1); /* Subtle light border */\n\t--color-input-bg: #1F2937; /* Slightly lighter than page bg */\n\t--color-header: #F9FAFB; /* Off-white for high contrast */\n\t--color-label: #9CA3AF; /* Light gray for secondary text */\n\t--color-input-text: #F9FAFB;\n\t--color-input-border: #4B5563; /* Mid-gray border */\n\t--color-focus-border: #8B5CF6; /* Vibrant Purple */\n\t--color-link: #8B5CF6;\n\t--color-submit-btn-bg: #8B5CF6;\n\t--color-submit-btn-hover-bg: #7C3AED; /* Darker Purple */\n\t--color-submit-btn-text: #FFFFFF;\n\t--color-error: #F43F5E; /* Vibrant Rose for errors */\n\t--color-required: #F43F5E;\n\n\t/* --- DIMENSIONS & SPACING --- */\n\t--container-width: 550px;\n\t--border-radius-card: 16px;\n\t--border-radius-input: 8px;\n\t--padding-card: 32px;\n\t--padding-form-input: 14px;\n\t--submit-btn-height: 48px;\n\t--checkbox-size: 20px;\n\n\t/* --- EFFECTS & ANIMATIONS --- */\n\t--box-shadow-card: 0 16px 50px rgba(0, 0, 0, 0.3); /* Deeper shadow for dark mode */\n\t--transition-speed: 0.25s;\n\t--animation-speed-fast: 0.2s;\n\t--animation-speed-normal: 0.4s;\n}\n\n/* === KEYFRAME ANIMATIONS === */\n@keyframes fadeInSlideUp {\n    from {\n        opacity: 0;\n        transform: translateY(20px);\n    }\n    to {\n        opacity: 1;\n        transform: translateY(0);\n    }\n}\n\n@keyframes backgroundPan {\n\t0% { background-position: 0% 50%; }\n\t50% { background-position: 100% 50%; }\n\t100% { background-position: 0% 50%; }\n}\n\n/* === GLOBAL LAYOUT & STYLES === */\nbody {\n    /* Dynamic animated aurora gradient background */\n    background-color: var(--color-page-bg);\n    background-image:\n        radial-gradient(at 20% 100%, hsla(278, 60%, 45%, 0.2) 0px, transparent 50%),\n        radial-gradient(at 80% 0%, hsla(215, 60%, 40%, 0.2) 0px, transparent 50%),\n        radial-gradient(at 50% 50%, hsla(259, 70%, 55%, 0.1) 0px, transparent 50%);\n    background-size: 200% 200%;\n    animation: backgroundPan 15s ease-in-out infinite;\n\n    line-height: var(--line-height-base);\n    font-size: var(--font-size-body);\n    color: var(--color-label); /* Set default text color for body */\n\n    /* Flexbox properties for true centering */\n    display: flex;\n    align-items: center;\n    justify-content: center;\n    min-height: 100vh;\n    margin: 0;\n    overflow-x: hidden; /* Prevent horizontal scroll from large gradients */\n}\n\n.form-container {\n    padding: 2rem 1rem;\n}\n\n/* === THE GLASSMORPHISM CARD === */\n.card {\n    background: var(--color-card-bg-glass);\n    backdrop-filter: blur(16px) saturate(150%);\n    -webkit-backdrop-filter: blur(16px) saturate(150%);\n    border-radius: var(--border-radius-card);\n    border: 1px solid var(--color-card-border-glass);\n    box-shadow: var(--box-shadow-card);\n    transition: box-shadow var(--animation-speed-normal) ease;\n\n    /* Card Load-in Animation */\n    animation: fadeInSlideUp 0.6s ease-out forwards;\n}\n.card:hover {\n    box-shadow: 0 0 50px rgba(139, 92, 246, 0.15); /* Subtle purple glow on hover */\n}\n\n/* === FORM ELEMENT STYLING === */\n.form-input {\n    border-radius: var(--border-radius-input);\n    transition: border-color var(--transition-speed) ease, box-shadow var(--transition-speed) ease;\n    background-color: var(--color-input-bg);\n    border: 1px solid var(--color-input-border);\n    color: var(--color-input-text);\n}\n.form-input::placeholder {\n    color: var(--color-label);\n    opacity: 0.7;\n}\n.form-input:focus {\n    /* Glow effect on focus */\n    box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.25);\n    border-color: var(--color-focus-border);\n    outline: none; /* Remove default outline */\n}\n\ntextarea.form-input {\n    min-height: 150px;\n    resize: vertical;\n}\n\n/* Submit Button */\nbutton.submit-btn {\n    transition: all var(--transition-speed) ease-in-out;\n    font-family: var(--font-family);\n    font-weight: var(--font-weight-bold);\n    color: var(--color-submit-btn-text);\n    background-color: var(--color-submit-btn-bg);\n    border-radius: var(--border-radius-input);\n    border: none;\n    cursor: pointer;\n}\nbutton.submit-btn:hover {\n    background-color: var(--color-submit-btn-hover-bg);\n    /* Add a lift and glow effect on hover */\n    transform: translateY(-3px);\n    box-shadow: 0 8px 25px rgba(139, 92, 246, 0.3);\n}\n\n/* === MODERN CHECKBOX STYLING === */\nlabel.multiselect-label {\n    display: flex;\n    align-items: center;\n    cursor: pointer;\n    position: relative;\n    padding: 8px 0;\n}\nlabel.multiselect-label span {\n    padding-left: 12px;\n    color: var(--color-label);\n    transition: color var(--transition-speed) ease;\n}\nlabel.multiselect-label:hover span {\n    color: var(--color-input-text); /* Lighten label text on hover */\n}\nlabel.multiselect-label input[type=\"checkbox\"] {\n    position: absolute;\n    opacity: 0;\n    cursor: pointer;\n    height: 0;\n    width: 0;\n}\nlabel.multiselect-label span::before {\n    content: '';\n    position: absolute;\n    left: 0;\n    top: 50%;\n    transform: translateY(-50%);\n    width: var(--checkbox-size);\n    height: var(--checkbox-size);\n    background-color: var(--color-input-bg);\n    border: 1px solid var(--color-input-border);\n    border-radius: 6px;\n    transition: all var(--animation-speed-fast) ease-in-out;\n}\nlabel.multiselect-label input[type=\"checkbox\"]:checked + span::before {\n    background-color: var(--color-focus-border);\n    border-color: var(--color-focus-border);\n    background-image: url(\"data:image/svg+xml,%3csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 16 16' fill='white'%3e%3cpath d='M12.207 4.793a1 1 0 010 1.414l-5 5a1 1 0 01-1.414 0l-2-2a1 1 0 011.414-1.414L6.5 9.086l4.293-4.293a1 1 0 011.414 0z'/%3e%3c/svg%3e\");\n    background-position: center;\n    background-repeat: no-repeat;\n    /* Animation for the checkmark appearing */\n    transform: translateY(-50%) scale(1.05);\n}\nlabel.multiselect-label input[type=\"checkbox\"]:focus-visible + span::before {\n    /* Use a glow for focus instead of a harsh outline */\n    box-shadow: 0 0 0 3px rgba(139, 92, 246, 0.3);\n}",
          "buttonLabel": "Submit Application",
          "appendAttribution": false
        },
        "formTitle": "Submit Your Application",
        "formFields": {
          "values": [
            {
              "fieldLabel": "Full Name",
              "placeholder": "e.g., Jane Doe",
              "requiredField": true
            },
            {
              "fieldLabel": "Email",
              "placeholder": "e.g., jane.doe@example.com",
              "requiredField": true
            },
            {
              "fieldType": "file",
              "fieldLabel": "Upload CV",
              "requiredField": true,
              "acceptFileTypes": ".pdf"
            }
          ]
        },
        "responseMode": "lastNode",
        "formDescription": "Please fill out the form below and upload your CV to apply."
      },
      "typeVersion": 2.2
    },
    {
      "id": "8af8707e-de1b-4687-8d7a-c853dfec2b31",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Début ici",
      "type": "n8n-nodes-base.manualTrigger",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -1648,
        704
      ],
      "parameters": {},
      "typeVersion": 1
    },
    {
      "id": "3b04b67b-d4dc-44e6-90e1-d239dbbc40d1",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Extraire le texte du CV",
      "type": "n8n-nodes-base.mistralAi",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -640,
        704
      ],
      "parameters": {
        "options": {},
        "binaryProperty": "={{ $('Application Form').last().binary.keys()[0] }}"
      },
      "credentials": {
        "mistralCloudApi": {
          "id": "CVHf7SBQRl2FcHwb",
          "name": "Mistral Template Key"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "483377db-ede2-4dcb-8ce0-a77b9f9d1b09",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Enregistrer la soumission du candidat",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -624,
        368
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email": "={{ $json.Email }}",
            "FullName": "={{ $json[\"Full Name\"] }}"
          },
          "schema": [
            {
              "id": "FullName",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "FullName",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "QualificationRate",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "QualificationRate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "QualificationDescription",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "QualificationDescription",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "append",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg/edit#gid=0",
          "cachedResultName": "Feuille 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg/edit?usp=drivesdk",
          "cachedResultName": "CVs"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "csiCs0Ukgbs3jYYk",
          "name": "Calvin"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "d4aa8091-6577-44b5-9541-c0cc87f83e93",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Ajouter l'analyse du CV",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -64,
        704
      ],
      "parameters": {
        "columns": {
          "value": {
            "Email": "={{ $('Application Form').last().json.Email }}",
            "QualificationRate": "={{ $json.output.qualificationRate }}",
            "QualificationDescription": "={{ $json.output.explanation }}"
          },
          "schema": [
            {
              "id": "FullName",
              "type": "string",
              "display": true,
              "removed": true,
              "required": false,
              "displayName": "FullName",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "Email",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "Email",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "QualificationRate",
              "type": "string",
              "display": true,
              "required": false,
              "displayName": "QualificationRate",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "QualificationDescription",
              "type": "string",
              "display": true,
              "removed": false,
              "required": false,
              "displayName": "QualificationDescription",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            },
            {
              "id": "row_number",
              "type": "number",
              "display": true,
              "removed": true,
              "readOnly": true,
              "required": false,
              "displayName": "row_number",
              "defaultMatch": false,
              "canBeUsedToMatch": true
            }
          ],
          "mappingMode": "defineBelow",
          "matchingColumns": [
            "Email"
          ],
          "attemptToConvertTypes": false,
          "convertFieldsToString": false
        },
        "options": {},
        "operation": "update",
        "sheetName": {
          "__rl": true,
          "mode": "list",
          "value": "gid=0",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg/edit#gid=0",
          "cachedResultName": "Feuille 1"
        },
        "documentId": {
          "__rl": true,
          "mode": "list",
          "value": "1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg",
          "cachedResultUrl": "https://docs.google.com/spreadsheets/d/1PSiIF84BsVrnePIfgdNEVqYnWlWxW5ok8wh3cPDUYxg/edit?usp=drivesdk",
          "cachedResultName": "CVs"
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "csiCs0Ukgbs3jYYk",
          "name": "Calvin"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "05672977-b212-4dc6-9315-9d2c191c43a6",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "JSON Output Parser",
      "type": "@n8n/n8n-nodes-langchain.outputParserStructured",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -176,
        960
      ],
      "parameters": {
        "schemaType": "manual",
        "inputSchema": "{\n  \"type\": \"object\",\n  \"properties\": {\n    \"qualificationRate\": {\n      \"type\": \"number\",\n      \"description\": \"The qualification rate, typically a number between 0 and 1 or a percentage.\"\n    },\n    \"explanation\": {\n      \"type\": \"string\",\n      \"description\": \"A textual explanation or description of the qualification rate.\"\n    }\n  },\n  \"required\": [\n    \"qualificationRate\",\n    \"explanation\"\n  ],\n  \"additionalProperties\": false\n}"
      },
      "typeVersion": 1.3
    },
    {
      "id": "e94d6fac-a882-4573-a52d-11a90b15302f",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Gemini 2.5 Flash Lite",
      "type": "@n8n/n8n-nodes-langchain.lmChatGoogleGemini",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -512,
        944
      ],
      "parameters": {
        "options": {
          "temperature": 0.4
        },
        "modelName": "models/gemini-2.5-flash-lite"
      },
      "credentials": {
        "googlePalmApi": {
          "id": "Tfw18hAjsu3IwEqi",
          "name": "Google Gemini(PaLM) Api account"
        }
      },
      "typeVersion": 1
    },
    {
      "id": "7f185e06-146b-4949-a2b9-c840f1fbf556",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Créer la feuille de calcul 'CVs'",
      "type": "n8n-nodes-base.googleSheets",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -1328,
        704
      ],
      "parameters": {
        "title": "CVs",
        "options": {},
        "resource": "spreadsheet",
        "sheetsUi": {
          "sheetValues": [
            {
              "title": "FullName"
            },
            {
              "title": "Email"
            },
            {
              "title": "QualificationRate"
            },
            {
              "title": "QualificationDescription"
            }
          ]
        }
      },
      "credentials": {
        "googleSheetsOAuth2Api": {
          "id": "csiCs0Ukgbs3jYYk",
          "name": "Calvin"
        }
      },
      "typeVersion": 4.6
    },
    {
      "id": "21587944-8fd4-4583-8697-a7bf04441850",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Note adhésive12",
      "type": "n8n-nodes-base.stickyNote",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -1024,
        608
      ],
      "parameters": {
        "color": 7,
        "width": 300,
        "height": 268,
        "content": "💡 Later, activate this workflow and share the public form URL to let candidates share their CV!"
      },
      "typeVersion": 1
    },
    {
      "id": "f7e475cb-a354-4e10-9bc1-662cc81d13df",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Note adhésive",
      "type": "n8n-nodes-base.stickyNote",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -624,
        912
      ],
      "parameters": {
        "color": 7,
        "width": 294,
        "height": 316,
        "content": "\n\n\n\n\n\n\n\n\n\n\n\n1. [In Google AI Studio](https://aistudio.google.com/app/apikey) click **“Create API key in new project”** and copy it.\n\n2. Open the ```Connect Gemini``` node:\n   * **Select Credential → Create New**\n   * Paste into **API Key** and **Save**\n"
      },
      "typeVersion": 1
    },
    {
      "id": "d75d53de-6040-4620-b102-0621829c0666",
      "cid": "Ikx1Y2FzIFBleXJpbiI",
      "name": "Qualification IA",
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "notes": "© 2025 Lucas Peyrin",
      "creator": "Lucas Peyrin",
      "position": [
        -416,
        704
      ],
      "parameters": {
        "text": "=<goal>\nYour primary goal is to evaluate a candidate's CV against the provided job requirements for the Senior Frontend Developer position. You must determine if the prospect is qualified and produce a raw JSON output containing a qualification score and a detailed, evidence-based explanation for that score.\n</goal>\n\n<context>\n<job_requirements>\n\n# Position Profile: Senior Frontend Developer\n\nJob Title: Senior Frontend Developer\nLocation: Remote (US-based)\n\nAbout the Role:\nWe are looking for an experienced and passionate Senior Frontend Developer to join our core product team. You will be responsible for building and maintaining the user-facing components of our flagship SaaS platform, ensuring a seamless, responsive, and high-performance user experience. You will collaborate closely with UI/UX designers, product managers, and backend engineers to bring new features to life and mentor other developers on the team.\n\nKey Responsibilities:\n- Develop, test, and deploy high-quality, scalable, and user-friendly web applications using React and TypeScript.\n- Collaborate with cross-functional teams to define, design, and ship new features.\n- Mentor junior and mid-level developers through code reviews, pair programming, and technical guidance.\n- Optimize applications for maximum speed, scalability, and accessibility.\n- Ensure the technical feasibility of UI/UX designs and maintain a high standard of code quality.\n- Stay up-to-date with emerging technologies and advocate for their adoption where it makes sense.\n\n# EVALUATION CRITERIA\n\n## Core Requirements (Must-Haves)\n\n- Experience: 5+ years of professional experience in frontend development.\n- Project Leadership: Proven experience leading frontend projects from conception to completion.\n- JavaScript/TypeScript: Expert-level proficiency in modern JavaScript (ES6+) and TypeScript.\n- Framework Expertise: Deep, hands-on experience with React.\n- State Management: Strong experience with state management libraries such as Redux, Zustand, or React Query.\n- Styling: Proficiency in modern CSS, including CSS-in-JS (e.g., Styled Components) or utility-first CSS (e.g., Tailwind CSS).\n- API Integration: Extensive experience consuming RESTful or GraphQL APIs.\n- Testing: Solid experience with frontend testing frameworks like Jest and React Testing Library.\n- Version Control: Mastery of Git and collaborative workflows (e.g., GitFlow).\n- Communication: Excellent written and verbal communication skills (assessed through the clarity and professionalism of the CV).\n\n## Preferred Qualifications (Nice-to-Haves)\n\n- Meta-Frameworks: Experience with Next.js or a similar framework.\n- Backend Knowledge: Familiarity with Node.js and server-side development.\n- CI/CD: Experience setting up and maintaining CI/CD pipelines (e.g., GitHub Actions, Vercel).\n- Design Acumen: A strong eye for UI/UX design.\n- Performance Tuning: Experience with web performance optimization tools like Lighthouse.\n\n</job_requirements>\n\n<qualifiaction>\n# How I Evaluate\nI operate based on a strict set of evaluation criteria provided for a specific role. My analysis is broken down into two main categories: \"Core Requirements\" (which are non-negotiable) and \"Preferred Qualifications\" (which act as bonuses). My final output is a qualification score and a detailed justification, citing specific evidence from the candidate's CV.\n\n# Evaluation Logic\n- The `qualificationRate` is a score from 0.0 to 1.0.\n- **Core Requirements** are critical. A candidate missing one or more core requirements cannot score above 0.6. A candidate meeting all core requirements should score at least 0.75.\n- **Preferred Qualifications** are bonuses. Each met preferred qualification adds to the score, pushing it closer to 1.0.\n- The `explanation` must be a detailed, point-by-point analysis, justifying the score by citing evidence (or lack thereof) from the CV for each requirement.\n</qualifiaction>\n</context>\n\n<output_format>\nYou must produce a single, raw JSON object. Do not add any conversational text, greetings, or explanations outside of the JSON structure. The JSON object must strictly adhere to the following format:\n```json\n{\n  \"explanation\": \"<string>\",\n  \"qualificationRate\": <number>\n}\n```\n</output_format>\n</instructions>",
        "batching": {},
        "messages": {
          "messageValues": [
            {
              "message": "You are the AI Hiring Assistant, a specialized AI agent designed to meticulously analyze and evaluate candidate CVs against specific job requirements. Your personality is professional, objective, and detail-oriented. You provide clear, evidence-based assessments to support hiring decisions."
            }
          ]
        },
        "promptType": "define",
        "hasOutputParser": true
      },
      "typeVersion": 1.7
    }
  ],
  "pinData": {},
  "connections": {
    "8af8707e-de1b-4687-8d7a-c853dfec2b31": {
      "main": [
        [
          {
            "node": "7f185e06-146b-4949-a2b9-c840f1fbf556",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "3b04b67b-d4dc-44e6-90e1-d239dbbc40d1": {
      "main": [
        [
          {
            "node": "d75d53de-6040-4620-b102-0621829c0666",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "d75d53de-6040-4620-b102-0621829c0666": {
      "main": [
        [
          {
            "node": "d4aa8091-6577-44b5-9541-c0cc87f83e93",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "cb5ef831-79f7-4129-9642-6ece79a3603e": {
      "main": [
        [
          {
            "node": "3b04b67b-d4dc-44e6-90e1-d239dbbc40d1",
            "type": "main",
            "index": 0
          },
          {
            "node": "483377db-ede2-4dcb-8ce0-a77b9f9d1b09",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "05672977-b212-4dc6-9315-9d2c191c43a6": {
      "ai_outputParser": [
        [
          {
            "node": "d75d53de-6040-4620-b102-0621829c0666",
            "type": "ai_outputParser",
            "index": 0
          }
        ]
      ]
    },
    "e94d6fac-a882-4573-a52d-11a90b15302f": {
      "ai_languageModel": [
        [
          {
            "node": "d75d53de-6040-4620-b102-0621829c0666",
            "type": "ai_languageModel",
            "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é - Ressources Humaines, 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.

Workflows recommandés

Support par e-mail automatisé avec Google Gemini et apprentissage avec intervention humaine
Soutien automatisé aux e-mails avec Google Gemini et apprentissage par intervention humaine
If
Set
Gmail
+
If
Set
Gmail
29 NœudsLucas Peyrin
Création de contenu
Assistant d'entretien intelligent : questions personnalisées basées sur le CV, la description de poste et le tour
Utiliser GPT-4 pour générer des questions d'entretien personnalisées basées sur un CV, une description de poste et un tour de table
Set
Code
Merge
+
Set
Code
Merge
26 NœudsTrung Tran
Ressources Humaines
Évaluation et approche personnalisée des prospects basées sur l'IA (avec Relevance AI)
Évaluation et approche personnalisée des prospects basées sur l'IA : utilisation de Relevance AI
Set
Code
Gmail
+
Set
Code
Gmail
34 NœudsDiptamoy Barman
Création de contenu
Génération automatique de propositions Upwork en temps réel avec Apify, Google Gemini et Sheets
Utiliser Apify, Google Gemini et Sheets pour automatiser la génération de propositions Upwork IA
If
Set
Gmail
+
If
Set
Gmail
25 NœudsIntuz
Génération de leads
Posts sur les festivals hindous sur X
Publication automatique de publications quotidiennes sur les festivals hindous vers X via Gemini AI et GPT-4o Mini
Code
Twitter
Http Request
+
Code
Twitter
Http Request
30 NœudsHarsh Maniya
Réseaux sociaux
Génération automatisée de prospects IA LinkedIn pour les emplois avec Apify, Apollo.io et Google Gemini
Automatisation de la génération de prospects d'offres d'emploi LinkedIn : Apify, Apollo.io et Google Gemini
If
Code
Limit
+
If
Code
Limit
47 NœudsIntuz
Génération de leads
Informations sur le workflow
Niveau de difficulté
Avancé
Nombre de nœuds18
Catégorie2
Types de nœuds8
Description de la difficulté

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

Auteur
Lucas Peyrin

Lucas Peyrin

@lucaspeyrin

Innovative builder with a passion for crafting automation solutions that solve real-world challenges. From streamlining workflows to driving efficiency, my work empowers teams and individuals to achieve more with less effort. Experienced in developing scalable tools and strategies that deliver results with n8n, supabase and cline.

Liens externes
Voir sur n8n.io

Partager ce workflow

Catégories

Catégories: 34