尚未偵測到更新。GitHub 發布版本後會顯示在這裡。
個人 GitHub 帳號下公開儲存庫的擁有者可以登入並驗證所有權,自行管理介紹,無需管理員核准。
登入並產生驗證檔案,在 30 分鐘內將其提交至此儲存庫的預設分支。其他分支或分叉儲存庫中的檔案無效。然後在下方檢查檔案,即可無需管理員核准直接管理專案。請保留檔案以維持管理權限。
如需登入,將前往登入頁面。登入後請回到此處,再次點擊所選的驗證按鈕。
在專案資料夾中執行 /nomorevibe verify,即可驗證所有權並自行管理介紹。
一分鐘完成驗證製作者的介紹僅有上面的一句話。 更多詳情請閱讀儲存庫 README。 儲存庫 README ↗
正在載入完整 README。
檢視完整 README ↗Turn one favorite song into a 30-minute conversation.
Reminiscence Agent helps caregivers of people living with dementia prepare a reminiscence session. Name one to three things the person loves: a singer, a film, a TV show. The agent follows their taste through Qloo's taste graph to the music, films and shows of their youth, sets aside anything that could upset them, and writes a 30-minute session a caregiver can read aloud. After the session, the caregiver records how each item landed, and the agent plans the next one from that.
A conversation aid, not medical advice.
Reminiscence activities, talking about music, films and everyday life from someone's past, are a common, low-pressure way to connect with people living with dementia. Preparing one well is hard work for a family member or a care-home aide:
Most caregivers know one or two favorites. That is where this app starts.
exclude, caution (allowed only through a named safe angle) or ok, against the caregiver's topics and a default list of hard topics (war, the Holocaust, violent crime, terminal illness, suicide).The hackathon asks a fair question: would this work just as well without Qloo? A large language model also knows a lot about 1960s pop culture. So we ran a side-by-side test.
Setup
gemini-3.5-flash-lite, two runs per profile.gemini-3.6-flash; earlier requests used the alias gemini-3.5-flash, whose successful responses reported gemini-3.6-flash. Successful outputs were preserved across quota-related pauses./api/resolve → /api/expand), one run per profile. B was not repeated./search. Age-window fit uses only film/TV items with a known release year. Main-profile candidate counts are 240 for each LLM condition and 120 for B; these are not counts of completed sessions.Results
| What we measured | A1: LLM only | A2: LLM only | B: With Qloo |
|---|---|---|---|
| Film/TV age-window fit (known years only) | 91.8% | 89.5% | 100% |
| Mean Jaccard between Q1–Q3 lists | 0.268 | 0.265 | 0.044 |
| Mean same-profile Jaccard across two runs | 0.493 | 0.663 | Not measured |
Jaccard is intersection size divided by union size. Lower Q1–Q3 overlap means more different lists when favorites change; higher same-profile overlap means more repeatable lists. Neither is a direct measure of recommendation quality or caregiver benefit.
What this shows
A2's age-window fit was lower than A1's (89.5% versus 91.8%), while its personalization Jaccard was similar (0.265 versus 0.268). A2 repeated its own lists more consistently (0.663 versus 0.493), so variation cannot simply be dismissed as randomness. B produced more distinct lists across the three taste profiles in this small sample, but its age-window filters and removal of input favorites affect the comparison. These results do not establish that Qloo is indispensable, reduces hallucinations, improves safety, or produces better care outcomes.
Limits of the test: eight profiles is a small sample. B's 100% age-window figure reflects filtering; B repeatability was not measured. Popularity-based title matching can select a remake instead of the intended original, so apparent year mismatches need manual review. Safety judgments can differ for identical descriptions across model calls and should not be treated as a reliable ranking of the approaches.
Built into the design, not established by this experiment: Qloo IDs support exact exclusions in later sessions, and contribution scores support the app's “Why this” explanation.
Public experiment summary. The original raw JSON and run.mjs are not yet in this repository; the summary explicitly records that audit limitation.
flowchart LR
A["Caregiver input<br/>name, birth year,<br/>favorites, topics"] --> B["/api/resolve<br/>Qloo search → entity IDs"]
B --> C["/api/expand<br/>Qloo insights:<br/>films · TV · music<br/>age 10–30"]
C --> D["/api/plan · review<br/>Gemini safety screen<br/>exclude · caution · ok"]
D --> E["/api/plan · generate<br/>Gemini writes session<br/>+ rule checks in code"]
E --> F["Session screen<br/>caregiver runs it"]
F --> G["/api/replan<br/>reactions + note →<br/>new starting points,<br/>extra topics to avoid"]
G -->|"excludes used and<br/>uneasy items by ID"| C
| Step | Qloo call | Details |
|---|---|---|
| Resolve favorites | GET /search | Picks the most popular result of the chosen type (artist, movie, TV show). An unmatched favorite returns a clear error instead of a silent substitute. |
| Expand by taste | GET /v2/insights (three calls in parallel) | signal.interests.entities = all favorites, filter.type = movie / TV show / artist, take=12, feature.explainability=true. |
| Age window | filter.release_year.min/max | Birth year +10 to +30 for films and TV. For artists, the app checks that their active years overlap the window. |
| Quality | filter.popularity.min | Films ≥ 0.8, TV ≥ 0.5. If fewer than three remain: lower to 0.5 / 0.2, then widen the window by five years on each side. |
| Explain | explainability scores | Each item keeps each favorite's contribution. The UI turns the top contribution into a sentence ("Mostly inspired by…", or "Because they enjoyed X in an earlier session"). |
| Next session | filter.exclude.entities | Items already used or marked uneasy are excluded by ID, and filtered again in code. |
All model calls use gemini-3.5-flash-lite with structured output (Zod schemas, through the Vercel AI SDK).
Models sometimes bend rules. We found it more reliable to check in code than to keep rewording prompts:
lib/proof.ts) that expires after 30 minutes, so the browser cannot alter the approved pool between review and writing.localStorage).Requirements: Node.js 24, a Qloo hackathon API key, and a Gemini API key from Google AI Studio.
npm ci
cp .env.example .env.local # then fill in QLOO_API_KEY and GEMINI_API_KEY
npm run dev # http://localhost:3000
Keys are read only on the server. Never commit .env.local, and never prefix a key with NEXT_PUBLIC_.
Checks:
npm test # 26 tests: Qloo matching, age window, explanations, plan rules, replanning
npm run lint
npm run typecheck
npm run build
The live demo runs on Vercel and deploys from main. Set QLOO_API_KEY and GEMINI_API_KEY in the project's environment variables, then redeploy.
| Path | What it does |
|---|---|
app/page.tsx | Landing text and "How it works" |
app/components/profile-form.tsx | Input form, call sequence, retries, save and resume |
app/components/session-plan.tsx | Session screen, reactions, print |
app/components/agent-note.tsx | "What changed for session N" |
app/api/{resolve,expand,plan,replan} | Server routes |
lib/qloo-server.ts, lib/qloo-data.ts | Qloo calls, filter relaxing, exclusions, "Why this" |
lib/safetyPrompt.ts, lib/prompt.ts, lib/replanPrompt.ts | Prompts for safety review, session writing and replanning |
lib/plan-schema.ts, lib/replan-schema.ts | Code checks and repairs |
lib/gemini-server.ts | Gemini calls and retries |
lib/proof.ts | HMAC sealing between steps |
tests/ | Automated tests |
Qloo Taste AI API · Google Gemini (gemini-3.5-flash-lite) · Next.js 16 · React 19 · TypeScript · Tailwind CSS 4 · Vercel AI SDK · Zod · Vercel
MIT. See LICENSE.