| from pydantic import BaseModel, Field | |
| from typing import List, Optional, Any, Dict | |
| class TripPlanRequest(BaseModel): | |
| destination: str | |
| duration: int | |
| budget: float | |
| preferences: list[str] = [] | |
| class TripPlanResponse(BaseModel): | |
| message: str | |
| plan: dict | |
| class YoutubeLinkRequest(BaseModel): | |
| video_id: str | |
| class YoutubeLinkResponse(BaseModel): | |
| message: str | |
| video_url: str | |
| class PlanRequest(BaseModel): | |
| start_place: str | |
| destination_place: str | |
| trip_price: Optional[float] = Field(None, description="Total budget in local currency") | |
| trip_context: Optional[str] = Field(None, description="e.g. adventure, rest, date") | |
| trip_duration_days: Optional[int] = 1 | |
| group_size: Optional[int] = 1 | |
| preferences: Optional[List[str]] = None | |
| top_k: Optional[int] = 3 | |
| class RetrievedItem(BaseModel): | |
| place_id: str | |
| place_name: str | |
| description: Optional[str] | |
| score: float | |
| metadata: Optional[Dict[str, Any]] = None | |
| class TransportInfo(BaseModel): | |
| mode: Optional[str] | |
| departure: Optional[str] | |
| arrival: Optional[str] | |
| duration_minutes: Optional[int] | |
| price: Optional[float] | |
| details: Optional[str] | |
| class PlanStep(BaseModel): | |
| day: Optional[int] | |
| title: Optional[str] | |
| description: Optional[str] | |
| transport: Optional[TransportInfo] | |
| map_coordinates: Optional[Dict[str, float]] | |
| images: Optional[List[str]] | |
| tips: Optional[List[str]] | |
| class TripPlan(BaseModel): | |
| overview: str | |
| total_estimated_cost: Optional[float] | |
| steps: List[PlanStep] | |
| class PlanResponse(BaseModel): | |
| tripOverview: str | |
| query_params: PlanRequest | |
| retrieved_data: List[RetrievedItem] | |
| trip_plan: TripPlan | |
| meta: Dict[str, Any] | |
| class ChatRequest(BaseModel): | |
| message: str | |