# Smart Travel AI Agent API Documentation This document describes how a web application or frontend client can connect to and interact with the Smart Travel AI Agent hosted on Hugging Face Spaces. ## 🔗 Connection Information - **Base URL**: `https://youmei295-planning-agent.hf.space` - **CORS**: Enabled for all origins (`*`), so it can be called directly from frontend web applications (e.g., Next.js, React, Vue, Vanilla JS). - **Communication Protocol**: HTTPS / REST API --- ## 🟢 1. Health Check Endpoint Used to verify if the AI agent backend is up and running. **Endpoint:** `GET /health` or `GET /` **Response Example (200 OK):** ```json { "status": "ok", "message": "Smart Travel AI API is running" } ``` --- ## 🚀 2. Trip Planning & Chat Endpoint This is the main endpoint used to communicate with the agent. The system automatically routes the message to either a normal conversation (chat) or complex trip planning based on the user's intent. **Endpoint:** `POST /api/plan` **Headers:** - `Content-Type: application/json` ### 📥 Input Format (Request Payload) Send a JSON body with the following structure: ```json { "message": "Mình muốn đi chơi cuối tuần ở Bình Thạnh, ưu tiên quán cafe yên tĩnh và ăn đồ nướng.", "start_date": "2024-12-01", // (Optional) Expected start date, Format: YYYY-MM-DD "num_days": 1, // (Optional) Number of days for the trip (Max: 3) "session_id": "user-123" // (Optional) For tracking user sessions } ``` **Field Details:** - `message` *(string, required)*: The user's prompt, question, or requirement. - `start_date` *(string, optional)*: Explicit start date chosen from the frontend UI. - `num_days` *(integer, optional)*: Explicit number of days chosen from the frontend UI. If omitted, the AI will try to infer the duration from the `message`. - `session_id` *(string, optional)*: An ID to keep track of the user's conversation thread (if applicable). --- ### 📤 Output Formats (Response) The API returns different structures depending on how the AI categorizes the user's input. #### Scenario A: Chat / Small Talk / Asking for more info If the user just says "Hello" or provides insufficient information for a trip, the agent responds conversationally. **Response Example (200 OK):** ```json { "status": "chat", "total_cost": "0 VNĐ", "itinerary_markdown": "Xin chào! Bạn muốn lên kế hoạch đi chơi ở đâu? Hãy cho mình biết thêm thông tin nhé.", "timeline": [] } ``` #### Scenario B: Successful Trip Plan Generation If the user provides a valid travel request, the system processes it, queries the database, and returns a detailed itinerary and timeline. **Response Example (200 OK):** ```json { "status": "success", "total_cost": "500.000 - 1.000.000 VNĐ", "itinerary_markdown": "## 🌟 Kế hoạch đi Bình Thạnh của bạn\n\n**Buổi sáng:** Cafe Yên...\n...", "timeline": [ { "time": "08:00 - 10:00", "activity": "Uống cafe", "location": "Quán Cafe Yên", "location_id": "uuid-from-supabase", "cost_estimate": "50000" }, { "time": "18:00 - 20:00", "activity": "Ăn đồ nướng", "location": "Panda BBQ", "location_id": "uuid-from-supabase", "cost_estimate": "250000" } ] } ``` #### Scenario C: Error Handling If an internal error occurs during processing. **Response Example (500 Internal Server Error):** ```json { "detail": "Lỗi kết nối cơ sở dữ liệu..." } ``` --- ## 💻 Example Connection Method (JavaScript/Fetch) Here is a simple example of how a web app can connect to this API using the standard `fetch` API: ```javascript async function requestTripPlan(userMessage) { const url = "https://youmei295-planning-agent.hf.space/api/plan"; const payload = { message: userMessage, start_date: "2024-12-01", // Or retrieve from your UI date picker num_days: 1 // Or retrieve from your UI dropdown }; try { const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(payload) }); if (!response.ok) { throw new Error(`HTTP error! status: ${response.status}`); } const data = await response.json(); if (data.status === "success") { console.log("Trip Planned Successfully!"); console.log("Total Cost:", data.total_cost); console.log("Markdown Report:", data.itinerary_markdown); console.log("Timeline Array:", data.timeline); // TODO: Render the markdown and timeline array in your UI } else if (data.status === "chat") { console.log("Agent Message:", data.itinerary_markdown); // TODO: Show this message in a chat bubble } } catch (error) { console.error("Error communicating with AI Agent:", error); } } // Example usage: // requestTripPlan("Mình muốn đi Quận 1 uống cafe và đi dạo."); ```