import streamlit as st import os import json from datetime import datetime, timedelta import base64 import pandas as pd import pydeck as pdk from travel import ( destination_research_task, accommodation_task, transportation_task, activities_task, dining_task, itinerary_task, chatbot_task, run_task ) # st.set_page_config()는 다른 Streamlit 함수보다 가장 먼저 실행되어야 합니다. st.set_page_config( page_title="Your AI Agent for Travelling", page_icon="✈️", layout="wide", initial_sidebar_state="expanded" ) # ------------------------------------------ # 다국어 지원을 위한 번역 사전 및 헬퍼 함수 # ------------------------------------------ translations = { "en": { "page_title": "Your AI Agent for Travelling", "header": "Your AI Agent for Travelling", "create_itinerary": "Create Your Itinerary", "trip_details": "Trip Details", "origin": "Origin", "destination": "Destination", "travel_dates": "Travel Dates", "duration": "Duration (days)", "preferences": "Preferences", "additional_preferences": "Additional Preferences", "interests": "Interests", "special_requirements": "Special Requirements", "submit": "🚀 Create My Personal Travel Itinerary", "request_details": "Your Travel Request", "from": "From", "when": "When", "budget": "Budget", "travel_style": "Travel Style", "live_agent_outputs": "Live Agent Outputs", "full_itinerary": "Full Itinerary", "details": "Details", "download_share": "Download & Share", "save_itinerary": "Save Your Itinerary", "plan_another_trip": "🔄 Plan Another Trip", "about": "About", "how_it_works": "How it works", "travel_agents": "Travel Agents", "share_itinerary": "Share Your Itinerary", "save_for_mobile": "Save for Mobile", "built_with": "Built with ❤️ for you", # 출력 관련 추가 텍스트 "itinerary_ready": "Your Travel Itinerary is Ready! 🎉", "personalized_experience": "We've created a personalized travel experience just for you. Explore your itinerary below.", "agent_activity": "Agent Activity", "error_origin_destination": "Please enter both origin and destination.", "your_itinerary_file": "Your Itinerary File", "text_format": "Text format - Can be opened in any text editor" }, "ko": { "page_title": "당신의 여행을 위한 AI 에이전트", "header": "당신의 여행을 위한 AI 에이전트", "create_itinerary": "여행 일정 생성", "trip_details": "여행 세부 정보", "origin": "출발지", "destination": "목적지", "travel_dates": "여행 날짜", "duration": "기간 (일수)", "preferences": "선호사항", "additional_preferences": "추가 선호사항", "interests": "관심사", "special_requirements": "특별 요구사항", "submit": "🚀 나만의 여행 일정 생성", "request_details": "여행 요청 정보", "from": "출발지", "when": "여행 기간", "budget": "예산", "travel_style": "여행 스타일", "live_agent_outputs": "실시간 에이전트 결과", "full_itinerary": "전체 일정", "details": "세부사항", "download_share": "다운로드 및 공유", "save_itinerary": "일정 저장", "plan_another_trip": "🔄 다른 여행 계획", "about": "소개", "how_it_works": "작동 방식", "travel_agents": "여행 에이전트", "share_itinerary": "일정 공유", "save_for_mobile": "모바일 저장", "built_with": "당신을 위해 ❤️ 만들어졌습니다", # 출력 관련 추가 텍스트 "itinerary_ready": "여행 일정이 준비되었습니다! 🎉", "personalized_experience": "당신만을 위한 맞춤형 여행 경험이 만들어졌습니다. 아래에서 일정을 확인하세요.", "agent_activity": "에이전트 활동", "error_origin_destination": "출발지와 목적지를 모두 입력하세요.", "your_itinerary_file": "당신의 여행 일정 파일", "text_format": "텍스트 형식 - 모든 텍스트 편집기에서 열 수 있습니다." }, "ja": { "page_title": "あなたの旅行のためのAIエージェント", "header": "あなたの旅行のためのAIエージェント", "create_itinerary": "旅行プラン作成", "trip_details": "旅行詳細", "origin": "出発地", "destination": "目的地", "travel_dates": "旅行日程", "duration": "期間(日数)", "preferences": "好み", "additional_preferences": "追加の好み", "interests": "興味", "special_requirements": "特別な要件", "submit": "🚀 私のための旅行プラン作成", "request_details": "旅行リクエスト", "from": "出発地", "when": "旅行期間", "budget": "予算", "travel_style": "旅行スタイル", "live_agent_outputs": "リアルタイムエージェント出力", "full_itinerary": "全行程", "details": "詳細", "download_share": "ダウンロードと共有", "save_itinerary": "旅行プランを保存", "plan_another_trip": "🔄 他の旅行を計画", "about": "概要", "how_it_works": "使い方", "travel_agents": "旅行エージェント", "share_itinerary": "旅行プランを共有", "save_for_mobile": "モバイル保存", "built_with": "愛を込めて作られました", # 출력 관련 추가 텍스트 "itinerary_ready": "旅行プランの準備ができました! 🎉", "personalized_experience": "あなたのためにパーソナライズされた旅行体験を作成しました。下のプランをご覧ください。", "agent_activity": "エージェントアクティビティ", "error_origin_destination": "出発地と目的地の両方を入力してください。", "your_itinerary_file": "あなたの旅行プランファイル", "text_format": "テキスト形式 - 任意のテキストエディタで開けます。" }, "zh": { "page_title": "您的旅行 AI 代理", "header": "您的旅行 AI 代理", "create_itinerary": "创建您的行程", "trip_details": "旅行详情", "origin": "出发地", "destination": "目的地", "travel_dates": "旅行日期", "duration": "天数", "preferences": "偏好", "additional_preferences": "其他偏好", "interests": "兴趣", "special_requirements": "特殊需求", "submit": "🚀 创建我的个性化行程", "request_details": "您的旅行请求", "from": "出发地", "when": "旅行时间", "budget": "预算", "travel_style": "旅行风格", "live_agent_outputs": "实时代理输出", "full_itinerary": "完整行程", "details": "详情", "download_share": "下载与分享", "save_itinerary": "保存行程", "plan_another_trip": "🔄 计划另一趟旅行", "about": "关于", "how_it_works": "工作原理", "travel_agents": "旅行代理", "share_itinerary": "分享行程", "save_for_mobile": "保存到手机", "built_with": "用❤️为您制作", # 출력 관련 추가 텍스트 "itinerary_ready": "您的旅行行程已准备就绪! 🎉", "personalized_experience": "我们已为您创建了个性化的旅行体验,请在下方查看您的行程。", "agent_activity": "代理活动", "error_origin_destination": "请输入出发地和目的地。", "your_itinerary_file": "您的行程文件", "text_format": "文本格式 - 可在任何文本编辑器中打开。" }, "es": { "page_title": " Tu Agente de IA para Viajar", "header": " Tu Agente de IA para Viajar", "create_itinerary": "Crea Tu Itinerario", "trip_details": "Detalles del Viaje", "origin": "Origen", "destination": "Destino", "travel_dates": "Fechas del Viaje", "duration": "Duración (días)", "preferences": "Preferencias", "additional_preferences": "Preferencias Adicionales", "interests": "Intereses", "special_requirements": "Requisitos Especiales", "submit": "🚀 Crea Mi Itinerario Personalizado", "request_details": "Tu Solicitud de Viaje", "from": "Desde", "when": "Cuándo", "budget": "Presupuesto", "travel_style": "Estilo de Viaje", "live_agent_outputs": "Salidas en Vivo del Agente", "full_itinerary": "Itinerario Completo", "details": "Detalles", "download_share": "Descargar y Compartir", "save_itinerary": "Guardar Itinerario", "plan_another_trip": "🔄 Planear Otro Viaje", "about": "Acerca de", "how_it_works": "Cómo Funciona", "travel_agents": "Agentes de Viaje", "share_itinerary": "Compartir Itinerario", "save_for_mobile": "Guardar para Móvil", "built_with": "Hecho con ❤️ para ti", # 출력 관련 추가 텍스트 "itinerary_ready": "¡Tu itinerario de viaje está listo! 🎉", "personalized_experience": "Hemos creado una experiencia de viaje personalizada solo para ti. Explora tu itinerario a continuación.", "agent_activity": "Actividad del Agente", "error_origin_destination": "Por favor, ingresa tanto el origen como el destino.", "your_itinerary_file": "Tu Archivo de Itinerario", "text_format": "Formato de texto - Se puede abrir en cualquier editor de texto." }, "fr": { "page_title": " Votre Agent IA pour Voyager", "header": " Votre Agent IA pour Voyager", "create_itinerary": "Créez Votre Itinéraire", "trip_details": "Détails du Voyage", "origin": "Origine", "destination": "Destination", "travel_dates": "Dates du Voyage", "duration": "Durée (jours)", "preferences": "Préférences", "additional_preferences": "Préférences Supplémentaires", "interests": "Centres d'intérêt", "special_requirements": "Exigences Spéciales", "submit": "🚀 Créez Mon Itinéraire Personnalisé", "request_details": "Votre Demande de Voyage", "from": "De", "when": "Quand", "budget": "Budget", "travel_style": "Style de Voyage", "live_agent_outputs": "Résultats en Direct de l'Agent", "full_itinerary": "Itinéraire Complet", "details": "Détails", "download_share": "Télécharger et Partager", "save_itinerary": "Enregistrer l'Itinéraire", "plan_another_trip": "🔄 Planifier un Autre Voyage", "about": "À Propos", "how_it_works": "Fonctionnement", "travel_agents": "Agents de Voyage", "share_itinerary": "Partager l'Itinéraire", "save_for_mobile": "Enregistrer pour Mobile", "built_with": "Conçu avec ❤️ pour vous", # 출력 관련 추가 텍스트 "itinerary_ready": "Votre itinéraire de voyage est prêt ! 🎉", "personalized_experience": "Nous avons créé une expérience de voyage personnalisée rien que pour vous. Découvrez votre itinéraire ci-dessous.", "agent_activity": "Activité de l'Agent", "error_origin_destination": "Veuillez saisir à la fois le lieu de départ et la destination.", "your_itinerary_file": "Votre Fichier d'Itinéraire", "text_format": "Format texte - Peut être ouvert dans n'importe quel éditeur de texte." }, "de": { "page_title": "Ihr KI-Reiseassistent", "header": " Ihr KI-Reiseassistent", "create_itinerary": "Erstellen Sie Ihre Reiseroute", "trip_details": "Reisedetails", "origin": "Abfahrtsort", "destination": "Zielort", "travel_dates": "Reisedaten", "duration": "Dauer (Tage)", "preferences": "Vorlieben", "additional_preferences": "Zusätzliche Vorlieben", "interests": "Interessen", "special_requirements": "Besondere Anforderungen", "submit": "🚀 Erstellen Sie meine personalisierte Reiseroute", "request_details": "Ihre Reiseanfrage", "from": "Von", "when": "Wann", "budget": "Budget", "travel_style": "Reisestil", "live_agent_outputs": "Live Agent Ausgaben", "full_itinerary": "Komplette Reiseroute", "details": "Details", "download_share": "Herunterladen & Teilen", "save_itinerary": "Reiseroute speichern", "plan_another_trip": "🔄 Plane eine weitere Reise", "about": "Über", "how_it_works": "Wie es funktioniert", "travel_agents": "Reiseassistenten", "share_itinerary": "Reiseroute teilen", "save_for_mobile": "Für Mobilgeräte speichern", "built_with": "Mit ❤️ für Sie gebaut", # 출력 관련 추가 텍스트 "itinerary_ready": "Ihre Reiseroute ist fertig! 🎉", "personalized_experience": "Wir haben eine personalisierte Reiseerfahrung nur für Sie erstellt. Entdecken Sie Ihre Reiseroute unten.", "agent_activity": "Agentenaktivität", "error_origin_destination": "Bitte geben Sie sowohl den Abfahrtsort als auch das Ziel ein.", "your_itinerary_file": "Ihre Reise-Datei", "text_format": "Textformat – Kann in jedem Texteditor geöffnet werden." }, "ar": { "page_title": " وكيل السفر الذكي الخاص بك", "header": " وكيل السفر الذكي الخاص بك", "create_itinerary": "إنشاء خط سير الرحلة", "trip_details": "تفاصيل الرحلة", "origin": "المغادرة من", "destination": "الوجهة", "travel_dates": "تواريخ السفر", "duration": "المدة (بالأيام)", "preferences": "التفضيلات", "additional_preferences": "تفضيلات إضافية", "interests": "الاهتمامات", "special_requirements": "المتطلبات الخاصة", "submit": "🚀 إنشاء خط سير الرحلة الشخصي", "request_details": "طلب السفر الخاص بك", "from": "من", "when": "متى", "budget": "الميزانية", "travel_style": "أسلوب السفر", "live_agent_outputs": "مخرجات الوكيل المباشرة", "full_itinerary": "خط سير الرحلة الكامل", "details": "التفاصيل", "download_share": "تنزيل ومشاركة", "save_itinerary": "حفظ خط سير الرحلة", "plan_another_trip": "🔄 خطط لرحلة أخرى", "about": "حول", "how_it_works": "كيف يعمل", "travel_agents": "وكلاء السفر", "share_itinerary": "شارك خط سير الرحلة", "save_for_mobile": "حفظ للهاتف المحمول", "built_with": "مصنوع بحب من أجلك", # 출력 관련 추가 텍스트 "itinerary_ready": "تم تجهيز خط سير رحلتك! 🎉", "personalized_experience": "لقد أنشأنا تجربة سفر مخصصة لك. استعرض خط سير رحلتك أدناه.", "agent_activity": "نشاط الوكيل", "error_origin_destination": "يرجى إدخال نقطة الانطلاق والوجهة.", "your_itinerary_file": "ملف خط سير رحلتك", "text_format": "تنسيق نصي - يمكن فتحه في أي محرر نصوص." } } def t(key): lang = st.session_state.get("selected_language", "en") return translations[lang].get(key, key) # --------------------------- # 세션 초기화 # --------------------------- if 'selected_language' not in st.session_state: st.session_state.selected_language = "en" # 기본은 영어 # ------------------------------------------ # 사이드바에 언어 선택 위젯 추가 # ------------------------------------------ with st.sidebar: language = st.selectbox( "Language / 언어 / 言語 / 语言 / Idioma / Langue / Sprache / اللغة", ["English", "한국어", "日本語", "中文", "Español", "Français", "Deutsch", "العربية"] ) lang_map = { "English": "en", "한국어": "ko", "日本語": "ja", "中文": "zh", "Español": "es", "Français": "fr", "Deutsch": "de", "العربية": "ar" } st.session_state.selected_language = lang_map.get(language, "en") # ------------------------------------------ # 이후 Streamlit UI 코드 시작 # ------------------------------------------ # Modern CSS with refined color scheme and sleek animations st.markdown(""" """, unsafe_allow_html=True) # Helper function to download HTML file def get_download_link(text_content, filename): b64 = base64.b64encode(text_content.encode()).decode() href = f'📥 {t("save_itinerary")}' return href # Updated helper function to display modern progress with a single UI element def display_modern_progress(current_step, total_steps=6): if 'progress_steps' not in st.session_state: st.session_state.progress_steps = { 0: {'status': 'pending', 'name': t("trip_details")}, 1: {'status': 'pending', 'name': t("about")}, 2: {'status': 'pending', 'name': t("travel_style")}, 3: {'status': 'pending', 'name': t("live_agent_outputs")}, 4: {'status': 'pending', 'name': t("download_share")}, 5: {'status': 'pending', 'name': t("full_itinerary")} } for i in range(total_steps): if i < current_step: st.session_state.progress_steps[i]['status'] = 'complete' elif i == current_step: st.session_state.progress_steps[i]['status'] = 'active' else: st.session_state.progress_steps[i]['status'] = 'pending' progress_percentage = (current_step / total_steps) * 100 st.progress(progress_percentage / 100) st.markdown("""
✨ Create your personalized AI-powered travel itinerary in minutes! ✨
AI-Powered Travel Planning
Complete the form below for a personalized travel plan.
""", unsafe_allow_html=True) with st.form("travel_form"): col1, col2 = st.columns(2) with col1: st.markdown('Trip Details
', unsafe_allow_html=True) origin = st.text_input(t("origin"), placeholder="e.g., New York, USA") destination = st.text_input(t("destination"), placeholder="e.g., Paris, France") st.markdown('Travel Dates
', unsafe_allow_html=True) start_date = st.date_input("Start Date", min_value=datetime.now(), label_visibility="collapsed") duration = st.slider(t("duration"), min_value=1, max_value=30, value=7) end_date = start_date + timedelta(days=duration-1) st.markdown('' + start_date.strftime("%b %d") + " - " + end_date.strftime("%b %d, %Y") + '
', unsafe_allow_html=True) with col2: st.markdown('Preferences
', unsafe_allow_html=True) travelers = st.number_input("Travelers", min_value=1, max_value=15, value=2) budget_options = ["Budget", "Moderate", "Luxury"] budget = st.selectbox("Budget", budget_options, help="Budget: Economy options | Moderate: Mid-range | Luxury: High-end experiences") travel_style = st.multiselect("🌈 Travel Style", options=["Culture", "Adventure", "Relaxation", "Food & Dining", "Nature", "Shopping", "Nightlife", "Family-friendly"], default=["Culture", "Food & Dining"]) with st.expander("Additional Preferences", expanded=False): preferences = st.text_area("Interests", placeholder="History museums, local cuisine, hiking, art...") special_requirements = st.text_area("Special Requirements", placeholder="Dietary restrictions, accessibility needs...") submit_button = st.form_submit_button(t("submit")) st.markdown('""" + t("personalized_experience") + """
""" + t("text_format") + """
""", unsafe_allow_html=True) st.markdown("""" + t("built_with") + """