尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证An AI agent that finds the shared world between people who've drifted apart, using Qloo's taste graph to bridge different tastes and plan their next time together. Built for the Qloo Agentic Hackathon.
翻译准备中
取自仓库 README
正在加载完整 README。
查看完整 README ↗An AI agent that finds the shared world between people who have drifted apart, then plans their next time together.
Built for the Qloo Agentic Hackathon.
Live demo: https://commonground-agent.vercel.app
Click Watch a live example to see the agent plan Sunday lunch for Gogo Thandi and her three grandkids, no typing needed. Then try it with your own people.
A gogo who loves Jim Reeves. Grandkids who love Burna Boy, Lucky Dube and Ladysmith Black Mambazo. They love each other, but Sunday lunch runs out of things to say. About 1 in 6 people worldwide experience loneliness (WHO, 2025), and often the people we love are right there. We've just run out of things to share.
Common Ground takes a few favourites from each person and uses Qloo's taste graph to find:
Adding interests is a search over Qloo: type a name, optionally narrow it with a category button, and pick the right match from the labelled results ("Tyla · Public figure · South African singer-songwriter"). A namesake isn't hidden as a duplicate: Tyla the South African singer still shows next to Tyla the English rock musician.
Each person can add their own favourites. After adding yours, tap Invite them to add theirs: your picks travel inside a link (no accounts, no database) that you send on WhatsApp. The other person opens it, sees your card filled in, adds theirs and gets the plan. Links are checked strictly when opened, and anything that doesn't look like a genuine invite is ignored.
Your connections are kept. Every connection with a plan is saved on your device and listed on the home page ("Gogo Thandi, Sipho, Lerato and Ayanda · Visit 3 · planned 2 days ago"). Open one to go straight back to its plan, past visits and what the agent has learned; starting a new one never wipes the old ones. Tastes change, so you can edit anyone's favourites at any time and either go back to the current plan or tap Update our plan; the agent keeps what it learned from past visits.
After the visit you tap what landed. The agent folds that into everyone's taste and plans the next visit.
Works for 2 to 5 people: grandparent and grandchildren, couples who've grown distant, parents and teens, carers and residents, and two people about to go on a first date who want something to talk about.
A plain LLM guesses at what a 75-year-old Jim Reeves fan and a 16-year-old Burna Boy fan might both enjoy. Qloo knows. Four Qloo calls do the work:
| What | Qloo call |
|---|---|
| Resolve "Brenda Fassie" to a real entity, optionally within a category (Music, Films, TV shows, Books, Podcasts, Food & places, Travel, Sport & brands, Famous people) | GET /search with types |
| Bridges: one blended signal from everyone's favourites | GET /v2/insights with signal.interests.entities=A,B,C |
| Swaps: take person A's world, re-rank it by everyone else's taste | GET /v2/insights with filter.results.entities |
| Real places nearby | GET /v2/insights with filter.type=urn:entity:place, filter.location=POINT(lon lat) and a 15 km filter.location.radius |
Evidence is enforced in code, not just in the prompt. Every bridge and swap must point at an entity id that a Qloo call actually returned during that run, or it is dropped before anyone sees it. Things the people already love are dropped too, so every suggestion is a discovery. Everything on screen is labelled From Qloo data or Agent's idea.
Places must be somewhere you'd spend an afternoon. Qloo's nearby results include schools, radio stations and holiday villas, so the server keeps only places whose Qloo categories are restaurants, cafés, bars, venues, museums, parks, markets and the like.
Places are searched by exact coordinates. Qloo matches place names loosely (a text search for "Durban" returned cafés in Durbanville, Cape Town), so the location box suggests real towns as you type and sends the chosen town's coordinates.
lib/agent.js runs a tool-calling loop on Gemini, in rounds:
find_bridges across several categories, find_places), all at once.find_swaps from every person, starting with whoever was served least. A real run: "The bridges leaned towards classic Afro-jazz and gospel, so I am exploring what from Sipho's modern Afrobeats universe Gogo Thandi and the family would love."submit_plan. The server attaches the real Qloo entities, drops anything without evidence, and adds counts (Qloo lookups, rounds).The agent is visible, not hidden behind a spinner. Every lookup carries the agent's own one-line reason, the trail is grouped into rounds, and the results open with an Agent's notes card: what it explored, what it noticed, how it balanced the group, and what it changed after the last visit.
Each step streams to the browser, so you watch the agent research.
Built to survive a free tier. Gemini's free quota is per model per day, so the agent walks a list of six models and hands over when one is busy or out of quota. Identical requests (like the live example) replay the last plan from memory in a few seconds instead of spending quota. Qloo lookups are queued (at most 4 at a time, because the hackathon key rate-limits bursts), retried on a rate limit or dropped connection, and cached per server instance.
Needs Node 20+, a Qloo hackathon API key and a Gemini API key.
cp .env.example .env # then fill in QLOO_API_KEY and GEMINI_API_KEY
npm run dev # http://localhost:3100
npm test # offline unit tests (agent loop, evidence rule, model fallback, input checks, Qloo queue, invite links)
npm run test:live # live smoke check against Qloo
No build step and no dependencies: plain HTML/CSS/JS in public/, two serverless functions in api/.
Import the repo into Vercel, add QLOO_API_KEY and GEMINI_API_KEY as environment variables, deploy. vercel.json sets no framework (so Vercel serves public/ as static files instead of guessing a Node server) and gives the agent up to 5 minutes per run.
MIT licensed. See LICENSE.