import gradio as gr import requests MODAL_ENDPOINT = "https://kim-ju-won--gemma2b-chat-chat.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]}) enhanced_message = f"Genre: {genre}\nMood: {mood}\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() return result.get("response", "Sorry, I couldn't process your request.") except Exception as e: return f"Error: {str(e)}" 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. """ # 🎨 μ™„λ²½ν•œ 닀크/라이트 λͺ¨λ“œ CSS custom_css = """ /* κΈ°λ³Έ(라이트 λͺ¨λ“œ) */ body, .gradio-container { background-color: #f9f9fb; color: #333; } .gr-box, .gr-group, .gr-column, .gr-dropdown, .gr-textbox, .gr-markdown { background-color: #ffffff; color: #333; border: 1px solid #e0e0e0; border-radius: 8px; box-shadow: 1px 1px 3px rgba(0,0,0,0.05); } .gr-chatbot { background-color: #f0f0f5; color: #333; border-radius: 10px; } .gr-button-primary { background-color: #ff7847 !important; color: #fff !important; } .gr-button-secondary { background-color: #d1c4e9 !important; color: #333 !important; } .gr-dropdown select, .gr-textbox textarea { background-color: #ffffff; color: #333; } /* 닀크 λͺ¨λ“œ */ @media (prefers-color-scheme: dark) { body, .gradio-container { background-color: #0d0d0d; color: #f0f0f0; } .gr-box, .gr-group, .gr-column, .gr-dropdown, .gr-textbox, .gr-markdown { background-color: #1a1a1a; color: #f0f0f0; border: 1px solid #333; } .gr-chatbot { background-color: #1a1a1a; color: #f0f0f0; } .gr-button-primary { background-color: #ff7847 !important; color: #fff !important; } .gr-button-secondary { background-color: #444 !important; color: #fff !important; } .gr-dropdown select, .gr-textbox textarea { background-color: #1a1a1a; color: #f0f0f0; } } """ with gr.Blocks(css=custom_css) as demo: gr.Markdown(""" # 🎬 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=("πŸ‘€", "🎬"), 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()