Spaces:
Runtime error
Runtime error
Download app.py from StudyOcean/Study-Ocean-AI_Mentor: direct link, hf CLI and curl.
- Browser
- Download file 5.91 kB
-
https://huggingface.co/spaces/StudyOcean/Study-Ocean-AI_Mentor/resolve/main/app.py
- Command line
-
hf download hf://spaces/StudyOcean/Study-Ocean-AI_Mentor/app.py
-
curl -L -o app.py https://huggingface.co/spaces/StudyOcean/Study-Ocean-AI_Mentor/resolve/main/app.py
5.91 kB
| """ | |
| Study Ocean AI Mentor β Gradio Web Interface | |
| A beautiful, student-friendly chat interface for the RAG-based | |
| doubt-solving mentor. Built with Gradio for easy deployment. | |
| """ | |
| import gradio as gr | |
| from rag_chain import get_chain, ask_question | |
| # βββ Custom CSS for Premium Look ββββββββββββββββββββββββββββ | |
| CUSTOM_CSS = """ | |
| /* Global */ | |
| .gradio-container { | |
| max-width: 900px !important; | |
| margin: auto !important; | |
| font-family: 'Inter', 'Segoe UI', sans-serif !important; | |
| } | |
| /* Header */ | |
| .header-section { | |
| text-align: center; | |
| padding: 20px 0 10px; | |
| background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); | |
| border-radius: 16px; | |
| margin-bottom: 20px; | |
| color: white; | |
| } | |
| .header-section h1 { | |
| font-size: 2em; | |
| margin: 0; | |
| color: white !important; | |
| } | |
| .header-section p { | |
| opacity: 0.9; | |
| margin: 5px 0 0; | |
| font-size: 1.05em; | |
| color: #e8e8ff !important; | |
| } | |
| /* Chat area */ | |
| .chatbot { | |
| border-radius: 12px !important; | |
| border: 1px solid #e2e8f0 !important; | |
| min-height: 450px !important; | |
| } | |
| /* Source cards */ | |
| .source-card { | |
| background: #f8fafc; | |
| border: 1px solid #e2e8f0; | |
| border-radius: 8px; | |
| padding: 10px 14px; | |
| margin: 4px 0; | |
| font-size: 0.9em; | |
| } | |
| .source-card strong { | |
| color: #6366f1; | |
| } | |
| /* Override dark mode */ | |
| .dark .source-card { | |
| background: #1e293b; | |
| border-color: #334155; | |
| } | |
| /* Buttons */ | |
| .primary-btn { | |
| background: linear-gradient(135deg, #667eea, #764ba2) !important; | |
| border: none !important; | |
| color: white !important; | |
| border-radius: 10px !important; | |
| font-weight: 600 !important; | |
| padding: 10px 24px !important; | |
| } | |
| .primary-btn:hover { | |
| opacity: 0.9 !important; | |
| transform: translateY(-1px); | |
| box-shadow: 0 4px 12px rgba(102, 126, 234, 0.4) !important; | |
| } | |
| """ | |
| # βββ Initialize chain on startup ββββββββββββββββββββββββββββ | |
| print("π Initializing Study Ocean AI Mentor...") | |
| chain = get_chain() | |
| print("β Ready to answer student doubts!\n") | |
| def format_sources(sources: list) -> str: | |
| """Format source documents into a readable string.""" | |
| if not sources: | |
| return "" | |
| lines = ["\n\n---\nπ **Sources Referenced:**\n"] | |
| for i, src in enumerate(sources, 1): | |
| lines.append(f"**{i}.** `{src['subject']}` β _{src['file']}_") | |
| return "\n".join(lines) | |
| def respond(message: str, chat_history: list) -> tuple: | |
| """Handle a student's question and return the mentor's response.""" | |
| if not message.strip(): | |
| return "", chat_history | |
| # Get answer from RAG chain | |
| result = ask_question(chain, message) | |
| answer = result["answer"] | |
| sources = result["sources"] | |
| # Append source references to the answer | |
| answer_with_sources = answer + format_sources(sources) | |
| # Update chat history | |
| chat_history.append((message, answer_with_sources)) | |
| return "", chat_history | |
| def clear_chat(): | |
| """Clear the chat history.""" | |
| return [], "" | |
| # βββ Build Gradio Interface βββββββββββββββββββββββββββββββββ | |
| with gr.Blocks(title="Study Ocean AI Mentor") as app: | |
| # Header | |
| gr.HTML(""" | |
| <div class="header-section"> | |
| <h1>π Study Ocean AI Mentor</h1> | |
| <p>Ask any doubt from your study material β I'll explain it step by step!</p> | |
| </div> | |
| """) | |
| # Chatbot | |
| chatbot = gr.Chatbot( | |
| label="π¬ Chat with Your Mentor", | |
| elem_classes=["chatbot"], | |
| height=480, | |
| avatar_images=(None, "https://api.dicebear.com/7.x/bottts/svg?seed=mentor&backgroundColor=6366f1"), | |
| ) | |
| # Input area | |
| with gr.Row(): | |
| msg = gr.Textbox( | |
| placeholder="Type your doubt here... e.g., 'Explain Newton's third law with examples'", | |
| label="Your Question", | |
| scale=5, | |
| lines=1, | |
| max_lines=3, | |
| show_label=False, | |
| container=False, | |
| ) | |
| submit_btn = gr.Button("Ask π", elem_classes=["primary-btn"], scale=1) | |
| # Action buttons | |
| with gr.Row(): | |
| clear_btn = gr.Button("ποΈ Clear Chat", size="sm") | |
| # Example questions | |
| gr.Examples( | |
| examples=[ | |
| "What are Newton's laws of motion? Explain with examples.", | |
| "Explain the difference between mitosis and meiosis.", | |
| "What is the Pythagorean theorem and how do I use it?", | |
| "Explain the concept of supply and demand in economics.", | |
| "What are the key features of the Indian Constitution?", | |
| "Solve: Find the derivative of f(x) = 3xΒ² + 2x - 5", | |
| ], | |
| inputs=msg, | |
| label="π‘ Try these example questions:", | |
| ) | |
| # Tips section | |
| with gr.Accordion("π Tips for Better Answers", open=False): | |
| gr.Markdown(""" | |
| - **Be specific**: Instead of "explain physics", ask "explain projectile motion with examples" | |
| - **Mention the topic**: "In organic chemistry, what is an SN2 reaction?" | |
| - **Ask for steps**: "Solve step by step: integrate sin(x)cos(x) dx" | |
| - **Request comparisons**: "Compare TCP and UDP protocols" | |
| - **Ask for formulas**: "List all the trigonometric identities" | |
| """) | |
| # Event handlers | |
| msg.submit(respond, [msg, chatbot], [msg, chatbot]) | |
| submit_btn.click(respond, [msg, chatbot], [msg, chatbot]) | |
| clear_btn.click(clear_chat, outputs=[chatbot, msg]) | |
| # βββ Launch βββββββββββββββββββββββββββββββββββββββββββββββββ | |
| if __name__ == "__main__": | |
| app.launch( | |
| server_name="0.0.0.0", | |
| server_port=7860, | |
| share=False, | |
| show_error=True, | |
| css=CUSTOM_CSS, | |
| theme=gr.themes.Soft(), | |
| ) | |