Skip to content
Nupgrade

AI trip planner and directory

Multilingual AI travel guide

A traveller describes the trip they want in ordinary language and gets a day-by-day draft built from a searchable directory of places, with every price labelled as an estimate.

A traveller should be able to say what they want, in their own words, and get a plan that respects practical limits: days, budget, interests and how far apart things are.

This project joins a searchable directory of places to AI-assisted planning. Requests can arrive in several languages, and the result is a draft a person can read, question and change, not a booking.

The problem

Travel assistants invent places, opening hours and prices. A planner people can act on has to be grounded in data someone has checked, and honest about what is only an estimate.

What the system does

  • Natural-language search and day-by-day planning that groups places by area and allows for travel time.
  • Requests in English, French, Arabic and Darija, handled by the same planner.
  • A directory where each listing keeps where its details come from and when they were last checked. No paid ranking.
  • A data pipeline from open data into PostGIS, deduplicated and validated before anything reaches the planner, with hybrid keyword and vector retrieval.

A representative journey

  1. Step 1: Describe the tripThe traveller writes how many days, what they enjoy and a rough budget, in any supported language.
  2. Step 2: Retrieve candidatesKeyword and vector search return places from the directory that fit the request. Nothing outside it is offered.
  3. Step 3: Assemble a draftPlaces are grouped by area, so a day is not spent crossing the country. Travel time is allowed for.
  4. Step 4: Show sources and estimatesEach item shows where its details came from, when they were checked and which prices are estimates.
  5. Step 5: RefineThe traveller swaps a place, changes the budget or drops a day, and the plan is rebuilt from the same directory.

The traveller's brief

Darija / FR / EN

“4 days, we like old cities and quiet places, about 8,000 MAD in total.”

«أربعة أيام، نحب المدن القديمة والأماكن الهادئة»

Days
4
Interests
History, quiet
Budget
~8,000 MAD

Candidates come from the checked directory only. Source and last-checked date shown for each.

Example itinerary

6-day draft, first 4 days shown

~8,200 MAD est.

  1. 1Marrakech: medina and souksWalking tour0 MAD
  2. 2Aït Benhaddou and the AtlasShared driver~900 MAD
  3. 3Sahara: camel and campDesert package~1,400 MAD
  4. 4Fès: the old medinaTrain, 2nd class~120 MAD
Illustrative figures, not a quoteEstimates are labelled
Concept view: itinerary draft. Illustrative, with authored synthetic data. It is not a screenshot of a real system, and no real person, client, record or result appears in it.

Inspect the system

Inspect the system

How Multilingual AI travel guide is put together

What it is
Open data and checked sourcesThe raw place data the directory starts from.
What flows through it
Public data comes in. Each record keeps where it came from and when it was last checked.
The decision
Every listing shows its source and last-checked date, so a reader can judge it.
Read the whole system as a list
  1. Open data and checked sources. The raw place data the directory starts from. Flow: Public data comes in. Each record keeps where it came from and when it was last checked. Decision: Every listing shows its source and last-checked date, so a reader can judge it.
  2. Data pipeline. Loads the open data into PostgreSQL with PostGIS for location queries. Flow: Raw records go in. Deduplicated, validated records come out. Decision: Nothing reaches the planner until it has been deduplicated and validated.
  3. Hybrid retrieval. Keyword and vector (pgvector) search over the directory. Flow: A traveller's request goes in. Candidate places from the directory come out. Decision: Combine keyword and vector search, so exact names and loose descriptions both find places.
  4. Day-by-day planner. Turns a natural-language request into a day-by-day draft. Flow: Days, budget and retrieved places go in. A draft grouped by area, with travel time allowed for, comes out. Decision: AI proposes, sources decide: the planner works from the directory, not from memory.
  5. Price estimates. The prices shown next to a plan. Flow: Estimated costs are attached to plan items and shown to the traveller. Decision: Every price is labelled as an estimate, never a quote.

Key decisions

  • Plan from the directory, not from memory

    The planner may only use places that exist in the checked directory. A model that is allowed to improvise will eventually invent an opening hour.

  • Hybrid retrieval

    Exact names need keyword search; loose descriptions need vectors. Using both lets “the blue gate near the tanneries” and a precise listing name find the same place.

  • Label estimates as estimates

    A price shown as a quote that turns out wrong costs more trust than a range that says it is a range.

Outcomes and limits

We publish no measured outcomes for this project, because we have none we can evidence. The description above is of what the system does, not of results it has produced.

  • Prices are estimates, not quotes, and the planner does not book anything.
  • The exact set of supported languages and the quality in each have not been independently evaluated here.
  • We publish no traffic, usage or directory-size figures for this project.

Guardrail

AI proposes, sources decide. The planner works from the directory and labels every price as an estimate, never a quote.

Technical detail

Technology behind this project.

  • Node.js
  • PostgreSQL / PostGIS
  • pgvector
  • Ollama
  • Next.js

One question

Which manual process currently takes the most time from your team?

Answer in a sentence or two. An engineer replies with where we would start, what it takes and what we would not automate.