尚未检测到更新。GitHub 发布版本后会显示在这里。
个人 GitHub 账号下公开仓库的所有者可以登录并验证所有权,自行管理介绍,无需管理员批准。
登录并生成验证文件,在 30 分钟内将其提交到此仓库的默认分支。其他分支或分叉仓库中的文件无效。然后在下方检查文件,即可无需管理员批准直接管理项目。请保留文件以维持管理权限。
如需登录,将前往登录页面。登录后请回到此处,再次点击所选的验证按钮。
在项目文件夹中运行 /nomorevibe verify,即可验证所有权并自行管理介绍。
一分钟完成验证制作者的介绍仅有上面的一句话。 更多详情请阅读仓库 README。 仓库 README ↗
正在加载完整 README。
查看完整 README ↗"I'm in Marseille, it's 00:12 and we're eating spaghetti bolognese." → three real bottles from your catalog, with the reason on each label.
sommelier/
├── studio/ Sanity Studio (standalone) — schemas, desk structure, seed data
└── web/ Next.js 16 + Tailwind 4 — the sentence form, the agent route, wine labels
Browser ── city / GPS, local time, timezone, locale ──▶ /api/chat
│
nearest appellations (from Sanity geopoints)┤
▼
AI SDK agent loop (model in web/src/lib/agent/model.ts)
1. findDish GROQ → dish flavours, protein, intensity
2. getPairingRules GROQ → house rules → target profile
3. (optional) Knowledge Base tools via Sanity Context MCP
4. searchWines GROQ → catalog filtered by profile, local first
5. showRecommendations → re-fetches the picked ids → wine label cards
Cards are always rendered from catalog data fetched by id, never from model text, so the agent can't invent a bottle, price or merchant.
cd studio
npm install
export SANITY_STUDIO_PROJECT_ID=<your id>
node seed/build-seed.mjs # writes seed/seed.ndjson (demo data)
npm run seed # imports it into the production dataset
npm run dev # http://localhost:3333
cd web
npm install
cp .env.example .env.local # fill in project id + ANTHROPIC_API_KEY
npm run dev # http://localhost:3000
The seed wines are clearly marked "(demo)" and have no merchant links. Replace them with your feed import.
| Type | Role |
|---|---|
wine | The catalog. Taste profile on a 1–5 scale, offers[] for buy links, externalIds (LWIN, feed id) for sync, reviewStatus for AI-enriched data |
appellation | Region + geopoint, used to find what's local to the user |
grape, producer | Reference data |
dish | Flavours, protein, intensity, aliases ("spag bol") |
pairingRule | The house doctrine: when it applies → target profile → why. This is your moat |
guide | Long-form editorial, the best Knowledge Base source |
The agent works without it. To add one:
pairingRule and guide documents (not the raw catalog).?mode=knowledge_base&knowledgeBases=kb_… in SANITY_CONTEXT_MCP_URL, and an org token in SANITY_ORGANIZATION_TOKEN.The route then merges the KB tools with the catalog tools and adds the initial context to the system prompt.
Everything goes through web/src/lib/agent/model.ts. Swap the provider there; the rest of the code doesn't change. Jev is mentioned in Sanity's engineering blog but isn't documented as a public API yet. If Sanity exposes it through an OpenAI-compatible endpoint, the commented snippet in that file is all you need.
web/src/lib/geo.ts knows a dozen cities. Swap in a real geocoder (or rely on "Use my location")./api/chat before it's public.studio/sanity.cli.ts is configured to write types into web/src/sanity/sanity.types.ts.studio/scripts/sync-*.ts: import an affiliate feed, upsert by externalIds.feedId, only fill empty editorial fields./wines/[slug] page per bottle (good for SEO and as Knowledge Base URLs).