File size: 5,741 Bytes
1e81c91
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1bcc194
 
 
 
 
 
 
 
 
 
 
 
 
 
1e81c91
1bcc194
 
 
 
 
1e81c91
 
 
 
 
 
 
1bcc194
 
 
 
 
 
bc3f685
 
1bcc194
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1e81c91
1c02ddb
 
 
 
 
 
 
 
1e81c91
1bcc194
 
1c02ddb
1bcc194
 
 
 
1e81c91
b54ff3c
 
 
 
 
 
 
 
 
 
1e81c91
1bcc194
 
 
 
b54ff3c
1bcc194
 
7bc7ddb
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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):
    # Core location fields
    start_place: str = Field(..., description="Starting location")
    destination: str = Field(..., description="Destination location") 
    
    # Trip details
    travelDates: Optional[str] = Field(None, description="Travel dates in format 'YYYY-MM-DD to YYYY-MM-DD'")
    duration: int = Field(..., description="Duration in days")
    
    # Group and preferences
    groupSize: int = Field(4, description="Number of people in the group")
    interests: List[str] = Field(default_factory=list, description="List of interests like 'Cultural immersion', 'Mountain views'")
    
    # Budget and accommodation
    budgetTier: Optional[str] = Field(None, description="Budget tier: 'Budget', 'Mid-range', 'Luxury'")
    trip_price: Optional[float] = Field(None, description="Total budget in local currency")
    stayPref: Optional[str] = Field(None, description="Accommodation preference like 'Tea houses and lodges'")
    
    # Transport and theme
    transportPref: Optional[str] = Field(None, description="Transport preference like 'Local bus'")
    theme: Optional[str] = Field(None, description="Trip theme like 'Adventure', 'Relaxation'")


class RetrievedItem(BaseModel):
    place_id: str
    place_name: str
    score: float

class Timeline(BaseModel):
    t: str = Field(..., description="Time in HH:MM format")
    detail: str = Field(..., description="Activity description")

class Spot(BaseModel):
    name: str = Field(..., description="Location name")
    latitude: Optional[float] = Field(None, description="Latitude coordinate")
    longitude: Optional[float] = Field(None, description="Longitude coordinate")
    time: str = Field(..., description="Time range like '09:30 – 11:45'")
    notes: str = Field(..., description="Description and tips")

class Budget(BaseModel):
    transport: Optional[float] = Field(None, description="Transport cost")
    entrance: Optional[float] = Field(None, description="Entrance fees")
    meals: Optional[float] = Field(None, description="Meal costs")
    accommodation: Optional[float] = Field(None, description="Accommodation costs")
    activities: Optional[float] = Field(None, description="Activity costs")
    total: Optional[float] = Field(None, description="Total estimated cost")

class Permits(BaseModel):
    needed: bool = Field(False, description="Whether permits are required")
    notes: str = Field("", description="Permit requirements")
    seasonal: str = Field("", description="Seasonal considerations")

class Contact(BaseModel):
    name: str = Field(..., description="Contact name")
    phone: str = Field(..., description="Phone number")

class SafetyContacts(BaseModel):
    ranger: Optional[Contact] = Field(None, description="Ranger station contact")
    hospital: Optional[Contact] = Field(None, description="Hospital contact")
    police: Optional[Contact] = Field(None, description="Police contact")

class Safety(BaseModel):
    registration: str = Field("", description="Safety registration info")
    checkins: str = Field("", description="Check-in procedures")
    sos: str = Field("", description="Emergency procedures")
    contacts: Optional[SafetyContacts] = Field(None, description="Emergency contacts")

class TimelineEntry(BaseModel):
    t: str = Field(..., description="Time in HH:MM format")
    detail: str = Field(..., description="Activity description")

class DayTimeline(BaseModel):
    day: int = Field(..., description="Day number")
    activities: List[TimelineEntry] = Field(..., description="Activities for this day")

class TripPlan(BaseModel):
    title: str = Field(..., description="Descriptive title for the trip")
    date: str = Field(..., description="Suggested date/timing")
    timeline: List[DayTimeline] = Field(default_factory=list, description="Daily timeline")
    spots: List[Spot] = Field(default_factory=list, description="Points of interest")
    budget: Budget = Field(..., description="Budget breakdown")
    permits: Optional[Permits] = Field(None, description="Permit information")
    safety: Optional[Safety] = Field(None, description="Safety information")

class PreparationItem(BaseModel):
    category: str = Field(..., description="Category like 'Documents', 'Clothing', 'Equipment'")
    items: List[str] = Field(..., description="List of items to prepare")
    notes: str = Field("", description="Additional notes for this category")

class Preparation(BaseModel):
    overview: str = Field("", description="General preparation overview")
    items: List[PreparationItem] = Field(default_factory=list, description="Preparation items by category")
    timeline: str = Field("", description="When to prepare (e.g., '2 weeks before departure')")

class PlanResponse(BaseModel):
    tripOverview: str = Field(..., description="Overview of the trip")
    query_params: PlanRequest = Field(..., description="Original request parameters")
    retrieved_data: List[RetrievedItem] = Field(default_factory=list, description="Retrieved context data")
    trip_plan: TripPlan = Field(..., description="Detailed trip plan")
    preparation: Optional[Preparation] = Field(None, description="Trip preparation details")
    meta: Dict[str, Any] = Field(default_factory=dict, description="Metadata")

    
class ChatRequest(BaseModel):
    message: str