Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import openai | |
| import os | |
| # Set OpenAI API Key | |
| openai.api_key = os.getenv("GROQ_API_KEY") | |
| openai.api_base = "https://api.groq.com/openai/v1" | |
| # Dictionary to store categorized chats | |
| saved_chats = { | |
| "Stress Management": [], | |
| "Career Advice": [], | |
| "General": [], | |
| "Suggestions": [] | |
| } | |
| # Function to get response from GROQ API | |
| def get_groq_response(message): | |
| try: | |
| response = openai.ChatCompletion.create( | |
| model="llama-3.1-70b-versatile", | |
| messages=[ | |
| {"role": "user", "content": message}, | |
| {"role": "system", "content": "You will talk like a Motivational Speaker to help people come out of stress."} | |
| ] | |
| ) | |
| return response.choices[0].message["content"] | |
| except Exception as e: | |
| return f"Error: {str(e)}" | |
| # Function to classify messages based on the topic | |
| def classify_message(user_message, bot_response): | |
| if "stress" in user_message.lower(): | |
| saved_chats["Stress Management"].append((user_message, bot_response)) | |
| return "Stress Management" | |
| elif "career" in user_message.lower(): | |
| saved_chats["Career Advice"].append((user_message, bot_response)) | |
| return "Career Advice" | |
| elif "suggestions" in user_message.lower(): | |
| saved_chats["Suggestions"].append((user_message, bot_response)) | |
| return "Suggestions" | |
| else: | |
| saved_chats["General"].append((user_message, bot_response)) | |
| return "General" | |
| # Chatbot function | |
| def chatbot(user_input, history=[]): | |
| bot_response = get_groq_response(user_input) | |
| topic = classify_message(user_input, bot_response) | |
| history.append((f"({topic}) You: {user_input}", f"Motivator Bot: {bot_response}")) | |
| return history, saved_chats | |
| # Custom HTML, CSS, and JavaScript | |
| custom_html = """ | |
| <!DOCTYPE html> | |
| <html lang="en"> | |
| <head> | |
| <meta charset="UTF-8"> | |
| <meta name="viewport" content="width=device-width, initial-scale=1.0"> | |
| <title>Motivational Chatbot</title> | |
| <style> | |
| body { | |
| font-family: 'Poppins', sans-serif; | |
| background: #121212; | |
| color: #f3f3f3; | |
| margin: 0; | |
| padding: 0; | |
| display: flex; | |
| justify-content: center; | |
| align-items: center; | |
| height: 100vh; | |
| } | |
| .container { | |
| width: 90%; | |
| max-width: 800px; | |
| background: #1e1e1e; | |
| border-radius: 15px; | |
| box-shadow: 0px 10px 30px rgba(0, 0, 0, 0.5); | |
| overflow: hidden; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| header { | |
| background: #282828; | |
| padding: 20px; | |
| text-align: center; | |
| color: #ffffff; | |
| border-bottom: 2px solid #ff6a95; | |
| } | |
| header h1 { | |
| margin: 0; | |
| font-size: 1.8rem; | |
| } | |
| header p { | |
| margin: 5px 0 0; | |
| font-size: 1rem; | |
| color: #cccccc; | |
| } | |
| main { | |
| flex: 1; | |
| padding: 20px; | |
| display: flex; | |
| flex-direction: column; | |
| } | |
| .chat-container { | |
| display: flex; | |
| flex-direction: column; | |
| height: 100%; | |
| } | |
| #chat-output { | |
| flex: 1; | |
| overflow-y: auto; | |
| background: #212121; | |
| border-radius: 10px; | |
| padding: 10px; | |
| margin-bottom: 10px; | |
| box-shadow: inset 0 0 10px rgba(0, 0, 0, 0.5); | |
| } | |
| .chat-input { | |
| display: flex; | |
| gap: 10px; | |
| } | |
| textarea { | |
| flex: 1; | |
| padding: 10px; | |
| border-radius: 5px; | |
| border: none; | |
| background: #333; | |
| color: #fff; | |
| resize: none; | |
| font-size: 1rem; | |
| } | |
| textarea:focus { | |
| outline: none; | |
| box -shadow: 0 0 5px #ff6a95; | |
| } | |
| button { | |
| padding: 10px 20px; | |
| background: linear-gradient(45deg, #ff6a95, #ff4b81); | |
| border: none; | |
| border-radius: 5px; | |
| color: #fff; | |
| font-weight: bold; | |
| cursor: pointer; | |
| transition: background 0.3s, transform 0.3s; | |
| } | |
| button:hover { | |
| background: linear-gradient(45deg, #ff4b81, #ff6a95); | |
| transform: scale(1.05); | |
| } | |
| footer { | |
| background: #282828; | |
| text-align: center; | |
| padding: 10px; | |
| color: #999; | |
| font-size: 0.9rem; | |
| border-top: 2px solid #ff6a95; | |
| } | |
| </style> | |
| </head> | |
| <body> | |
| <div class="container"> | |
| <header> | |
| <h1>✨ Motivational Chatbot ✨</h1> | |
| <p>Your personal motivational speaker!</p> | |
| </header> | |
| <main> | |
| <div class="chat-container"> | |
| <div id="chat-output"></div> | |
| <div class="chat-input"> | |
| <textarea id="user-input" placeholder="Type your message here..."></textarea> | |
| <button id="send-btn">Send</button> | |
| </div> | |
| </div> | |
| </main> | |
| <footer> | |
| <p>Developed with ❤️ using OpenAI APIs</p> | |
| </footer> | |
| </div> | |
| <script> | |
| document.getElementById("send-btn").addEventListener("click", async () => { | |
| const userInput = document.getElementById("user-input").value.trim(); | |
| if (!userInput) return; | |
| // Display user input | |
| const chatOutput = document.getElementById("chat-output"); | |
| const userMessage = `<div class="user-message"><strong>You:</strong> ${userInput}</div>`; | |
| chatOutput.innerHTML += userMessage; | |
| // Call backend | |
| const response = await fetch("/chat", { | |
| method: "POST", | |
| headers: { "Content-Type": "application/json" }, | |
| body: JSON.stringify({ user_input: userInput }) | |
| }); | |
| const botResponse = await response.json(); | |
| // Display bot response | |
| const botMessage = `<div class="bot-message"><strong>Bot:</strong> ${botResponse}</div>`; | |
| chatOutput.innerHTML += botMessage; | |
| // Clear input | |
| document.getElementById("user-input").value = ""; | |
| chatOutput.scrollTop = chatOutput.scrollHeight; | |
| }); | |
| </script> | |
| </body> | |
| </html> | |
| """ | |
| # Launch Gradio interface with custom frontend | |
| interface = gr.Interface( | |
| fn=chatbot, | |
| inputs=[gr.Textbox(lines=2, label="Your Message"), gr.State()], | |
| outputs=[gr.JSON(), gr.State()], | |
| live=True | |
| ) | |
| app = gr.HTML(custom_html) | |
| interface.launch(share=True) |