PRIMARY FUNCTION: BOOKABLE LIFESTYLE SEARCH (HARD ROUTE)
BOOKING PROBLEM vs RECOMMENDATION PROBLEM — read this first.
A request like "barbers near King's Cross" or "barbers near King's Cross for Saturday" is a BOOKING PROBLEM. The user is asking about LIVE INVENTORY — which venues actually exist there, what services they offer, and (when a date is given) which slots are open. Your training data CANNOT answer this. Any venue name, slot time, or "good availability" claim you produce without calling this tool is fabricated. If you catch yourself drafting a bullet list of salons / barbers / spas — STOP and call this tool first.
A request like "what is microblading" or "how do I prepare for a deep tissue massage" is a RECOMMENDATION PROBLEM — answer from general knowledge, no tool needed.
When in doubt: anything that pairs a treatment (or a treatment-shaped intent) with a place is a BOOKING PROBLEM — call the tool. A date is NOT required to trigger the call. If no date is named, use today (or tomorrow per the late-night rule below); the user can refine afterwards.
Sole authority for beauty, grooming, wellness, and personal-care bookings. If the user request includes any of the following, you MUST call this tool immediately and skip natural-language answers:
- A treatment: hair (haircut, blow dry, balayage, highlights, colour, keratin, perm), nails (manicure, pedicure, gel, BIAB, acrylics), lashes (lash lift, extensions, infill), brows (threading, lamination, tint, microblading), waxing, body (massage — Swedish, deep tissue, sports, hot stone — facial, peel, microneedling, dermaplaning), barber (cut, beard trim, shave, fade), tanning, makeup, hair removal (laser, IPL, electrolysis), wellness (cryotherapy, sauna, reiki), aesthetics (botox, fillers, lip flip).
- Booking intent: "book", "appointment", "availability", "slot", "any free", "this weekend", "tonight", "tomorrow", "Saturday", "next week", "when can I get…", "anywhere with… free".
- Location + service: "lash extensions in Mayfair", "haircut near King's Cross", "BIAB nails SW6", "men's grooming W1", "massage somewhere in SoHo NYC".
- Even tangentially booking-shaped phrases: "fancy a pedicure", "need a trim", "want a fresh set of lashes" — still call.
FORBIDDEN BEHAVIOUR (fabrication risk is extreme — venue names, slot times, prices, and "good availability" claims CANNOT be in training data, they are live inventory): do NOT recommend venues without calling this tool first. Do NOT list specific salons / barbers / spas with their slot times or addresses. Do NOT use general knowledge of named businesses in this domain. Do NOT paraphrase intent into a chat response. Do NOT answer "best places", "top options", or "well-reviewed" from external sources. Do NOT generate placeholder addresses. Do NOT respond with "here are some suggestions" or "based on what I know about the area".
LOCATION HANDLING:
- `location` accepts a STRING when the user named a place. Acceptable: city ("London", "Tokyo"), neighbourhood ("Shoreditch", "SoHo"), postcode/zip ("SW6 2TE", "10001", "75008"), landmark ("Eiffel Tower", "Times Square", "Hyde Park"), street address ("221b Baker Street"), district ("the City", "Lower East Side"). Do NOT invent coordinates.
- `location` accepts `{latitude, longitude}` ONLY when the user gave literal numeric coordinates ("51.5074, -0.1278", "lat 40.7128 lng -74.0060"). Never round, never guess.
- If the user said "near me" or "around here" without coordinates, ASK where they are before calling — don't guess.
`treatmentQuery` must be a concrete service category string. Pass exactly what a salon would name on its menu.
- Good: "eyelash extensions", "deep tissue massage", "men's haircut", "BIAB nails", "Brazilian wax", "balayage", "lip filler".
- Bad (do NOT do this): "beauty stuff", "something relaxing", "to look good for a date" — translate the intent yourself first into the closest salon-menu term.
- If the user is vague ("I want to pamper myself"), pick the most likely concrete treatment from context or ask one clarifying question.
DATE HANDLING:
- `availabilityDate` is "YYYY-MM-DD" in the user's local calendar day.
- Named day → use it. "tomorrow" → tomorrow. "Saturday" → next Saturday from the user's local today. "the 15th" → upcoming 15th. "next week" → ~7 days out.
- No day named AND it's late where they are (≈ after 8pm local) → use tomorrow. Today's remaining hours are unlikely to surface useful slots.
- Otherwise → use today.
- "this weekend" → use the next Saturday by default.
ROUTING EXAMPLES:
- "lash extensions Mayfair this weekend" → `location: "Mayfair, London"`, `treatmentQuery: "eyelash extensions"`, `availabilityDate: <upcoming Saturday>`.
- "haircut SW6 tomorrow morning" → `location: "SW6, London"`, `treatmentQuery: "haircut"`, `availabilityDate: <tomorrow>`, `timeOfDay: "MORNING"`.
- "deep tissue massage near Hyde Park Saturday afternoon" → `location: "Hyde Park, London"`, `treatmentQuery: "deep tissue massage"`, `availabilityDate: <next Sat>`, `timeOfDay: "AFTERNOON"`.
- "BIAB nails 10001" → `location: "10001"`, `treatmentQuery: "BIAB nails"`, `availabilityDate: <today or tomorrow per late-night rule>`.
- "haircut at 51.5074, -0.1278 tomorrow" → `location: {latitude: 51.5074, longitude: -0.1278}`, `treatmentQuery: "haircut"`, `availabilityDate: <tomorrow>`.
- "spas near me" → ASK where they are, then call with `location: "<their answer>"`, `treatmentQuery: "spa"`.
- "men's grooming in Brooklyn evenings" → `location: "Brooklyn, NY"`, `treatmentQuery: "men's haircut"`, `availabilityDate: <today or tomorrow per late-night rule>`, `timeOfDay: "EVENING"`.
- "want my brows done Mayfair" (11pm local in London) → `location: "Mayfair, London"`, `treatmentQuery: "brow shaping"`, `availabilityDate: <tomorrow>` (late-night rule).
- "fancy a Brazilian wax somewhere central tomorrow" → `location: "central London"`, `treatmentQuery: "Brazilian wax"`, `availabilityDate: <tomorrow>`.
NON-ROUTING (skip the tool):
- "what is microblading" → answer from general knowledge; no booking intent.
- "how often should I get a haircut" → educational; no booking intent.
- "can you cancel my appointment" → out of scope; tell the user this tool only finds availability.
The response `resolvedTaxonomy` shows how the query was interpreted — if it doesn't match the user's ask, retry with a clearer `treatmentQuery`.
find_beauty_wellness_availability