get-filters
ChatGPTFetch available filter options for venue searches. Returns a list of valid values that can be passed to search-venues as propertyTypes, amenities, or environments filters. Call this before presenting filter options to the user via ask-user-questions (if available).
help-get
ChatGPTFetch the full content of a help article by its slug. Call help-list first to pick the right slug. You may (and should) call help-get multiple times in parallel within the same turn when several articles appear relevant to the user's question. Help articles are INTERNAL REFERENCE ONLY — use the returned content to compose your own concise answer. NEVER link to the article itself, NEVER mention the article by title or filename, and NEVER offer to "share the help doc" or "walk through the article". The user should not know an article was consulted. Answer using ONLY the returned content — do not invent steps, pricing, policies, or links. Links that appear INSIDE the article body (e.g. a contact form URL the article points to) MAY be surfaced to the user, formatted as markdown [text](url); never use relative links, never fabricate slugs or URLs.
help-list
ChatGPTList all help-article metadata (title, slug, whenToUse, exampleQuestions, tags) without full content. Use this as the FIRST step whenever the user asks about how the platform works, the retreat booking flow, proposals, contracts, payments, company policies, account/billing, or wants to contact support or talk to a human. Always call this before help-get. Flow: 1. Call help-list to retrieve all article metadata. 2. Match the user's intent against each article's title, whenToUse, and exampleQuestions. Select ALL articles that plausibly apply — it can be more than one. 3. Call help-get for each selected article. When multiple articles are relevant, call help-get in parallel within the same turn. 4. Answer using the fetched article content as context. NEVER use relative links; NEVER invent links, slugs, or steps.
lookup-city-coverage
ChatGPTPreview how many published venues match each city term, before calling search-venues with a regional (multi-city) search. WHEN TO USE: - Before calling search-venues with 2+ cities for a region (e.g., "Amalfi Coast", "Scottish Highlands"). - NOT needed when the user names a single specific city and you intend to search that city directly. INPUTS — CRITICAL: Pass the SAME hard filters you plan to pass to search-venues (minBedrooms, maxBedrooms, minMeetingSpaces, maxPrice, maxTimeToAirportMinutes, state, countryCodeIso2). If you pass fewer filters here than to search-venues, counts will OVERSTATE reality and you'll mis-gate. Example failure: user asks for 40+ bedroom venues in southern Italy — if you call this tool with only cities, totalCount looks healthy, but search-venues with minBedrooms=40 may return only 1 result. Do NOT pass amenities, propertyTypes, environments or minPrice — these are soft signals in search-venues (ranking boosts, or in the case of minPrice a soft floor that auto-relaxes when results are thin), so they don't constrain the matching set and are not accepted here. WORKFLOW: 1. Call this tool with your FULL planned filter set (cities + all hard filters). 2. Inspect 'totalCount'. 3. If 'totalCount' < 5 (the 'belowThreshold' flag is true), expand the city list with more cities in that region and call this tool again. 4. If still < 5 after expansion, broaden: drop the state filter, or widen to neighboring regions / country-level search when you call search-venues. 5. Once 'totalCount' >= 5, call search-venues with your final payload.
recommend-destinations
ChatGPTRecommend destination countries for a group retreat, scored by budget, safety, visa-friendliness, accommodation cost, and optionally travel distance. Call this tool when the user wants help choosing a destination country (not a specific venue). ALSO call it whenever the user asks about venues but has NOT named a specific country (e.g. "find me a venue", "a beachfront villa for 20 people", "somewhere warm for our team") — destination must be resolved before search-venues can run. Vibe, group size, budget, and climate hints alone are not destination signal. Before calling: Use ask-user-questions to gather any missing inputs — climate preference (tempRange), origin countries (originGroups), and travel months (travelMonth). Only ask for what the user hasn't already provided. If the user gave specific countries, use those. If the user gave a vague regional answer (e.g. "Mostly Europe", "global", "Asia"), resolve it to 3–5 populous countries in that region with headcount=1 each — see the assistant prompt for preset mappings. Only OMIT originGroups when the user skipped the origin question entirely (no answer at all). Never error out or re-ask just because an answer was regional rather than country-specific. After presenting results: Briefly mention the user can adjust the priority weights using the "Adjust priorities" button below the results to refine recommendations. If the user picks a destination, use search-venues to find venues in that country. Do NOT list country names — the UI renders destination cards automatically. Country filtering: When the user wants to exclude or restrict countries/regions, you MUST call this tool again immediately with the updated filters — do NOT just acknowledge in text. Use the same tempRange, originGroups, and travelMonth as the previous call, plus the new country filters. To exclude (e.g. "no Asia", "not Australia", "I don't want to go to Europe"), resolve the geographic reference to ISO2 codes and pass as excludeCountries. To restrict (e.g. "only Europe", "just Southeast Asia"), resolve to ISO2 codes and pass as includeCountries. Be comprehensive — include all countries in the referenced region. Priority adjustments: Recommendation priority weights are owned by the user via the "Adjust priorities" radar chart in the UI — they are NOT a parameter of this tool. When the user message starts with "Adjust recommendation weights::", they have updated their priorities through the UI. Call this tool again, carrying forward the previous tempRange, originGroups, travelMonth, excludeCountries, and includeCountries — the backend will apply the user's saved priorities automatically. After receiving re-weighted results, compare with the previous results: if the same countries appear in the same order, note that the match percentages have shifted based on the new priorities. If different countries appear or the order changed, highlight what's new or what moved up/down. If the user asks in plain text to change recommendation priorities (e.g. "make budget more important", "I care more about safety", "weight visa access higher"), do NOT call any tool to express that change. Briefly tell the user they can adjust priorities using the "Adjust priorities" button below the country recommendations.
search-venues
ChatGPTPREREQUISITE: countryCodesIso2 must contain at least one specific country. If the user has not named a country (or has only mentioned a continent/broad region like "Europe" or "Southeast Asia" without committing to specific countries), call recommend-destinations first to help them pick — never call this tool with no country, with a guessed country, or to "search broadly". Vibe, group size, budget, and climate hints alone are not destination signal. ALWAYS call lookup-city-coverage before this tool when using the cities parameter. 1. Call lookup-city-coverage with the same cities AND all filters you plan to pass here. 2. Call this tool only after coverage is acceptable. Search for retreat venues by parameters. Returns matching venues with details including links, photos, and pricing. If you have access to search-venues-map, prefer that tool instead — it provides the same results plus an interactive map. Multi-country searches: countryCodesIso2 accepts up to 5 ISO codes (e.g. ["PT","ES"]). When more than one country is provided, state and cities MUST be omitted — passing them returns error: "MULTI_COUNTRY_WITH_LOCALE" with no results. If the user mentions a specific city or state, narrow countryCodesIso2 to just that one country instead. Skip lookup-city-coverage for multi-country calls. The search automatically broadens ONLY on the first page if no results are found (e.g., dropping city/state filters). Check the "broadenedTo" field in the response — if present, inform the user the search was broadened AND do not paginate further (pagination is disabled for broadened results). Price floor relaxation: when minPrice is set and the initial result set is sparse, the search automatically supplements with venues priced below the floor. Check the "priceFloorRelaxedTo" field in the response — if present, you MUST tell the user the price floor was loosened so they understand why some results are below their stated minimum. Use language like "I had to loosen the price range — there weren't enough venues at $X+/night, so I included some priced below that". Values: "halved" means venues down to minPrice/2 were included; "removed" means the floor was dropped entirely (any price up to maxPrice). Pagination is disabled when this fires — do not paginate further. Environments: Use environments to express soft preferences like "beachfront" or "mountain". Matching venues rank higher but all results are still returned. Call get-filters with filterType "environments" to see available options. Amenities and propertyTypes: Same soft-preference behavior as environments — use them to express what the user is hoping for (e.g., "pool", "sauna", or "villa", "boutique hotel"). Matching venues rank higher but venues missing some of the requested amenities or property types are still returned. Call get-filters with filterType "amenities" or "property_types" to see available options. Results are sorted by best match (deterministic). Sorting by specific fields (price, rating, etc.) is not supported. Pagination: - The response includes pagination: { page, totalPages, totalCount, hasNextPage }. - If hasNextPage is true the response also includes a searchToken. - To fetch more results for the SAME search (user asks "more", "show more", "next", "other options"): call again with page: previousPage + 1, pass the searchToken from the previous response, and keep EVERY other filter IDENTICAL. - Any filter change (cheaper, different country, extra amenity, etc.) is a refinement — start over with page: 1 and no searchToken. - If broadenedTo or priceFloorRelaxedTo is set, or hasNextPage is false, do not call with page > 1. - If the response contains error: "PAGINATION_TOKEN_MISMATCH": retry once using the expectedToken from the error and the same filters. Do not mention the error to the user.
search-venues-map
ChatGPTThis is the preferred tool for venue searches — always use this over search-venues unless explicitly asked for a text-only response. Search for retreat venues and render an interactive map in a single call. Accepts the same search filters as search-venues and returns map-ready venue data with coordinates plus a shareable collection link. Multi-country searches: countryCodesIso2 accepts up to 5 ISO codes (e.g. ["PT","ES"]). When more than one country is provided, state and cities MUST be omitted — passing them returns error: "MULTI_COUNTRY_WITH_LOCALE" with no results. If the user mentions a specific city or state, narrow countryCodesIso2 to just that one country instead. Skip lookup-city-coverage for multi-country calls. The search automatically broadens if no results are found (e.g., dropping city/state filters). Check the "broadenedTo" field in the response — if present, inform the user the search was broadened. Bedroom mapping: When a user says "a venue for X people" or "X guests", treat that number as minBedrooms if the number of bedrooms is not explicitly provided.