import gradio as gr import requests MODAL_ENDPOINT = "https://kim-ju-won--mistral7b-chat-create-app.modal.run" def create_system_prompt(agent_type, personality, expertise_level, language): base_prompt = f"""You are a {agent_type} movie recommendation agent with the following characteristics: - Personality: {personality} - Expertise Level: {expertise_level} - Language: {language} Your role is to: 1. Understand user preferences and mood 2. Provide personalized movie recommendations 3. Explain why you're recommending specific movies 4. Maintain a {personality} tone throughout the conversation 5. Consider the user's expertise level ({expertise_level}) when explaining Please respond in {language}.""" return base_prompt def respond(message, history, agent_type, personality, expertise_level, language, genre, mood): system_message = create_system_prompt(agent_type, personality, expertise_level, language) messages = [{"role": "system", "content": system_message}] for val in history: if val[0]: messages.append({"role": "user", "content": val[0]}) if val[1]: messages.append({"role": "assistant", "content": val[1]}) genre_str = ", ".join(genre) if genre else "Any" mood_str = ", ".join(mood) if mood else "Any" enhanced_message = f"Genre: {genre_str}\nMood: {mood_str}\nUser request: {message}" messages.append({"role": "user", "content": enhanced_message}) payload = { "messages": messages, "max_tokens": 512, "temperature": 0.7, "top_p": 0.95 } try: response = requests.post( MODAL_ENDPOINT, json=payload, headers={"Content-Type": "application/json"} ) response.raise_for_status() result = response.json() bot_reply = result.get("response", "Sorry, I couldn't process your request.") except Exception as e: bot_reply = f"Error: {str(e)}" history.append((message, bot_reply)) return history def reset_chat(): return None def show_settings_changed_info(agent_type, personality, expertise_level, language): return f""" New Agent Settings: - Type: {agent_type} - Personality: {personality} - Expertise Level: {expertise_level} - Response Language: {language} Chat has been reset. Please start a new conversation with the updated settings. """ custom_css = """ .header-container { text-align: center; margin-bottom: 20px; } .header-container img { width: 80px; margin-bottom: 10px; display: block; margin-left: auto; margin-right: auto; } .header-container h1 { display: inline-block; background: linear-gradient(90deg, #ff8a00, #e52e71, #9b00ff); -webkit-background-clip: text; -webkit-text-fill-color: transparent; font-weight: 900; margin: 0; } .header-container p { margin: 5px auto 0 auto; color: var(--body-text-color, #666); font-size: 1rem; } """ with gr.Blocks(css=custom_css, theme=gr.themes.Soft()) as demo: gr.HTML("""

🎬 Personalized Movie Recommender


Tell us your preferred genres and current mood, and we'll recommend the perfect movies for you.

""") with gr.Row(): with gr.Column(scale=2): chatbot = gr.Chatbot( height=600, show_copy_button=True, avatar_images=( "https://cdn-icons-png.flaticon.com/512/149/149071.png", # User Avatar "https://cdn-icons-png.flaticon.com/512/3135/3135715.png" # Bot Avatar ), bubble_full_width=False ) with gr.Row(equal_height=True): msg = gr.Textbox( placeholder="What kind of movie are you looking for?", show_label=False, container=False, min_width=400 ) submit = gr.Button("Send Chat", variant="primary", min_width=100) clear = gr.Button("Clear Chat", variant="secondary", min_width=100) with gr.Column(scale=1): with gr.Group(): gr.Markdown("### 🎯 Recommendation Settings") genre = gr.Dropdown( choices=[ "🎬 Action", "😂 Comedy", "🎭 Drama", "💕 Romance", "🔪 Thriller", "👽 Sci-Fi", "🧚 Fantasy", "🎨 Animation" ], label="Preferred Genres 🎥", multiselect=True ) mood = gr.Dropdown( choices=[ "⚡ Exciting", "😭 Emotional", "😱 Suspenseful", "😌 Relaxing", "🕵️ Mysterious" ], label="Current Mood 🌈", multiselect=True ) with gr.Group(): gr.Markdown("### 🤖 Agent Settings") agent_type = gr.Dropdown( choices=["🎓 Expert", "👯 Friend", "🎥 Film Critic", "🎨 Curator"], label="Agent Type 🧑‍💼", value="🎓 Expert" ) personality = gr.Dropdown( choices=[ "😊 Friendly", "💼 Professional", "😆 Humorous", "🥺 Emotional", "🔍 Objective" ], label="Personality 💫", value="😊 Friendly" ) expertise_level = gr.Dropdown( choices=["🍼 Beginner", "📚 Intermediate", "🏆 Expert"], label="Explanation Level 📈", value="📚 Intermediate" ) language = gr.Dropdown( choices=["🇬🇧 English", "🇰🇷 Korean", "🇯🇵 Japanese"], label="Response Language 🌐", value="🇬🇧 English" ) for component in [agent_type, personality, expertise_level, language]: component.change( fn=show_settings_changed_info, inputs=[agent_type, personality, expertise_level, language], outputs=gr.Info() ).then( fn=reset_chat, outputs=chatbot ) submit.click( respond, inputs=[ msg, chatbot, agent_type, personality, expertise_level, language, genre, mood, ], outputs=chatbot, ).then( lambda: "", None, msg, queue=False ) clear.click(lambda: None, None, chatbot, queue=False) if __name__ == "__main__": demo.launch()