""" ๐Ÿš€ Modern AI Assistant - Gradio 6 Application A clean, professional interface showcasing modern Gradio 6 features. """ import gradio as gr import time import random from datetime import datetime # ============================================================================= # AI Assistant Functions # ============================================================================= def generate_response(prompt: str, temperature: float, max_tokens: int) -> tuple: """Generate AI response with configurable parameters.""" time.sleep(1) # Simulate processing time responses = [ "That's an interesting question! Let me think about it...", "I can help you with that. Based on my analysis...", "Great question! Here's what I found...", "Let me break that down for you...", "That's a complex topic, but I can provide some insights..." ] response = random.choice(responses) # Simulate token generation words = response.split() generated_words = [] for i in range(min(len(words), max_tokens // 4)): generated_words.append(words[i]) time.sleep(0.1) # Simulate streaming effect final_response = " ".join(generated_words) + " " + random.choice([ "How else can I assist you today?", "Is there anything else you'd like to know?", "Feel free to ask more questions!" ]) return [[prompt, final_response]], "" def analyze_sentiment(text: str) -> tuple[str, str]: """Analyze sentiment of the input text.""" if not text.strip(): return "Please enter text to analyze", "" positive_words = ["good", "great", "excellent", "amazing", "wonderful", "fantastic", "love", "like", "happy", "joy", "success"] negative_words = ["bad", "terrible", "awful", "hate", "dislike", "sad", "angry", "fail", "poor", "worst"] text_lower = text.lower() positive_count = sum(1 for word in positive_words if word in text_lower) negative_count = sum(1 for word in negative_words if word in text_lower) score = (positive_count - negative_count) / (len(text.split()) or 1) score = max(-1, min(1, score)) # Clamp between -1 and 1 if score > 0.2: sentiment = "๐Ÿ˜Š Positive" elif score < -0.2: sentiment = "๐Ÿ˜Ÿ Negative" else: sentiment = "๐Ÿ˜ Neutral" result = f"{sentiment}\nScore: {round(score, 2)}" status = f"Analysis completed at {datetime.now().strftime('%H:%M:%S')}" return result, status def translate_text(text: str, target_language: str) -> str: """Simulate text translation.""" if not text.strip(): return "Please enter text to translate" translations = { "English": "Hello! How can I help you today?", "Spanish": "ยกHola! ยฟCรณmo puedo ayudarte hoy?", "French": "Bonjour! Comment puis-je vous aider aujourd'hui?", "German": "Hallo! Wie kann ich Ihnen heute helfen?", "Japanese": "ใ“ใ‚“ใซใกใฏ๏ผๆœฌๆ—ฅใฉใฎใ‚ˆใ†ใซใŠๆ‰‹ไผใ„ใงใใพใ™ใ‹๏ผŸ", "Chinese": "ไฝ ๅฅฝ๏ผไปŠๅคฉๆˆ‘่ƒฝๅฆ‚ไฝ•ๅธฎๅŠฉไฝ ๏ผŸ" } base_translation = translations.get(target_language, f"Translation to {target_language}") return f"๐ŸŒ Translated to {target_language}:\n\n{base_translation}\n\n(Simulated translation of: '{text[:50]}...')" def analyze_documents(files) -> tuple[str, str]: """Analyze uploaded documents.""" if not files: return "No files uploaded", "" file_count = len(files) if isinstance(files, list) else 1 result = f"๐Ÿ“Š Analyzed {file_count} document{'s' if file_count > 1 else ''}.\n\n" result += "โœ… Processing complete!\n" result += "โ€ข Extracted text content\n" result += "โ€ข Analyzed document structure\n" result += "โ€ข Generated metadata\n" status = f"๐Ÿ“… Analysis completed at {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}" return result, status def clear_all(): """Clear all fields.""" return None, "", "", "", "", "" # ============================================================================= # Gradio 6 Interface # ============================================================================= def create_modern_interface() -> gr.Blocks: """Create a modern, professional Gradio 6 interface.""" # Define custom theme theme = gr.themes.Soft( primary_hue="blue", secondary_hue="indigo", neutral_hue="slate", font=gr.themes.GoogleFont("Inter"), text_size="lg", spacing_size="lg", radius_size="md" ).set( button_primary_background_fill="*primary_600", button_primary_background_fill_hover="*primary_700", button_primary_text_color="white", block_title_text_weight="600", block_label_text_weight="500", input_border_color="*neutral_300", input_focus_border_color="*primary_500", slider_active_color="*primary_500", slider_color="*neutral_300" ) # Custom CSS custom_css = """ /* Modern Design System */ .gradio-container { max-width: 1200px !important; margin: 0 auto !important; padding: 2rem !important; font-family: 'Inter', sans-serif !important; } /* Header Styling */ .header-text h1 { font-size: 2.5rem !important; font-weight: 700 !important; margin-bottom: 1rem !important; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); -webkit-background-clip: text; -webkit-text-fill-color: transparent; background-clip: text; } .header-text p { font-size: 1.2rem !important; color: #64748b !important; line-height: 1.6 !important; } /* Chat Container */ .chat-container { border: 1px solid #e2e8f0 !important; border-radius: 12px !important; background: #ffffff !important; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1) !important; } /* Message Input */ .message-input textarea { border-radius: 8px !important; border: 2px solid #e2e8f0 !important; font-size: 1rem !important; padding: 0.75rem 1rem !important; transition: all 0.3s ease !important; } .message-input textarea:focus { border-color: #667eea !important; box-shadow: 0 0 0 3px rgba(102, 126, 234, 0.1) !important; } /* Buttons */ .send-button { font-size: 1.1rem !important; padding: 0.75rem 2rem !important; border-radius: 8px !important; font-weight: 600 !important; box-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1) !important; transition: all 0.3s ease !important; } .send-button:hover { transform: translateY(-2px) !important; box-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.2) !important; } /* File Upload Area */ .file-upload-area { border: 2px dashed #cbd5e1 !important; border-radius: 12px !important; transition: all 0.3s ease !important; padding: 1rem !important; } .file-upload-area:hover { border-color: #667eea !important; background: #f8fafc !important; } /* Mobile Responsiveness */ @media (max-width: 768px) { .gradio-container { padding: 1rem !important; } .header-text h1 { font-size: 2rem !important; } } """ with gr.Blocks(theme=theme, css=custom_css) as demo: # Header with branding with gr.Row(): with gr.Column(scale=1): gr.Markdown( """ # ๐Ÿค– Modern AI Assistant Experience the power of AI with our advanced language models. Built with cutting-edge technology for seamless interactions. """, elem_classes=["header-text"] ) gr.Markdown("---") # Main Content Area with gr.Row(): with gr.Column(scale=1): # Chat Interface chatbot = gr.Chatbot( height=400, label="๐Ÿ—จ๏ธ AI Conversation", elem_classes=["chat-container"] ) # Input Section with gr.Row(): user_input = gr.Textbox( placeholder="Type your message here...", label="Your Message", elem_classes=["message-input"], lines=2 ) send_btn = gr.Button( "โžค Send", variant="primary", elem_classes=["send-button"] ) # Generation Controls with gr.Row(): with gr.Column(scale=2): temperature = gr.Slider( minimum=0.1, maximum=1.0, value=0.7, step=0.1, label="๐Ÿ”ฅ Temperature", info="Controls randomness (0.1=precise, 1.0=creative)" ) with gr.Column(scale=2): max_tokens = gr.Slider( minimum=10, maximum=200, value=50, step=10, label="๐Ÿ“ Max Tokens", info="Maximum response length" ) # Additional Features with gr.Accordion("๐Ÿ”ง Advanced Features", open=False): with gr.Row(): with gr.Column(scale=1): sentiment_btn = gr.Button("๐Ÿ“Š Analyze Sentiment") sentiment_output = gr.Textbox( label="Sentiment Analysis", interactive=False, lines=3 ) with gr.Column(scale=1): translate_btn = gr.Button("๐ŸŒ Translate") language_dropdown = gr.Dropdown( choices=["English", "Spanish", "French", "German", "Japanese", "Chinese"], value="Spanish", label="Target Language" ) translation_output = gr.Textbox( label="Translation", interactive=False, lines=3 ) # File Upload for Document Analysis with gr.Row(): file_upload = gr.File( file_count="multiple", file_types=[".pdf", ".txt", ".docx"], label="๐Ÿ“„ Upload Documents", elem_classes=["file-upload-area"] ) with gr.Row(): analyze_btn = gr.Button( "๐Ÿ” Analyze Documents", variant="secondary" ) clear_btn = gr.Button( "๐Ÿ—‘๏ธ Clear All", variant="stop" ) analysis_output = gr.Textbox( label="Document Analysis", interactive=False, lines=6 ) # Status Section gr.Markdown("---") with gr.Row(): status_output = gr.Textbox( label="๐Ÿ“Š Status", interactive=False, lines=2 ) # Event Handlers - CORRIGIDO: Removido api_visibility send_btn.click( fn=generate_response, inputs=[user_input, temperature, max_tokens], outputs=[chatbot, user_input], api_name="generate" ) user_input.submit( fn=generate_response, inputs=[user_input, temperature, max_tokens], outputs=[chatbot, user_input], api_name="generate_submit" ) sentiment_btn.click( fn=analyze_sentiment, inputs=[user_input], outputs=[sentiment_output, status_output], api_name="sentiment" ) translate_btn.click( fn=translate_text, inputs=[user_input, language_dropdown], outputs=[translation_output], api_name="translate" ) analyze_btn.click( fn=analyze_documents, inputs=[file_upload], outputs=[analysis_output, status_output], api_name="analyze_docs" ) clear_btn.click( fn=clear_all, inputs=[], outputs=[chatbot, user_input, sentiment_output, translation_output, analysis_output, status_output], api_name=False ) return demo # ============================================================================= # MAIN EXECUTION # ============================================================================= if __name__ == "__main__": # Create the interface demo = create_modern_interface() # Launch with modern Gradio 6 configuration demo.launch( server_name="0.0.0.0", server_port=7860, share=False, max_file_size="100mb", show_error=True )