Download app.py from Blazingg/Multi-Language_Learning_Buddy: direct link, hf CLI and curl.
- Browser
- Download file 5.12 kB
-
https://huggingface.co/spaces/Blazingg/Multi-Language_Learning_Buddy/resolve/main/app.py
- Command line
-
hf download hf://spaces/Blazingg/Multi-Language_Learning_Buddy/app.py
-
curl -L -o app.py https://huggingface.co/spaces/Blazingg/Multi-Language_Learning_Buddy/resolve/main/app.py
5.12 kB
| import os | |
| from dotenv import load_dotenv | |
| import gradio as gr | |
| from groq import Groq | |
| load_dotenv() | |
| GROQ_API_KEY = os.getenv("GROQ_API_KEY") | |
| client = Groq(api_key=GROQ_API_KEY) if GROQ_API_KEY else None | |
| def chatbot_response(user_input, action, language, conversation_history, name, proficiency_level): | |
| if not client: | |
| error_msg = "⚠️ Error: Missing GROQ_API_KEY. Please check your .env file." | |
| conversation_history.append((user_input, error_msg)) | |
| return conversation_history | |
| system_message = f"""You are a {language} tutor for {name or 'a student'} ({proficiency_level} level). | |
| Provide personalized, level-appropriate responses. Use their name occasionally. If the user doesn't enter their name don't use it. | |
| For games, maintain context until completion. Acknowledge different dialects where relevant. | |
| **Important**: The user is communicating via text - focus on written errors. | |
| Only provide pronunciation help if explicitly requested. | |
| When correcting errors: | |
| 1. Clearly indicate the error with 🚨Error Alret🚨 | |
| 2. Explain why it's incorrect | |
| 3. Provide the correct version | |
| 4. Offer a brief practice example""" | |
| if action == "vocabulary": | |
| user_message = f"Provide 5 {language} vocabulary words for {proficiency_level} learners." | |
| elif action == "grammar": | |
| user_message = f"Explain a {language} grammar concept suitable for {proficiency_level} learners." | |
| elif action == "conversation": | |
| user_message = f"Start a {language} conversation practice. First offer 3 topic choices." | |
| elif action == "game": | |
| user_message = f"Create an interactive {language} language game for {proficiency_level} learners. Maintain game context." | |
| else: | |
| user_message = user_input | |
| conversation_history.append((user_message, "")) | |
| try: | |
| messages = [{"role": "system", "content": system_message}] | |
| for msg, response in conversation_history: | |
| messages.append({"role": "user", "content": msg}) | |
| if response: | |
| messages.append({"role": "assistant", "content": response.replace(f"**{language} Tutor:** ", "")}) | |
| completion = client.chat.completions.create( | |
| model="llama-3.3-70b-versatile", | |
| messages=messages, | |
| temperature=0.7, | |
| max_tokens=2000, | |
| stream=True, | |
| ) | |
| chatbot_message = "" | |
| for chunk in completion: | |
| if chunk.choices[0].delta.content: | |
| chatbot_message += chunk.choices[0].delta.content | |
| conversation_history[-1] = (user_message, f"**{language} Tutor:** {chatbot_message}") | |
| yield conversation_history | |
| except Exception as e: | |
| error_msg = f"⚠️ Error: {str(e)}. Please try again or reload." | |
| conversation_history[-1] = (user_message, f"**{language} Tutor:** {error_msg}") | |
| yield conversation_history | |
| def clear_chat(): | |
| return [], [] | |
| with gr.Blocks(theme=gr.themes.Default(primary_hue="green")) as demo: | |
| gr.Markdown("# 🌍 Multi-Language Learning Buddy") | |
| gr.Markdown("Welcome! Practice vocabulary, grammar, conversation, and play language games in multiple languages.") | |
| with gr.Row(): | |
| language = gr.Dropdown(["French", "Spanish", "German", "Italian", "Portuguese"], label="Language", value="French") | |
| proficiency = gr.Dropdown(["Beginner", "Intermediate", "Advanced"], label="Your Level", value="Beginner") | |
| name = gr.Textbox(label="Your Name", placeholder="Enter your name...") | |
| chatbot = gr.Chatbot(height=500) | |
| conversation_history = gr.State([]) | |
| with gr.Row(): | |
| user_input = gr.Textbox(placeholder="Type here or choose an activity below...", show_label=False) | |
| send_btn = gr.Button("Send", variant="primary") | |
| with gr.Row(): | |
| vocab_btn = gr.Button("📚 Daily Vocabulary") | |
| grammar_btn = gr.Button("📖 Grammar Lesson") | |
| conv_btn = gr.Button("💬 Practice Conversation") | |
| game_btn = gr.Button("🎮 Language Game") | |
| clear_btn = gr.Button("🔄 Clear Chat") | |
| input_components = [user_input, gr.State("chat"), language, conversation_history, name, proficiency] | |
| send_btn.click( | |
| chatbot_response, inputs=input_components, outputs=chatbot | |
| ).then(lambda: "", None, user_input) | |
| user_input.submit( | |
| chatbot_response, inputs=input_components, outputs=chatbot | |
| ).then(lambda: "", None, user_input) | |
| action_btns = [vocab_btn, grammar_btn, conv_btn, game_btn] | |
| for btn, action in zip(action_btns, ["vocabulary", "grammar", "conversation", "game"]): | |
| btn.click( | |
| chatbot_response, | |
| inputs=[gr.State(""), gr.State(action)] + input_components[2:], | |
| outputs=chatbot | |
| ) | |
| clear_btn.click( | |
| clear_chat, | |
| outputs=[chatbot, conversation_history], | |
| ) | |
| if __name__ == "__main__": | |
| if not GROQ_API_KEY: | |
| print("❌ Error: GROQ_API_KEY missing. Create a .env file with your key.") | |
| else: | |
| demo.launch() |