smooth-app
전 세계 식품의 성분·영양·정보를 자유롭게 협업하고 공개하는 데이터베이스
아직 감지된 업데이트가 없습니다. GitHub 릴리스가 나오면 여기에 보입니다.
개인 계정의 공개 저장소 소유자는 GitHub로 로그인해 운영자를 확인하고 소개를 직접 관리할 수 있습니다. 관리자 승인은 필요하지 않습니다.
로그인한 뒤 확인 파일을 만들어 이 저장소의 기본 브랜치에 30분 안에 커밋해 주세요. 다른 브랜치나 포크의 파일은 인정하지 않습니다. 파일을 올린 뒤 아래에서 확인하면 관리자 승인 없이 관리할 수 있습니다. 자격을 유지하려면 파일을 남겨 두세요.
로그인이 필요하면 로그인 화면으로 이동합니다. 로그인 후 이곳으로 돌아와 원하는 확인 버튼을 다시 눌러 주세요.
프로젝트 폴더에서 /nomorevibe verify를 실행하면 소유권을 확인하고 소개를 직접 관리할 수 있습니다.
1분 만에 확인하기메이커가 쓴 소개는 위의 한 줄이 전부입니다. 더 자세한 내용은 저장소 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.