|
|
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. |
|
|
""" |
|
|
|
|
|
|
|
|
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() |