Kim Juwon
update UI/UX
39ade08
raw
history blame
7.48 kB
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: #a78bfa !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: #121212;
color: #e0e0e0;
}
.gr-box, .gr-group, .gr-column, .gr-dropdown, .gr-textbox, .gr-markdown {
background-color: #1e1e1e;
color: #e0e0e0;
border: 1px solid #333;
}
.gr-chatbot {
background-color: #1a1a1a;
color: #e0e0e0;
}
.gr-button-primary {
background-color: #ff7847 !important;
color: #fff !important;
}
.gr-button-secondary {
background-color: #555 !important;
color: #fff !important;
}
.gr-dropdown select, .gr-textbox textarea {
background-color: #1e1e1e;
color: #e0e0e0;
}
}
"""
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()