AutomationFlowsWeb Scraping › AI CV Analysis & GitHub Scraper Chat

AI CV Analysis & GitHub Scraper Chat

Original n8n title: Pfe Hunter Sophistique

pfe-hunter-sophistique. Uses lmChatGroq, chatTrigger, chainLlm, httpRequest. Chat trigger; 24 nodes.

Chat trigger trigger★★★★☆ complexityAI-powered24 nodesGroq ChatChat TriggerChain LlmHTTP Request
Web Scraping Trigger: Chat trigger Nodes: 24 Complexity: ★★★★☆ AI nodes: yes Added:

This workflow follows the Chainllm → Chat Trigger 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": "pfe-hunter-sophistique",
  "nodes": [
    {
      "parameters": {
        "operation": "pdf",
        "binaryPropertyName": "data0",
        "options": {}
      },
      "type": "n8n-nodes-base.extractFromFile",
      "typeVersion": 1.1,
      "position": [
        -1152,
        -384
      ],
      "id": "c67b5a37-14a0-4598-b10e-3e52311f5667",
      "name": "Extract from File"
    },
    {
      "parameters": {
        "model": "llama-3.3-70b-versatile",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        -880,
        -160
      ],
      "id": "75dbd89b-8a4d-4525-a6c0-4ee1d7af6b35",
      "name": "Groq Chat Model",
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "conditions": {
          "options": {
            "caseSensitive": true,
            "leftValue": "",
            "typeValidation": "strict",
            "version": 2
          },
          "conditions": [
            {
              "id": "e95c1d4a-3b8b-4b94-a97b-b6256736fa32",
              "leftValue": "={{ $json.github_link }}",
              "rightValue": "NON",
              "operator": {
                "type": "string",
                "operation": "notEquals"
              }
            }
          ],
          "combinator": "and"
        },
        "options": {}
      },
      "type": "n8n-nodes-base.if",
      "typeVersion": 2.2,
      "position": [
        192,
        -144
      ],
      "id": "e61d9322-ea57-49b6-883c-6424ae08a1cb",
      "name": "If"
    },
    {
      "parameters": {
        "model": "llama-3.3-70b-versatile",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        1344,
        16
      ],
      "id": "6f0441ce-2632-4c40-ba0f-67c5f57f90e9",
      "name": "Groq Chat Model1",
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "mode": "raw",
        "jsonOutput": "={{ JSON.parse($json.text) }}",
        "options": {}
      },
      "type": "n8n-nodes-base.set",
      "typeVersion": 3.4,
      "position": [
        -464,
        -384
      ],
      "id": "cbcd2981-8475-4869-b9a5-e7974747039f",
      "name": "Edit Fields"
    },
    {
      "parameters": {
        "options": {
          "allowFileUploads": true
        }
      },
      "type": "@n8n/n8n-nodes-langchain.chatTrigger",
      "typeVersion": 1.4,
      "position": [
        -1360,
        -384
      ],
      "id": "43f3e436-030c-4e52-b75b-819cc303475a",
      "name": "Upload CV"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Tu es un expert en analyse de carri\u00e8re Tech.\nVoici le contenu brut du CV d'un candidat :\n\n{{ $json[\"text\"] }}\n\nTA MISSION :\nAnalyse ce texte et extrais un \"Profil JSON\" structur\u00e9.\nNe cherche pas de stage pour l'instant. Contente-toi d'extraire les faits avec une grande pr\u00e9cision.\n\nDIRECTIVES D'ANALYSE :\n1. Pour les COMP\u00c9TENCES : Ne te limite pas \u00e0 la liste \u00e0 puces \"Skills\". Tu dois scanner les descriptions des projets et des exp\u00e9riences pour d\u00e9duire les technologies r\u00e9ellement manipul\u00e9es (ex: si un projet cite \"d\u00e9veloppement d'une API REST\", ajoute \"API REST\" ou le langage utilis\u00e9).\n2. Pour le R\u00c9SUM\u00c9 : Il doit \u00eatre \"solide\". Il doit fusionner le background acad\u00e9mique, les projets phares et la stack technique principale.\n\nJe veux une r\u00e9ponse au format JSON strict avec ces champs :\n- \"resume\": \"Une synth\u00e8se professionnelle compl\u00e8te et dense (3-4 phrases). Elle doit mentionner le niveau d'\u00e9tudes, la sp\u00e9cialit\u00e9, et mettre en avant la coh\u00e9rence entre les projets r\u00e9alis\u00e9s et les comp\u00e9tences techniques.\",\n- \"top_skills\": [\"Liste d\u00e9duite et consolid\u00e9e des comp\u00e9tences techniques (Langages, Frameworks, Outils) trouv\u00e9es dans les projets ET la section comp\u00e9tences\"],\n- \"github_link\": \"L'URL du profil GitHub si elle existe, sinon 'NON'\",\n- \"experience_level\": \"D\u00e9butant\", \"Interm\u00e9diaire\" ou \"Avanc\u00e9\"\n\nIMPORTANT : R\u00e9ponds UNIQUEMENT avec le JSON brut. Pas de phrase d'introduction. Pas de balises markdown (```json). Juste le JSON.",
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.7,
      "position": [
        -880,
        -384
      ],
      "id": "12541bed-dfd6-4e09-b762-693869837d0e",
      "name": "Summary About CV"
    },
    {
      "parameters": {
        "url": "=https://api.github.com/users/{{ $json.github_link.split('/').pop() }}/repos?sort=updated&per_page=5",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "User-Agent",
              "value": "n8n-pfe-agent"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        512,
        -160
      ],
      "id": "7e572a73-7d68-42d0-b292-9e1c3b793251",
      "name": "Scraping Github"
    },
    {
      "parameters": {
        "url": "=https://api.github.com/repos/{{ $json.full_name }}/readme",
        "sendHeaders": true,
        "headerParameters": {
          "parameters": [
            {
              "name": "Accept",
              "value": "application/vnd.github.raw"
            }
          ]
        },
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "User-Agent",
              "value": "n8n-agent"
            }
          ]
        },
        "options": {
          "response": {
            "response": {
              "responseFormat": "text",
              "outputPropertyName": "readme_content"
            }
          }
        }
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        800,
        -160
      ],
      "id": "af980df6-18e8-4c17-8930-2249708e514f",
      "name": "Extracting Readme",
      "onError": "continueRegularOutput"
    },
    {
      "parameters": {
        "jsCode": "// 1. R\u00e9cup\u00e9rer la liste des projets (M\u00e9tadonn\u00e9es)\nconst repoMetadata = $('Scraping Github').all(); \n\n// 2. R\u00e9cup\u00e9rer le contenu des Readme (Donn\u00e9es actuelles)\nconst readmeData = $('Extracting Readme').all();\n\n// 3. Fusionner les deux\nconst summary = repoMetadata.map((repo, index) => {\n  const meta = repo.json;\n  \n  // Par d\u00e9faut : Pas de readme\n  let content = \"Pas de README disponible.\";\n  \n  // CORRECTION ICI : On v\u00e9rifie simplement si la donn\u00e9e 'readme_content' existe.\n  // Plus besoin de v\u00e9rifier .error explicitement, ce qui supprime le soulignement rouge.\n  if (readmeData[index] && readmeData[index].json && readmeData[index].json.readme_content) {\n     \n     // On prend 1000 caract\u00e8res pour avoir la stack technique\n     content = readmeData[index].json.readme_content.substring(0, 1000) + \"...\"; \n  }\n\n  return {\n    name: meta.name,\n    // On ajoute la description GitHub (tr\u00e8s utile pour l'IA)\n    description: meta.description || \"Pas de description\",\n    language: meta.language || \"Non sp\u00e9cifi\u00e9\",\n    updated_at: meta.updated_at.split('T')[0], // Date propre (YYYY-MM-DD)\n    readme_excerpt: content // L'extrait du readme\n  };\n});\n\n// 4. Renvoyer le paquet propre\nreturn {\n  json: {\n    github_summary: summary\n  }\n};"
      },
      "type": "n8n-nodes-base.code",
      "typeVersion": 2,
      "position": [
        1072,
        -160
      ],
      "id": "3e936eba-9e58-41a0-bfc3-da28a9585bd7",
      "name": "Code.js Formatting Github Infos"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Tu es un Directeur Technique (CTO) charg\u00e9 de l'audit approfondi des candidats.\nTon objectif n'est pas de lister ce que le candidat a fait, mais d'\u00e9valuer **comment** il le fait et **quel est son potentiel r\u00e9el**.\n\nDONN\u00c9ES D'ENTR\u00c9E (Portfolio GitHub Brut) :\n{{ JSON.stringify($json.github_summary) }}\n\nM\u00c9THODOLOGIE D'AUDIT (Rigueur stricte) :\n\n1.  **Analyse de la \"Stack Profonde\" :**\n    * Ne regarde pas seulement les langages. Cherche les \"Frameworks d'Entreprise\" dans les textes (ex: Spring Boot, Angular, React, .NET Core).\n    * Cherche les \"Outils de Production\" (Docker, CI/CD, Tests Unitaires, Swagger, JWT). Leur pr\u00e9sence est un marqueur fort de professionnalisme.\n\n2.  **\u00c9valuation de la Complexit\u00e9 Architecturale :**\n    * Le candidat construit-il des \"Hello World\" ou des syst\u00e8mes ? (Indices : mention de \"Base de donn\u00e9es\", \"API REST\", \"Microservices\", \"Authentification\", \"Dashboard Admin\").\n    * Discerne les projets \"Tutoriels\" des projets \"Personnels/Acad\u00e9miques complets\".\n\n3.  **Dynamique de D\u00e9veloppement :**\n    * Analyse les dates (`updated_at`). Est-ce un profil en apprentissage continu ? Est-il actif r\u00e9cemment ?\n\nFORMAT DE SORTIE (Synth\u00e8se Executive - Ton professionnel et impartial) :\n\nR\u00e9dige une note de synth\u00e8se dense (5-6 lignes) structur\u00e9e ainsi :\n* **Identit\u00e9 Technique :** D\u00e9finis le profil (ex: \"Ing\u00e9nieur Logiciel Backend\", \"Fullstack Polyvalent\", \"Sp\u00e9cialiste Mobile\").\n* **Expertise Valid\u00e9e :** Liste les comp\u00e9tences *prouv\u00e9es par le code* (Stack majeure + Outils).\n* **Indice de Maturit\u00e9 :** Mentionne explicitement si des pratiques avanc\u00e9es (Architecture, DevOps, Documentation soign\u00e9e) sont d\u00e9tect\u00e9es. C'est le point cl\u00e9.\n* **Verdict Op\u00e9rationnel :** Conclus sur sa capacit\u00e9 \u00e0 int\u00e9grer une \u00e9quipe technique (ex: \"Profil op\u00e9rationnel sur des stacks modernes\", \"Profil acad\u00e9mique prometteur\").\n\nCONTRAINTES ABSOLUES :\n* Interdiction de citer des noms de projets sp\u00e9cifiques.\n* Interdiction d'inventer des comp\u00e9tences non pr\u00e9sentes dans les donn\u00e9es.\n* R\u00e9ponds uniquement par l'analyse.",
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.7,
      "position": [
        1344,
        -160
      ],
      "id": "35610086-791a-4981-95b7-139bb2db6cf7",
      "name": "Summary About Github"
    },
    {
      "parameters": {
        "mode": "combine",
        "combineBy": "combineByPosition",
        "options": {}
      },
      "type": "n8n-nodes-base.merge",
      "typeVersion": 3.2,
      "position": [
        1872,
        -400
      ],
      "id": "022e6514-c52d-4fcc-b147-f055939cde7b",
      "name": "Merge CV + Github"
    },
    {
      "parameters": {
        "model": "llama-3.3-70b-versatile",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        2192,
        -208
      ],
      "id": "825e1c50-8046-4b41-bd18-4af5202bff6e",
      "name": "Groq Chat Model3",
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://google.serper.dev/search",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "q",
              "value": "={{ $json.text }}"
            },
            {
              "name": "num",
              "value": "20"
            },
            {
              "name": "gl",
              "value": "tn"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        2640,
        -400
      ],
      "id": "0bd36856-2572-44ad-aac3-db5bc8c153d1",
      "name": "The Offers",
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "model": "llama-3.3-70b-versatile",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        2880,
        -208
      ],
      "id": "d22fb923-e671-4b62-977b-6626899e4913",
      "name": "Groq Chat Model2",
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=R\u00f4le : Tu es un Mentor Carri\u00e8re Senior qui aide un futur ing\u00e9nieur \u00e0 choisir son PFE.\n\nCONTEXTE :\nUne recherche Google tr\u00e8s cibl\u00e9e a d\u00e9j\u00e0 \u00e9t\u00e9 faite sur la base des comp\u00e9tences du candidat.\nLes r\u00e9sultats ci-dessous sont donc d\u00e9j\u00e0 techniquement pertinents (bonne stack).\n\nDONN\u00c9ES D'ENTR\u00c9E (R\u00e9sultats Google) :\n{{ JSON.stringify($json[\"organic\"]) }}\n\nTA MISSION (LE FILTRE QUALIT\u00c9) :\nAnalyse cette liste et extrais les opportunit\u00e9s \"Premium\".\nNe te limite pas \u00e0 un nombre fixe : garde toutes les offres excellentes (entre 2 et 5 g\u00e9n\u00e9ralement).\n\nCRIT\u00c8RES DE S\u00c9LECTION (HI\u00c9RARCHIE DE VALEUR) :\n1.  **Priorit\u00e9 Absolue aux \"PFE Books\" :** Si un r\u00e9sultat est un PDF ou un catalogue officiel (\"Book PFE 2026\", \"Catalogue\"), c'est le Graal. Mets-le en premier.\n2.  **Analyse du Sujet :** Privil\u00e9gie les descriptions qui \u00e9voquent des d\u00e9fis d'ing\u00e9nierie (Architecture, Scalabilit\u00e9, Refonte, DevOps, Innovation). \u00c9limine les descriptions vagues ou \"t\u00e2ches r\u00e9p\u00e9titives\".\n3.  **R\u00e9putation de la Source :** Privil\u00e9gie les sites carri\u00e8res directs des entreprises ou LinkedIn. M\u00e9fie-toi des agr\u00e9gateurs g\u00e9n\u00e9riques (Tanitjobs, Keejob) sauf si l'offre est tr\u00e8s d\u00e9taill\u00e9e.\n\nFORMAT DE SORTIE (Markdown Professionnel) :\nPour chaque offre s\u00e9lectionn\u00e9e :\n\n### \ud83c\udf1f [Titre du Sujet/Poste] chez [Nom de l'Entreprise]\n- **Type :** [Indique si c'est un \"Catalogue PDF\", \"Offre Directe\" ou \"Via Agr\u00e9gateur\"]\n- **Lien :** [URL]\n- **Pourquoi cette offre est int\u00e9ressante :** Analyse la qualit\u00e9 du sujet ou de l'entreprise. (Ex: \"C'est un PFE Book officiel, ce qui garantit un encadrement structur\u00e9\" ou \"Le sujet mentionne une architecture Microservices, excellent pour monter en comp\u00e9tence\").",
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.7,
      "position": [
        2880,
        -400
      ],
      "id": "73f569bb-ccfc-4f7c-b998-a568c059cd4e",
      "name": "The Best Pfe"
    },
    {
      "parameters": {
        "model": "llama-3.3-70b-versatile",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        512,
        384
      ],
      "id": "4a3f847c-d026-456a-9547-fa27a1c82efd",
      "name": "Groq Chat Model4",
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "method": "POST",
        "url": "https://google.serper.dev/search",
        "authentication": "genericCredentialType",
        "genericAuthType": "httpHeaderAuth",
        "sendBody": true,
        "bodyParameters": {
          "parameters": [
            {
              "name": "q",
              "value": "={{ $json.text }}"
            },
            {
              "name": "num",
              "value": "20"
            },
            {
              "name": "gl",
              "value": "tn"
            }
          ]
        },
        "options": {}
      },
      "type": "n8n-nodes-base.httpRequest",
      "typeVersion": 4.3,
      "position": [
        800,
        176
      ],
      "id": "a739960e-ce4b-4652-a019-ccdc7c747836",
      "name": "The Offers2",
      "credentials": {
        "httpHeaderAuth": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Tu es un Expert en Sourcing.\nLe candidat n'a pas de GitHub, nous basons la recherche sur son CV.\n\nDONN\u00c9ES DU CANDIDAT :\n- R\u00e9sum\u00e9 : {{ $json.resume }}\n- Skills : {{ $json.top_skills }}\n\nTA MISSION :\nConstruis une requ\u00eate Google EFFICACE pour trouver des offres de stage.\n\nR\u00c8GLES D'ASSOUPLISSEMENT (POUR \u00c9VITER 0 R\u00c9SULTATS) :\n1.  **Date :** Cherche \"PFE 2025\" (plus courant que \"2025-2026\").\n2.  **Mots-cl\u00e9s :** Utilise l'op\u00e9rateur OR entre les technos. Ne cherche pas TOUT en m\u00eame temps. (ex: \"Spring\" OR \"Java\" plut\u00f4t que \"Spring\" AND \"Java\").\n3.  **Localisation :** Utilise \"Tunisie\" (plus large que Sfax uniquement).\n4.  **Format :** Ne force pas le \"filetype:pdf\" si cela risque de tuer la recherche.\n\nEXEMPLE DE REQU\u00caTE \u00c9QUILIBR\u00c9E :\n(\"PFE 2025\" OR \"Stage pr\u00e9-embauche\") AND (\"Spring Boot\" OR \"Java\") AND \"Tunisie\" -linkedin\n\nR\u00e9ponds UNIQUEMENT par la cha\u00eene de recherche.",
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.7,
      "position": [
        512,
        176
      ],
      "id": "33671adc-3926-42b2-aeb5-1feed4290ba4",
      "name": "The Request For Google 2"
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=R\u00f4le : Mentor Carri\u00e8re pour \u00e9tudiants ing\u00e9nieurs.\n\nCONTEXTE :\nLe candidat postule sur la base de son CV (pas de GitHub disponible pour preuve).\nNous avons cherch\u00e9 des offres correspondant \u00e0 son profil d\u00e9claratif.\n\nDONN\u00c9ES D'ENTR\u00c9E :\n1. Profil du candidat (CV) : {{ $('If').item.json.resume }}\n2. R\u00e9sultats de recherche (March\u00e9) : {{ JSON.stringify($json[\"organic\"]) }}\n\nTA MISSION :\nS\u00e9lectionne les 3 meilleures opportunit\u00e9s de stage PFE.\n\nCRIT\u00c8RES DE S\u00c9LECTION (QUALIT\u00c9 AVANT TOUT) :\n1.  **Pertinence Acad\u00e9mique :** L'offre correspond-elle au niveau (Ing\u00e9nieur/PFE) ? \u00c9limine les stages \"Technicien\" ou \"Ouvrier\" si le candidat est ing\u00e9nieur.\n2.  **Stack Technique :** L'offre demande-t-elle les technos que le candidat a list\u00e9es dans son CV ?\n3.  **Le \"Graal\" :** Si tu vois un PDF \"PFE Book\" ou \"Catalogue\", c'est la priorit\u00e9 n\u00b01.\n\nFORMAT DE SORTIE (Markdown) :\nPour chaque offre retenue :\n\n### \ud83d\udcc4 [Poste/Sujet] chez [Entreprise]\n- **Type :** [Catalogue PDF / Offre Web]\n- **Lien :** [URL]\n- **Pourquoi c'est pertinent :** [Explique le lien avec le CV. Ex: \"Cette offre demande du Angular, qui est list\u00e9 comme ta comp\u00e9tence principale.\"]",
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.7,
      "position": [
        1072,
        176
      ],
      "id": "36217bf3-3231-44a4-81e5-d0761562366c",
      "name": "Basic LLM Chain"
    },
    {
      "parameters": {
        "model": "llama-3.3-70b-versatile",
        "options": {}
      },
      "type": "@n8n/n8n-nodes-langchain.lmChatGroq",
      "typeVersion": 1,
      "position": [
        1072,
        368
      ],
      "id": "ddadd5d9-87cc-42c5-b083-43a8f3f71d8e",
      "name": "Groq Chat Model5",
      "credentials": {
        "groqApi": {
          "name": "<your credential>"
        }
      }
    },
    {
      "parameters": {
        "promptType": "define",
        "text": "=Tu es un Expert en Sourcing IT et \"Google Dorking\".\n\nANALYSE DU PROFIL (Fusion CV + GitHub) :\n1. D\u00c9CLARATIF (CV) : {{ $json.resume }}\n2. PREUVE TECHNIQUE (GitHub) :\n   {{ $json.text }}\n   (Concentre-toi sur les technos cit\u00e9es dans \"Expertise Valid\u00e9e\").\n\nCONTEXTE DE LA RECHERCHE :\nLe candidat cherche un \"Stage PFE\" pour la saison universitaire **2025-2026**.\nIl faut absolument \u00e9viter les offres p\u00e9rim\u00e9es de l'an dernier.\n\nTA MISSION :\nConstruis UNE SEULE cha\u00eene de recherche Google complexe et ultra-cibl\u00e9e.\n\nR\u00c8GLES DE CONSTRUCTION :\n1.  **Le Filtre Temporel (CRITIQUE) :** Utilise des mots-cl\u00e9s stricts : \"PFE Book 2025-2026\", \"Catalogue 2026\", \"Sujets PFE 2026\", \"Campagne PFE 2026\".\n2.  **La Techno (Preuve) :** Utilise UNIQUEMENT les stacks valid\u00e9es par l'audit GitHub (ex: si GitHub dit \"Expert Spring Boot\", mets \"Spring Boot\").\n3.  **La G\u00e9ographie :** Tunisie (Sfax, Tunis, Sousse...).\n4.  **Le Format :** Privil\u00e9gie les fichiers PDF (`filetype:pdf`) souvent utilis\u00e9s pour les catalogues officiels, ou les sites carri\u00e8res.\n\nEXEMPLE DE SORTIE ATTENDUE :\n(\"PFE Book 2025-2026\" OR \"Catalogue PFE 2026\" OR \"Sujets PFE 2026\") AND (\"Spring Boot\" OR \"Dotnet\") AND (\"Tunisie\" OR \"Sfax\") -linkedin\n\nR\u00e9ponds UNIQUEMENT par la cha\u00eene de recherche brute.",
        "batching": {}
      },
      "type": "@n8n/n8n-nodes-langchain.chainLlm",
      "typeVersion": 1.7,
      "position": [
        2192,
        -400
      ],
      "id": "83d575b9-538c-42af-b726-aea9bd5e53b3",
      "name": "The Requet (CV + Github)"
    },
    {
      "parameters": {
        "content": "Only CV",
        "height": 80,
        "width": 150
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        208,
        64
      ],
      "id": "141a5cdc-ae55-45d7-aec0-031900705b6b",
      "name": "Sticky Note"
    },
    {
      "parameters": {
        "content": "CV + Github",
        "height": 80,
        "width": 150
      },
      "type": "n8n-nodes-base.stickyNote",
      "typeVersion": 1,
      "position": [
        336,
        -224
      ],
      "id": "1947bccb-a216-4911-bbfe-768901ab6bc1",
      "name": "Sticky Note1"
    }
  ],
  "connections": {
    "Extract from File": {
      "main": [
        [
          {
            "node": "Summary About CV",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model": {
      "ai_languageModel": [
        [
          {
            "node": "Summary About CV",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "If": {
      "main": [
        [
          {
            "node": "Scraping Github",
            "type": "main",
            "index": 0
          }
        ],
        [
          {
            "node": "The Request For Google 2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model1": {
      "ai_languageModel": [
        [
          {
            "node": "Summary About Github",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Edit Fields": {
      "main": [
        [
          {
            "node": "If",
            "type": "main",
            "index": 0
          },
          {
            "node": "Merge CV + Github",
            "type": "main",
            "index": 1
          }
        ]
      ]
    },
    "Upload CV": {
      "main": [
        [
          {
            "node": "Extract from File",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summary About CV": {
      "main": [
        [
          {
            "node": "Edit Fields",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Scraping Github": {
      "main": [
        [
          {
            "node": "Extracting Readme",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Extracting Readme": {
      "main": [
        [
          {
            "node": "Code.js Formatting Github Infos",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Code.js Formatting Github Infos": {
      "main": [
        [
          {
            "node": "Summary About Github",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Summary About Github": {
      "main": [
        [
          {
            "node": "Merge CV + Github",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Merge CV + Github": {
      "main": [
        [
          {
            "node": "The Requet (CV + Github)",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model3": {
      "ai_languageModel": [
        [
          {
            "node": "The Requet (CV + Github)",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "The Offers": {
      "main": [
        [
          {
            "node": "The Best Pfe",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model2": {
      "ai_languageModel": [
        [
          {
            "node": "The Best Pfe",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model4": {
      "ai_languageModel": [
        [
          {
            "node": "The Request For Google 2",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "The Request For Google 2": {
      "main": [
        [
          {
            "node": "The Offers2",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "The Offers2": {
      "main": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "main",
            "index": 0
          }
        ]
      ]
    },
    "Groq Chat Model5": {
      "ai_languageModel": [
        [
          {
            "node": "Basic LLM Chain",
            "type": "ai_languageModel",
            "index": 0
          }
        ]
      ]
    },
    "The Requet (CV + Github)": {
      "main": [
        [
          {
            "node": "The Offers",
            "type": "main",
            "index": 0
          }
        ]
      ]
    }
  },
  "active": false,
  "settings": {
    "executionOrder": "v1"
  },
  "versionId": "92544cc9-08a0-4557-af01-bc0bfca1a9c7",
  "meta": {
    "templateCredsSetupCompleted": true
  },
  "id": "wzDvTQGkUgy9flsP",
  "tags": []
}

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

pfe-hunter-sophistique. Uses lmChatGroq, chatTrigger, chainLlm, httpRequest. Chat trigger; 24 nodes.

Source: https://github.com/MahdiBoughariou/n8n-ai-pfe-hunter/blob/3bf23b3e3a5188e2794fdb6cee0dce30e3e1b2ae/workflow.json — original creator credit. Request a take-down →

More Web Scraping workflows → · Browse all categories →

Related workflows

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

Web Scraping

Scraping Articles Dev.to Prod. Uses itemLists, stickyNote, nocoDb, scheduleTrigger. Scheduled trigger; 44 nodes.

Item Lists, Noco Db, HTTP Request +2
Web Scraping

Use cases are many: Compare costs across different models, plan your AI budget, optimize prompts for cost efficiency, or track expenses for client billing! OpenRouter charges a platform fee on top of

Chat Trigger, Execute Workflow Trigger, Form +4
Web Scraping

This workflow contains community nodes that are only compatible with the self-hosted version of n8n.

Chat Trigger, HTTP Request, N8N Nodes Aimlapi +1
Web Scraping

Unlock the power of automation with the Automatically Generate Content and Post to Bluesky with LLM Workflow, an n8n-powered solution that uses Large Language Model (LLM) APIs to create engaging conte

HTTP Request, Groq Chat, Stop And Error +1
Web Scraping

Generate Videos from Chat with Google Vertex AI (Veo3) - Beginner Friendly

HTTP Request, Chat Trigger