尚未偵測到更新。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).