Spaces:
Sleeping
Sleeping
Update app.py
Browse files
app.py
CHANGED
@@ -24,8 +24,11 @@ competence_questions = [
|
|
24 |
competence_responses = []
|
25 |
current_question_index = 0
|
26 |
|
27 |
-
def
|
28 |
-
messages = [
|
|
|
|
|
|
|
29 |
for i, response in enumerate(responses):
|
30 |
messages.append({"role": "user", "content": f"{competence_questions[i]} : {response}"})
|
31 |
|
@@ -53,12 +56,29 @@ def call_api_for_summary(responses):
|
|
53 |
logger.error(f"Erreur lors de l'appel API: {str(e)}")
|
54 |
return f"Erreur: {str(e)}"
|
55 |
|
56 |
-
def
|
57 |
-
|
|
|
|
|
|
|
|
|
58 |
|
59 |
-
|
60 |
-
messages.append({"role": "user", "content": f"{competence_questions[i]} : {response}"})
|
61 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
62 |
try:
|
63 |
response = requests.post(
|
64 |
url="https://openrouter.ai/api/v1/chat/completions",
|
@@ -76,31 +96,29 @@ def call_api_for_skill_assessment(responses):
|
|
76 |
|
77 |
if response.status_code == 200:
|
78 |
data = response.json()
|
79 |
-
|
|
|
80 |
else:
|
81 |
-
|
|
|
82 |
except Exception as e:
|
83 |
logger.error(f"Erreur lors de l'appel API: {str(e)}")
|
84 |
-
return f"Erreur: {str(e)}"
|
85 |
|
86 |
-
def
|
87 |
-
|
88 |
-
|
89 |
-
"Authorization": f"Bearer {AIRTABLE_API_KEY}",
|
90 |
-
"Content-Type": "application/json"
|
91 |
-
}
|
92 |
-
data = {
|
93 |
-
"fields": {
|
94 |
-
"Description Compétences Etudiants": skill_assessment
|
95 |
-
}
|
96 |
-
}
|
97 |
|
98 |
-
|
|
|
|
|
99 |
|
100 |
-
|
101 |
-
|
102 |
-
|
103 |
-
|
|
|
|
|
104 |
|
105 |
def chatbot_response(message, history):
|
106 |
global competence_responses, current_question_index
|
@@ -111,9 +129,8 @@ def chatbot_response(message, history):
|
|
111 |
if current_question_index < len(competence_questions):
|
112 |
return competence_questions[current_question_index], None
|
113 |
else:
|
114 |
-
summary = call_api_for_summary(competence_responses)
|
115 |
skill_assessment = call_api_for_skill_assessment(competence_responses)
|
116 |
-
return f"Merci pour vos réponses ! Voici votre bilan de compétences :\n\n{
|
117 |
|
118 |
def start_conversation():
|
119 |
global current_question_index, competence_responses
|
@@ -137,24 +154,53 @@ def clear_chat():
|
|
137 |
current_question_index = 0
|
138 |
return [], None, None
|
139 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
140 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
141 |
chatbot = gr.Chatbot(label="Historique de la conversation")
|
142 |
msg = gr.Textbox(label="Votre message", placeholder="Tapez votre message ici...")
|
143 |
clear = gr.Button("Effacer la conversation")
|
144 |
-
summary_output = gr.Textbox(label="Résumé des compétences", interactive=False)
|
145 |
skill_assessment_output = gr.Textbox(label="Bilan des compétences", interactive=False)
|
146 |
-
submit_button = gr.Button("Soumettre")
|
|
|
147 |
|
148 |
demo.load(start_conversation, inputs=None, outputs=[chatbot, skill_assessment_output])
|
149 |
msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(
|
150 |
bot, [chatbot], [chatbot, skill_assessment_output]
|
151 |
)
|
152 |
-
clear.click(clear_chat, None, [chatbot, skill_assessment_output,
|
153 |
-
|
154 |
-
def submit_summary(skill_assessment_output):
|
155 |
-
airtable_response = upload_to_airtable(skill_assessment_output)
|
156 |
-
return f"Résumé soumis : {skill_assessment_output}\n{airtable_response}"
|
157 |
-
|
158 |
-
submit_button.click(submit_summary, skill_assessment_output, summary_output)
|
159 |
|
160 |
demo.launch()
|
|
|
24 |
competence_responses = []
|
25 |
current_question_index = 0
|
26 |
|
27 |
+
def call_api_for_skill_assessment(responses):
|
28 |
+
messages = [
|
29 |
+
{"role": "system", "content": "Vous êtes un assistant IA qui évalue les compétences. Faites un bilan des compétences avec toutes les compétences, appliquez ceci à toutes les compétences de l'utilisateur. Évaluez-les en fonction de l'expérience de l'utilisateur, sans aucun autre commentaire, ni style dans le texte (pas de gras, pas de souligné, pas d'italique). Sous cette forme :\n- Compétence 1\n- Compétence 2\n- Compétence 3\n..."}
|
30 |
+
]
|
31 |
+
|
32 |
for i, response in enumerate(responses):
|
33 |
messages.append({"role": "user", "content": f"{competence_questions[i]} : {response}"})
|
34 |
|
|
|
56 |
logger.error(f"Erreur lors de l'appel API: {str(e)}")
|
57 |
return f"Erreur: {str(e)}"
|
58 |
|
59 |
+
def get_enterprise_descriptions():
|
60 |
+
url = f"https://api.airtable.com/v0/{AIRTABLE_BASE_ID}/DescriptionsEntreprises"
|
61 |
+
headers = {
|
62 |
+
"Authorization": f"Bearer {AIRTABLE_API_KEY}",
|
63 |
+
"Content-Type": "application/json"
|
64 |
+
}
|
65 |
|
66 |
+
response = requests.get(url, headers=headers)
|
|
|
67 |
|
68 |
+
if response.status_code == 200:
|
69 |
+
data = response.json()
|
70 |
+
descriptions = [(record['fields'].get('Nom', f"Entreprise {i+1}"), record['fields']['Description entreprises']) for i, record in enumerate(data['records'])]
|
71 |
+
return descriptions
|
72 |
+
else:
|
73 |
+
logger.error(f"Erreur lors de la récupération des descriptions d'entreprises : {response.status_code} - {response.text}")
|
74 |
+
return []
|
75 |
+
|
76 |
+
def compare_skills_ai(student_skills, enterprise_skills):
|
77 |
+
messages = [
|
78 |
+
{"role": "system", "content": "Vous êtes un expert en recrutement chargé d'évaluer la correspondance entre les compétences d'un étudiant et celles requises par une entreprise. Votre tâche est d'analyser ces compétences et de fournir une valeur de correspondance entre l'étudiant et les différentes entreprise, je veux simplement la note global pour chaque entreprise. Tenez compte des compétences similaires ou complémentaires, pas seulement des correspondances exactes."},
|
79 |
+
{"role": "user", "content": f"Compétences de l'étudiant :\n{student_skills}\n\nCompétences requises par l'entreprise :\n{enterprise_skills}\n\nVeuillez analyser ces compétences et fournir un chiffre entre 0 et 100 pour la correspondance entre l'etudiant et l'entreprise afin de voir le taux de compatibilité entre l'etudiants et les différentes entreprises. en détaille rien, juste la note global sans le détail. Ecrit juste le nom de l'entreprise puis le score"}
|
80 |
+
]
|
81 |
+
|
82 |
try:
|
83 |
response = requests.post(
|
84 |
url="https://openrouter.ai/api/v1/chat/completions",
|
|
|
96 |
|
97 |
if response.status_code == 200:
|
98 |
data = response.json()
|
99 |
+
ai_analysis = data['choices'][0]['message']['content']
|
100 |
+
return ai_analysis
|
101 |
else:
|
102 |
+
logger.error(f"Erreur lors de l'appel à l'API : {response.status_code} - {response.text}")
|
103 |
+
return "Erreur lors de l'analyse des compétences."
|
104 |
except Exception as e:
|
105 |
logger.error(f"Erreur lors de l'appel API: {str(e)}")
|
106 |
+
return f"Erreur lors de l'analyse des compétences : {str(e)}"
|
107 |
|
108 |
+
def compare_with_enterprises(skill_assessment):
|
109 |
+
enterprise_descriptions = get_enterprise_descriptions()
|
110 |
+
results = []
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
111 |
|
112 |
+
for enterprise_name, enterprise_desc in enterprise_descriptions:
|
113 |
+
analysis = compare_skills_ai(skill_assessment, enterprise_desc)
|
114 |
+
results.append((enterprise_name, analysis))
|
115 |
|
116 |
+
output = ""
|
117 |
+
for enterprise_name, analysis in results:
|
118 |
+
output += f"Analyse pour {enterprise_name}:\n{analysis}\n\n"
|
119 |
+
|
120 |
+
print(output)
|
121 |
+
return output
|
122 |
|
123 |
def chatbot_response(message, history):
|
124 |
global competence_responses, current_question_index
|
|
|
129 |
if current_question_index < len(competence_questions):
|
130 |
return competence_questions[current_question_index], None
|
131 |
else:
|
|
|
132 |
skill_assessment = call_api_for_skill_assessment(competence_responses)
|
133 |
+
return f"Merci pour vos réponses ! Voici votre bilan de compétences :\n\n{skill_assessment}", skill_assessment
|
134 |
|
135 |
def start_conversation():
|
136 |
global current_question_index, competence_responses
|
|
|
154 |
current_question_index = 0
|
155 |
return [], None, None
|
156 |
|
157 |
+
def upload_to_airtable(skill_assessment):
|
158 |
+
url = f"https://api.airtable.com/v0/{AIRTABLE_BASE_ID}/{AIRTABLE_TABLE_NAME}"
|
159 |
+
headers = {
|
160 |
+
"Authorization": f"Bearer {AIRTABLE_API_KEY}",
|
161 |
+
"Content-Type": "application/json"
|
162 |
+
}
|
163 |
+
data = {
|
164 |
+
"fields": {
|
165 |
+
"Description Compétences Etudiants": skill_assessment
|
166 |
+
}
|
167 |
+
}
|
168 |
+
|
169 |
+
try:
|
170 |
+
response = requests.post(url, headers=headers, json=data)
|
171 |
+
|
172 |
+
if response.status_code == 200:
|
173 |
+
return "Données envoyées avec succès à Airtable."
|
174 |
+
else:
|
175 |
+
logger.error(f"Erreur lors de l'envoi à Airtable : {response.status_code} - {response.text}")
|
176 |
+
return f"Erreur lors de l'enregistrement dans Airtable : {response.status_code}"
|
177 |
+
|
178 |
+
except Exception as e:
|
179 |
+
logger.error(f"Erreur lors de l'envoi à Airtable : {str(e)}")
|
180 |
+
return f"Erreur lors de l'enregistrement dans Airtable : {str(e)}"
|
181 |
+
|
182 |
+
def submit_and_compare(skill_assessment_output):
|
183 |
+
# Remplissage de la BDD Airtable avec le bilan des compétences
|
184 |
+
airtable_response = upload_to_airtable(skill_assessment_output)
|
185 |
+
|
186 |
+
# Comparaison avec les entreprises
|
187 |
+
comparison_result = compare_with_enterprises(skill_assessment_output)
|
188 |
+
|
189 |
+
return f"Résultat de l'enregistrement dans Airtable: {airtable_response}\n\n{comparison_result}"
|
190 |
+
|
191 |
with gr.Blocks(theme=gr.themes.Soft()) as demo:
|
192 |
chatbot = gr.Chatbot(label="Historique de la conversation")
|
193 |
msg = gr.Textbox(label="Votre message", placeholder="Tapez votre message ici...")
|
194 |
clear = gr.Button("Effacer la conversation")
|
|
|
195 |
skill_assessment_output = gr.Textbox(label="Bilan des compétences", interactive=False)
|
196 |
+
submit_button = gr.Button("Soumettre et comparer")
|
197 |
+
comparison_output = gr.Textbox(label="Résultat de la comparaison", interactive=False)
|
198 |
|
199 |
demo.load(start_conversation, inputs=None, outputs=[chatbot, skill_assessment_output])
|
200 |
msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(
|
201 |
bot, [chatbot], [chatbot, skill_assessment_output]
|
202 |
)
|
203 |
+
clear.click(clear_chat, None, [chatbot, skill_assessment_output, comparison_output], queue=False)
|
204 |
+
submit_button.click(submit_and_compare, skill_assessment_output, comparison_output)
|
|
|
|
|
|
|
|
|
|
|
205 |
|
206 |
demo.launch()
|