File size: 6,489 Bytes
a62a9f5
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
import requests
import json
import gradio as gr
import logging

logging.basicConfig(level=logging.ERROR)
logger = logging.getLogger(__name__)

OPENROUTER_API_KEY = "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"
YOUR_SITE_URL = "votre-site.com"
YOUR_APP_NAME = "MonChatbot"

AIRTABLE_API_KEY = "patUUQ6NE9zUOqooM.ec8d096169d754852305c88c7966ad1f8a151f3bf015d39f80bb895bdad0e2f5"
AIRTABLE_BASE_ID = "appht9RdYAQVd32Py"
AIRTABLE_TABLE_NAME = "DescriptionsEtudiants"

competence_questions = [
    "Quelles sont vos compétences techniques ?",
    "Quelles sont vos compétences en communication ?",
    "Pouvez-vous me parler de vos expériences professionnelles ?",
    "Quelles sont vos compétences en gestion de projet ?"
]

competence_responses = []
current_question_index = 0

def call_api_for_summary(responses):
    messages = [{"role": "system", "content": "Vous êtes un assistant IA qui génère un résumé des compétences."}]
    for i, response in enumerate(responses):
        messages.append({"role": "user", "content": f"{competence_questions[i]} : {response}"})
    
    try:
        response = requests.post(
            url="https://openrouter.ai/api/v1/chat/completions",
            headers={
                "Authorization": f"Bearer {OPENROUTER_API_KEY}",
                "HTTP-Referer": f"{YOUR_SITE_URL}",
                "X-Title": f"{YOUR_APP_NAME}",
                "Content-Type": "application/json"
            },
            data=json.dumps({
                "model": "mistralai/pixtral-12b:free",
                "messages": messages
            })
        )
        
        if response.status_code == 200:
            data = response.json()
            return data['choices'][0]['message']['content']
        else:
            return f"Erreur lors de l'appel à l'API : {response.status_code} - {response.text}"
    except Exception as e:
        logger.error(f"Erreur lors de l'appel API: {str(e)}")
        return f"Erreur: {str(e)}"

def call_api_for_skill_assessment(responses):
    messages = [{"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 ceci en fonction de l'expérience de l'utilisateur, sans aucun autre commentaire, ni style sur le texte (pas de gras, pas de souligné, pas d'italique), fait une liste sans titre ni style de texte."}]
    
    for i, response in enumerate(responses):
        messages.append({"role": "user", "content": f"{competence_questions[i]} : {response}"})
    
    try:
        response = requests.post(
            url="https://openrouter.ai/api/v1/chat/completions",
            headers={
                "Authorization": f"Bearer {OPENROUTER_API_KEY}",
                "HTTP-Referer": f"{YOUR_SITE_URL}",
                "X-Title": f"{YOUR_APP_NAME}",
                "Content-Type": "application/json"
            },
            data=json.dumps({
                "model": "mistralai/pixtral-12b:free",
                "messages": messages
            })
        )
        
        if response.status_code == 200:
            data = response.json()
            return data['choices'][0]['message']['content']
        else:
            return f"Erreur lors de l'appel à l'API : {response.status_code} - {response.text}"
    except Exception as e:
        logger.error(f"Erreur lors de l'appel API: {str(e)}")
        return f"Erreur: {str(e)}"

def upload_to_airtable(skill_assessment):
    url = f"https://api.airtable.com/v0/{AIRTABLE_BASE_ID}/{AIRTABLE_TABLE_NAME}"
    headers = {
        "Authorization": f"Bearer {AIRTABLE_API_KEY}",
        "Content-Type": "application/json"
    }
    data = {
        "fields": {
            "Description Compétences Etudiants": skill_assessment  
        }
    }
    
    response = requests.post(url, headers=headers, json=data)
    
    if response.status_code == 200:
        return "Résumé ajouté à Airtable avec succès."
    else:
        return f"Erreur lors de l'ajout à Airtable : {response.status_code} - {response.text}"

def chatbot_response(message, history):
    global competence_responses, current_question_index
    
    competence_responses.append(message)
    current_question_index += 1
    
    if current_question_index < len(competence_questions):
        return competence_questions[current_question_index], None
    else:
        summary = call_api_for_summary(competence_responses)
        skill_assessment = call_api_for_skill_assessment(competence_responses)
        return f"Merci pour vos réponses ! Voici votre bilan de compétences :\n\n{summary}", skill_assessment

def start_conversation():
    global current_question_index, competence_responses
    current_question_index = 0
    competence_responses = []
    return [[None, competence_questions[0]]], None

def user(user_message, history):
    return "", history + [[user_message, None]]

def bot(history):
    if history:
        bot_message, skill_assessment = chatbot_response(history[-1][0], history[:-1])
        history[-1][1] = bot_message
        return history, skill_assessment
    return [], None

def clear_chat():
    global competence_responses, current_question_index
    competence_responses = []
    current_question_index = 0
    return [], None, None

with gr.Blocks(theme=gr.themes.Soft()) as demo:
    chatbot = gr.Chatbot(label="Historique de la conversation")
    msg = gr.Textbox(label="Votre message", placeholder="Tapez votre message ici...")
    clear = gr.Button("Effacer la conversation")
    summary_output = gr.Textbox(label="Résumé des compétences", interactive=False)
    skill_assessment_output = gr.Textbox(label="Bilan des compétences", interactive=False)
    submit_button = gr.Button("Soumettre")

    demo.load(start_conversation, inputs=None, outputs=[chatbot, skill_assessment_output])
    msg.submit(user, [msg, chatbot], [msg, chatbot], queue=False).then(
        bot, [chatbot], [chatbot, skill_assessment_output]
    )
    clear.click(clear_chat, None, [chatbot, skill_assessment_output, summary_output], queue=False)

    def submit_summary(skill_assessment_output):
        airtable_response = upload_to_airtable(skill_assessment_output)
        return f"Résumé soumis : {skill_assessment_output}\n{airtable_response}"

    submit_button.click(submit_summary, skill_assessment_output, summary_output)

demo.launch(share=True)