Spaces:
Paused
Paused
| import gradio as gr | |
| from transformers import pipeline | |
| import numpy as np | |
| from PIL import Image | |
| import io | |
| import base64 | |
| # Initialize sentiment analysis pipeline (lightweight for CPU) | |
| sentiment_analyzer = pipeline("sentiment-analysis", model="distilbert-base-uncased-finetuned-sst-2-english") | |
| # Mock text-to-image function (CPU-friendly) | |
| def generate_mock_image(text_prompt, width=200, height=200): | |
| img_array = np.zeros((height, width, 3), dtype=np.uint8) | |
| for i in range(height): | |
| for j in range(width): | |
| img_array[i, j] = [(i % 255), (j % 255), ((i + j) % 255)] # RGB gradient | |
| img = Image.fromarray(img_array) | |
| buffered = io.BytesIO() | |
| img.save(buffered, format="PNG") | |
| img_str = base64.b64encode(buffered.getvalue()).decode("utf-8") | |
| return f"data:image/png;base64,{img_str}" | |
| # Sentiment analysis function | |
| def analyze_sentiment(text): | |
| if not text.strip(): | |
| return "Please enter some text." | |
| result = sentiment_analyzer(text)[0] | |
| label = result['label'] | |
| score = result['score'] | |
| return f"Sentiment: {label} (Confidence: {score:.2%})" | |
| # Chatbot feedback function | |
| def chatbot_response(user_feedback, chat_history): | |
| if not user_feedback.strip(): | |
| return chat_history, "Please provide feedback." | |
| chat_history.append(( | |
| f"**You**: {user_feedback}", | |
| f"**Bot**: Thanks for your feedback! I understood: '{user_feedback}'." | |
| )) | |
| return chat_history, "" | |
| # Custom CSS for dark grey, minimalist UI | |
| custom_css = """ | |
| body, .gradio-container { | |
| background: #2d2d2d !important; | |
| color: #d4d4d4 !important; | |
| font-family: 'Inter', -apple-system, sans-serif; | |
| margin: 0; | |
| padding: 20px; | |
| } | |
| .tab-nav button { | |
| background: #3a3a3a !important; | |
| color: #a3a3a3 !important; | |
| border: none !important; | |
| padding: 12px 20px !important; | |
| border-radius: 8px 8px 0 0 !important; | |
| transition: background 0.3s, color 0.3s; | |
| } | |
| .tab-nav button:hover, .tab-nav button[aria-selected="true"] { | |
| background: #4a4a4a !important; | |
| color: #e0e0e0 !important; | |
| } | |
| .block, .gr-panel { | |
| background: #353535 !important; | |
| border-radius: 10px !important; | |
| padding: 20px !important; | |
| box-shadow: 0 4px 10px rgba(0, 0, 0, 0.25); | |
| margin-bottom: 20px; | |
| } | |
| input, textarea, .gr-textbox { | |
| background: #2a2a2a !important; | |
| color: #d4d4d4 !important; | |
| border: 1px solid #4a4a4a !important; | |
| border-radius: 8px !important; | |
| padding: 12px !important; | |
| transition: border-color 0.2s; | |
| } | |
| input:focus, textarea:focus { | |
| border-color: #6b6b6b !important; | |
| outline: none; | |
| } | |
| button { | |
| background: #4a4a4a !important; | |
| color: #e0e0e0 !important; | |
| border: none !important; | |
| border-radius: 8px !important; | |
| padding: 12px 24px !important; | |
| font-weight: 600; | |
| transition: background 0.2s, transform 0.2s; | |
| } | |
| button:hover { | |
| background: #5a5a5a !important; | |
| transform: scale(1.03); | |
| } | |
| .gr-image img { | |
| border-radius: 8px !important; | |
| border: 2px solid #4a4a4a !important; | |
| max-width: 100%; | |
| } | |
| .gr-chatbot .message { | |
| border-radius: 8px !important; | |
| padding: 12px !important; | |
| margin: 8px 0 !important; | |
| } | |
| .gr-chatbot .message:nth-child(odd) { | |
| background: #3a3a3a !important; /* User messages */ | |
| } | |
| .gr-chatbot .message:nth-child(even) { | |
| background: #2a2a2a !important; /* Bot messages */ | |
| } | |
| h1, h2, h3 { | |
| color: #b3b3b3 !important; | |
| font-weight: 600; | |
| } | |
| @media (max-width: 768px) { | |
| .gradio-container { | |
| padding: 10px; | |
| } | |
| .block { | |
| padding: 15px !important; | |
| } | |
| button { | |
| padding: 10px 20px !important; | |
| } | |
| .tab-nav button { | |
| padding: 10px 15px !important; | |
| font-size: 14px; | |
| } | |
| } | |
| """ | |
| # Main Gradio app with Tabs | |
| with gr.Blocks(css=custom_css) as demo: | |
| gr.Markdown( | |
| """ | |
| # ๐ ๏ธ Interactive AI Dashboard | |
| Explore **Sentiment Analysis**, **Text-to-Image Generation**, and **Feedback Chatbot** in a sleek grey interface. | |
| Built for Hugging Face Spaces (free tier, CPU-only). | |
| """ | |
| ) | |
| with gr.Tabs(): | |
| # Sentiment Analysis Tab | |
| with gr.Tab("Sentiment Analysis"): | |
| with gr.Row(): | |
| with gr.Column(scale=3): | |
| gr.Markdown("### ๐ Analyze Text Sentiment") | |
| sentiment_input = gr.Textbox( | |
| label="Your Text", | |
| placeholder="Enter text like 'This app is awesome!'", | |
| lines=4, | |
| show_label=False | |
| ) | |
| sentiment_button = gr.Button("Analyze", variant="primary") | |
| sentiment_output = gr.Textbox( | |
| label="Result", | |
| interactive=False, | |
| placeholder="Sentiment result will appear here..." | |
| ) | |
| with gr.Column(scale=2): | |
| gr.Markdown("### Example Prompts") | |
| gr.Examples( | |
| examples=[ | |
| "Iโm thrilled about this project!", | |
| "Today feels a bit gloomy.", | |
| "Programming is tough but rewarding!" | |
| ], | |
| inputs=sentiment_input | |
| ) | |
| sentiment_button.click( | |
| fn=analyze_sentiment, | |
| inputs=sentiment_input, | |
| outputs=sentiment_output, | |
| show_progress=True | |
| ) | |
| # Text-to-Image Tab | |
| with gr.Tab("Text-to-Image"): | |
| with gr.Row(): | |
| with gr.Column(scale=3): | |
| gr.Markdown("### ๐ผ๏ธ Generate Mock Images") | |
| image_prompt = gr.Textbox( | |
| label="Image Prompt", | |
| placeholder="Describe an image, e.g., 'Abstract colorful pattern'", | |
| lines=3, | |
| show_label=False | |
| ) | |
| image_button = gr.Button("Generate", variant="primary") | |
| image_output = gr.Image( | |
| label="Generated Image", | |
| type="pil", | |
| interactive=False | |
| ) | |
| with gr.Column(scale=2): | |
| gr.Markdown("### Info") | |
| gr.Markdown( | |
| "This mock generator creates gradient images to stay lightweight for the free tier." | |
| ) | |
| image_button.click( | |
| fn=generate_mock_image, | |
| inputs=image_prompt, | |
| outputs=image_output, | |
| show_progress=True | |
| ) | |
| # Chatbot Tab | |
| with gr.Tab("Feedback Chatbot"): | |
| with gr.Row(): | |
| with gr.Column(): | |
| gr.Markdown("### ๐ฌ Share Your Thoughts") | |
| chatbot = gr.Chatbot( | |
| label="Conversation", | |
| bubble_full_width=False, | |
| height=400 | |
| ) | |
| feedback_input = gr.Textbox( | |
| label="Your Message", | |
| placeholder="Type your feedback here...", | |
| lines=2, | |
| show_label=False | |
| ) | |
| feedback_button = gr.Button("Send", variant="primary") | |
| feedback_output = gr.Textbox( | |
| label="Status", | |
| interactive=False, | |
| placeholder="Bot response status..." | |
| ) | |
| feedback_button.click( | |
| fn=chatbot_response, | |
| inputs=[feedback_input, chatbot], | |
| outputs=[chatbot, feedback_output], | |
| show_progress=True | |
| ) | |
| # Launch the app | |
| if __name__ == "__main__": | |
| demo.launch() |