LilRg commited on
Commit
d1f9405
·
verified ·
1 Parent(s): 32e1d74

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +298 -71
app.py CHANGED
@@ -2,12 +2,13 @@ import requests
2
  import json
3
  import gradio as gr
4
  import logging
 
5
 
6
  logging.basicConfig(level=logging.ERROR)
7
  logger = logging.getLogger(__name__)
8
 
9
  OPENROUTER_API_KEY = "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"
10
- YOUR_SITE_URL = "https://huggingface.co/spaces/LilRg/AlbatrossV1Chatbot"
11
  YOUR_APP_NAME = "MonChatbot"
12
 
13
  AIRTABLE_API_KEY = "patUUQ6NE9zUOqooM.ec8d096169d754852305c88c7966ad1f8a151f3bf015d39f80bb895bdad0e2f5"
@@ -21,8 +22,85 @@ competence_questions = [
21
  "Quelles sont vos compétences en gestion de projet ?"
22
  ]
23
 
24
- competence_responses = []
25
- current_question_index = 0
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
 
27
  def call_api_for_skill_assessment(responses):
28
  messages = [
@@ -67,7 +145,7 @@ def get_enterprise_descriptions():
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}")
@@ -76,7 +154,7 @@ def get_enterprise_descriptions():
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:
@@ -97,7 +175,12 @@ def compare_skills_ai(student_skills, enterprise_skills):
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."
@@ -105,42 +188,173 @@ def compare_skills_ai(student_skills, enterprise_skills):
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
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
125
 
126
- competence_responses.append(message)
127
- current_question_index += 1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
128
 
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
137
- current_question_index = 0
138
- competence_responses = []
139
- return [[None, competence_questions[0]]], None
 
 
 
 
 
 
 
 
 
 
 
140
 
141
  def user(user_message, history):
142
  return "", history + [[user_message, None]]
143
 
 
 
 
 
 
 
 
 
 
 
144
  def bot(history):
145
  if history:
146
  bot_message, skill_assessment = chatbot_response(history[-1][0], history[:-1])
@@ -149,52 +363,64 @@ def bot(history):
149
  return [], None
150
 
151
  def clear_chat():
152
- global competence_responses, current_question_index
153
- 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(
@@ -203,4 +429,5 @@ with gr.Blocks(theme=gr.themes.Soft()) as demo:
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()
 
 
2
  import json
3
  import gradio as gr
4
  import logging
5
+ import re
6
 
7
  logging.basicConfig(level=logging.ERROR)
8
  logger = logging.getLogger(__name__)
9
 
10
  OPENROUTER_API_KEY = "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"
11
+ YOUR_SITE_URL = "votre-site.com"
12
  YOUR_APP_NAME = "MonChatbot"
13
 
14
  AIRTABLE_API_KEY = "patUUQ6NE9zUOqooM.ec8d096169d754852305c88c7966ad1f8a151f3bf015d39f80bb895bdad0e2f5"
 
22
  "Quelles sont vos compétences en gestion de projet ?"
23
  ]
24
 
