import gradio as gr import time import random # --- 1. Configuration du Thème Sombre Pro --- # Nous utilisons gr.themes.Soft avec des teintes sombres (slate/gray) custom_theme = gr.themes.Soft( primary_hue="cyan", # Une touche de cyan pour le côté "Tech/Pro" secondary_hue="blue", neutral_hue="slate", # Fond gris foncé/slate font=gr.themes.GoogleFont("Inter"), # Police moderne et lisible text_size="lg", spacing_size="lg", radius_size="md" ).set( # Palette de couleurs sombres personnalisée body_background_fill="*neutral_950", # Fond presque noir body_background_fill_dark="*neutral_950", block_background_fill="*neutral_900", # Fond des blocs légèrement plus clair block_border_color="*neutral_800", # Bordures subtiles block_border_width="1px", # Textes body_text_color="*neutral_100", # Texte blanc cassé body_text_color_dark="*neutral_100", block_title_text_color="*neutral_50", # Titres blancs block_label_text_color="*neutral_400", # Labels gris clair # Boutons button_primary_background_fill="*primary_600", button_primary_background_fill_hover="*primary_500", button_primary_text_color="white", # Input (Chatbox) input_background_fill="*neutral_950", input_background_fill_dark="*neutral_950", border_color_primary="*primary_500", ) # --- 2. CSS Personnalisé pour les Animations --- # Ajoute des effets de fade-in, de glow et de transitions fluides custom_css = """ /* Animation d'apparition des messages (Slide Up + Fade) */ @keyframes slideUpFade { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } /* Animation de pulsation pour le micro */ @keyframes pulse-glow { 0% { box-shadow: 0 0 0 0 rgba(6, 182, 212, 0.7); } 70% { box-shadow: 0 0 0 10px rgba(6, 182, 212, 0); } 100% { box-shadow: 0 0 0 0 rgba(6, 182, 212, 0); } } /* Appliquer l'animation aux bulles de chat */ .message { animation: slideUpFade 0.4s ease-out forwards; } /* Effet de survol néon sur les boutons */ button.primary-btn:hover { box-shadow: 0 0 15px rgba(6, 182, 212, 0.4); transition: all 0.3s ease; } /* Personnalisation de la barre de défilement */ ::-webkit-scrollbar { width: 8px; } ::-webkit-scrollbar-track { background: #0f172a; } ::-webkit-scrollbar-thumb { background: #334155; border-radius: 4px; } ::-webkit-scrollbar-thumb:hover { background: #475569; } /* Style spécifique pour le bouton micro en enregistrement */ .recording-active { animation: pulse-glow 1.5s infinite; background-color: #ef4444 !important; border-color: #ef4444 !important; color: white !important; } /* Glassmorphism léger pour la sidebar */ .sidebar-glass { background: rgba(15, 23, 42, 0.95); backdrop-filter: blur(10px); } """ # --- 3. Logique de l'Application --- def generate_response(message, history, system_prompt, temperature, max_tokens): """ Simule une réponse IA avec effet de streaming (comme dans votre code HTML original). """ # Simulation d'un délai de réseau time.sleep(0.5) # Génération d'une réponse factice basée sur les paramètres temp_val = float(temperature) if "hello" in message.lower() or "bonjour" in message.lower(): response = f"Bonjour ! Je suis configuré pour être très professionnel. Température actuelle : {temp_val}." elif "code" in message.lower(): response = "Voici un exemple de code Python généré :\n\n```python\ndef pro_function():\n return 'Success'\n```" else: response = f"J'ai reçu votre message : '{message}'.\n\nPrompt système : '{system_prompt}'.\n\nJe simule ici une réponse IA avec un design sombre et des animations fluides." # Simulation de l'effet de streaming (mot par mot ou phrase par phrase) words = response.split(" ") partial_response = "" for word in words: partial_response += word + " " yield partial_response time.sleep(0.05) # Vitesse de l'effet de frappe def transcribe_audio(audio_file): """ Simule la transcription audio (Speech-to-Text). Dans une vraie app, vous utiliseriez `whisper` ou `SpeechRecognition` ici. """ if audio_file is None: return "" # Simulation : on renvoie un texte fictif pour montrer que ça marche return "(Ceci est une transcription simulée de l'audio pour la démo)" # --- 4. Construction de l'Interface Gradio 6 --- with gr.Blocks(theme=custom_theme, css=custom_css, title="Pro AI Chat") as demo: # Sidebar pour les réglages (Gradio 6 Feature) with gr.Sidebar(open=True, elem_classes="sidebar-glass") as sidebar: gr.Markdown("### ⚙️ Configuration") gr.Markdown("Paramètres du modèle et de l'interface.") with gr.Accordion("Paramètres LLM", open=True): system_prompt = gr.Textbox( label="System Prompt", value="You are a helpful, professional AI assistant.", lines=3, placeholder="Définissez le comportement de l'IA..." ) temperature = gr.Slider( minimum=0.1, maximum=2.0, step=0.1, value=0.7, label="Température (Créativité)", info="Plus c'est haut, plus c'est créatif." ) max_tokens = gr.Slider( minimum=100, maximum=4000, step=100, value=1024, label="Max Tokens" ) with gr.Accordion("Info", open=False): gr.Markdown(""" **Instructions:** 1. Tapez votre message ou utilisez le micro. 2. Ajustez les paramètres dans la sidebar. 3. Profitez du mode sombre animé ! """) # Zone principale de Chat with gr.Row(): with gr.Column(scale=1): # Header avec le lien "Built with anycoder" gr.HTML("""