A personal AI travel guide. Type a destination and it researches YouTube videos, travel blogs and social posts, then presents the results as cards: top attractions, hidden gems, food, places to stay, activities and festivals — each with a photo (Wikimedia Commons) and links to the sources it came from.
Built with a CrewAI Flow orchestrator and a Groq-powered LLM. Research is gathered by plain Python search calls (no LLM) and synthesized by a single Groq JSON-mode call, which avoids the fragile server-side function-call validation seen with multi-agent tool use. 100% free-tier stack, no payment required.
backend/ FastAPI + CrewAI (Python)
frontend/ React + Vite (JS)
cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txtThe only key required to run the app is Groq (free at https://console.groq.com):
Copy-Item .env.example .envThen open backend/.env and set:
GROQ_API_KEY=your_groq_api_key_here
Optional keys (skip them and the app still works with fallbacks):
| Variable | What it enables | If empty |
|---|---|---|
TAVILY_API_KEY |
Better web search (free, 1,000/mo at https://tavily.com) | Falls back to DuckDuckGo |
YOUTUBE_API_KEY |
YouTube video search + transcripts | YouTube research skipped gracefully |
GROQ_MODEL |
Override model | Defaults to groq/openai/gpt-oss-20b |
cd frontend
npm installTwo terminals, from the project root.
Terminal 1 — backend (http://127.0.0.1:8000):
cd backend
.\.venv\Scripts\Activate.ps1
python run.pyTerminal 2 — frontend (http://localhost:5173):
cd frontend
npm run devOpen http://localhost:5173, type a destination, and hit Build guide. A run takes 1–2 minutes; progress is shown live.
| Method | Path | Description |
|---|---|---|
| GET | /health |
Service + key status |
| POST | /api/guide |
{"query": "Bali"} → starts research, returns {"guide_id": "..."} |
| GET | /api/guide/{id} |
Poll status/steps/result |
| GET | /api/images?q=... |
Look up a Wikimedia image for a name |
GuideFlow (CrewAI Flow) is the orchestrator:
- query_parser — one Groq JSON-mode call extracts destination + focus
- research — plain Python, no LLM: DuckDuckGo/Tavily web searches, Reddit search, and (if a key is set) YouTube transcripts; each hit keeps its real source URL
- aggregate — a single Groq JSON-mode call builds the categorized
GuideResponsefrom the raw research text (never invents places or URLs) - images — Wikimedia Commons resolution per place (no LLM)
- All services used are free tier: Groq (free plan), Tavily (1,000/mo) or DuckDuckGo (keyless), YouTube Data API (daily quota), Wikimedia Commons (free).
- Results are stored in-memory per run (no database).
- Set
GROQ_MODELif you want a different model. The model must support JSON mode (response_format json_object). Verified models:groq/openai/gpt-oss-20b(8k tokens/min, 200k tokens/day) andgroq/llama-3.3-70b-versatile(12k tokens/min, 100k tokens/day — higher quality, faster daily budget). The app retries throttled calls with backoff, so it also works when a minute budget is briefly exceeded.