25
+ def get_last_user_id():
26
+ url = f"https://api.airtable.com/v0/{AIRTABLE_BASE_ID}/Inscription_Etudiants"
27
+ headers = {
28
+ "Authorization": f"Bearer {AIRTABLE_API_KEY}",
29
+ "Content-Type": "application/json"
30
+ }
31
+
32
+ params = {
33
+ "sort[0][field]": "ID_Etu",
34
+ "sort[0][direction]": "desc",
35
+ "maxRecords": 1
36
+ }
37
+
38
+ try:
39
+ response = requests.get(url, headers=headers, params=params)
40
+
41
+ if response.status_code == 200:
42
+ data = response.json()
43
+
44
+ if len(data['records']) > 0:
45
+ last_record = data['records'][0]
46
+ last_user_id = last_record['fields'].get('ID_Etu', 'Aucun ID trouvé')
47
+ return last_user_id
48
+ else:
49
+ return None
50
+ else:
51
+ logger.error(f"Erreur lors de la récupération des ID : {response.status_code} - {response.text}")
52
+ return None
53
+
54
+ except Exception as e:
55
+ logger.error(f"Erreur lors de la récupération des ID : {str(e)}")
56
+ return None
57
+
58
+ def call_api_for_response_analysis(question, response):
59
+ messages = [
60
+ {
61
+ "role": "system",
62
+ "content": "Vous êtes un assistant IA expert en analyse de réponses. "
63
+ "Évaluez la réponse d'un utilisateur à une question sur ses compétences. "
64
+ "Renvoie le score de pertinence (0-100), le score de détail (0-100) et des suggestions pour améliorer la réponse. "
65
+ "Format de sortie : 'Score de pertinence, Score de détail, \"Suggestions\"'."
66
+ },
67
+ {
68
+ "role": "user",
69
+ "content": f"Question : {question}\nRéponse de l'utilisateur : {response}\n\n"
70
+ "Format de sortie attendu : 'Score de pertinence, Score de détail, \"Suggestions\"'."
71
+ }
72
+ ]
73
+
74
+ try:
75
+ api_response = requests.post(
76
+ url="https://openrouter.ai/api/v1/chat/completions",
77
+ headers={
78
+ "Authorization": f"Bearer {OPENROUTER_API_KEY}",
79
+ "HTTP-Referer": f"{YOUR_SITE_URL}",
80
+ "X-Title": f"{YOUR_APP_NAME}",
81
+ "Content-Type": "application/json"
82
+ },
83
+ data=json.dumps({
84
+ "model": "mistralai/pixtral-12b:free",
85
+ "messages": messages
86
+ })
87
+ )
88
+
89
+ if api_response.status_code == 200:
90
+ data = api_response.json()
91
+ logger.info(f"Réponse de l'API : {data}")
92
+ analysis = data['choices'][0]['message']['content']
93
+ logger.info(f"Analyse brute de l'API : {analysis}")
94
+ parsed_results = parse_analysis(analysis)
95
+ return parsed_results
96
+
97
+ else:
98
+ logger.error(f"Erreur lors de l'analyse de la réponse : {api_response.status_code} - {api_response.text}")
99
+ return {"error": f"Erreur lors de l'analyse de la réponse : {api_response.status_code} - {api_response.text}"}
100
+
101
+ except Exception as e:
102
+ logger.error(f"Erreur lors de l'appel API: {str(e)}")
103
+ return {"error": f"Erreur: {str(e)}"}
104
 
105
  def call_api_for_skill_assessment(responses):
