Spaces:
Sleeping
Sleeping
import gradio as gr | |
import os | |
from groq import Groq | |
import os | |
api_key = os.getenv("GROQ_API_KEY") | |
client = Groq(api_key=api_key) | |
#client = Groq(api_key= "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") # Assumes GROQ_API_KEY is in .env file | |
system_prompt = "You are a Travel Advisor. Provide helpful travel tips, recommend destinations, and suggest itineraries based on user queries." | |
def chatbot_response(user_message, history, output_length): | |
# Initialize chat history if None | |
if history is None: | |
history = [] | |
# Build messages list | |
messages = [{"role": "system", "content": system_prompt}] | |
for user_msg, bot_msg in history: | |
messages.append({"role": "user", "content": user_msg}) | |
messages.append({"role": "assistant", "content": bot_msg}) | |
messages.append({"role": "user", "content": user_message}) | |
# Adjust response length | |
length_modifier = { | |
"Concise": "Respond briefly.", | |
"Moderate": "Respond with a balanced explanation.", | |
"Explained": "Provide a detailed and thorough response." | |
} | |
messages.append({"role": "system", "content": length_modifier[output_length]}) | |
# Call Groq API | |
response = client.chat.completions.create( | |
model="llama-3.3-70b-versatile", | |
messages=messages | |
) | |
# Update history | |
history.append((user_message, response.choices[0].message.content)) | |
return history, history, "" # Return history for chatbot/state and "" to clear textbox | |
# Custom CSS for a travel-themed UI | |
custom_css = """ | |
/* General container styling */ | |
.gradio-container { | |
background: linear-gradient(to bottom, #e6f3ff, #ffffff); | |
font-family: 'Poppins', sans-serif; | |
color: #333; | |
} | |
/* Header styling */ | |
h1, h3 { | |
color: #1a5f7a; | |
text-align: center; | |
text-shadow: 1px 1px 2px rgba(0,0,0,0.1); | |
} | |
/* Chatbot area */ | |
.gr-chatbot { | |
background: #ffffff; | |
border-radius: 15px; | |
box-shadow: 0 4px 12px rgba(0,0,0,0.1); | |
padding: 20px; | |
max-height: 500px; | |
overflow-y: auto; | |
border: 2px solid #95c8d8; | |
} | |
/* Chat messages */ | |
.gr-chatbot .message { | |
border-radius: 10px; | |
margin: 10px 0; | |
padding: 10px 15px; | |
} | |
.gr-chatbot .user { | |
background: #95c8d8; | |
color: #fff; | |
text-align: right; | |
} | |
.gr-chatbot .assistant { | |
background: #e6f3ff; | |
color: #333; | |
text-align: left; | |
} | |
/* Textbox */ | |
.gr-textbox input { | |
border: 2px solid #95c8d8; | |
border-radius: 10px; | |
padding: 10px; | |
font-size: 16px; | |
transition: border-color 0.3s ease; | |
} | |
.gr-textbox input:focus { | |
border-color: #1a5f7a; | |
outline: none; | |
} | |
/* Radio buttons */ | |
.gr-radio { | |
background: #ffffff; | |
border-radius: 10px; | |
padding: 15px; | |
border: 2px solid #95c8d8; | |
box-shadow: 0 2px 8px rgba(0,0,0,0.1); | |
} | |
.gr-radio label { | |
color: #1a5f7a; | |
font-weight: 600; | |
} | |
.gr-radio input[type="radio"]:checked + label { | |
color: #0a3d62; | |
} | |
/* Buttons */ | |
.gr-button { | |
background: #1a5f7a; | |
color: #ffffff; | |
border: none; | |
border-radius: 10px; | |
padding: 10px 20px; | |
font-size: 16px; | |
font-weight: 600; | |
transition: background 0.3s ease, transform 0.2s ease; | |
} | |
.gr-button:hover { | |
background: #0a3d62; | |
transform: translateY(-2px); | |
} | |
.gr-button:active { | |
transform: translateY(0); | |
} | |
/* Row layout */ | |
.gr-row { | |
gap: 20px; | |
} | |
/* Add a subtle background image */ | |
body::before { | |
content: ''; | |
position: fixed; | |
top: 0; | |
left: 0; | |
width: 100%; | |
height: 100%; | |
background: url('https://www.transparenttextures.com/patterns/white-wave.png'); | |
opacity: 0.1; | |
z-index: -1; | |
} | |
""" | |
# Create Gradio interface with Blocks | |
with gr.Blocks(css=custom_css) as demo: | |
gr.Markdown("# π My Travel Advisor Chatbot") | |
gr.Markdown("Embark on your next adventure with personalized travel tips and itineraries!") | |
# Chatbot display | |
chatbot = gr.Chatbot(label="Travel Chat", height=500) | |
# Input components | |
with gr.Row(): | |
user_message = gr.Textbox( | |
label="Your Travel Question", | |
placeholder="Ask about destinations, tips, or itineraries...", | |
lines=2 | |
) | |
output_length = gr.Radio( | |
choices=["Concise", "Moderate", "Explained"], | |
value="Moderate", | |
label="Response Length", | |
info="Choose how detailed you want the response to be." | |
) | |
# Submit and clear buttons | |
with gr.Row(): | |
submit_button = gr.Button("Send") | |
clear_button = gr.Button("Clear Chat") | |
# State to store chat history | |
chat_state = gr.State(value=[]) | |
# Connect button to function | |
submit_button.click( | |
fn=chatbot_response, | |
inputs=[user_message, chat_state, output_length], | |
outputs=[chatbot, chat_state, user_message] | |
) | |
# Clear chat functionality | |
clear_button.click( | |
fn=lambda: ([], [], ""), | |
inputs=None, | |
outputs=[chatbot, chat_state, user_message] | |
) | |
# Launch the app | |
demo.launch() |