Update main.py
Browse files
main.py
CHANGED
@@ -424,8 +424,11 @@ async def start():
|
|
424 |
|
425 |
if chatProfile[1] == 'ROMESKILLS':
|
426 |
contextChat = await homeRome()
|
|
|
427 |
else:
|
428 |
contextChat = await homeEsco()
|
|
|
|
|
429 |
os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN']
|
430 |
repo_id = "mistralai/Mistral-7B-Instruct-v0.3"
|
431 |
|
@@ -460,44 +463,59 @@ async def start():
|
|
460 |
async def construction_NCS(competenceList):
|
461 |
context = await contexte(competenceList)
|
462 |
emploisST = context.to_string(index = False)
|
463 |
-
|
464 |
-
|
465 |
-
|
466 |
-
|
467 |
-
|
468 |
-
|
469 |
-
|
470 |
-
|
471 |
-
|
472 |
-
|
473 |
-
|
474 |
-
|
475 |
-
|
476 |
-
|
477 |
-
|
478 |
-
|
479 |
-
|
480 |
-
|
481 |
-
|
482 |
-
|
483 |
-
|
484 |
-
|
485 |
-
|
486 |
-
|
487 |
-
|
488 |
-
|
489 |
-
]
|
490 |
-
await cl.Message(author="Datapcc : 🌐🌐🌐",content="📊 Afficher la datavisualisation des chiffres clés des métiers", actions=datavizChiffresClesMetiers).send()
|
491 |
-
await cl.sleep(1)
|
492 |
-
codeArray = romeListArray
|
493 |
-
ficheMetiers = []
|
494 |
-
for i in range(0,len(codeArray)):
|
495 |
-
ficheMetiers = [
|
496 |
-
cl.File(name= "Fiche métier " + codeArray[i],url="https://www.soi-tc.fr/assets/fiches_pe/FEM_" + codeArray[i] + ".pdf",display="inline",)
|
497 |
]
|
498 |
-
await cl.Message(
|
499 |
-
|
500 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
501 |
|
502 |
await datavisualisation_statistiques_emplois(context)
|
503 |
|
@@ -509,20 +527,14 @@ async def recuperation_contexte(getNote):
|
|
509 |
return getNote + " :\n" + getContext
|
510 |
@cl.step(type="retrieval")
|
511 |
async def contexte(competence):
|
512 |
-
|
|
|
|
|
|
|
513 |
await cl.sleep(1)
|
514 |
romeListArray = cl.user_session.get("codeRomeArray")
|
515 |
df_emplois = await API_France_Travail(romeListArray)
|
516 |
-
|
517 |
-
#for j in range(0, len(romeListArray)):
|
518 |
-
# table = await datavisualisation_chiffres_cles_emplois("https://dataemploi.pole-emploi.fr/metier/chiffres-cles/NAT/FR/" + romeListArray[j])
|
519 |
-
# plot_demandeur = plotDemandeur(htmlToDataframe(table[0]), romeListArray[j])
|
520 |
-
# if len(table[1]) > 0:
|
521 |
-
# plot_salaire = plotSalaire(htmlToDataframe(table[1]))
|
522 |
-
# plot_difficulte = plotDifficulte(htmlToDataframe(table[2]))
|
523 |
-
# plot_repartitionContrat = plotRepartition(htmlToDataframe(table[3]), "Répartition des embauches du métier : type de contrat")
|
524 |
-
# plot_repartitionEntreprise = plotRepartition(htmlToDataframe(table[4]), "Répartition des embauches du métier : type entreprise")
|
525 |
-
|
526 |
return df_emplois
|
527 |
|
528 |
@cl.step(type="tool")
|
@@ -703,16 +715,16 @@ async def API_France_Travail(romeListArray):
|
|
703 |
results = []
|
704 |
for k in romeListArray:
|
705 |
params = {"motsCles": k,'minCreationDate': dt_to_str_iso(start_dt),'maxCreationDate': dt_to_str_iso(end_dt),'range':'0-149'}
|
706 |
-
|
707 |
-
|
|
|
708 |
results_df = pd.DataFrame(results)
|
709 |
return results_df
|
710 |
|
711 |
@cl.step(type="tool")
|
712 |
-
async def creation_liste_code_Rome(competence):
|
713 |
-
os.environ['PINECONE_API_KEYROME'] = os.environ['PINECONE_API_KEYROME']
|
714 |
docsearch = await connexion_catalogue_Rome()
|
715 |
-
retrieve_comp = docsearch.similarity_search(competence, k=30, filter={"categorie": {"$eq":
|
716 |
retrieve = pd.DataFrame(retrieve_comp)
|
717 |
codeRome = []
|
718 |
competence = []
|
@@ -761,7 +773,62 @@ async def creation_liste_code_Rome(competence):
|
|
761 |
arrayCodeRome = stringCodeRome.split(',')
|
762 |
else:
|
763 |
arrayCodeRome = codeRome_list
|
764 |
-
await cl.Message(author="Datapcc : 🌐🌐🌐",content="Votre
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
765 |
cl.user_session.set("codeRomeArray", arrayCodeRome)
|
766 |
|
767 |
@cl.step(type="tool")
|
|
|
424 |
|
425 |
if chatProfile[1] == 'ROMESKILLS':
|
426 |
contextChat = await homeRome()
|
427 |
+
categorie = cl.user_session.set("categorie", os.environ['PINECONE_API_KEYROME'])
|
428 |
else:
|
429 |
contextChat = await homeEsco()
|
430 |
+
categorie = cl.user_session.set("categorie", os.environ['PINECONE_API_KEYESCO'])
|
431 |
+
|
432 |
os.environ['HUGGINGFACEHUB_API_TOKEN'] = os.environ['HUGGINGFACEHUB_API_TOKEN']
|
433 |
repo_id = "mistralai/Mistral-7B-Instruct-v0.3"
|
434 |
|
|
|
463 |
async def construction_NCS(competenceList):
|
464 |
context = await contexte(competenceList)
|
465 |
emploisST = context.to_string(index = False)
|
466 |
+
if chatProfile[1] == 'ROMESKILLS':
|
467 |
+
romeListArray = cl.user_session.get("codeRomeArray")
|
468 |
+
ficheClesMetier = await document_chiffres_cles_emplois("https://dataemploi.francetravail.fr/metier/chiffres-cles/NAT/FR/", romeListArray)
|
469 |
+
contentChatBot = str(emploisST).replace('[','').replace(']','').replace('{','').replace('}','') + ficheClesMetier
|
470 |
+
finals_df = context[['intitule','typeContratLibelle','experienceLibelle','competences','description','qualitesProfessionnelles','salaire','lieuTravail','formations']].copy()
|
471 |
+
listEmplois = finals_df.values.tolist()
|
472 |
+
stringEmplois = ''
|
473 |
+
for i in range(0,len(listEmplois)):
|
474 |
+
stringEmplois += "\n✔️ Emploi : " + str(listEmplois[i][0]) + ";\n◉ Contrat : " + str(listEmplois[i][1]) + ";\n◉ Compétences professionnelles : " + str(listEmplois[i][3]) + ";\n" + "◉ Salaire : " + str(listEmplois[i][6]) + ";\n◉ Qualification : " + str(listEmplois[i][5]).replace("'libelle'","\n• 'libelle") + ";\n◉ Localisation : " + str(listEmplois[i][7]) + ";\n◉ Expérience : " + str(listEmplois[i][2]) + ";\n◉ Niveau de qualification : " + str(listEmplois[i][8]) + ";\n◉ Description de l'emploi : " + str(listEmplois[i][4]) + "\n"
|
475 |
+
await cl.sleep(1)
|
476 |
+
listEmplois_name = f"Liste des emplois"
|
477 |
+
text_elements = []
|
478 |
+
text_elements.append(
|
479 |
+
cl.Text(content="Question : " + competenceList + "\n\nRéponse :\n" + stringEmplois.replace('[','').replace(']','').replace('{','').replace('}','').replace("'code'","\n• 'code'"), name=listEmplois_name)
|
480 |
+
)
|
481 |
+
await cl.Message(author="Datapcc : 🌐🌐🌐",content="👨💼 Source France Travail : " + listEmplois_name, elements=text_elements).send()
|
482 |
+
await cl.sleep(1)
|
483 |
+
listClesMetier_name = f"Chiffres clés des emplois"
|
484 |
+
text_ClesMetier = []
|
485 |
+
text_ClesMetier.append(
|
486 |
+
cl.Text(content="Question : " + competenceList + "\n\nRéponse :\n" + ficheClesMetier, name=listClesMetier_name)
|
487 |
+
)
|
488 |
+
await cl.Message(author="Datapcc : 🌐🌐🌐",content="📈 Source France Travail : " + listClesMetier_name, elements=text_ClesMetier).send()
|
489 |
+
await cl.sleep(1)
|
490 |
+
datavizChiffresClesMetiers = [
|
491 |
+
cl.Action(name="datavizChiffresClesMetiers", value=str(romeListArray), description="Afficher la datavisualisation des chiffres clés des métiers")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
492 |
]
|
493 |
+
await cl.Message(author="Datapcc : 🌐🌐🌐",content="📊 Afficher la datavisualisation des chiffres clés des métiers", actions=datavizChiffresClesMetiers).send()
|
494 |
+
await cl.sleep(1)
|
495 |
+
codeArray = romeListArray
|
496 |
+
ficheMetiers = []
|
497 |
+
for i in range(0,len(codeArray)):
|
498 |
+
ficheMetiers = [
|
499 |
+
cl.File(name= "Fiche métier " + codeArray[i],url="https://www.soi-tc.fr/assets/fiches_pe/FEM_" + codeArray[i] + ".pdf",display="inline",)
|
500 |
+
]
|
501 |
+
await cl.Message(
|
502 |
+
author="Datapcc : 🌐🌐🌐", content="[Fiches métiers] 🔗", elements=ficheMetiers
|
503 |
+
).send()
|
504 |
+
else:
|
505 |
+
contentChatBot = str(emploisST).replace('[','').replace(']','').replace('{','').replace('}','')
|
506 |
+
finals_df = context[['intitule','typeContratLibelle','experienceLibelle','competences','description','qualitesProfessionnelles','salaire','lieuTravail','formations']].copy()
|
507 |
+
listEmplois = finals_df.values.tolist()
|
508 |
+
stringEmplois = ''
|
509 |
+
for i in range(0,len(listEmplois)):
|
510 |
+
stringEmplois += "\n✔️ Emploi : " + str(listEmplois[i][0]) + ";\n◉ Contrat : " + str(listEmplois[i][1]) + ";\n◉ Compétences professionnelles : " + str(listEmplois[i][3]) + ";\n" + "◉ Salaire : " + str(listEmplois[i][6]) + ";\n◉ Qualification : " + str(listEmplois[i][5]).replace("'libelle'","\n• 'libelle") + ";\n◉ Localisation : " + str(listEmplois[i][7]) + ";\n◉ Expérience : " + str(listEmplois[i][2]) + ";\n◉ Niveau de qualification : " + str(listEmplois[i][8]) + ";\n◉ Description de l'emploi : " + str(listEmplois[i][4]) + "\n"
|
511 |
+
await cl.sleep(1)
|
512 |
+
listEmplois_name = f"Liste des emplois"
|
513 |
+
text_elements = []
|
514 |
+
text_elements.append(
|
515 |
+
cl.Text(content="Question : " + competenceList + "\n\nRéponse :\n" + stringEmplois.replace('[','').replace(']','').replace('{','').replace('}','').replace("'code'","\n• 'code'"), name=listEmplois_name)
|
516 |
+
)
|
517 |
+
await cl.Message(author="Datapcc : 🌐🌐🌐",content="👨💼 Source France Travail : " + listEmplois_name, elements=text_elements).send()
|
518 |
+
cl.user_session.set("contextChatBot", contentChatBot[0:28875])
|
519 |
|
520 |
await datavisualisation_statistiques_emplois(context)
|
521 |
|
|
|
527 |
return getNote + " :\n" + getContext
|
528 |
@cl.step(type="retrieval")
|
529 |
async def contexte(competence):
|
530 |
+
if chatProfile[1] == 'ROMESKILLS':
|
531 |
+
results = await creation_liste_code_Rome(competence, cl.user_session.get("categorie"))
|
532 |
+
else:
|
533 |
+
results = await creation_liste_skills_Esco(competence, cl.user_session.get("categorie"))
|
534 |
await cl.sleep(1)
|
535 |
romeListArray = cl.user_session.get("codeRomeArray")
|
536 |
df_emplois = await API_France_Travail(romeListArray)
|
537 |
+
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
538 |
return df_emplois
|
539 |
|
540 |
@cl.step(type="tool")
|
|
|
715 |
results = []
|
716 |
for k in romeListArray:
|
717 |
params = {"motsCles": k,'minCreationDate': dt_to_str_iso(start_dt),'maxCreationDate': dt_to_str_iso(end_dt),'range':'0-149'}
|
718 |
+
try:
|
719 |
+
search_on_big_data = client.search(params=params)
|
720 |
+
results += search_on_big_data["resultats"]
|
721 |
results_df = pd.DataFrame(results)
|
722 |
return results_df
|
723 |
|
724 |
@cl.step(type="tool")
|
725 |
+
async def creation_liste_code_Rome(competence, categorie):
|
|
|
726 |
docsearch = await connexion_catalogue_Rome()
|
727 |
+
retrieve_comp = docsearch.similarity_search(competence, k=30, filter={"categorie": {"$eq": categorie}})
|
728 |
retrieve = pd.DataFrame(retrieve_comp)
|
729 |
codeRome = []
|
730 |
competence = []
|
|
|
773 |
arrayCodeRome = stringCodeRome.split(',')
|
774 |
else:
|
775 |
arrayCodeRome = codeRome_list
|
776 |
+
await cl.Message(author="Datapcc : 🌐🌐🌐",content="Votre saisie est erronée. Nous continuons l'action avec les codes Rome sélectionnés automatiquement pour vous : " + codeRome_list).send()
|
777 |
+
cl.user_session.set("codeRomeArray", arrayCodeRome)
|
778 |
+
|
779 |
+
@cl.step(type="tool")
|
780 |
+
async def creation_liste_skills_Esco(competence, categorie):
|
781 |
+
docsearch = await connexion_catalogue_Rome()
|
782 |
+
retrieve_comp = docsearch.similarity_search(competence, k=40, filter={"categorie": {"$eq": categorie}})
|
783 |
+
retrieve = pd.DataFrame(retrieve_comp)
|
784 |
+
codeRome = []
|
785 |
+
competence = []
|
786 |
+
metier = []
|
787 |
+
for i in range(0,len(retrieve_comp)):
|
788 |
+
competence.append(retrieve_comp[i].metadata['compétence'])
|
789 |
+
description_competence.append(retrieve_comp[i].metadata['description_compétence'])
|
790 |
+
metier.append(retrieve_comp[i].metadata['métier'])
|
791 |
+
description_metier.append(retrieve_comp[i].metadata['description_métier'])
|
792 |
+
|
793 |
+
results_df = pd.DataFrame({'compétence': competence,'description_compétence': description_competence, 'métier': metier, 'description_métier': description_metier})
|
794 |
+
arrayresults = results_df.values.tolist()
|
795 |
+
displayresults = '| Compétence | Description Compétence | Métier | Description Métier |\n| -------- | ------- | ------- | ------- |'
|
796 |
+
for j in range(0, len(arrayresults)):
|
797 |
+
displayresults += '\n| ' + arrayresults[j][0] + ' | ' + arrayresults[j][1] + ' | ' + arrayresults[j][2] + ' | ' + arrayresults[j][3] + ' |'
|
798 |
+
|
799 |
+
await cl.Message(author="Datapcc : 🌐🌐🌐",content="Voici le résultat de la recherche sémantique sur la classification ESCO :\n" + displayresults).send()
|
800 |
+
|
801 |
+
results_df = results_df.drop_duplicates(subset=["métier"])
|
802 |
+
results_df = results_df.head(10)
|
803 |
+
codeRomeString = results_df["métier"].to_string(index = False)
|
804 |
+
codeRome_list = results_df["métier"].tolist()
|
805 |
+
actionRome = await cl.AskActionMessage(
|
806 |
+
content="Etes-vous d'accord avec la sélection des 10 métiers automatiques pour compléter la liste des compétences avec celles attendues sur le marché du travail? :\n" + codeRomeString,
|
807 |
+
actions=[
|
808 |
+
cl.Action(name="continue", value="Offres d'emploi en temps réel", label="✅ Oui, je veux continuer vers l'extraction en temps réel des offres d'emploi"),
|
809 |
+
cl.Action(name="cancel", value="Saisie des codes Rome", label="❌ Non, je veux saisir ma liste de métiers, séparés par des points-virgules"),
|
810 |
+
], timeout=3600
|
811 |
+
).send()
|
812 |
+
if actionRome and actionRome.get("name") == "continue":
|
813 |
+
await cl.Message(
|
814 |
+
content="Connexion à France Travail, et récupération des offres d'emploi",
|
815 |
+
).send()
|
816 |
+
cl.user_session.set("codeRomeArray", codeRome_list)
|
817 |
+
else:
|
818 |
+
actionsaisierome = await cl.AskUserMessage(content="Saisissez vos métiers dans le prompt? ⚠️ Attention, indiquez seulement des métiers séparés par des points-virgules", timeout=3600).send()
|
819 |
+
if actionsaisierome:
|
820 |
+
await cl.Message(
|
821 |
+
content=f"Votre saisie est : {actionsaisierome['output']}",
|
822 |
+
).send()
|
823 |
+
stringCodeRome = actionsaisierome['output']
|
824 |
+
stopWords = [';']
|
825 |
+
teststringCodeRome = [ele for ele in stopWords if(ele in stringCodeRome)]
|
826 |
+
teststringCodeRome = bool(teststringCodeRome)
|
827 |
+
if teststringCodeRome == False:
|
828 |
+
arrayCodeRome = stringCodeRome.split(';')
|
829 |
+
else:
|
830 |
+
arrayCodeRome = codeRome_list
|
831 |
+
await cl.Message(author="Datapcc : 🌐🌐🌐",content="Votre saisie est erronée. Nous continuons l'action avec les métiers sélectionnés automatiquement pour vous : " + codeRome_list).send()
|
832 |
cl.user_session.set("codeRomeArray", arrayCodeRome)
|
833 |
|
834 |
@cl.step(type="tool")
|