import os import gradio as gr from huggingface_hub import InferenceClient # Récupérer le token depuis les variables d'environnement (Secrets) HF_TOKEN = os.environ.get("HF_TOKEN") # Définir un message système plus léger SYSTEM_MESSAGE = """ Tu es TeachEase, un enseignant virtuel conçu pour aider les élèves à comprendre leurs cours, faire leurs exercices et devoirs. Ton rôle est d'expliquer les concepts de manière claire et pédagogique, de fournir des exemples concrets et de poser des questions pour vérifier la compréhension. **Instructions spéciales :** 1. **Salutations :** Réponds de manière courte et amicale. 2. **Expressions mathématiques et scientifiques :** Utilise le format LaTeX. 3. **Traduction et réponses multilingues :** Adapte ta réponse en fonction de la langue demandée. """ def detect_language_request(message: str) -> str: """ Détecte si l'utilisateur demande une réponse dans une langue spécifique. Retourne la langue demandée ou None si aucune demande n'est détectée. """ language_requests = { "anglais": "en", "english": "en", "espagnol": "es", "spanish": "es", "allemand": "de", "german": "de", "portugais": "pt", "portuguese": "pt", "français": "fr", "french": "fr", "italien": "it", "italian": "it", "chinois": "zh", "chinese": "zh", "japonais": "ja", "japanese": "ja", "russe": "ru", } for keyword, lang_code in language_requests.items(): if keyword in message.lower(): return lang_code return None def translate_response(response: str, target_lang: str) -> str: """ Traduit la réponse dans la langue cible (simulation). """ translations = { "en": "Hello! How can I assist you today?", "es": "¡Hola! ¿En qué puedo ayudarte hoy?", "de": "Hallo! Wie kann ich Ihnen heute helfen?", "pt": "Olá! Como posso ajudar você hoje?", "fr": "Bonjour ! Comment puis-je vous aider aujourd'hui ?", "it": "Ciao! Come posso aiutarti oggi?", } return translations.get(target_lang, response) # Retourne la réponse originale si la langue n'est pas trouvée def respond( message, history: list[dict[str, str]], system_message=SYSTEM_MESSAGE, max_tokens=256, temperature=0.7, top_p=0.95, ): """ For more information on `huggingface_hub` Inference API support, please check the docs: https://huggingface.co/docs/huggingface_hub/v0.22.2/en/guides/inference """ if not HF_TOKEN: yield "❌ Erreur : HF_TOKEN non configuré. Ajoutez-le dans les Secrets de votre Space." return try: client = InferenceClient(token=HF_TOKEN, model="openai/gpt-oss-20b") # Détecter si l'utilisateur demande une réponse dans une langue spécifique target_lang = detect_language_request(message) messages = [{"role": "system", "content": system_message}] # Limiter l'historique de la conversation aux 3 derniers échanges for val in history[-3:]: if val.get("role") == "user" and val.get("content"): messages.append({"role": "user", "content": val["content"]}) if val.get("role") == "assistant" and val.get("content"): messages.append({"role": "assistant", "content": val["content"]}) messages.append({"role": "user", "content": message}) response = "" for message in client.chat_completion( messages, max_tokens=max_tokens, stream=True, temperature=temperature, top_p=top_p, ): choices = message.choices token = "" if len(choices) and choices[0].delta.content: token = choices[0].delta.content response += token yield response # Traduire la réponse si une langue cible est demandée if target_lang: response = translate_response(response, target_lang) yield response except Exception as e: yield f"❌ Erreur : {str(e)}" """ For information on how to customize the ChatInterface, peruse the gradio docs: https://www.gradio.app/docs/chatinterface """ chatbot = gr.ChatInterface( respond, type="messages", additional_inputs=[ gr.Textbox(value=SYSTEM_MESSAGE, label="System message", interactive=False), gr.Slider(minimum=1, maximum=512, value=256, step=1, label="Max new tokens"), gr.Slider(minimum=0.1, maximum=4.0, value=0.7, step=0.1, label="Temperature"), gr.Slider( minimum=0.1, maximum=1.0, value=0.95, step=0.05, label="Top-p (nucleus sampling)", ), ], title="TeachEase - Enseignant Virtuel", description="Bienvenue sur TeachEase ! Posez vos questions et obtenez des explications claires et pédagogiques avec des expressions mathématiques en LaTeX." ) with gr.Blocks() as demo: # Affichage d'information sur le token (debug) gr.Markdown(f"Token configuré: {'✅ Oui' if HF_TOKEN else '❌ Non'}") # Vous pouvez retirer le LoginButton puisque nous utilisons le token direct # with gr.Sidebar(): # gr.LoginButton() chatbot.render() if __name__ == "__main__": demo.launch()