Creator prompt
The idea behind this presentation
🤖 Analyse Complète — AI Job Agent (MAHMOUD)
🎯 C'est quoi ce projet ?
C'est une application web intelligente de recherche d'emploi automatisée, construite en Python (Flask). Elle collecte des offres d'emploi réelles depuis Internet, les filtre, et décide lesquelles correspondent à ton profil. Aucune offre n'est inventée — tout vient de sources réelles.
🏗️ Architecture Globale (les 3 images expliquées)
Image 1 — Skill 2 : Job Discovery Agent
C'est le moteur de collecte :
Il va chercher automatiquement sur LinkedIn, Indeed, Job boards, APIs publiques
Il ramène des "offres brutes" (non filtrées)
Image 2 — Skill 3 : Matching Agent
C'est le moteur de décision :
Il compare ton CV + compétences + expérience + localisation + salaire avec chaque offre
Il calcule un Score de match
Si le score est faible → Ignorer ; si bon match → garder
Image 3 — Interface Web (127.0.0.1:8000)
C'est le workflow visuel que tu vois dans le navigateur. Il montre :
162 offres collectées en mémoire
112 résultats après décision
5 étapes : Profil → Critères → Collecte → Décision → Résultats
📁 Structure des Fichiers (le ZIP)
MAHMOUD/
├── app.py ← 🧠 Cerveau principal (API Flask)
├── requirements.txt ← Flask + requests (2 dépendances seulement)
├── .env.example ← Configuration (clé secrète, Ollama optionnel)
├── data/
│ └── store.json ← 💾 Base de données locale (profil, offres, résultats)
├── services/
│ ├── job_sources.py ← 🌐 Collecte des offres (6 sources)
│ ├── decision.py ← ⚖️ Algorithme de matching
│ └── llm.py ← 🤖 IA optionnelle (Ollama)
├── templates/index.html ← 🖥️ Interface utilisateur
└── static/
├── app.js ← Interactions JavaScript
└── style.css ← Design de l'interface
🔄 Comment ça fonctionne étape par étape
Étape 1 — Tu remplis ton profil
Tu entres : tes compétences, expériences, préférences salariales, localisation.
→ Sauvegardé dans data/store.json
Étape 2 — Tu définis tes critères de recherche
Pays, ville, mots-clés, type (stage/emploi), durée min/max.
Étape 3 — Skill 1 : Collecte (job_sources.py)
L'app interroge 6 sources gratuites :
Source Type
Arbeitnow API JSON
Remotive API JSON (remote)
Jobicy API JSON (remote)
Remote OK API JSON
Himalayas API paginée
We Work Remotely Flux RSS
Elle normalise tout (même format), déduplique, filtre par pays/ville/mots-clés.
Étape 4 — Skill 2 : Décision (decision.py)
Pour chaque offre, l'algorithme calcule un score sur 100 :
Score Final = 70% × Score critères obligatoires
+ 30% × Score compétences/préférences
Décision = "BON" si score ≥ 60 ET critères obligatoires ≥ 70%
= "MAUVAIS" sinon
Les critères vérifiés : Type d'offre, Domaine, Pays, Ville, Compétences, Durée.
Étape 5 — Résultats exportables
Les résultats sont triés par score et exportables en CSV avec : décision, score, titre, entreprise, lien direct.
🤖 L'IA optionnelle (llm.py)
Par défaut désactivée. Si tu actives USE_OLLAMA=true dans .env, l'app utilise un modèle LLM local (ex: qwen2.5) pour faire une analyse sémantique plus profonde de chaque offre. C'est un bonus, pas une nécessité.
🚀 Comment lancer le projet
cmd
# Windows
py -m pip install -r requirements.txt
py app.py
# Puis ouvre : http://127.0.0.1:8000
✅ En résumé
Aspect Détail
Langage Python (Flask)
Interface Web (navigateur)
Sources 6 APIs/RSS publiques et gratuites
Matching Algorithme déterministe (règles + score)
IA Optionnelle (Ollama local)
Anti-hallucination 100% — aucune offre inventée
Export CSV téléchargeable
C'est un projet bien structuré, fonctionnel et intelligent qui automatise entièrement la veille d'offres d'emploi adaptées à ton profil. Tu veux que j'explique une partie en détail ou que j'améliore quelque chose ?
LIT TOUS
Maintenant j'ai tout lu intégralement — chaque ligne de chaque fichier. Voici l'analyse complète et profonde :
📖 ANALYSE TOTALE DU PROJET — AI JOB AGENT
🗂️ 1. FICHIERS LUS (100%)
Fichier Taille Rôle
app.py 4 328 o Serveur Flask + toutes les routes API
services/job_sources.py 8 199 o Collecte des offres (6 sources)
services/decision.py 3 201 o Algorithme de matching
services/llm.py 966 o IA locale optionnelle
templates/index.html 10 858 o Interface web complète
static/app.js 7 995 o Logique JavaScript (frontend)
static/style.css 6 641 o Design de l'interface
data/store.json 1,2 MB Base de données réelle (162 jobs, 112 résultats)
README.md README Instructions de lancement
.env.example Config Variables d'environnement
🧠 2. APP.PY — Le cerveau Flask
C'est le serveur central. Il expose ces routes API :
Route Méthode Ce qu'elle fait
GET / — Affiche l'interface HTML
GET /api/state — Retourne tout le store.json
POST /api/profile JSON Sauvegarde ton profil candidat
POST /api/criteria JSON Sauvegarde tes critères de recherche
POST /api/skill1/run — Lance la collecte des offres
POST /api/skill2/run — Lance le matching/décision
GET /api/jobs — Retourne les offres collectées
GET /api/results — Retourne les résultats analysés
GET /api/export.csv — Télécharge les résultats en CSV
POST /api/reset — Réinitialise tout
La base de données est simplement un fichier data/store.json — pas de MySQL, pas de PostgreSQL. Simple et efficace.
🌐 3. JOB_SOURCES.PY — La collecte (730 offres brutes)
Il interroge 6 sources gratuites en parallèle :
Source Offres récupérées Type
Arbeitnow 325 API JSON (arbeitnow.com)
We Work Remotely 89 Flux RSS XML
Himalayas 100 (5 pages × 20) API paginée avec curseur
Remote OK 99 API JSON publique
Jobicy 100 API JSON
Remotive 17 API JSON
TOTAL 730 offres brutes —
Ensuite le code normalise tout (même format), filtre par pays/ville/mots-clés, puis déduplique (par titre + entreprise + lieu + URL). Résultat : 730 → 162 offres valides.
⚖️ 4. DECISION.PY — L'algorithme de matching
Pour chaque offre, il vérifie des critères obligatoires et des préférences :
Score Final = 70% × Score critères durs
+ 30% × Score compétences
Décision "BON" si Score ≥ 60% ET critères durs ≥ 70%
Décision "MAUVAIS" sinon
Ce qui est vérifié :
✅ Type d'offre (stage / emploi / alternance...)
✅ Domaine (IA, automatisation...)
✅ Pays (France, Tunisie...)
✅ Ville si précisée
✅ Compétences (Python, YOLO, PLC...)
✅ Durée (min/max en mois)
Résultat réel dans ton store.json :
112 offres analysées → 12 BON / 100 MAUVAIS
Score moyen : 44.8/100
Score max : 91/100
🤖 5. LLM.PY — L'IA optionnelle (Ollama)
Désactivée par défaut (USE_OLLAMA=false). Si tu l'actives, il envoie un prompt JSON à un modèle local (ex: qwen2.5:7b) qui retourne une analyse sémantique enrichie avec :
semantic_match (0-100)
matched / missing
explanation en texte
Complètement optionnel — l'app fonctionne parfaitement sans.
🖥️ 6. INDEX.HTML — L'interface (5 écrans)
L'interface est divisée en 5 sections :
Workflow — Vue visuelle de l'architecture en temps réel
Profil candidat — Formulaire complet (nom, skills, expériences, diplômes, langues...)
Critères de recherche — Pays, ville, type, durée, salaire, mots-clés...
Skill 1 — Collecte — Lance la collecte + affiche journal + tableau des offres
Skill 2 — Décision — Lance le matching + affiche résultats + export CSV
⚡ 7. APP.JS — La logique frontend
Le JavaScript gère :
La navigation entre les 5 écrans
Les appels API fetch vers Flask
L'affichage dynamique des offres et résultats
Le rendu des cartes résultats (score, BON/MAUVAIS, chips vert/rouge)
L'export CSV en un clic
La restauration d'état au rechargement (relit le store.json)
La fonction esc() pour sécuriser l'affichage HTML (protection XSS)
🎨 8. STYLE.CSS — Le design
Interface professionnelle avec :
Sidebar sombre (
#101828) + contenu clair
Palette : bleu (
#2563eb), vert (
#16a34a), rouge (
#dc2626)
Cartes résultats : badge vert "BON" / rouge "MAUVAIS"
Responsive : s'adapte aux écrans < 900px
Workflow board : nodes avec bordures colorées (orange = en cours, vert = terminé)
📊 9. STORE.JSON — Tes données réelles
Voici ce qui est actuellement sauvegardé dans ton projet :
Profil : partiellement rempli — niveau "3ème année cycle ingénieur, génie électrique", les autres champs vides.
Critères : Pays = France, type = stage, company = startup. Pas de mots-clés ni compétences précisés → c'est pourquoi 100 offres sont "MAUVAIS" (aucune compétence ne booste le score de préférence, il reste à 70% par défaut).
TOP 5 offres détectées comme BON :
Score Poste Entreprise Ville
91% AI Growth & Strategic Partnership Manager PALO IT Paris
91% Partner Marketing Specialist Pennylane SAS France (remote)
91% Ingénieur CVC & PB Deerns Groep Paris
91% Post-Doctorant IA (CDD 13 mois) IMT Mines-Télécom Alès
91% Maître de conférences Cybersécurité IMT Mines-Télécom Rennes
🔴 Ce qui manque / peut être amélioré
Ton profil est vide (pas de nom, pas de compétences, pas de skills) → ajoute Python, MATLAB, PLC, OpenCV pour que le score de préférence monte vraiment
Pas de mots-clés définis → sans ça, l'algorithme ne peut pas faire de matching compétences
12 BON sur 112 c'est normal vu que les critères sont minimalistes (juste pays + type stage)
L'app ne cherche pas sur LinkedIn/Indeed (payants) — seulement sur les 6 sources gratuites
Pas de notifications ou d'envoi d'email automatique
✅ RÉSUMÉ EN 1 PHRASE
C'est un agent de veille emploi automatisé, 100% Python/Flask, qui collecte 730 offres réelles depuis 6 sources gratuites, les filtre, les score et les classe selon ton profil — sans aucune hallucination IA, avec une interface web propre et un export CSV.
Follow Design: {"palette":["Void Obsidian #030712 — deep background","Neon Cyan #06B6D4 — agentic discovery engine and active telemetry","Radiant Violet #8B5CF6 — algorithmic scoring weights and decision logic","Success Mint #22C55E — verified matches and export actions","Muted Mist #94A3B8 — secondary body text and metadata"],"fonts":{"Sora":"https://fonts.googleapis.com/css2?family=Sora:wght@100..800&display=swap","Outfit":"https://fonts.googleapis.com/css2?family=Outfit:wght@100..900&display=swap","Fira Code":"https://fonts.googleapis.com/css2?family=Fira+Code:wght@300..700&display=swap"},"type":"Sora bold for futuristic product headings and section crowns; Outfit for approachable, modern narrative copy; Fira Code for formula weights, API endpoints, and configuration parameters.","layout":"Dynamic multi-tier card grid anchored by visual agent pipeline ribbons, full-width metric score counters, and floating decision matrices.","framework_treatment":"Translucent dark-surface cards with subtle cyan-to-violet border gradients, circular match score progress rings, glowing process nodes, and prominent CSV export action cards.","feels_like":"A Silicon Valley AI agent demo day presentation with polished SaaS product metrics"}