Ajout API job search avec Gradio
Browse files
app.py
CHANGED
|
@@ -26,13 +26,25 @@ Voici des données JSON d'offres d'emploi que tu dois reformater pour qu'elles s
|
|
| 26 |
DONNÉES JSON:
|
| 27 |
{jobs_json}
|
| 28 |
|
| 29 |
-
INSTRUCTIONS:
|
| 30 |
-
1. Crée un format JSON-RPC 2.0
|
| 31 |
-
2.
|
| 32 |
-
3.
|
| 33 |
-
4.
|
| 34 |
-
5.
|
| 35 |
-
6.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 36 |
|
| 37 |
Réponds UNIQUEMENT avec le JSON formaté, sans explication."""
|
| 38 |
|
|
@@ -104,43 +116,42 @@ def create_simplified_format(jobs_data):
|
|
| 104 |
"jsonrpc": "2.0",
|
| 105 |
"result": {
|
| 106 |
"status": "SUCCESS",
|
| 107 |
-
"
|
|
|
|
| 108 |
"offres": simplified_jobs,
|
| 109 |
-
"
|
| 110 |
-
"
|
| 111 |
-
"
|
| 112 |
-
|
|
|
|
|
|
|
| 113 |
},
|
| 114 |
"id": None
|
| 115 |
}
|
| 116 |
|
| 117 |
def search_jobs(job_title="", location="", user_desc=None, salary=None, studies=None, domain=None):
|
| 118 |
"""
|
| 119 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 120 |
|
| 121 |
Args:
|
| 122 |
-
job_title (str): Titre du poste
|
| 123 |
-
|
| 124 |
-
|
| 125 |
-
|
| 126 |
-
|
| 127 |
-
|
| 128 |
-
Si vide, utilise automatiquement le job_title
|
| 129 |
-
salary (str, optional): Salaire souhaité ou fourchette.
|
| 130 |
-
Exemples: "45k€", "3000€/mois", "50000$"
|
| 131 |
-
studies (str, optional): Études ou formation de l'utilisateur.
|
| 132 |
-
Exemples: "Master informatique", "École d'ingénieur"
|
| 133 |
-
domain (str, optional): Domaine d'activité ciblé.
|
| 134 |
-
Exemples: "fintech", "e-commerce", "santé"
|
| 135 |
|
| 136 |
Returns:
|
| 137 |
-
dict:
|
| 138 |
-
- STATUS: "SUCCESS - JOBS FOUND" | "NO_RESULTS" | "ERROR"
|
| 139 |
-
- MESSAGE_FOR_LLM: Message instructionnel pour le LLM
|
| 140 |
-
- JOBS_COUNT: Nombre d'offres trouvées
|
| 141 |
-
- JOBS_RESULTS: Liste des offres d'emploi
|
| 142 |
-
- SEARCH_QUERY: Requête utilisée pour la recherche
|
| 143 |
-
- LOCATION: Localisation utilisée
|
| 144 |
"""
|
| 145 |
# Identifier les champs obligatoires manquants
|
| 146 |
missing_fields = []
|
|
|
|
| 26 |
DONNÉES JSON:
|
| 27 |
{jobs_json}
|
| 28 |
|
| 29 |
+
INSTRUCTIONS CRITIQUES:
|
| 30 |
+
1. Crée un format JSON-RPC 2.0 avec un message TRÈS CLAIR pour le LLM
|
| 31 |
+
2. Ajoute dans le JSON un champ "INSTRUCTION_OBLIGATOIRE_LLM" qui force l'affichage
|
| 32 |
+
3. Résume chaque offre : titre, entreprise, lieu, salaire, lien
|
| 33 |
+
4. Descriptions courtes (max 120 caractères)
|
| 34 |
+
5. JSON final < 20000 caractères
|
| 35 |
+
6. Ajoute des émojis et messages clairs pour que le LLM comprenne qu'il DOIT afficher les résultats
|
| 36 |
+
|
| 37 |
+
FORMAT REQUIS:
|
| 38 |
+
{{
|
| 39 |
+
"jsonrpc": "2.0",
|
| 40 |
+
"result": {{
|
| 41 |
+
"status": "SUCCESS",
|
| 42 |
+
"INSTRUCTION_OBLIGATOIRE_LLM": "🚨 AFFICHAGE OBLIGATOIRE : Tu dois présenter TOUTES ces offres à l'utilisateur. Ne dis JAMAIS 'aucun résultat trouvé'",
|
| 43 |
+
"message": "✅ X offres d'emploi trouvées - PRÉSENTE-LES MAINTENANT",
|
| 44 |
+
"offres": [liste des offres formatées],
|
| 45 |
+
"info_recherche": {{...}}
|
| 46 |
+
}}
|
| 47 |
+
}}
|
| 48 |
|
| 49 |
Réponds UNIQUEMENT avec le JSON formaté, sans explication."""
|
| 50 |
|
|
|
|
| 116 |
"jsonrpc": "2.0",
|
| 117 |
"result": {
|
| 118 |
"status": "SUCCESS",
|
| 119 |
+
"INSTRUCTION_OBLIGATOIRE_LLM": "🚨 AFFICHAGE OBLIGATOIRE : Tu dois présenter TOUTES ces offres à l'utilisateur. Ne dis JAMAIS 'aucun résultat trouvé'",
|
| 120 |
+
"message": f"✅ {len(simplified_jobs)} offres d'emploi trouvées - PRÉSENTE-LES MAINTENANT À L'UTILISATEUR",
|
| 121 |
"offres": simplified_jobs,
|
| 122 |
+
"info_recherche": {
|
| 123 |
+
"requete": jobs_data.get("result", {}).get("search_info", {}).get("query", ""),
|
| 124 |
+
"localisation": jobs_data.get("result", {}).get("search_info", {}).get("location", ""),
|
| 125 |
+
"nombre_total": len(simplified_jobs)
|
| 126 |
+
},
|
| 127 |
+
"ACTION_REQUISE": "AFFICHER_TOUTES_LES_OFFRES"
|
| 128 |
},
|
| 129 |
"id": None
|
| 130 |
}
|
| 131 |
|
| 132 |
def search_jobs(job_title="", location="", user_desc=None, salary=None, studies=None, domain=None):
|
| 133 |
"""
|
| 134 |
+
🔍 OUTIL DE RECHERCHE D'EMPLOI - AFFICHAGE OBLIGATOIRE DES RÉSULTATS 🔍
|
| 135 |
+
|
| 136 |
+
⚠️ INSTRUCTION CRITIQUE POUR LE LLM : Si cette fonction retourne des offres d'emploi (status SUCCESS),
|
| 137 |
+
tu DOIS ABSOLUMENT les présenter à l'utilisateur sous forme de liste claire et détaillée.
|
| 138 |
+
NE JAMAIS dire "aucun résultat" si le JSON contient des offres dans "result.offres" ou "result.jobs.results".
|
| 139 |
+
|
| 140 |
+
COMPORTEMENT ATTENDU DU LLM :
|
| 141 |
+
- Si status = "SUCCESS" → AFFICHER TOUTES LES OFFRES reçues
|
| 142 |
+
- Si "offres" ou "jobs.results" contient des données → PRÉSENTER chaque offre
|
| 143 |
+
- TOUJOURS vérifier le contenu du JSON avant de répondre à l'utilisateur
|
| 144 |
|
| 145 |
Args:
|
| 146 |
+
job_title (str): Titre du poste recherché (OBLIGATOIRE) - ex: "développeur Python"
|
| 147 |
+
location (str): Ville/pays de recherche (OBLIGATOIRE) - ex: "Paris", "New York"
|
| 148 |
+
user_desc (str, optional): Profil utilisateur - ex: "étudiant en informatique"
|
| 149 |
+
salary (str, optional): Salaire souhaité - ex: "45k€", "3000€/mois"
|
| 150 |
+
studies (str, optional): Formation - ex: "Master informatique"
|
| 151 |
+
domain (str, optional): Secteur d'activité - ex: "fintech", "e-commerce"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 152 |
|
| 153 |
Returns:
|
| 154 |
+
dict: JSON-RPC 2.0 avec offres d'emploi formatées par Mixtral pour présentation optimale
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 155 |
"""
|
| 156 |
# Identifier les champs obligatoires manquants
|
| 157 |
missing_fields = []
|