- name
- vitamin-analyzer
- description
- Help users audit their supplement stack and answer the quiet question behind every vitamin bottle โ "Am I actually covering what I need? Am I doubling up? Is anything over the upper limit?" Guides the user on a journey to optimize their vitamin portfolio with evidence-based analysis. Activates when the user shares a supplement name, ingredient list, or Supplement Facts label photo, optionally with personal context (age, biological sex, symptoms, pregnancy, prescription drugs). Returns a Korean (default) or English markdown report covering RDA gaps, UL overages, duplicate ingredients, drug/supplement interactions, and domestic + overseas (iHerb) alternative product suggestions โ every medical claim backed by Tier 1โ2 citations from the U.S. National Institutes of Health Office of Dietary Supplements (NIH ODS), PubMed (National Library of Medicine), Cochrane Library systematic reviews, Examine.com, and the Korean Ministry of Food and Drug Safety (์์ฝ์ฒ) public Open APIs for both domestic health functional foods (C003/I2710) and OTC / prescription drugs (product approval, patient-friendly summaries, pill identification) when KFDA_HTFS_KEY / KFDA_FOODSAFETY_KEY env vars are set. Automatically routes between health-food and drug APIs so OTC multivitamins (e.g. ๋น๋งฅ์ค, ์๋ก๋๋ฏผ, ์ผํธ๋ฃธ) are correctly identified when not registered as health functional foods. Supports multiple user-named profiles (self, family, friends) and three intent modes (quick_check / quick_replace / full_analysis) to match answer depth to question depth. Persists product DB, stack JSON, and reports under ./user-data/. Declines analyses for under-12 and pets; never issues prescription-drug dosing advice.
- license
- MIT
- version
- 1.3.0
# Vitamin Analyzer โ ๋ณด์ถฉ์ ๋ถ์ Skill
> **"์ง๊ธ ๋จน๋ ๋นํ๋ฏผ, ์ ๋ง ๋ํํ
๋ง๋ ๊ฑธ๊น?"**
> ๋ถ์กฑํ ๊ฑด ์๋์ง, ๋ญ ์ค๋ณต์ผ๋ก ๋จน๊ณ ์์ง๋ ์์์ง, ์ํ์ ์ ๋๊ธด ์ฑ๋ถ์ ์๋์ง โ ๋ด ๋นํ๋ฏผ ํฌํธํด๋ฆฌ์ค๋ฅผ ๊ทผ๊ฑฐ ๊ธฐ๋ฐ์ผ๋ก ์ ๊ฒํ๊ณ ์ต์ ์ ์กฐํฉ์ ์ฐพ์๊ฐ๋ **ํ์ ์ฌ์ **์ ๋๋ Claude Skill. ํ๋กํ(์ ํ)๊ณผ ๋ณต์ฉ ์ ํ(ํ
์คํธ/๋ผ๋ฒจ ์ฌ์ง/์ ํ๋ช
)์ ๋ฐ์ UL ์ด๊ณผยทRDA ๋ฏธ๋ฌยท์ค๋ณตยท์ํธ์์ฉ์ ํ๊ฐํ๊ณ , **๊ตญ๋ดยทํด์ธ์์ ๊ตฌํ ์ ์๋ ๋์ฒด ์ ํ**์ ๊ฐ๊ฒฉยท๊ทผ๊ฑฐ์ ํจ๊ป ์ ์ํฉ๋๋ค. ์์ฝ์ฒ ๊ฑด๊ฐ๊ธฐ๋ฅ์ํ Open API(์ ํ) ์ฐ๋ ์ ๊ตญ๋ด ์ ํ์ ์ ํ๋ช
๋ง์ผ๋ก ์ ๋ถ ๊ณต์ DB์์ ์ ํํ ์๋ณํฉ๋๋ค.
---
## 1. When to use this skill
๋ณธ ์คํฌ์ ๋ค์ ์ค ํ๋ ์ด์์ ์
๋ ฅ์ด ๊ฐ์ง๋ ๋ ํ์ฑํ๋ฉ๋๋ค:
- ๋ณด์ถฉ์ ์ ํ๋ช
(ํ/์) โ ์: "์ผํธ๋ฃธ ์ค๋ฒ ์ฌ์ฑ์ฉ", "NutriCalm LiverRelax"
- ์ฑ๋ถ ๋ฆฌ์คํธ ํ
์คํธ โ ์: "๋นํ๋ฏผ D 1000IU, ์นผ์ 500mg, ๋ง๊ทธ๋ค์ 200mg"
- **์ฑ๋ถํ ์ฌ์ง (Supplement Facts ํจ๋)** โ ์ด๋ฏธ์ง ์
๋ก๋
- **๋ณต์ ์ ํ ์กฐํฉ** โ 2๊ฐ ์ด์ ์ ํ์ ํ ๋ฒ์ ๋ถ์ (์คํ ์ต์ ํ)
- ์ ํ์ ํ๋กํ โ ์ฑ๋ณ/๋์ด/์ฆ์/์์ ยท์์ /๋ณต์ฉ ์ฝ๋ฌผ
**ํ์ฑํํ์ง ์๋ ๊ฒฝ์ฐ**:
- ์์ ์(<12์ธ) ๋๋ ๋ฐ๋ ค๋๋ฌผ ๋์ โ ยง6 ๊ฑฐ๋ถ ํ๋กํ ์ฝ
- ์ฒ๋ฐฉ์ฝ ๋ณต์ฉ๋ ์กฐ์ ์์ฒญ โ "์์ฌยท์ฝ์ฌ ์๋ด ๊ถ๊ณ "๋ก ์๋ต
- ์ํ ์์ ๋ถ์ (๋ณด์ถฉ์ ์ธ) โ ๋ณธ ์คํฌ ๋ฒ์ ๋ฐ
---
## 2. ์ฌ์ฉ ํ๋กํ ์์ง (PRD โ ์ ํ ์
๋ ฅ)
์คํฌ ์์ ์ ์ฌ์ฉ์์๊ฒ **์ ํ์ ์ผ๋ก** ํ๋กํ์ ์ง๋ฌธํฉ๋๋ค. **๋ชจ๋ ํ๋๋ ์๋ฌด๊ฐ ์๋๋๋ค.**
### 2-1. ์ง๋ฌธ ํ
ํ๋ฆฟ (ํ๊ตญ์ด)
```
๋ณด์ถฉ์ ๋ถ์์ ์์ํ๊ฒ ์ต๋๋ค. ๋ ์ ํํ ๋ถ์์ ์ํด ํ๋กํ์ ์
๋ ฅํด ์ฃผ์ธ์. (๋ชจ๋ ์ ํ์
๋๋ค โ ๊ฑด๋๋ฐ์ด๋ ๋ฉ๋๋ค)
1. **์ฑ๋ณ**: ์ฌ์ฑ / ๋จ์ฑ / ๊ธฐํยท๋ฏธ์
๋ ฅ
2. **๋์ด** (๋๋ ์ ์ฒด๋์ด): ์) 35
3. **ํ์ฌ ์ฆ์/๋ชฉํ**: ์) ํผ๋ก, ์๋ฉด์ ์ง, ๋ฉด์ญ, ๊ด์ , ํน๋ณ ์์
4. **์์ ยท์์ ์ฌ๋ถ**: ํด๋น / ํด๋น ์์
5. **๋ณต์ฉ ์ค์ธ ์ฒ๋ฐฉ์ฝ**: ์) ๋ ๋ณดํฐ๋ก์ , ์ํ๋ฆฐ, ์์
6. **๊ธฐ์ ์งํ** (์ ํ): ์) ๊ฐ์์ , ๊ณ ํ์, ์์
์
๋ ฅํ์ง ์์ ํญ๋ชฉ์ "์ผ๋ฐ ์ฑ์ธ" ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์งํํฉ๋๋ค.
์ด์ด์ ๋ถ์ํ ์ ํ์ ์๋ ค์ฃผ์ธ์:
- ์ ํ๋ช
(์: "์ผํธ๋ฃธ ์ค๋ฒ")
- ์ฑ๋ถํ ์ฌ์ง ์
๋ก๋
- ์ฑ๋ถ ๋ฆฌ์คํธ ์ง์ ์
๋ ฅ (์: "๋นํ๋ฏผ D 1000IU, ...")
- **์ฌ๋ฌ ์ ํ์ ํ๋ฒ์ ๋ถ์ํ๋ ค๋ฉด ๋ชจ๋ ๋์ดํ๊ฑฐ๋ ์ฌ์ง์ ์ฌ๋ฌ ์ฅ ์ฌ๋ ค์ฃผ์ธ์**
```
### 2-1-A. ์ ํ ์์ ์ฑ ์ฌํ์ธ ๋ฃจํ
์ฌ์ฉ์๊ฐ ์ ํ ๋ชฉ๋ก์ ์ ์ํ **์งํ**, ์๋ ํ์ธ ์ง๋ฌธ์ **๋ฐ๋์** ์คํ (์๋ต ๊ธ์ง):
```
ํ์ธ: ํ์ฌ ๋งค์ผ ๋์๋ ๋ณด์ถฉ์ ๋ ์๋ N๊ฐ๊ฐ **์ ๋ถ**์ธ๊ฐ์?
- [์ ํ1]
- [์ ํ2]
- [์ ํ3]
ํน์ ์๋ ์ค ๋น ์ง ๊ฒ ์๋ค๋ฉด ์ง๊ธ ์ถ๊ฐํด ์ฃผ์ธ์:
- ์ค๋ฉ๊ฐ3ยทํผ์ฌ์ค์ผ
- ๋นํ๋ฏผD (๋จ๋
์ ํ, ์ข
ํฉ๋นํ๋ฏผ์ ํฌํจ๋ ๊ฒ ์ธ)
- ํ๋ก๋ฐ์ด์คํฑ์คยท์ ์ฐ๊ท
- ๋ง๊ทธ๋ค์ยท์นผ์ยท์ฒ ๋ถ (๋จ๋
)
- ๋ฃจํ
์ธยท์์คํ์ํด ๋ฑ ๋ ๋ณด์กฐ์
- ์ฝ๋ผ๊ฒยทํ์๋ฃจ๋ก ์ฐ
- ์ธ์ด๋ธยท์ ค๋ฆฌ ํํ ๋ณด์ถฉ์ (์๊ธฐ ์ฌ์)
- ์ฃผ 1-2ํ๋ง ๋ณต์ฉํ๋ ์ ํ
"์ด๊ฒ ์ ๋ถ" ๋๋ ์ถ๊ฐ ์ ํ์ ์๋ ค์ฃผ์๋ฉด ๋ถ์ ์งํํฉ๋๋ค.
```
**๊ท์น**:
- ์ด ๋ฃจํ๋ฅผ **๊ฑฐ์น์ง ์๊ณ Phase 2๋ก ์ง์
ํ์ง ๋ง ๊ฒ**
- ์ฌ์ฉ์๊ฐ "์ ๋ถ"๋ผ๊ณ ํ์ธํ ํ์๋ง ๋ถ์ ์์
- ๋ถ์ ์ค๊ฐ์ ์ฌ์ฉ์๊ฐ "์, ์ด๊ฒ๋ ๋จน์ด" ํ๊ณ ์ถ๊ฐํ๋ฉด Phase 1๋ก ๋ณต๊ทํ์ฌ ์ฒ์๋ถํฐ ์ฌ์ฐ์ถ
- ์ฌ์ : ์ดํ ํ
์คํธ์์ ์ฌ์ฉ์๊ฐ ์ฒ ๋ถ์ "๋จน๋๋ค"๊ณ ํ์ผ๋ ์ค์ ๋ก๋ ์ ๋จน์๊ณ , ์ค๋ฉ๊ฐ3๋ ์ค๊ฐ์ ์ถ๊ฐ๋๋ ๋ฑ ๋ชฉ๋ก ๋ถ์ ํ์ด ๋น๋ฒ
### 2-2. ์ง๋ฌธ ํ
ํ๋ฆฟ (`--en` ์์ด ์ต์
)
```
Starting the supplement analysis. For more accurate results, please share your profile (all fields are optional โ you can skip).
1. **Gender**: female / male / other / skip
2. **Age** (or biological age): e.g., 35
3. **Current symptoms/goals**: e.g., fatigue, sleep, immunity, joint, none
4. **Pregnancy/breastfeeding**: yes / no
5. **Prescription medications**: e.g., levothyroxine, warfarin, none
6. **Underlying conditions** (optional): e.g., thyroid, hypertension, none
Unspecified fields default to "general adult".
Then, provide the supplement(s) to analyze:
- Product name
- Upload a photo of the Supplement Facts panel
- Type the ingredient list directly
- **For multi-product stack analysis, list all or upload multiple photos**
```
### 2-3. ํ๋กํ ์ฒ๋ฆฌ ๊ท์น
- **์์ ์(<12์ธ) ๋๋ ๋ฐ๋ ค๋๋ฌผ** ๊ฐ์ง ์ โ ์ฆ์ ยง6 ๊ฑฐ๋ถ ํ๋กํ ์ฝ
- **์์ ยท์์ ** ์๋ต "ํด๋น" โ ๋ฆฌํฌํธ ์ต์๋จ์ `references/disclaimer.md` ยง3-1 ๋ฐฐ๋ ๊ฐ์ ์ฝ์
- **์ฒ๋ฐฉ์ฝ** ๋น์ด์์ง ์์ โ ยง3-3 ๋ฐฐ๋ ์ฝ์
, ๊ฐ ๋ณด์ถฉ์ -์ฝ๋ฌผ ์์ ๋ํด `references/interaction-patterns.md` ๋งค์นญ
- ๋ชจ๋ ํ๋ ๋ฏธ์
๋ ฅ โ `profile_assumption: "์ผ๋ฐ ์ฑ์ธ (19-50์ธ, ์ฌ์ฑ ๊ธฐ์ค)"` ํ๋๊ทธ
---
## 3. ํ์ดํ๋ผ์ธ (Phase 0-A ~ 6)
```
Phase 0-A: API ์ฐ๊ฒฐ ์ฒดํฌ (๋งค ์ธ์
์ต์ด 1ํ โ ๊ฐ์ฅ ๋จผ์ ์คํ)
โโ KFDA ํ๊ฒฝ๋ณ์ ์กด์ฌ โ ์ฆ์ Phase 0 ์ง์
โโ user-data/kfda-skip.json (foreign_only) ์กด์ฌ โ ์ฆ์ Phase 0 ์ง์
โโ ๋ ๋ค ์์ โ API ์๋ด ํ๋ฉด ์ถ๋ ฅ โ ์ฌ์ฉ์ ์ ํ (A/B/C)
A. ์ง๊ธ ์ฐ๋ โ ๋ฐ๊ธ ๊ฐ์ด๋ ๋จ๊ณ๋ณ ์ถ๋ ฅ โ ํค ์
๋ ฅ ๋๊ธฐ โ ~/.env ์ค์ ์๋ด โ Phase 0
B. ์ด๋ฒ๋ง ๊ฑด๋๋ฐ๊ธฐ โ ์ ์ฅ ์์ (๋ค์ ์ธ์
์ฌ์๋ด) โ Phase 0 (KFDA ๋ฏธ์ฐ๋ ๋ฐฐ๋ ํฌํจ)
C. ์๊ตฌ ๊ฑด๋๋ฐ๊ธฐ โ user-data/kfda-skip.json ์์ฑ โ Phase 0 (๋ฐฐ๋ ์์)
Phase 0: ํ๋กํ ๊ฒฐ์
โโ prompts/detect-profile.md โ profile_id ํ์
โโ user-data/profiles/{id}.json ๋ก๋ or ์ ๊ท ์์ฑ
Phase 0.5: ์ธํ
ํธ ๋ผ์ฐํ
โโ prompts/detect-intent.md โ mode ๋ถ๋ฅ
โโ quick_check โ Phase 1ยท3๋ง ์ถ์ฝ ์คํ โ 1~2 ๋ฌธ๋จ ๋ต๋ณ
โโ quick_replace โ Phase 1ยท5๋ง ์ถ์ฝ ์คํ โ ๋์ฒดํ๋ณด ํ
โโ full_analysis โ Phase 1~6 ์ ์ฒด ์คํ (์๋)
โ
Phase 1: ์
๋ ฅ ์์ + ์ด๋ฏธ์ง ํ๋
+ ์ ํ DB ์กฐํ
โโ ๋ผ๋ฒจ ์ฌ์ง (์ต์ฐ์ )
โโ user-data/products/ DB ์ฌ์ฌ์ฉ (365์ผ ์ด๋ด)
โโ ํ
์คํธ ์
๋ ฅ โ ์ง์ ํ์ฑ
โโ ์ด๋ฏธ์ง โ prompts/parse-image.md โ JSON
โโ ์ ํ๋ช
๋ง โ Fallback Chain (ยง4-1-3)
โ
Phase 2: ์ ๊ทํ
โโ prompts/analyze-ingredient.md ยง2 โ canonical_name ๋งคํ
โโ prompts/analyze-ingredient.md ยง3 โ ๋จ์ ํ์คํ (IUโmcg ๋ฑ)
โ
Phase 3: ์คํ ํฉ์ฐ + RDA/UL + ์ค๋ณต + deficiency_gap[]
โโ prompts/analyze-ingredient.md ยง4 / ยง5 / ยง6 / ยง4.5 (๋ถ์กฑ)
โ
Phase 4: ์ํธ์์ฉ + ๊ทผ๊ฑฐ URL ์กฐํ
โโ prompts/analyze-ingredient.md ยง7 / ยง8
โ
Phase 5: ๋์ฒด์ ํ ์กฐํ (๊ตญ๋ด 5 + ํด์ธ 3, ํก์์จ ๋ฐ์)
โโ references/search-templates.md ยง10-2 + bioavailability-table.md
โโ ์ฟ ํก/๋ค์ด๋ฒ = ๊ฐ๊ฒฉ๋ง / iHerb = ๊ฐ๊ฒฉ+๋ฆฌ๋ทฐ
โ
Phase 6: ๋ฆฌํฌํธ ์์ฑ + ์๋ ์ ์ฅ (ํ๋กํ๋ณ ๋๋ ํ ๋ฆฌ)
โโ prompts/report-template.md + references/disclaimer.md ยง1/ยง2
โโ user-data/stacks/{profile_id}_latest.json (์๋ณธ ๋ฐฑ์
)
โโ user-data/reports/{profile_id}/YYYY-MM-DD_HHMM_analysis.md
โโ user-data/reports/{profile_id}/latest.md (symlink)
```
**๋ชจ๋๋ณ ์คํ ๋ฒ์**:
| ๋ชจ๋ | Phase 0-A | Phase 0 | 0.5 | 1 | 2 | 3 | 4 | 5 | 6 | ๋ฆฌํฌํธ ์ ์ฅ |
|------|----------|---------|-----|---|---|---|---|---|---|------------|
| quick_check | โ
ํ์ | โ
| โ
| ์ถ์ฝ | โ
| ์ ํ ํญ๋ชฉ๋ง | ์ ํ ํญ๋ชฉ๋ง | โ | ์ถ์ฝ | โ |
| quick_replace | โ
ํ์ | โ
| โ
| 1์ ํ๋ง | โ
| ํด๋น ์ฑ๋ถ๋ง | โ | โ
| ์ถ์ฝ | ์ ํ |
| full_analysis | โ
ํ์ | โ
| โ
| ์ ์ฒด | โ
| ์ ์ฒด | โ
| โ
| ์ ์ฒด | โ
|
---
## 4. Phase๋ณ ์์ธ
### Phase 0-A โ API ์ฐ๊ฒฐ ์ฒดํฌ (๋งค ์ธ์
์ต์ด 1ํ)
**๋ชจ๋ ๋ชจ๋์์ ๊ฐ์ฅ ๋จผ์ ์คํ.** Phase 0๋ณด๋ค ์ ํ.
#### ํ๋จ ์์
```
1. KFDA_HTFS_KEY + KFDA_FOODSAFETY_KEY ํ๊ฒฝ๋ณ์ ์กด์ฌ?
โ YES: ์ฆ์ Phase 0 ์ง์
(์ด Phase ์ข
๋ฃ)
2. user-data/kfda-skip.json ์กด์ฌ + reason == "foreign_only"?
โ YES: ์ฆ์ Phase 0 ์ง์
(์ด Phase ์ข
๋ฃ)
3. ๋ ๋ค ์๋๋ฉด: ์๋ ์๋ด ํ๋ฉด ์ถ๋ ฅ โ ์ ํ ๋๊ธฐ
```
#### ์๋ด ํ๋ฉด (์ถ๋ ฅ ํ
ํ๋ฆฟ)
```
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โ ๏ธ ์์ฝ์ฒ API ๋ฏธ์ฐ๋ โ ํ๊ตญ ์ ํ ์ ํ๋ ์ ํ
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
์ด ์คํฌ์ ์์ฝ์ฒ Open API ์ฐ๋์ ๊ธฐ๋ณธ์ผ๋ก ์ค๊ณ๋์ต๋๋ค.
API ์์ด๋ ๋์ํ์ง๋ง, ํ๊ตญ ์ ํ(๋น๋งฅ์คยท์๋ก๋๋ฏผยท์ผํธ๋ฃธ ๋ฑ)์
์ฑ๋ถยทํจ๋ ์ ํ๋๊ฐ ํฌ๊ฒ ๋ฎ์์ง๋๋ค.
ํญ๋ชฉ | API ์์ | API ์์
โโโโโโโโโโโโโโโโโ|โโโโโโโโโโโโโโโโโโ|โโโโโโโโโโโโโโโโโ
ํ๊ตญ ์ ํ ์ฑ๋ถ | โ
โ
โโโ (์น ๊ฒ์) | โ
โ
โ
โ
โ
(์์ฝ์ฒ ๊ณต์ DB)
์ฑ๋ถ ํจ๋ ์ ํ๋ | ๋ฎ์ | ๋์
์์ฝํ/๊ฑด๊ธฐ์ ๊ตฌ๋ถ | ์ด๋ ค์ | ์๋ ๊ตฌ๋ถ
์ ํํด ์ฃผ์ธ์:
A. ์ง๊ธ ์ฐ๋ํ๊ธฐ (API ํค ๋ฐ๊ธ, ์ฝ 5๋ถ โ ์น์ธ๊น์ง ์ต๋ 2์๊ฐ)
B. ์ด๋ฒ๋ง ๊ฑด๋๋ฐ๊ธฐ (๋ค์ ์ธ์
์ ๋ค์ ์๋ด)
C. ๊ณ์ ๊ฑด๋๋ฐ๊ธฐ (์ธ๊ตญ ๋ณด์ถฉ์ ๋ง ๋ถ์)
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
```
#### ์ ํ๋ณ ์ฒ๋ฆฌ
**A โ ์ง๊ธ ์ฐ๋:**
์๋ ๊ฐ์ด๋๋ฅผ ์์๋๋ก ์ถ๋ ฅํ๊ณ , ํค ์
๋ ฅ์ ๊ธฐ๋ค๋ฆฐ ํ Phase 0 ์ง์
.
```
[์์ฝ์ฒ API ์ฐ๋ ๊ฐ์ด๋]
Step 1. ๊ฑด๊ฐ๊ธฐ๋ฅ์ํ API ํค ๋ฐ๊ธ (KFDA_FOODSAFETY_KEY)
1) https://openapi.foodsafetykorea.go.kr ํ์๊ฐ์
2) C003 / I0030 / I2710 ๊ฐ๊ฐ ํ์ฉ์ ์ฒญ
3) ๋ฐ๊ธ๋ ํค ๋ณต์ฌ
Step 2. ์์ฝํ API ํค ๋ฐ๊ธ (KFDA_HTFS_KEY)
1) https://data.go.kr ํ์๊ฐ์
2) "์ํ์์ฝํ์์ ์ฒ_์์ฝํ๊ฐ์์ ๋ณด" ๊ฒ์ โ ํ์ฉ์ ์ฒญ
3) Encoding ํญ์ URL-encoded ํค ๋ณต์ฌ (%2Fยท%2B ํฌํจ)
โ ๏ธ ์น์ธ๊น์ง ์ต๋ 2์๊ฐ ์์. ์น์ธ ํ ์๋ ์
๋ ฅ.
Step 3. ํ๊ฒฝ๋ณ์ ๋ฑ๋ก (~/.env ๋๋ claude_desktop_config.json)
KFDA_FOODSAFETY_KEY=๋ฐ๊ธ๋ฐ์_ํค
KFDA_HTFS_KEY=๋ฐ๊ธ๋ฐ์_ํค
ํค๋ฅผ ๋ฐ์ผ์
จ์ผ๋ฉด "๋ฑ๋ก ์๋ฃ"๋ผ๊ณ ์
๋ ฅํด ์ฃผ์ธ์.
(์ง๊ธ ๋น์ฅ ๋ฐ๊ธ์ด ์ด๋ ค์ฐ๋ฉด 'B'๋ฅผ ์
๋ ฅํ๋ฉด ์ด๋ฒ๋ง ๊ฑด๋๋๋๋ค)
```
์ฌ์ฉ์๊ฐ "๋ฑ๋ก ์๋ฃ" ์
๋ ฅ ์ โ Phase 0 ์ง์
(ํ๊ฒฝ๋ณ์๋ ์ฌ์์ ํ ์ ์ฉ๋จ์ ์๋ด).
**B โ ์ด๋ฒ๋ง ๊ฑด๋๋ฐ๊ธฐ:**
- `user-data/kfda-skip.json` **์ ์ฅํ์ง ์์** (๋ค์ ์ธ์
์ฌ์๋ด ๋ณด์ฅ)
- Phase 0 ์ง์
. ๋ฆฌํฌํธ ์๋จ์ KFDA ๋ฏธ์ฐ๋ ๋ฐฐ๋ 1ํ ์ฝ์
.
**C โ ์๊ตฌ ๊ฑด๋๋ฐ๊ธฐ (์ธ๊ตญ ์ ํ ์ ์ฉ):**
- `user-data/kfda-skip.json` ์์ฑ:
```json
{ "reason": "foreign_only", "skipped_at": "YYYY-MM-DD" }
```
- Phase 0 ์ง์
. ์ดํ ์ธ์
์์ ์ด Phase ์ฌ์คํ ์ ํจ.
#### ๊ท์น
- ์ด Phase๋ **์ธ์
๋ด 1ํ๋ง** ์คํ (๊ฐ์ ์ธ์
์์ ๋ ๋ฒ์งธ ์ฟผ๋ฆฌ๋ถํฐ๋ ์คํต)
- ์ฌ์ฉ์๊ฐ ๋จผ์ ๋ณด์ถฉ์ ์ ๋ณด๋ฅผ ์
๋ ฅํด๋ **์ด Phase๋ฅผ ๋จผ์ ์ฒ๋ฆฌํ ๋ค** ๋ถ์ ์์
- "๋์ค์", "๋ฌด์", "๊ด์ฐฎ์" ๊ฐ์ ์ฐํ ํํ โ B ์ ํ์ผ๋ก ์ฒ๋ฆฌ (์ ์ฅ ์์)
---
### Phase 0 โ ํ๋กํ ๊ฒฐ์
๋ชจ๋ ์ฌ์ฉ์ ๋ฐํ์ ๋ํด **๊ฐ์ฅ ๋จผ์ ** ์คํ. ๋ถ์ ๋์ ํ๋กํ์ ํ์ .
1. `user-data/profiles/_index.json` ์ฝ๊ธฐ (์์ผ๋ฉด ๋น ์ธ๋ฑ์ค ์์ฑ)
2. `prompts/detect-profile.md` ํ๋กฌํํธ๋ก ๋ฐํ ๋ถ๋ฅ โ `decision` ์์
3. `decision` ๋ณ ์ฒ๋ฆฌ:
| decision | ์ฒ๋ฆฌ |
|----------|------|
| `match` | `profiles/{id}.json` + `stacks/{id}_latest.json` ๋ก๋, "์ง๋๋ฒ OO ๋์๋ '{display_name}' ๋ง์ผ์ ๊ฐ์?" 1ํ ํ์ธ (์ธ์
๋ด 2๋ถ ์ด๋ด ์ฌ์ฐธ์กฐ๋ ์๋ต) |
| `default` | `default_profile_id` ์ฌ์ฉ. ์ฒซ ๋ฐฉ๋ฌธ์ด๋ฉด `display_name`์ ์ฌ์ฉ์์๊ฒ ์ง๋ฌธ ํ ์ ๊ท ์์ฑ |
| `needs_new_profile` | ํ๋กํ๋ช
์ง๋ฌธ โ slug ๋ณํ โ `_index.json` ์ถ๊ฐ + `{id}.json` ์ ๊ท (demographics๋ Phase 1์์) |
| `ambiguous` | ํ๋ณด ๋ชฉ๋ก ์ ์, ์ฌ์ฉ์ ์ ํ ํ ์ฌ์ง์
|
| `reject_scope` | ์์ ์ยท๋ฐ๋ ค๋๋ฌผ ๊ฑฐ๋ถ ๋ฌธ๊ตฌ ์ถ๋ ฅ ํ ์ข
๋ฃ (ยง6 ๊ฑฐ๋ถ ํ๋กํ ์ฝ๊ณผ ๋์ผ) |
**ํ๋ผ์ด๋ฒ์ ์์น**: profile JSON์ ๋ก์ปฌ์๋ง ์ ์ฅ. WebSearch ์ฟผ๋ฆฌ์๋ ๋น์๋ณ ์ ๋ณด๋ง ์ฌ์ฉ (์: ์ฐ๋ น๋ยท์ฑ๋ณยท์ผ๋ฐ ์ฆ์ ํค์๋).
**์คํค๋ง**: `references/user-data-schema.md` ์ฐธ์กฐ.
---
### Phase 0.5 โ ์ธํ
ํธ ๋ผ์ฐํ
Phase 0 ์งํ ์คํ. ์ฌ์ฉ์ ๋ฐํ์ ๊น์ด์ ๋ง๋ ๋ชจ๋๋ฅผ ์ ํ.
1. `prompts/detect-intent.md` ํ๋กฌํํธ ์คํ โ `mode`, `target`, `suggestion_message` ์์
2. ๋ชจ๋๋ณ ๋ถ๊ธฐ:
| mode | ๋ค์ ๋จ๊ณ |
|------|----------|
| `quick_check` | Phase 1ยท3 ์ถ์ฝ ์ง์
. `target.ingredient_ids`๋ง RDA/UL ์กฐํ. ๋ต๋ณ ๋ง๋ฏธ์ `suggestion_message` 1๋ฌธ์ฅ |
| `quick_replace` | Phase 1ยท5 ์ถ์ฝ ์ง์
. `target.product_keys[0]`์ ํต์ฌ ์ฑ๋ถ ์ค์ฌ ๋์ฒดํ๋ณด 5+3. `suggestion_message`๋ก ํ ๋ถ์ ์ ์ |
| `full_analysis` | ๊ธฐ์กด Phase 1~6 ์ ์ฒด ์คํ. `suggestion_message` = null |
**ํต์ฌ ์์น (CLAUDE.md ยง2-1 + L10 ๊ตํ)**:
- ํ ๋ถ์์ **๊ฐ์ ์ ๋ํ์ง ์์**. ์ ์๋ง.
- ๋ชจํธํ ๋ ๋ผ์ดํธ ๋ชจ๋ ํธํฅ (`quick_check` ์ฐ์ )
- ํ ๋ถ์ ์งํ 10๋ถ ์ด๋ด ๊ฐ์ ํ๋กํ ์ง๋ฌธ์ `escalation_allowed: false` โ ์ ์ ์๋ต
---
### Phase 1 โ ์
๋ ฅ ์์
#### 4-1-1. ํ
์คํธ ์
๋ ฅ
์ฌ์ฉ์๊ฐ ์ฑ๋ถ ๋ฆฌ์คํธ๋ฅผ ํ
์คํธ๋ก ์
๋ ฅํ๋ฉด ๊ทธ๋๋ก `ingredients[]` ๋ฐฐ์ด๋ก ๋ณํ:
```
"๋นํ๋ฏผ D 1000IU, ์นผ์ 500mg, ๋ง๊ทธ๋ค์ 200mg"
โ [{ raw_name: "๋นํ๋ฏผ D", amount: 1000, unit: "IU" }, ...]
```
#### 4-1-2. ์ด๋ฏธ์ง ์
๋ ฅ
- `prompts/parse-image.md` ํ๋กฌํํธ๋ก Claude native vision ํธ์ถ
- JSON ์ถ๋ ฅ ์์ โ `overall_confidence` ํ์ธ
- `medium`/`low` ๋๋ `partial` โ ยง4-1-2-a ์ฌํ์ธ ํ๋ก์ฐ
##### 4-1-2-a. ์ฌํ์ธ ํ๋ก์ฐ
`requires_user_confirmation: true` ์:
```
์ฑ๋ถํ ์ด๋ฏธ์ง ์ผ๋ถ๋ฅผ ๋ช
ํํ๊ฒ ํ๋
ํ์ง ๋ชปํ์ต๋๋ค.
๋ถ๋ช
ํํ ํญ๋ชฉ: [unclear_fields ๋ฆฌ์คํธ]
์ ์ฒด ์ ๋ขฐ๋: [overall_confidence]
๋ค์ ์ค ์ ํํด ์ฃผ์ธ์:
1. ๋ ์ ๋ช
ํ ์ฌ์ง์ ๋ค์ ์
๋ก๋ (์ ๋ฉด, ๋ฐ์ ์กฐ๋ช
๊ถ์ฅ)
2. ์ฑ๋ถ์ ์ง์ ํ
์คํธ๋ก ์
๋ ฅ
3. ํ์ฌ ํ๋
๋ ๋ถ๋ถ๋ง์ผ๋ก ๋ถ์ ์งํ (์ผ๋ถ ์ฑ๋ถ ๋๋ฝ ๊ฐ๋ฅ, ๊ถ์ฅ X)
```
#### 4-1-3. ์ ํ๋ช
๋ง ์
๋ ฅ โ Fallback Chain v3.1 (KFDA ๊ฑด๊ธฐ์ + ์์ฝํ ํตํฉ + ํจ๋ ์คํฌ๋ํ)
**ํต์ฌ ์์น (2026-04-18 v3.1 โ nedrug ์์ธ ์คํฌ๋ํ ํตํฉ)**:
- ํ๊ตญ ์ ํ โ **์์ฝ์ฒ Open API๊ฐ 1์ฐจ ๊ทผ๊ฑฐ** (๊ฑด๊ธฐ์ C003 โ ์์ฝํ ํ๊ฐ์ ๋ณด ์์ฐจ ์กฐํ)
- ๊ฑด๊ธฐ์ 0๊ฑด โ "๋ชจ๋ฅธ๋ค". **์๋์ผ๋ก ์์ฝํ API ํด๋ฐฑ** (OTC ์ข
ํฉ๋นํ๋ฏผ์ด ๊ฑด๊ธฐ์์ด ์๋ ์์ฝํ์ธ ๊ฒฝ์ฐ ๋ง์ โ ๋น๋งฅ์คยท์๋ก๋๋ฏผยท์ผํธ๋ฃธ ๋ฑ)
- **์์ฝํ์ Open API๋ง์ผ๋ก ํจ๋ ํ๋ณด ๋ถ๊ฐ** (ํ๊ฐ์ ๋ณด API๋ ์ฑ๋ถ๋ช
๋ง ์ ๊ณต). ITEM_SEQ ํ๋ณด ํ **nedrug ์์ธ ํ์ด์ง "์๋ฃ์ฝํ ๋ฐ ๋ถ๋" ํ
์ด๋ธ์ ํ์ ํ์ฑ** โ ์ง์ง ํจ๋(mg/IU/ยตg)ยท๊ท๊ฒฉ(KP/USP/EP/๋ณ๊ท)ยทํ์ฐ๊ฐ(์ผ๋ก์ X mg) ํ๋ณด
- ๋ผ๋ฒจ ์ฌ์ง ์
๋ก๋ ์ โ OCR + ์ ์ ํ API ๊ต์ฐจ๊ฒ์ฆ (**๋ผ๋ฒจ ๊ฐ์ด ground truth**)
- ํด์ธ ์ ํ์ ์์ฝ์ฒ ๋ฏธ๋ฑ๋ก โ Perplexity/๊ณต์๋ชฐ/iHerb ์ฒด์ธ์ผ๋ก ํด๋ฐฑ
- ์ ์ฒด ๊ท์น: `references/kfda-htfs-api.md` (๊ฑด๊ธฐ์), `references/kfda-drug-api.md` (์์ฝํ API + ยง9 nedrug ์คํฌ๋ํ)
```
Step A: ์ฌ์ฉ์ ๋ผ๋ฒจ ์ฌ์ง ์์ฒญ (ํญ์ 1์์ ์ง๋ฌธ)
- "๋ผ๋ฒจ ์ฌ์ง ์์ผ๋ฉด ํจ์ฌ ์ ํํด์. ์์ผ์๋ฉด ์ฌ๋ ค์ฃผ์ธ์."
- ์ฌ์ง ์ ๊ณต ์ โ prompts/parse-image.md๋ก JSON ์ถ์ถ + ๋ผ๋ฒจ์ "์์ฝํ/๊ฑด๊ฐ๊ธฐ๋ฅ์ํ" ํ๊ธฐ ๊ฐ์ง โ Step B-KFDA๋ก ๊ต์ฐจ๊ฒ์ฆ โ Step X
- ์์ผ๋ฉด Step B๋ก
Step B: user-data/ DB ์ฌ์ฌ์ฉ
- ๊ฑด๊ธฐ์: user-data/products/{key}.json
- ์์ฝํ: user-data/drugs/{item_seq}.json
- verified_at 365์ผ ์ด๋ด + confidence โฅ medium์ด๋ฉด ์ฌ์ฌ์ฉ
- DB hit ์ โ Step X๋ก (๋คํธ์ํฌ ํธ์ถ 0๊ฑด)
Step C: โ
์์ฝ์ฒ C003 API (๊ฑด๊ฐ๊ธฐ๋ฅ์ํ 1์ฐจ ๊ทผ๊ฑฐ)
- ์กฐ๊ฑด: env KFDA_FOODSAFETY_KEY ์ค์ ๋จ
- ์๋ํฌ์ธํธ:
GET http://openapi.foodsafetykorea.go.kr/api/{KEY}/C003/json/1/10/PRDLST_NM={์ ํ๋ช
}
- ๊ฒฐ๊ณผ ์ฒ๋ฆฌ (kfda-htfs-api.md ยง4-4):
* 1๊ฑด โ ํ์ โ prompts/parse-kfda-response.md โ Step X
* 2~5๊ฑด โ ๋ฆฌ์คํธ ์ ์ + ์ฌ์ฉ์ ์ ํ
* 6๊ฑด+ โ ์ขํ๊ธฐ ์ง๋ฌธ (์ ์กฐ์ฌ โ ์ ํ โ ํจ๋ โ ๊ตฌ๋งค์๊ธฐ ์)
* 0๊ฑด โ โ
Step C2๋ก (๊ฑด๊ธฐ์ ๋ฏธ๋ฑ๋ก = ์์ฝํ ๊ฐ๋ฅ์ฑ)
Step C2-a: โ
์์ฝ์ฒ ์์ฝํ Open API (์ผ๋ฐ์์ฝํ/์ ๋ฌธ์์ฝํ ํด๋ฐฑ) [v3 ์ ๊ท, v3.1 ์ฌ๊ตฌ์ฑ]
- ์กฐ๊ฑด: env KFDA_HTFS_KEY ์ค์ ๋จ (๋๋ KFDA_DRUG_KEY)
- ์๋ํฌ์ธํธ ์์ฐจ:
Auf GitHub ansehen