|
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(""" |
|
<div class="header-container"> |
|
<h1>π¬ Personalized Movie Recommender</h1> |
|
<p><br/>Tell us your preferred genres and current mood, and we'll recommend the perfect movies for you.<br/></p> |
|
</div> |
|
""") |
|
|
|
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", |
|
"https://cdn-icons-png.flaticon.com/512/3135/3135715.png" |
|
), |
|
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() |