106
  messages = [
 
145
 
146
  if response.status_code == 200:
147
  data = response.json()
148
+ descriptions = [(record['fields'].get('Nom', f"Entreprise {i+1}"), record['fields']['Description entreprises'], record['fields'].get('ID_Offre2')) for i, record in enumerate(data['records'])]
149
  return descriptions
150
  else:
151
  logger.error(f"Erreur lors de la récupération des descriptions d'entreprises : {response.status_code} - {response.text}")
 
154
  def compare_skills_ai(student_skills, enterprise_skills):
155
  messages = [
156
  {"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."},
157
+ {"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 que et uniquement le score, par exemple : 100 et pas : Score : 100, juste 100"}
158
  ]
159
 
160
  try:
 
175
  if response.status_code == 200:
176
  data = response.json()
177
  ai_analysis = data['choices'][0]['message']['content']
178
+ try:
179
+ score = int(ai_analysis.strip())
180
+ return score
181
+ except ValueError:
182
+ logger.error(f"Erreur lors de la conversion du score : la réponse était '{ai_analysis}'")
183
+ return "Erreur lors de l'analyse des compétences : score non valide."
184
  else:
185
  logger.error(f"Erreur lors de l'appel à l'API : {response.status_code} - {response.text}")
186
  return "Erreur lors de l'analyse des compétences."
 
188
  logger.error(f"Erreur lors de l'appel API: {str(e)}")
189
  return f"Erreur lors de l'analyse des compétences : {str(e)}"
190
 
191
+ def upload_to_airtable(skill_assessment):
192
+ url = f"https://api.airtable.com/v0/{AIRTABLE_BASE_ID}/{AIRTABLE_TABLE_NAME}"
193
+ headers = {
194
+ "Authorization": f"Bearer {AIRTABLE_API_KEY}",
195
+ "Content-Type": "application/json"
196
+ }
197
+ data = {
198
+ "fields": {
199
+ "Description Compétences Etudiants": skill_assessment
200
+ }
201
+ }
202
 
203
+ try:
204
+ response = requests.post(url, headers=headers, json=data)
205
+
206
+ if response.status_code == 200:
207
+ return "Données envoyées avec succès."
208
+ else:
209
+ logger.error(f"Erreur lors de l'envoi : {response.status_code} - {response.text}")
210
+ return f"Erreur lors de l'enregistrement : {response.status_code}"
211
 
212
+ except Exception as e:
213
+ logger.error(f"Erreur lors de l'envoi : {str(e)}")
214
+ return f"Erreur lors de l'enregistrement : {str(e)}"
215
+
216
+ def add_to_compatibility_table(student_id, skill_assessment, enterprise_skills, offer_id, compatibility_rate):
217
+ url = f"https://api.airtable.com/v0/{AIRTABLE_BASE_ID}/TauxCompatibilité"
218
+ headers = {
219
+ "Authorization": f"Bearer {AIRTABLE_API_KEY}",
220
+ "Content-Type": "application/json"
221
+ }
222
+
223
+ data = {
224
+ "fields": {
225
+ "ID_Etu": student_id,
226
+ "DescriptionEtu": skill_assessment,
227
+ "ID_Offre": offer_id,
228
+ "DescriptionOffre": enterprise_skills,
229
+ "Taux de compatibilité" : compatibility_rate
230
+ }
231
+ }
232
 
233
+ try:
234
+ response = requests.post(url, headers=headers, json=data)
235
 
236
+ if response.status_code == 200:
237
+ return "Données ajoutées avec succès !"
238
+ else:
239
+ logger.error(f"Erreur lors de l'ajout à la table de compatibilité : {response.status_code} - {response.text}")
240
+ return f"Erreur lors de l'ajout à la table de compatibilité : {response.status_code}"
241
+ except Exception as e:
242
+ logger.error(f"Erreur lors de l'ajout à Airtable : {str(e)}")
243
+ return f"Erreur lors de l'ajout à Airtable : {str(e)}"
244
+
245
+ def parse_analysis(analysis):
246
+ try:
247
+ cleaned_analysis = re.sub(r'[^\d\s]', '', analysis)
248
+ cleaned_analysis = cleaned_analysis.strip()
249
+
250
+ numbers = re.findall(r'\d+', cleaned_analysis)
251
+
252
+ if len(numbers) >= 2:
253
+ pertinence = int(numbers[0])
254
+ detail = int(numbers[1])
255
+ else:
256
+ pertinence = 0
257
+ detail = 0
258
+
259
+ last_number_index = cleaned_analysis.rfind(numbers[1])
260
+ suggestions = analysis[last_number_index + len(numbers[1]):].strip() if last_number_index != -1 else ""
261
+
262
+ return {
263
+ "pertinence": pertinence,
264
+ "detail": detail,
265
+ "suggestions": suggestions
266
+ }
267
 
268
+ except Exception as e:
269
+ logger.error(f"Erreur lors du parsing de l'analyse: {str(e)}")
270
+ return {"pertinence": 0, "detail": 0, "suggestions": ""}
271
+
272
+ def generate_follow_up_question(original_question, current_response, previous_response, suggestions):
273
+ messages = [
274
+ {"role": "system", "content": "Vous êtes un assistant IA expert en analyse de compétences. Votre tâche est de générer une question de suivi pertinente basée sur la question originale, la réponse actuelle de l'utilisateur, sa réponse précédente et les suggestions d'amélioration fournies."},
275
+ {"role": "user", "content": f"Question originale : {original_question}\nRéponse actuelle : {current_response}\nSuggestions d'amélioration : {suggestions}\n\nVeuillez générer une question de suivi pertinente pour obtenir plus de détails ou de pertinence en fonction de ce qui à été dit, reprend les éléments de reponse de l'utilisateur pour lui poser une nouvelle question."}
276
+ ]
277
+
278
+ try:
279
+ api_response = requests.post(
280
+ url="https://openrouter.ai/api/v1/chat/completions",
281
+ headers={
282
+ "Authorization": f"Bearer {OPENROUTER_API_KEY}",
283
+ "HTTP-Referer": f"{YOUR_SITE_URL}",
284
+ "X-Title": f"{YOUR_APP_NAME}",
285
+ "Content-Type": "application/json"
286
+ },
287
+ data=json.dumps({
288
+ "model": "mistralai/pixtral-12b:free",
289
+ "messages": messages
290
+ })
291
+ )
292
+
293
+ if api_response.status_code == 200:
294
+ data = api_response.json()
295
+ follow_up_question = data['choices'][0]['message']['content']
296
+ return follow_up_question
297
+ else:
298
+ return f"Pouvez-vous développer davantage votre réponse ? {suggestions}"
299
+ except Exception as e:
300
+ logger.error(f"Erreur lors de la génération de la question de suivi: {str(e)}")
301
+ return f"Pouvez-vous nous en dire plus sur {original_question.lower()} ?"
302
+
303
+ def manage_conversation_flow(question, response, history):
304
+ analysis = call_api_for_response_analysis(question, response)
305
+ current_question_index = 0
306
 
307
+ if isinstance(analysis, dict) and "error" not in analysis:
308
+ current_question_index = len(history) // 2
309
+
310
+ if analysis["pertinence"] >= 70 or analysis["detail"] >= 70:
311
+ if current_question_index < len(competence_questions) - 1:
312
+ return competence_questions[current_question_index + 1], None
313
+ else:
314
+ all_responses = [item[0] for item in history[1::2]]
315
+ skill_assessment = call_api_for_skill_assessment(all_responses)
316
+ return f"Merci pour vos réponses ! Voici votre bilan de compétences :\n\n{skill_assessment}", skill_assessment
317
+ else:
318
+ follow_up_question = generate_follow_up_question(question, response, history[-3][0] if len(history) > 2 else "", analysis['suggestions'])
319
+ return follow_up_question, None
320
  else:
321
+ if current_question_index < len(competence_questions) - 1:
322
+ return competence_questions[current_question_index + 1], None
323
+ else:
324
+ all_responses = [item[0] for item in history[1::2]]
325
+ skill_assessment = call_api_for_skill_assessment(all_responses)
326
+ return f"Désolé, nous avons rencontré un problème. Voici votre bilan basé sur les informations fournies :\n\n{skill_assessment}", skill_assessment
327
 
328
+ def submit_and_compare(skill_assessment_output):
329
+ airtable_response = upload_to_airtable(skill_assessment_output)
330
+
331
+ enterprise_descriptions = get_enterprise_descriptions()
332
+ student_id = get_last_user_id()
333
+ results = []
334
+
335
+ for enterprise_name, enterprise_desc, offer_id in enterprise_descriptions:
336
+ analysis = compare_skills_ai(skill_assessment_output, enterprise_desc)
337
+
338
+ add_response = add_to_compatibility_table(student_id, skill_assessment_output, enterprise_desc, offer_id, analysis)
339
+
340
+ results.append(f"Entreprise : {enterprise_name}\n{add_response}")
341
+
342
+ output = "\n".join(results)
343
+ return f"Résultat de l'enregistrement : {airtable_response}\n\n{output}"
344
 
345
  def user(user_message, history):
346
  return "", history + [[user_message, None]]
347
 
348
+ def chatbot_response(message, history):
349
+ if not history:
350
+ # Première question
351
+ return competence_questions[0], None
352
+ elif len(history) == 1:
353
+ # Première réponse de l'utilisateur
354
+ return manage_conversation_flow(competence_questions[0], message, history)
355
+ else:
356
+ last_question = history[-2][1] # La dernière question posée par le chatbot
357
+ return manage_conversation_flow(last_question, message, history)
358
  def bot(history):
359
  if history:
360
  bot_message, skill_assessment = chatbot_response(history[-1][0], history[:-1])
 
363
  return [], None
364
 
365
  def clear_chat():
 
 
 
366
  return [], None, None
367
 
368
+ def start_conversation():
369
+ return [[None, competence_questions[0]]], None
370
+
371
+ def afficher_aide():
372
+ return ("Pour construire votre bilan de compétences, veuillez répondre aux questions qui vous seront posées. "
373
+ "N'hésitez pas à prendre votre temps et à relire chaque question si nécessaire. "
374
+ "Si vous souhaitez refaire votre bilan, vous pouvez facilement effacer la conversation et recommencer.")
375
+
376
+ # Création du thème personnalisé
377
+ custom_theme = gr.themes.Base(
378
+ primary_hue="blue",
379
+ secondary_hue="purple",
380
+ neutral_hue="gray",
381
+ font=("Helvetica", "sans-serif"),
382
+ font_mono=("Courier", "monospace"),
383
+ )
384
+
385
+ with gr.Blocks(theme=custom_theme) as demo:
386
+ gr.Markdown("# Assistant d'évaluation des compétences")
387
+
388
+ with gr.Accordion("Besoin d'aide ?", open=False):
389
+ gr.Markdown(afficher_aide())
390
 
391
+ with gr.Row():
392
+ with gr.Column(scale=2):
393
+ chatbot = gr.Chatbot(label="Conversation", height=400)
394
+ msg = gr.Textbox(
395
+ label="Votre message",
396
+ placeholder="Tapez votre message ici...",
397
+ info="Décrivez vos compétences en détail"
398
+ )
399
+ clear = gr.Button("🚮 Effacer la conversation 🚮", variant="secondary")
400
 
401
+ with gr.Column(scale=1):
402
+ skill_assessment_output = gr.Textbox(
403
+ label="Bilan des compétences",
404
+ interactive=False,
405
+ lines=10
406
+ )
407
+ submit_button = gr.Button("📤 Soumettre et comparer 📤", variant="primary")
408
+ comparison_output = gr.Textbox(
409
+ label="Résultat de la comparaison",
410
+ interactive=False,
411
+ lines=5
412
+ )
413
+ gr.Markdown(
414
+ """<a href="https://votre-url-externe.com" target="_blank">
415
+ <button style="width: 100%; padding: 10px; background-color: #C4DAFB; color: #3662E3; border: none; border-radius: 5px; font-family: 'Helvetica', sans-serif; font-weight: bold;">
416
+ 🔮 Voir offres 🔮
417
+ </button>
418
+ </a>""",
419
+ elem_id="voir-offre-button"
420
+ )
421
 
422
+ gr.Markdown("© 2024 🪽 Albatross 🪽.")
 
 
 
 
 
 
 
423
 
 
 
 
 
 
 
 
424
 
425
  demo.load(start_conversation, inputs=None, outputs=[chatbot, skill_assessment_output])
426
  msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(
 
429
  clear.click(clear_chat, None, [chatbot, skill_assessment_output, comparison_output], queue=False)
430
  submit_button.click(submit_and_compare, skill_assessment_output, comparison_output)
431
 
432
+ if __name__ == "__main__":
433
+ demo.launch()