HonAnson's picture
Update app.py
169883c verified
import os
import gradio as gr
from dotenv import load_dotenv
from smolagents import CodeAgent, GoogleSearchTool, OpenAIServerModel
# Load environment variables
load_dotenv()
OPENAI_API_KEY = os.getenv("MISTRAL_API_KEY")
search_tool = GoogleSearchTool(provider="serpapi")
model = OpenAIServerModel(
model_id="gpt-4",
api_key=OPENAI_API_KEY
)
agent = CodeAgent(
tools=[search_tool],
model=model,
add_base_tools=False
)
# === Travel Survey Classification ===
def classify_travel_profile(*answers):
preferences = {
"Budget": 1, "Mid-range": 2, "Luxury": 3,
"Solo": 1, "Couple": 2, "Family": 3, "Group": 3,
"Weekend (1–3 days)": 1, "Short trip (4–7 days)": 2, "Extended (8+ days)": 3,
"Nature": 1, "City": 2, "Exotic/Remote": 3,
"Public Transport": 1, "Taxi/Rideshare": 2, "Private Car": 3
}
total = sum(preferences.get(a, 2) for a in answers)
level = round(total / len(answers))
category = ["Budget Traveler", "Balanced Traveler", "Luxury Traveler"][level - 1]
return category, f"🌍 Your travel profile: **{category}**"
# === Budget Estimation ===
def estimate_budget(profile, q1_answer, q2_answer, q3_answer, q4_answer, q5_answer):
answers = [q1_answer, q2_answer, q3_answer, q4_answer, q5_answer]
base_cost = {
"Budget Traveler": 50,
"Balanced Traveler": 150,
"Luxury Traveler": 350
}.get(profile, 100)
days = {"Weekend (1–3 days)": 2, "Short trip (4–7 days)": 5, "Extended (8+ days)": 10}.get(answers[2], 5)
group_factor = {"Solo": 1, "Couple": 0.9, "Family": 0.8, "Group": 0.75}.get(answers[1], 1)
daily_cost = base_cost * group_factor
total = daily_cost * days
budget_text = f"""πŸ’Έ **Estimated Budget**
- **Daily Cost:** ${daily_cost:.2f}
- **Trip Duration:** {days} days
- **Total Estimate:** ${total:.2f}
_For a {profile} going on a {answers[2]} in a group of {answers[1]}, primarily visiting {answers[3]} destinations._
"""
return budget_text, budget_text
# === Chat Agent ===
def travel_chat(user_message, chat_history, profile, budget_summary):
if not profile or not budget_summary:
return chat_history, chat_history + [["⚠️", "Please complete your profile and budget estimate first."]]
prompt = (
f"Traveler Profile: {profile}\n"
f"Budget Summary:\n{budget_summary}\n"
f"User: {user_message}\n"
f"Advisor:"
)
try:
reply = agent.run(prompt)
except Exception as e:
reply = f"❌ Error: {e}"
chat_history.append([user_message, reply])
return chat_history, chat_history
# === Gradio UI ===
with gr.Blocks() as demo:
travel_profile = gr.State()
travel_summary = gr.State()
chat_history = gr.State([])
gr.Markdown("# ✈️ Trip Budget Advisor")
with gr.Row():
q1 = gr.Radio(["Budget", "Mid-range", "Luxury"], label="1. What’s your travel style?")
q2 = gr.Radio(["Solo", "Couple", "Family", "Group"], label="2. Who are you traveling with?")
q3 = gr.Radio(["Weekend (1–3 days)", "Short trip (4–7 days)", "Extended (8+ days)"], label="3. Duration?")
q4 = gr.Radio(["Nature", "City", "Exotic/Remote"], label="4. Destination type?")
q5 = gr.Radio(["Public Transport", "Taxi/Rideshare", "Private Car"], label="5. Preferred transport?")
profile_btn = gr.Button("Generate Travel Profile")
profile_out = gr.Markdown()
profile_btn.click(
classify_travel_profile,
inputs=[q1, q2, q3, q4, q5],
outputs=[travel_profile, profile_out]
)
gr.Markdown("## 🧾 Budget Estimator")
budget_btn = gr.Button("Estimate Budget")
budget_out = gr.Markdown()
budget_btn.click(
fn=lambda prof, a1, a2, a3, a4, a5: estimate_budget(prof, a1, a2, a3, a4, a5),
inputs=[travel_profile, q1, q2, q3, q4, q5],
outputs=[budget_out, travel_summary]
)
gr.Markdown("## πŸ’¬ Travel Chat Assistant")
chatbot = gr.Chatbot()
user_input = gr.Textbox(placeholder="Ask travel questions like best cities under budget...", label="Ask something")
chat_btn = gr.Button("Send")
chat_btn.click(
travel_chat,
inputs=[user_input, chat_history, travel_profile, travel_summary],
outputs=[chatbot, chat_history]
)
demo.launch()