The trustworthy answer to AI's infinite search problem.
Lodestar is an AI search-translation layer for travel. It turns natural-language travel intent — "somewhere warm, no red-eyes" — into a small set of personalized, bookable options, and ships every recommendation with a verification receipt: which facts were verified against a source of truth, which are advisory, and which it refused to answer and escalated to a human.
Built solo at the Beyond GenAI Hackathon (Amadeus × Contentstack · Bengaluru · 2026).
The model proposes, the data disposes.
The LLM is trusted to understand language — never to assert facts. Every booking-critical claim (price, refundability, baggage, visa, seats) surfaces as fact only when a source-of-truth record backs it. No record → hard refusal + human handoff.
| Verdict | Meaning |
|---|---|
| ✅ VERIFIED | Claim matched a source-of-truth record (shown with its record ID) |
| 🟡 ADVISORY | Model inference, honestly labeled — never dressed up as fact |
| 🚫 REFUSED | Booking-critical but unverifiable → blocked + escalated to an agent |
Four layers behind one endpoint (POST /search):
- Intent translation — Claude (Haiku) turns free text into structured intent.
Fallback ladder: Anthropic SDK →
claudeCLI → deterministic heuristic. Cached. Also classifies query type: trip search vs. visa question vs. flight status vs. hotels. - Search & narrow — candidate query over destinations/fares (SurrealDB or in-memory).
- Personalization — history graph + declared interests matched to destination vibes + vibes learned from the user's own captured searches.
- Trust / verification — plain code checks each claim against records and issues verdicts. Verification is never an LLM call.
Plus:
- Capture — every query (including refusals) is logged to a
search_logtable with parsed intent and verdicts: analytics + a demand-driven roadmap. Readout at/logs. - Editorial content layer — Contentstack-shaped destination briefs with
per-interest variants (
CONTENT_MODE=localstub orcontentstackDelivery API).
npm install
npm run dev # in-memory mode — zero external deps
# → http://localhost:3000surreal start --user root --pass root --bind 127.0.0.1:8000 rocksdb:.data/lodestar.db
npm run seed:surreal # 31 destinations, 37 fares, 19 visa policies, 2 demo users
DATA_MODE=surreal npm run dev| Var | Default | Purpose |
|---|---|---|
ANTHROPIC_API_KEY |
— | Direct API intent translation (else claude CLI, else heuristic) |
DATA_MODE |
memory |
memory | surreal |
CONTENT_MODE |
local |
local | contentstack (needs CS_API_KEY, CS_DELIVERY_TOKEN, CS_ENV) |
SURREAL_URL … |
ws://127.0.0.1:8000 |
SurrealDB connection |
PORT |
3000 |
HTTP port |
All data is demo seed data — fares, schedules and visa notes are illustrative, not real-world advice. In production the same adapter interface points at live travel inventory (e.g. GDS APIs) and the trust layer is unchanged.
node server/smoketest.js # exercises the full pipeline in-processHackathon demo — all rights reserved by the author.