Inspiration
Singapore's hawker culture is iconic but discovering the best stall for a specific dish is surprisingly hard. Google Maps shows overall ratings — not whether a stall's laksa specifically is good. I wanted a recommendation system that actually understands dish-level quality from real reviews.
What it does
HawkerHero is an AI-powered hawker food concierge. Users can search by dish, location, or MRT station and get results ranked by aspect-based sentiment scores & how many reviewers specifically praised that dish at that dish/stall. The agent also plans multi-stop food routes, handles dietary and timing constraints, detects conflicting requirements before searching, and verifies stalls are still operating via live web search.
How we built it
I scraped and indexed 6,500 hawker reviews into Elasticsearch Cloud, running PyABSA to extract dish-level sentiment into nested ABSA fields. A FastAPI backend on Cloud Run handles complex Query DSL aggregations that score each stall per dish, the score accounts mentions of user's search/dish term mentioned, whether it was recommended in google reviews, how positive the sentiment was etc.
An ADK agent powered by Gemini 3 orchestrates four tools — our FastAPI search API, Elastic MCP via Kibana Agent Builder for location queries,generic hawker information, as well as Google Search for live verification. The agent is deployed on Cloud Run with the ADK dev UI.
Tools
FastAPI backend deployed on Google Cloud Run - dish and stall rankings based on user prompt
Elastic MCP tools --- get_hawker_info — fetches centre details, rating, and coordinates by name get_top_rated — returns the 5 highest rated hawker centres nearest_hawkers — finds centres within a radius using ST_DISTANCE geo queries
Web search-- for live data such as opening and closing time, crowd conditions
Challenges we ran into
Initial unfamiliarity to Elasticsearch syntax .
Mixing Google Search with custom tools required switching to Gemini 3 Flash Preview since earlier models don't support tool combination. Cloud Run environment variables were overriding our .env settings, causing the Vertex AI location to default to asia-southeast1 instead of the global endpoint required for Gemini 3.
Accomplishments that we're proud of
Building a genuinely differentiated ranking signal — dish-level ABSA sentiment is more meaningful than star ratings and no existing Singapore food app does this. The multi-stop meal planning feature reasons across location, dietary constraints, and dish variety simultaneously, validates stops geographically, and outputs a clickable Google Maps route. End-to-end deployment with two partner integrations (Elastic MCP + Google ADK) working together in production.
What we learned
Elasticsearch Query DSL's nested aggregations are quick and powerful for complex sentiment scoring and data aggregations. ES|QL is great and fast for simple lookups and queries. They combine well to provide insightful ideas from data. This shaped the architecture: FastAPI owns the complex ABSA scoring via Query DSL, while Elastic MCP handles simpler ES|QL queries like location search and metadata lookup.
ADK's OpenAPI toolset makes connecting REST APIs to agents remarkably straightforward once the spec is correctly configured. Gemini 3's ability to mix built-in and custom tools opens up genuinely new agent architectures that weren't possible with earlier models.
What's next for HawkerHero
- MongoDB memory layer for personalised recommendations based on past searches
- Crowd level live integration
- User-saved lists and favourite stalls across sessions
- Expanded dataset beyond 60 hawker centres to cover all of Singapore
- Mobile-friendly frontend for on-the-go food discovery
Built With
- adk
- cloudrun
- elastic
- fastapi
- python
Log in or sign up for Devpost to join the conversation.