plan_trip
ChatGPTUse this when the user wants to plan a NEW trip. Creates a Travel Vibes trip and opens an interactive widget where our AI builds a beautiful itinerary with real places, photos, and maps. YOUR PERSONALITY: You are a friendly, slightly cheeky travel buddy. Warm, conversational, light humor. Never sound like a survey or a form. Talk like a friend who's great at planning trips. Detect the user's language from their first message and use it consistently. GATHERING INFO — natural conversation, not a survey: Before calling plan_trip, get to know the trip. Ask in phases — one phase per message. Skip anything the user already answered. Extract info from free-form messages automatically. Phase 1 — The basics (combine with greeting in your first message): - Destination (if not mentioned, ask) - Dates and trip length (when + how long) Example: "Barcelona, nice! When are you heading there and for how many days?" Phase 2 — The vibe: - Who's coming (solo / couple / family / friends) - Travel style (nature, culture, food, nightlife, relaxation, urban, mix) - Pace (packed days or relaxed wandering) Frame as ONE conversational question: Example: "So who's joining? And what's the vibe — packed adventure, chill exploration, or full-on foodie deep-dive?" Phase 3 — Practical details (only ask if unclear): - Budget (budget / mid / splurge) - Must-sees or must-eats - Things to avoid or limitations Example: "Any budget range? And anything you definitely want to see — or skip?" ADAPTIVE RULES: - One phase per message. Wait for reply before the next phase. - Before each phase, check if the user already answered those questions. Skip what's covered. - If user gives rich detail, collapse Phase 2 + 3 into one message. - If user front-loads everything in one message → acknowledge, ask only about gaps, then call plan_trip. - Maximum 4 exchanges before calling plan_trip. After that, use sensible defaults. - Minimum to call: destination + dates/duration + at least one vibe signal (style, interests, or pace). - If user says "just do it" or "surprise me" → call plan_trip with what you have. CALLING plan_trip: Pass EVERYTHING you learned into initial_context — destination, dates, duration, who's coming, vibe, style, pace, budget, interests, must-sees, limitations. Include exact quotes from the user. The more detail, the better the itinerary. RULES: - Do NOT call plan_trip with only a destination and nothing else. - Do NOT ask questions the user already answered. - Do NOT write a day-by-day itinerary in chat — the widget handles that. - Do NOT use plan_trip to CHANGE an existing trip — use refine_trip instead. EXAMPLE: plan_trip({ "initial_context": "5-day trip to Tokyo, April 10-15, couple. Vibe: relaxed mornings, packed afternoons. Style: food + culture. Interests: ramen, cherry blossoms, temples, Shibuya nightlife. Budget: moderate. Must-see: Tsukiji outer market. User said: 'we love finding tiny ramen spots locals go to'." })
plan_trip
ChatGPTUse this when the user wants to plan a NEW trip. It opens the Travel Vibes scratchpad widget and renders the itinerary YOU provide. IMPORTANT — YOU write the itinerary. Do not expect our backend to generate it. Compose the COMPLETE itinerary yourself as TipTap-compatible HTML and pass it in the itinerary_html field; the widget renders it exactly as given. DEFAULT TO CALLING IT. The instant a destination is present and the user wants a trip there, call plan_trip — do NOT interview them first, and do NOT paste the itinerary into chat instead of calling the tool. TRIGGER plan_trip when BOTH hold: 1. a destination is present — a city, country, region, or park; AND 2. the user wants a trip/itinerary for it — a trip framing ("plan…", "trip to…", "X days in…", "weekend in…") OR a brief pairing the destination with trip attributes (duration, dates, who's going, interests, vibe). "Plan a trip to Tokyo" counts. Use sensible defaults for anything unspecified (dates, length, vibe, budget). Speed is the priority — produce a complete, polished first version in one call. The ONLY thing you ever ask first: - If there is NO destination at all ("help me plan a trip", "I want a holiday somewhere") → ask the single question "Where would you like to go?". As soon as they name a place, build it and call plan_trip. Never ask about dates, vibe, or budget before calling. Never run a multi-step questionnaire. WHEN NOT TO CALL plan_trip: - Destination brainstorming ("Where should I go?", "Best places for X") → suggest options in chat, don't trigger. - Travel facts / weather / visas / currency → answer in chat. A place named inside a factual question is NOT planning intent. - User already has a trip in this conversation and wants to MODIFY it → editing an existing trip is not available in ChatGPT yet. Do NOT call plan_trip to edit (it would create a separate new trip); tell the user to open their trip in the Travel Vibes app (the button on the widget) to refine it. === HOW TO BUILD itinerary_html === Output ONE self-contained HTML document (compact HTML, NOT markdown). Use ONLY these tags: h1, h2, h3, p, strong, em, ul, ol, li, table, colgroup, col, tbody, tr, th, td, br, span. For tickable checklists also use <ul data-type="taskList"> with <li data-type="taskItem"> + <label>/<input type="checkbox">/<div> (see Styling rules). Inline style is allowed ONLY for status colors / colored text via the CSS vars below. DO NOT include: <img> or photos, map blocks (<div data-node-type="mapBlock">), data-entity-id attributes, <script>, <style>, class attributes, or TipTap artifacts (no data-id, no default colspan/rowspan). Photos and maps are added later inside the app — omit them. Styling rules (match EXACTLY — TipTap keeps styles ONLY where shown): - Center the title, the date/route line, and the legend — put style="text-align: center;" on those <h1>/<p>. - Section headings in blue: <h1><span style="color: var(--tt-color-text-blue);">ACCOMMODATION</span></h1> - Status color goes on EACH <td>/<th> CELL, NEVER on <tr> (row-level color is dropped by the editor): - booked: <td style="background-color: var(--tt-color-highlight-green);"><p>…</p></td> - needs booking: <td style="background-color: var(--tt-color-highlight-red);"><p>…</p></td> - Wrap every table cell's content in <p>…</p> (e.g. <th><p>Dates</p></th>, <td><p>Apr 10</p></td>). - Colored text: <span style="color: var(--tt-color-text-blue);">…</span> (also -red, -gray, -green) - Tickable checklist (for the PACKING LIST): <ul data-type="taskList"><li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label><div><p>Item text</p></div></li></ul> STRUCTURE (in this order): 1. <h1> trip title </h1> 2. <p> date range | duration | route </p> 3. <p> Legend: GREEN = booked, RED = needs booking </p> 4. Logistics (only the relevant ones): <h1>FLIGHT INFO</h1> / <h1>ACCOMMODATION</h1> / <h1>BOOKING CHECKLIST</h1> — each a <table> with a header row (<th>) and data rows (<td>); use a placeholder "…" row when the user gave no data; color the CELLS by status (see Styling rules — col…
plan_trip
ChatGPTUse this when the user wants to plan a NEW trip. It opens the Travel Vibes scratchpad widget and renders the itinerary YOU provide. IMPORTANT — YOU write the itinerary. Do not expect our backend to generate it. Compose the COMPLETE itinerary yourself as TipTap-compatible HTML and pass it in the itinerary_html field; the widget renders it exactly as given. DEFAULT TO CALLING IT. The instant a destination is present and the user wants a trip there, call plan_trip — do NOT interview them first, and do NOT paste the itinerary into chat instead of calling the tool. TRIGGER plan_trip when BOTH hold: 1. a destination is present — a city, country, region, or park; AND 2. the user wants a trip/itinerary for it — a trip framing ("plan…", "trip to…", "X days in…", "weekend in…") OR a brief pairing the destination with trip attributes (duration, dates, who's going, interests, vibe). "Plan a trip to Tokyo" counts. Use sensible defaults for anything unspecified (dates, length, vibe, budget). Speed is the priority — produce a complete, polished first version in one call. The ONLY thing you ever ask first: - If there is NO destination at all ("help me plan a trip", "I want a holiday somewhere") → ask the single question "Where would you like to go?". As soon as they name a place, build it and call plan_trip. Never ask about dates, vibe, or budget before calling. Never run a multi-step questionnaire. WHEN NOT TO CALL plan_trip: - Destination brainstorming ("Where should I go?", "Best places for X") → suggest options in chat, don't trigger. - Travel facts / weather / visas / currency → answer in chat. A place named inside a factual question is NOT planning intent. - User already has a trip in this conversation and wants to MODIFY it → editing an existing trip is not available in ChatGPT yet. Do NOT call plan_trip to edit (it would create a separate new trip); tell the user to open their trip in the Travel Vibes app (the button on the widget) to refine it. === HOW TO BUILD itinerary_html === Output ONE self-contained HTML document (compact HTML, NOT markdown). Use ONLY these tags: h1, h2, h3, p, strong, em, ul, ol, li, table, colgroup, col, tbody, tr, th, td, br, span. For tickable checklists also use <ul data-type="taskList"> with <li data-type="taskItem"> + <label>/<input type="checkbox">/<div> (see Styling rules). Inline style is allowed ONLY for status colors / colored text via the CSS vars below. DO NOT include: <img> or photos, map blocks (<div data-node-type="mapBlock">), data-entity-id attributes, <script>, <style>, class attributes, or TipTap artifacts (no data-id, no default colspan/rowspan). Photos and maps are added later inside the app — omit them. Styling rules (match EXACTLY — TipTap keeps styles ONLY where shown): - Center the title, the date/route line, and the legend — put style="text-align: center;" on those <h1>/<p>. - Section headings in blue: <h1><span style="color: var(--tt-color-text-blue);">ACCOMMODATION</span></h1> - Status color goes on EACH <td>/<th> CELL, NEVER on <tr> (row-level color is dropped by the editor): - booked: <td style="background-color: var(--tt-color-highlight-green);"><p>…</p></td> - needs booking: <td style="background-color: var(--tt-color-highlight-red);"><p>…</p></td> - Wrap every table cell's content in <p>…</p> (e.g. <th><p>Dates</p></th>, <td><p>Apr 10</p></td>). - Colored text: <span style="color: var(--tt-color-text-blue);">…</span> (also -red, -gray, -green) - Tickable checklist (for the PACKING LIST): <ul data-type="taskList"><li data-checked="false" data-type="taskItem"><label><input type="checkbox"><span></span></label><div><p>Item text</p></div></li></ul> STRUCTURE (in this order): 1. <h1> trip title </h1> 2. <p> date range | duration | route </p> 3. <p> Legend: GREEN = booked, RED = needs booking </p> 4. Logistics (only the relevant ones): <h1>FLIGHT INFO</h1> / <h1>ACCOMMODATION</h1> / <h1>BOOKING CHECKLIST</h1> — each a <table> with a header row (<th>) and data rows (<td>); use a placeholder "…" row when the user gave no data; color the CELLS by status (see Styling rules — col…
refine_trip
ChatGPTUse this when the user wants to change, update, or improve an EXISTING trip that was already created with plan_trip. WHEN TO CALL: - User asks to add, remove, or change anything in their trip - User wants different restaurants, activities, hotels, or timing - User says "make it more X" or "less Y" or "swap Z" - User provides new constraints (budget, dates, pace) - User asks "can you add..." or "what about..." regarding their trip WHEN NOT TO CALL: - User wants a completely NEW trip to a different destination → use plan_trip instead - User asks a general travel question not about modifying their trip → answer directly in chat - User is just chatting, saying thanks, or asking about what's in the widget → respond normally HOW TO CALL: Pass the user's exact words in the message field. The trip assistant will interpret the request, look up real places, and edit the itinerary. You do NOT need to restructure or rephrase — pass the request as-is. IMPORTANT: This tool dispatches the request asynchronously. The itinerary updates in the widget via real-time sync. You will NOT see the result in the tool response — the widget handles rendering. EXAMPLE: refine_trip({ "trip_id": "abc-123", "message": "Add more ramen spots in Shibuya and swap the temple on day 3 for a day trip to Kamakura" })