Spaces:
Runtime error
Runtime error
J.B-Lin commited on
Commit ยท
ec90eae
1
Parent(s): ca31c30
chore: save current version before UI improvements (i18n + font fix)
Browse filesThis view is limited to 50 files because it contains too many changes. ย See raw diff
- .gitignore +1 -2
- __pycache__/loop.cpython-311.pyc +0 -0
- __pycache__/loop.cpython-313.pyc +0 -0
- app.py +10 -4
- c +502 -0
- data/diet_logs.json +53 -0
- data/family/memory.md +21 -0
- data/family/preferences.md +23 -0
- data/family/recipes.md +35 -0
- data/nutrition/raw/ไธญๅฝๅญๆๅฆๅฅณ่ณ้ฃๆๅ2022ๅพ็่ฝฌmd็.md +124 -0
- data/nutrition/raw/ๅคๅญ&ๅญๆฉไธญๆไธๆๅๅบไนณๆ็ๆๆ่ณ้ฃ่ฅๅ ป็ด ๅ่ๆๅ ฅ้.md +291 -0
- data/nutrition/raw/ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟๆจ่ๅผๆ ๅ.md +92 -0
- data/presets/.daily_status.json +6 -0
- data/presets/ไปๆฅ็ฎๆฅ_2026-06-10.json +15 -0
- debug2.txt +3 -0
- debug4.txt +2 -0
- debug_out.txt +3 -0
- docs/้กน็ฎ็่งฃ_ๆๆฏๆถๆ.md +578 -222
- loop.py +291 -0
- modules/__pycache__/__init__.cpython-313.pyc +0 -0
- modules/__pycache__/diet_extractor.cpython-311.pyc +0 -0
- modules/__pycache__/diet_extractor.cpython-313.pyc +0 -0
- modules/__pycache__/family_manager.cpython-311.pyc +0 -0
- modules/__pycache__/family_manager.cpython-313.pyc +0 -0
- modules/__pycache__/nutrition_standards.cpython-311.pyc +0 -0
- modules/__pycache__/nutrition_standards.cpython-313.pyc +0 -0
- modules/diet_extractor.py +274 -0
- modules/family_manager.py +320 -0
- modules/nutrition_standards.py +377 -0
- plugins/__init__.py +5 -0
- plugins/__pycache__/__init__.cpython-311.pyc +0 -0
- plugins/__pycache__/__init__.cpython-313.pyc +0 -0
- plugins/__pycache__/base.cpython-311.pyc +0 -0
- plugins/__pycache__/base.cpython-313.pyc +0 -0
- plugins/__pycache__/briefing_generator.cpython-311.pyc +0 -0
- plugins/__pycache__/briefing_generator.cpython-313.pyc +0 -0
- plugins/__pycache__/diet_summary.cpython-311.pyc +0 -0
- plugins/__pycache__/diet_summary.cpython-313.pyc +0 -0
- plugins/__pycache__/dri_analysis.cpython-311.pyc +0 -0
- plugins/__pycache__/dri_analysis.cpython-313.pyc +0 -0
- plugins/__pycache__/family_memory.cpython-311.pyc +0 -0
- plugins/__pycache__/family_memory.cpython-313.pyc +0 -0
- plugins/__pycache__/family_quiz.cpython-311.pyc +0 -0
- plugins/__pycache__/family_quiz.cpython-313.pyc +0 -0
- plugins/__pycache__/preset_writer.cpython-311.pyc +0 -0
- plugins/__pycache__/preset_writer.cpython-313.pyc +0 -0
- plugins/__pycache__/three_day_summary.cpython-311.pyc +0 -0
- plugins/__pycache__/three_day_summary.cpython-313.pyc +0 -0
- plugins/__pycache__/weight_check.cpython-311.pyc +0 -0
- plugins/__pycache__/weight_check.cpython-313.pyc +0 -0
.gitignore
CHANGED
|
@@ -1,2 +1 @@
|
|
| 1 |
-
.vscode/
|
| 2 |
-
data/nutrition/raw/
|
|
|
|
| 1 |
+
.vscode/
|
|
|
__pycache__/loop.cpython-311.pyc
ADDED
|
Binary file (17.4 kB). View file
|
|
|
__pycache__/loop.cpython-313.pyc
ADDED
|
Binary file (16.6 kB). View file
|
|
|
app.py
CHANGED
|
@@ -1,12 +1,13 @@
|
|
| 1 |
"""
|
| 2 |
PregoPal - ๅญๆ้ชๆคAIๅฉๆ
|
| 3 |
=========================
|
| 4 |
-
ไธปๅ
ฅๅฃ๏ผๅฏๅจ Gradio ๅบ็จใ
|
| 5 |
|
| 6 |
ๆถๆ๏ผ
|
| 7 |
-
app.py โ ่ๅ
ฅๅฃ๏ผ
|
| 8 |
config.py โ ๅ
จๅฑ้
็ฝฎ
|
| 9 |
-
|
|
|
|
| 10 |
modules/ โ ไธๅก้ป่พๅฑ
|
| 11 |
ui/ โ ่กจ็ฐๅฑ๏ผGradio ็้ข๏ผ
|
| 12 |
data/ โ ๆฐๆฎๅญๅจ
|
|
@@ -14,9 +15,14 @@ PregoPal - ๅญๆ้ชๆคAIๅฉๆ
|
|
| 14 |
|
| 15 |
import gradio as gr
|
| 16 |
from ui.app_builder import create_app
|
|
|
|
| 17 |
|
| 18 |
if __name__ == "__main__":
|
| 19 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
| 20 |
demo.launch(
|
| 21 |
theme=gr.themes.Soft(
|
| 22 |
primary_hue="pink",
|
|
|
|
| 1 |
"""
|
| 2 |
PregoPal - ๅญๆ้ชๆคAIๅฉๆ
|
| 3 |
=========================
|
| 4 |
+
ไธปๅ
ฅๅฃ๏ผๅฏๅจ Gradio ๅบ็จ + ๆฏๆฅ Loopใ
|
| 5 |
|
| 6 |
ๆถๆ๏ผ
|
| 7 |
+
app.py โ ่ๅ
ฅๅฃ๏ผๅฏๅจ Gradio + Loop๏ผ
|
| 8 |
config.py โ ๅ
จๅฑ้
็ฝฎ
|
| 9 |
+
loop.py โ ๆ ธๅฟๅพช็ฏๅผๆ๏ผ็ถๆๆบ้ฉฑๅจ๏ผ
|
| 10 |
+
plugins/ โ Loop ๆไปถ
|
| 11 |
modules/ โ ไธๅก้ป่พๅฑ
|
| 12 |
ui/ โ ่กจ็ฐๅฑ๏ผGradio ็้ข๏ผ
|
| 13 |
data/ โ ๆฐๆฎๅญๅจ
|
|
|
|
| 15 |
|
| 16 |
import gradio as gr
|
| 17 |
from ui.app_builder import create_app
|
| 18 |
+
from loop import check_and_run_loop
|
| 19 |
|
| 20 |
if __name__ == "__main__":
|
| 21 |
+
# ๅฏๅจๆถๆฃๆฅๅนถ่ฟ่กๆฏๆฅ Loop
|
| 22 |
+
loop = check_and_run_loop()
|
| 23 |
+
|
| 24 |
+
# ๅๅปบๅนถๅฏๅจ Gradio ๅบ็จ
|
| 25 |
+
demo = create_app(loop)
|
| 26 |
demo.launch(
|
| 27 |
theme=gr.themes.Soft(
|
| 28 |
primary_hue="pink",
|
c
ADDED
|
@@ -0,0 +1,502 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ๐ธ PregoPal ้กน็ฎ็่งฃไธๆๆฏๆถๆ๏ผv4 - Loop ้ฉฑๅจ + ไธๆๆกฃๆไฝ๏ผ
|
| 2 |
+
|
| 3 |
+
> ๆฌๆๆกฃๅทฒๅฎๆ้ๆ๏ผๆฏไธชๅฐ่ๆซๅฐพ้ๆๆนๆณจๅบ๏ผไพฟไบไฝ ่พน็่พนๆ ๆณจๆ่งใ
|
| 4 |
+
|
| 5 |
+
---
|
| 6 |
+
|
| 7 |
+
## ไธใไธๅฅ่ฏๅฎไฝ
|
| 8 |
+
|
| 9 |
+
**ไธไธชๅบไบๆฏๆฅ็ๅฝๅจๆ Loop ้ฉฑๅจ็ๅญๆ้ชๆค AI ๅฉๆ**๏ผๆฏๅคฉ้ฆๆฌกๅฏๅจๆถ่ชๅจๆป็ปๆจๆฅ้ฅฎ้ฃใๅฏนๆฏๅฝๅฎถ่ฅๅ
ปๆ ๅ๏ผDRIs/่ณ้ฃๆๅ/ไฝ้ๆ ๅ๏ผ๏ผ็ๆไปๆฅ็ฎๆฅๆณจๅ
ฅๅฏน่ฏไธไธๆ๏ผ็ฝๅคฉไธๅฎถๅบญๆๅ๏ผ้่ฟๅฃฐ็บนๅบๅ๏ผ่ช็ถไบคไบ๏ผๅฎๆถ่ฎฐๅฝ้ฅฎ้ฃใๆจ่้ฃ่ฐฑ๏ผๆฌกๆฅๅพช็ฏๅพๅคใ
|
| 10 |
+
|
| 11 |
+
> **ๆนๆณจ๏ผ** ________
|
| 12 |
+
|
| 13 |
+
---
|
| 14 |
+
|
| 15 |
+
## ไบใไธไธช่ฅๅ
ปๆๆกฃ็ๆไฝๆนๆณ
|
| 16 |
+
|
| 17 |
+
ไฝ ๅทฒ็ปไธ่ฝฝๅฐ `data/nutrition/raw/` ็ไธไธชๆไปถ๏ผๅ่ชๆฟๆ
ไธๅ่ง่ฒ๏ผ
|
| 18 |
+
|
| 19 |
+
| ๆๆกฃ | ๆไปถ | ็จ้ | PregoPal ็ๆไฝๆนๅผ |
|
| 20 |
+
|------|------|------|-------------------|
|
| 21 |
+
| **โ ไฝ้ๅข้ฟๆ ๅ** | `ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟๆจ่ๅผๆ ๅ.md` | ไฝ้็ๆตๅบๅ | **ไธปๅจ่ฏข้ฎไฝ้** โ ๆฏๅคฉ Loop ไธญๆฃๆฅๆฏๅฆ้่ฆ่ฏข้ฎ๏ผๅฏน็
ง BMI ๅ็ฑป็ปๅบ่ฏไปท |
|
| 22 |
+
| **โก ่ณ้ฃๆๅ** | `ไธญๅฝๅญๆๅฆๅฅณ่ณ้ฃๆๅ2022ๅพ็่ฝฌmd็.md` | ้ฃ่ฐฑๆจ่ๅบๅ | **ไฝไธบๆจ่้ฃ่ฐฑ็็บฆๆๅบ็ก** โ ๆ นๆฎๅญๆ้ถๆฎต็จๅฎๅกๆจ่้็ๆๆจกๆฟ |
|
| 23 |
+
| **โข DRIs** | `ๅคๅญ&ๅญๆฉไธญๆไธๆๅๅบไนณๆ็ๆๆ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้.md` | ่ฅๅ
ปๅๆๅบๅ | **Agent ๅฎๆๆ่** โ ๆฏๅคฉ่ชๅจๅฏนๆฏ RNI๏ผๅๆไธ่ถณ๏ผๅๅ
ฅๆฌกๆฅ้ข่ฎพ |
|
| 24 |
+
|
| 25 |
+
> **ๆนๆณจ๏ผ** ________
|
| 26 |
+
|
| 27 |
+
### 2.1 ไฝ้ๅข้ฟๆ ๅ โ ไธปๅจ่ฏข้ฎไฝ้
|
| 28 |
+
|
| 29 |
+
**ๆฐๆฎๆฅๆบ**๏ผWS/T 801-2022 ่กจ1
|
| 30 |
+
|
| 31 |
+
```
|
| 32 |
+
ๆฏๅคฉๆฉไธ Loop ็ weight_check ๆไปถ๏ผ
|
| 33 |
+
โโ ๆฃๆฅ data/logs/ ไธญๆฏๅฆๆ่ฟๆ็ไฝ้่ฎฐๅฝ
|
| 34 |
+
โโ ่ฅๆ ่ฎฐๅฝๆ่ฎฐๅฝ่ถ
่ฟ 7 ๅคฉ
|
| 35 |
+
โ โโ ๅจไปๆฅ็ฎๆฅไธญๆ ่ฎฐใ้่ฏข้ฎไฝ้ใ
|
| 36 |
+
โ ๏ผUI ๅผนๅบไฝ้ๅก็๏ผๆ่ฏญ้ณ่ฏข้ฎ๏ผใไปๅคฉ็งฐไฝ้ไบๅ๏ผใ๏ผ
|
| 37 |
+
โโ ่ฅๆ่ฎฐๅฝ
|
| 38 |
+
โโ ่ฎก็ฎๅฝๅๅญๅจใๅญๅ BMIใๅฝๅๆปๅข้ฟๅผ
|
| 39 |
+
โโ ๅฏน็
งๆ ๅ่กจ๏ผ
|
| 40 |
+
|
| 41 |
+
| ๅญๅ BMI ๅ็ฑป | ๆปๅข้ฟ่ๅด | ๆฏๅจๅข้ฟ(ไธญ+ๆ) |
|
| 42 |
+
|----------------------|------------|----------------|
|
| 43 |
+
| ไฝไฝ้ BMI<18.5 | 11.0~16.0 | 0.46(0.37~0.56) |
|
| 44 |
+
| ๆญฃๅธธ 18.5โคBMI<24.0 | 8.0~14.0 | 0.37(0.26~0.48) |
|
| 45 |
+
| ่ถ
้ 24.0โคBMI<28.0 | 7.0~11.0 | 0.30(0.22~0.37) |
|
| 46 |
+
| ่ฅ่ BMIโฅ28.0 | 5.0~9.0 | 0.22(0.15~0.30) |
|
| 47 |
+
|
| 48 |
+
โโ ๅจ่ๅดๅ
โ โ
้ผๅฑใไฝ้ๅข้ฟๅพๅฅฝ๏ผ็ปง็ปญไฟๆ๏ผใ
|
| 49 |
+
โโ ่ถ
ๅบ่ๅด โ โ ๏ธ ๆ้ใๅข้ฟๅๅฟซ/ๅๆ
ข๏ผๅปบ่ฎฎ่ฐๆด้ฅฎ้ฃ/ๅจ่ฏขๅป็ใ
|
| 50 |
+
```
|
| 51 |
+
|
| 52 |
+
> **ๆนๆณจ๏ผ** ________
|
| 53 |
+
|
| 54 |
+
### 2.2 ่ณ้ฃๆๅ โ ้ฃ่ฐฑๆจ่ๅบ็ก
|
| 55 |
+
|
| 56 |
+
**ๆฐๆฎๆฅๆบ**๏ผไธญๅฝๅญๆๅฆๅฅณๅนณ่กก่ณ้ฃๅฎๅก๏ผๅคๅญ/ๅญไธญๆ/ๅญๆๆ/ๅบไนณๆ๏ผ
|
| 57 |
+
|
| 58 |
+
```
|
| 59 |
+
ๆจ่้ฃ่ฐฑๆถ๏ผAI ็็บฆๆๆกไปถ๏ผ
|
| 60 |
+
โโ ๅญไธญๆๅฎๅก๏ผ
|
| 61 |
+
โ ๅฅถ็ฑป 300-500g๏ผ้ฑผ็ฆฝ่่็ฑป 150-200g๏ผ่ฐท็ฑป 200-250g
|
| 62 |
+
โ ่ฌ่ 400-500g๏ผๆฐดๆ 200-300g๏ผ่ฏ็ฑป 75g
|
| 63 |
+
โ ๅคง่ฑ 20g๏ผๅๆ 10g๏ผๆฒน 25g๏ผ็ 5g
|
| 64 |
+
โ
|
| 65 |
+
โโ ๅญๆๆๅฎๅก๏ผ
|
| 66 |
+
โ ๅฅถ็ฑป 300-500g๏ผ้ฑผ็ฆฝ่่็ฑป 175-225g๏ผ่ฐท็ฑป 225-275g
|
| 67 |
+
โ ่ฌ่ 400-500g๏ผๆฐดๆ 200-350g๏ผ่ฏ็ฑป 75g
|
| 68 |
+
โ ๅคง่ฑ 20g๏ผๅๆ 10g๏ผๆฒน 25g๏ผ็ 5g
|
| 69 |
+
โ
|
| 70 |
+
โโ ่ณ้ฃๆๅๅ
ญๆกๆ ธๅฟๅปบ่ฎฎ๏ผๅตๅ
ฅ็ณป็ปๆ็คบ่ฏ๏ผ๏ผ
|
| 71 |
+
1. ่ฐๆดๅญๅไฝ้่ณๆญฃๅธธ่ๅด
|
| 72 |
+
2. ๅธธๅๅซ้้ฃ็ฉ๏ผ้็จ็ข็๏ผ่กฅๅ
ๅถ้
ธๅ็ปด็็ด D
|
| 73 |
+
3. ๅญๅไธฅ้่
ๅฐ้ๅค้ค
|
| 74 |
+
4. ๅญไธญๆๆๅขๅ ๅฅถใ้ฑผใ็ฆฝใ่ใ็ฆ่
|
| 75 |
+
5. ็ปๅธธๆทๅคๆดปๅจ๏ผ็ฆ็้
|
| 76 |
+
6. ๆๅฟซๅญ่ฒๆฐ็ๅฝ๏ผ็งฏๆๅๅคๆฏไนณๅๅ
ป
|
| 77 |
+
```
|
| 78 |
+
|
| 79 |
+
**ๅๆ MEAL_TEMPLATES ็ๆน้ **๏ผไธๅ็กฌ็ผ็ ๆจกๆฟๅญ็ฌฆไธฒ๏ผ่ๆฏๅฐไธ่ฟฐๅฎๅก็บฆๆๆกไฝไธบ็ปๆๅ JSON ไผ ้็ป AI๏ผๆไฝไธบๆฌๅฐ fallback ๅ
ๅบ๏ผ๏ผ็ฑ AI ๆ นๆฎๅฎๅก็บฆๆ + ็จๆทๅๅฅฝ็ๆไธชๆงๅ้ฃ่ฐฑใ
|
| 80 |
+
|
| 81 |
+
> **ๆนๆณจ๏ผ** ________
|
| 82 |
+
|
| 83 |
+
### 2.3 DRIs โ Agent ๅฎๆๅๆ๏ผ่ชๅจ่ฟ่ก โ ๅๅ
ฅๆฌกๆฅ้ข่ฎพ๏ผ
|
| 84 |
+
|
| 85 |
+
**ๆฐๆฎๆฅๆบ**๏ผ่กจ15๏ผๅญๆฉๆ๏ผ/ ่กจ16๏ผๅญไธญๆ๏ผ/ ่กจ17๏ผๅญๆๆ๏ผ/ ่กจ18๏ผๅบไนณๆ๏ผ
|
| 86 |
+
|
| 87 |
+
```
|
| 88 |
+
ๆฏๅคฉ Loop ็ dri_analysis ๆไปถ๏ผ
|
| 89 |
+
โโ ่ฏปๅๆจๆฅ้ฅฎ้ฃ่ฎฐๅฝ๏ผdata/logs/้ฅฎ้ฃๆฅๅฟ_YYYY-MM-DD.md๏ผ
|
| 90 |
+
โโ ๆ นๆฎๅฝๅๅญๆ้ถๆฎต้ๆฉๅฏนๅบ DRIs ่กจ
|
| 91 |
+
โโ ๅ
ณ้ฎ่ฅๅ
ป็ด ้้กนๅฏนๆฏ๏ผ้็นๆ ่ฎฐ RNI ไธๆๅ
ฅ้ๅทฎๅผ๏ผ๏ผ
|
| 92 |
+
|
| 93 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 94 |
+
โ ่ฅๅ
ป็ด RNI(ๅญไธญๆ) ๆจๆฅๆๅ
ฅ ๅทฎๅผ โ
|
| 95 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค
|
| 96 |
+
โ ่ฝ้(MJ) 9.84(PAL II) 8.2 -17% โ
|
| 97 |
+
โ ่็ฝ่ดจ(g) 70 55 -21% โ
|
| 98 |
+
โ ้(mg) 800 420 -48% โ
|
| 99 |
+
โ ้(mg) 25 12 -52% โ ้็นๅ
ณๆณจ โ
|
| 100 |
+
โ ๅถ้
ธ(ฮผg DFE) 600 350 -42% โ ้็นๅ
ณ๏ฟฝ๏ฟฝ โ
|
| 101 |
+
โ ็ปด็็ด D(ฮผg) 10 2.1 -79% โ ้็นๅ
ณๆณจ โ
|
| 102 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 103 |
+
|
| 104 |
+
โโ ็ๆๅๆ็ป่ฎบ๏ผ่ช็ถ่ฏญ่จ๏ผ๏ผ
|
| 105 |
+
โ ใๆจๅคฉ้ใ้ใๅถ้
ธๆๅ
ฅๅไฝ๏ผๅปบ่ฎฎไปๅคฉๅคๅ๏ผ
|
| 106 |
+
โ โ ๆทฑ็ปฟ่ฒ่ฌ่๏ผ่ ่ใ่ฅฟๅ
ฐ่ฑ๏ผ
|
| 107 |
+
โ โ ็ฆ่/ๅจ็ฉ่่
|
| 108 |
+
โ โ ่ฑๅถๅ/ๅฅถๅถๅใ
|
| 109 |
+
โ
|
| 110 |
+
โโ ๅๅ
ฅ data/presets/ไปๆฅ็ฎๆฅ_YYYY-MM-DD.json
|
| 111 |
+
โ ไปๆฅ้็นๅ
ณๆณจ่ฅๅ
ป็ด ๅ่กจ
|
| 112 |
+
โ ไปๆฅๆจ่้ฃ็ฉ็ฑปๅซไธไปฝ้
|
| 113 |
+
โ ไฝ้ๆ้๏ผๅฆ้๏ผ
|
| 114 |
+
โ ไธๅญๅฆๅๅฎถไบบไบค่ฐ็ๅปบ่ฎฎๅผๅบ่ฏ้ข
|
| 115 |
+
```
|
| 116 |
+
|
| 117 |
+
> **ๆนๆณจ๏ผ** ________
|
| 118 |
+
|
| 119 |
+
---
|
| 120 |
+
|
| 121 |
+
## ไธใๆ ธๅฟๆถๆ๏ผLoop ้ฉฑๅจ๏ผ็ถๆๆบ + ๆไปถๆณจๅ๏ผ
|
| 122 |
+
|
| 123 |
+
### 3.1 ่ฎพ่ฎก็ๅฟต
|
| 124 |
+
|
| 125 |
+
PregoPal ไธๆฏไธไธชใ็จๆท็นๆ้ฎ โ ๅบ็ปๆใ็่ขซๅจๅบ็จ๏ผ่ๆฏ**ๆๆฏๆฅ็ๅฝๅจๆ็ไธปๅจไผดไพฃ**ใ
|
| 126 |
+
|
| 127 |
+
ๅ่ไฝ ๆไพ็ `nanobot_core/agent/loop.py` ไธญ็**็ถๆๆบไบไปถ้ฉฑๅจๆจกๅผ**๏ผPregoPal ็ Loop ๆๅไธคไธชๆ ธๅฟ่ฎพ่ฎก๏ผ
|
| 128 |
+
|
| 129 |
+
1. **TurnState ็ถๆๆบ**๏ผ็ฑปๆฏ `_process_message` ็ `_state_*` ็ถๆ้พ๏ผโ ็ฎก็ๆฏๆฅ็ๅฝๅจๆ็้ถๆฎตๆต่ฝฌ
|
| 130 |
+
2. **ๅฏๆณจๅ็ๆฉๅฑ่ฝๅ**๏ผ็ฑปๆฏ ToolRegistry๏ผโ ๆฏไธช้ถๆฎต็ๅ
ทไฝ้ป่พ็ฑ Plugin ๅฎ็ฐ
|
| 131 |
+
|
| 132 |
+
> **ๆนๆณจ๏ผ** ________
|
| 133 |
+
|
| 134 |
+
### 3.2 ๆฏๆฅ็ๅฝๅจๆ
|
| 135 |
+
|
| 136 |
+
```
|
| 137 |
+
โโโโโโโโโโโโโโโ
|
| 138 |
+
โ LAUNCH โ โ ้ฆๆฌกๅฏๅจๆฃๆฅ
|
| 139 |
+
โ (ๅฏๅจ) โ
|
| 140 |
+
โโโโโโโโฌโโโโโโโ
|
| 141 |
+
โ
|
| 142 |
+
โโโโโโโโโโโโโดโโโโโโโโโโโโ
|
| 143 |
+
โ โ
|
| 144 |
+
้ฆๆฌก่ฟ่กไปๆฅ ๅทฒ่ฟ่ก่ฟไปๆฅ
|
| 145 |
+
โ โ
|
| 146 |
+
โผ โผ
|
| 147 |
+
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
|
| 148 |
+
โ SUMMARIZE โ โ โ
|
| 149 |
+
โ (ๆจๆฅๆป็ป) โ โ โ
|
| 150 |
+
โ โ ่ฏปๅ้ฅฎ้ฃๆฅๅฟ โ โ โ
|
| 151 |
+
โ โ ๆฃๆฅไฝ้ โ โ โ
|
| 152 |
+
โโโโโโโโฌโโโโโโโโ โ โ
|
| 153 |
+
โ โ โ
|
| 154 |
+
โผ โ โ
|
| 155 |
+
โโโโโโโโโโโโโโโโ โ โ
|
| 156 |
+
โ ANALYZE โ โ โ
|
| 157 |
+
โ (่ฅๅ
ปๅๆ) โ โ โ
|
| 158 |
+
โ โ ๅฏนๆฏDRIs โ โ โ
|
| 159 |
+
โโโโโโโโฌโโโโโโโโ โ โ
|
| 160 |
+
โ โ โ
|
| 161 |
+
โผ โ โ
|
| 162 |
+
โโโโโโโโโโโโโโโโ โ โ
|
| 163 |
+
โ BRIEF โ โ โ
|
| 164 |
+
โ (็ๆ็ฎๆฅ) โ โ โ
|
| 165 |
+
โ โ ๅJSON โ โ โ
|
| 166 |
+
โโโโโโโโฌโโโโโโโโ โ โ
|
| 167 |
+
โ โ โ
|
| 168 |
+
โผ โผ โ
|
| 169 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 170 |
+
โ INTERACT โโโโ
|
| 171 |
+
โ (็ฝๅคฉไบคไบๆจกๅผ) โ
|
| 172 |
+
โ โ ๅฃฐ็บน่ฏๅซ โ ๅบๅ่ฏด่ฏไบบ โ
|
| 173 |
+
โ โ ๅฏน่ฏ็่งฃ โ ่ฎฐๅฝ้ฅฎ้ฃ/ๆจ่/้ฒ่ โ
|
| 174 |
+
โ โ ็ฎๆฅๆณจๅ
ฅ โ AI ็ฅ้ไปๆฅๅ
ณๆณจ็น โ
|
| 175 |
+
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
|
| 176 |
+
โ
|
| 177 |
+
็จๆท็ปๆไปๆฅ
|
| 178 |
+
โ
|
| 179 |
+
โผ
|
| 180 |
+
โโโโโโโโโโโโโโโโ
|
| 181 |
+
โ CONSOLIDATE โ
|
| 182 |
+
โ (ๆ้ดๆด็) โ โ ๅฏ้๏ผๅ
ณ้ญ้กต้ขๆถ่งฆๅ๏ผ
|
| 183 |
+
โ โ ๆฑๆปไปๆฅ โ
|
| 184 |
+
โ โ ๅๆๆฅ้ข่ฎพ โ
|
| 185 |
+
โโโโโโโโฌโโโโโโโโ
|
| 186 |
+
โ
|
| 187 |
+
โผ
|
| 188 |
+
โโโโโโโโโโโโโโโโ
|
| 189 |
+
โ DONE โ
|
| 190 |
+
โโโโโโโโโโโโโโโโ
|
| 191 |
+
```
|
| 192 |
+
|
| 193 |
+
> **ๆนๆณจ๏ผ** ________
|
| 194 |
+
|
| 195 |
+
### 3.3 ็ถๆๆบๅฎไน
|
| 196 |
+
|
| 197 |
+
```python
|
| 198 |
+
# ็ถๆๆไธพ
|
| 199 |
+
class LoopState(Enum):
|
| 200 |
+
LAUNCH = "launch" # ๅฏๅจๆฃๆฅ๏ผๆฏๅฆๆฏไปๆฅ้ฆๆฌก่ฟ่ก
|
| 201 |
+
SUMMARIZE = "summarize" # ๆจๆฅๆป็ป๏ผ๏ฟฝ๏ฟฝๆๆจๆฅ้ฅฎ้ฃ/ไฝ้
|
| 202 |
+
ANALYZE = "analyze" # ่ฅๅ
ปๅๆ๏ผๅฏนๆฏ DRIs
|
| 203 |
+
BRIEF = "brief" # ็ๆไปๆฅ็ฎๆฅ
|
| 204 |
+
INTERACT = "interact" # ็ฝๅคฉไบคไบๆจกๅผ๏ผ็ญๅพ
็จๆทๆไฝ๏ผ
|
| 205 |
+
CONSOLIDATE = "consolidate" # ๆ้ดๆด็
|
| 206 |
+
DONE = "done"
|
| 207 |
+
|
| 208 |
+
# ็ถๆ่ฝฌ็งป่กจ๏ผ็ฑปๆฏ nanobot_core ็ _TRANSITIONS๏ผ
|
| 209 |
+
_TRANSITIONS = {
|
| 210 |
+
(LoopState.LAUNCH, "first_run_today"): LoopState.SUMMARIZE,
|
| 211 |
+
(LoopState.LAUNCH, "already_run"): LoopState.INTERACT,
|
| 212 |
+
(LoopState.SUMMARIZE, "ok"): LoopState.ANALYZE,
|
| 213 |
+
(LoopState.ANALYZE, "ok"): LoopState.BRIEF,
|
| 214 |
+
(LoopState.BRIEF, "ok"): LoopState.INTERACT,
|
| 215 |
+
(LoopState.INTERACT, "day_ended"): LoopState.CONSOLIDATE,
|
| 216 |
+
(LoopState.CONSOLIDATE, "ok"): LoopState.DONE,
|
| 217 |
+
}
|
| 218 |
+
```
|
| 219 |
+
|
| 220 |
+
> **ๆนๆณจ๏ผ** ________
|
| 221 |
+
|
| 222 |
+
### 3.4 ็ถๆๅค็ๅจ
|
| 223 |
+
|
| 224 |
+
ๆฏไธช็ถๆๅฏนๅบไธไธช handler๏ผ็ฑปๆฏ `_state_restore`, `_state_compact`, `_state_run` ็ญ๏ผ๏ผ
|
| 225 |
+
|
| 226 |
+
| ็ถๆ | Handler | ๅ่ฝ |
|
| 227 |
+
|------|---------|------|
|
| 228 |
+
| `LAUNCH` | `_state_launch()` | ๆฃๆฅ `data/presets/` ไธญๆฏๅฆๆไปๆฅ็ฎๆฅ โ ๅณๅฎ้ฆๆฌก/ๅทฒ่ฟ่ก |
|
| 229 |
+
| `SUMMARIZE` | `_state_summarize()` | ้ๅๆง่กๆๆๆณจๅๅจ SUMMARIZE ้ถๆฎต็ Plugin |
|
| 230 |
+
| `ANALYZE` | `_state_analyze()` | ้ๅๆง่กๆๆๆณจๅๅจ ANALYZE ้ถๆฎต็ Plugin |
|
| 231 |
+
| `BRIEF` | `_state_brief()` | ้ๅๆง่กๆๆๆณจๅๅจ BRIEF ้ถๆฎต็ Plugin |
|
| 232 |
+
| `INTERACT` | `_state_interact()` | ็ญๅพ
็จๆทไบคไบ๏ผไป Gradio event queue ๆถ่ดนๆถๆฏ๏ผ |
|
| 233 |
+
| `CONSOLIDATE` | `_state_consolidate()` | ้ๅๆง่กๆๆๆณจๅๅจ CONSOLIDATE ้ถๆฎต็ Plugin |
|
| 234 |
+
| `DONE` | `_state_done()` | ๆธ
็่ตๆบ๏ผๆ ่ฎฐไปๆฅๅฎๆ |
|
| 235 |
+
|
| 236 |
+
> **ๆนๆณจ๏ผ** ________
|
| 237 |
+
|
| 238 |
+
### 3.5 ไธปๅพช็ฏๅ
ฅๅฃ
|
| 239 |
+
|
| 240 |
+
```python
|
| 241 |
+
# loop.py ๆ ธๅฟ้ป่พ
|
| 242 |
+
class PregoPalLoop:
|
| 243 |
+
def __init__(self):
|
| 244 |
+
self.plugins = PluginRegistry()
|
| 245 |
+
self.state = LoopState.LAUNCH
|
| 246 |
+
self._register_default_plugins()
|
| 247 |
+
|
| 248 |
+
async def run(self) -> None:
|
| 249 |
+
"""ไธปๅพช็ฏๅ
ฅๅฃ"""
|
| 250 |
+
while self.state is not LoopState.DONE:
|
| 251 |
+
handler_name = f"_state_{self.state.value}"
|
| 252 |
+
handler = getattr(self, handler_name)
|
| 253 |
+
event = await handler()
|
| 254 |
+
next_state = _TRANSITIONS.get((self.state, event))
|
| 255 |
+
if next_state is None:
|
| 256 |
+
raise RuntimeError(f"No transition from {self.state} on {event}")
|
| 257 |
+
self.state = next_state
|
| 258 |
+
|
| 259 |
+
async def _state_summarize(self) -> str:
|
| 260 |
+
"""SUMMARIZE ้ถๆฎต๏ผๆง่กๆๆ็ธๅ
ณๆไปถ"""
|
| 261 |
+
for plugin in self.plugins.get_plugins(LoopStage.SUMMARIZE):
|
| 262 |
+
await plugin.run(self.context)
|
| 263 |
+
return "ok"
|
| 264 |
+
```
|
| 265 |
+
|
| 266 |
+
> **ๆนๆณจ๏ผ** ________
|
| 267 |
+
|
| 268 |
+
---
|
| 269 |
+
|
| 270 |
+
## ๅใๆไปถ็ณป็ป่ฎพ่ฎก๏ผๅฏๆฉๅฑๆง๏ผ
|
| 271 |
+
|
| 272 |
+
### 4.1 ๆไปถๅบ็ฑป
|
| 273 |
+
|
| 274 |
+
```python
|
| 275 |
+
# plugins/base.py
|
| 276 |
+
from abc import ABC, abstractmethod
|
| 277 |
+
from dataclasses import dataclass, field
|
| 278 |
+
from enum import Enum
|
| 279 |
+
|
| 280 |
+
class LoopStage(Enum):
|
| 281 |
+
"""ๆไปถๅฏๆณจๅ็้ถๆฎต"""
|
| 282 |
+
SUMMARIZE = "summarize"
|
| 283 |
+
ANALYZE = "analyze"
|
| 284 |
+
BRIEF = "brief"
|
| 285 |
+
CONSOLIDATE = "consolidate"
|
| 286 |
+
|
| 287 |
+
@dataclass
|
| 288 |
+
class LoopContext:
|
| 289 |
+
"""ๆไปถไธไธๆ๏ผๅ
ฑไบซๆฐๆฎๅฎนๅจ"""
|
| 290 |
+
briefing: dict = field(default_factory=dict) # ไปๆฅ็ฎๆฅๆฐๆฎ
|
| 291 |
+
weight_data: dict = field(default_factory=dict) # ไฝ้่ฎฐๅฝ
|
| 292 |
+
diet_records: list = field(default_factory=list) # ้ฅฎ้ฃ่ฎฐๅฝ
|
| 293 |
+
analysis_results: dict = field(default_factory=dict) # ๅๆ็ปๆ
|
| 294 |
+
errors: list = field(default_factory=list) # ้่ฏฏๆถ้
|
| 295 |
+
|
| 296 |
+
@dataclass
|
| 297 |
+
class PluginResult:
|
| 298 |
+
"""ๆไปถๆง่ก็ปๆ"""
|
| 299 |
+
success: bool
|
| 300 |
+
data: dict = field(default_factory=dict)
|
| 301 |
+
message: str = ""
|
| 302 |
+
|
| 303 |
+
class LoopPlugin(ABC):
|
| 304 |
+
"""Loop ๆฉๅฑๆไปถๅบ็ฑป โ ๆๆๆไปถ็ปงๆฟๆญค็ฑป"""
|
| 305 |
+
|
| 306 |
+
@abstractmethod
|
| 307 |
+
def stage(self) -> LoopStage:
|
| 308 |
+
"""ๆญคๆไปถๆณจๅๅฐๅชไธช้ถๆฎต"""
|
| 309 |
+
|
| 310 |
+
@abstractmethod
|
| 311 |
+
def name(self) -> str:
|
| 312 |
+
"""ๆไปถๅฏไธๅ็งฐ"""
|
| 313 |
+
|
| 314 |
+
@abstractmethod
|
| 315 |
+
async def run(self, ctx: LoopContext) -> PluginResult:
|
| 316 |
+
"""ๆง่กๆไปถ้ป่พ"""
|
| 317 |
+
```
|
| 318 |
+
|
| 319 |
+
> **ๆนๆณจ๏ผ** ________
|
| 320 |
+
|
| 321 |
+
### 4.2 ๅ
็ฝฎๆไปถๆธ
ๅ
|
| 322 |
+
|
| 323 |
+
| ๆไปถ | ็ฑปๅ | ๆณจๅ้ถๆฎต | ๅ่ฝ | ๆฐๆฎๆบ |
|
| 324 |
+
|------|------|---------|------|--------|
|
| 325 |
+
| ๆจๆฅ้ฅฎ้ฃๆป็ป | `DietSummaryPlugin` | SUMMARIZE | ่ฏปๅๆจๆฅ้ฅฎ้ฃๆฅๅฟ๏ผๆฑๆปไธ้ค | `data/logs/*.md` |
|
| 326 |
+
| ไฝ้ๆฃๆฅ | `WeightCheckPlugin` | SUMMARIZE | ๆฃๆฅไฝ้่ฎฐๅฝ๏ผๅฏนๆฏ WS/T 801 | `data/logs/*.md` + ็จๆท่พๅ
ฅ |
|
| 327 |
+
| DRIs ๅๆ | `DRIAnalysisPlugin` | ANALYZE | ๅฏนๆฏ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้ | DRIs ่กจ + ๆจๆฅ้ฅฎ้ฃ |
|
| 328 |
+
| ็ฎๆฅ็ๆ | `BriefingGeneratorPlugin` | BRIEF | ๆฑๆปๅๆไธบ็ปๆๅ JSON | `LoopContext` |
|
| 329 |
+
| ้ข่ฎพๅๅ
ฅ | `PresetWriterPlugin` | CONSOLIDATE | ็ๆๆๆฅ้ข่ฎพๆไปถ | `data/presets/` |
|
| 330 |
+
|
| 331 |
+
> **ๆนๆณจ๏ผ** ________
|
| 332 |
+
|
| 333 |
+
### 4.3 ๆฉๅฑๆนๅผ
|
| 334 |
+
|
| 335 |
+
```python
|
| 336 |
+
# ๅ็ปญๆฐๅขๅ่ฝ๏ผๅฆ่ก็ณ็ๆต๏ผๅช้ไธคๆญฅ๏ผ
|
| 337 |
+
|
| 338 |
+
# 1. ๅไธไธชๆฐๆไปถ
|
| 339 |
+
class BloodSugarPlugin(LoopPlugin):
|
| 340 |
+
def stage(self) -> LoopStage: return LoopStage.SUMMARIZE
|
| 341 |
+
def name(self) -> str: return "blood_sugar"
|
| 342 |
+
async def run(self, ctx: LoopContext) -> PluginResult:
|
| 343 |
+
# ่ฏปๅ่ก็ณ่ฎฐๅฝ โ ๅๆ่ถๅฟ โ ๅๅ
ฅ ctx
|
| 344 |
+
...
|
| 345 |
+
|
| 346 |
+
# 2. ๆณจๅๅฐ loop
|
| 347 |
+
loop.plugins.register(BloodSugarPlugin())
|
| 348 |
+
|
| 349 |
+
# ไธ้่ฆไฟฎๆน loop.py ็ไปปไฝ็ถๆๆบไปฃ็
|
| 350 |
+
```
|
| 351 |
+
|
| 352 |
+
> **ๆนๆณจ๏ผ** ________
|
| 353 |
+
|
| 354 |
+
---
|
| 355 |
+
|
| 356 |
+
## ไบใๆดไฝๆไปถ็ปๆ
|
| 357 |
+
|
| 358 |
+
```
|
| 359 |
+
PregoPal/
|
| 360 |
+
โโโ app.py # ไธปๅ
ฅๅฃ๏ผๅฏๅจ Gradio + Loop
|
| 361 |
+
โโโ config.py # ๅ
จๅฑ้
็ฝฎ๏ผ่ทฏๅพ/ๆไธพ/็ณป็ปๆ็คบ่ฏๆจกๆฟ๏ผ
|
| 362 |
+
โโโ utils.py # ๅทฅๅ
ทๅฝๆฐ
|
| 363 |
+
โโโ loop.py โ ๐ ๆฐๅข # ๆ ธๅฟๅพช็ฏๅผๆ๏ผ็ถๆๆบ้ฉฑๅจ๏ผ
|
| 364 |
+
โ
|
| 365 |
+
โโโ plugins/ โ ๐ ๆฐๅข # Loop ๆไปถ
|
| 366 |
+
โ โโโ __init__.py
|
| 367 |
+
โ โโโ base.py # LoopPlugin ๅบ็ฑป + PluginRegistry
|
| 368 |
+
โ โโโ diet_summary.py # ๆจๆฅ้ฅฎ้ฃๆป็ป
|
| 369 |
+
โ โโโ weight_check.py # ไฝ้ๆฃๆฅ๏ผWS/T 801๏ผ
|
| 370 |
+
โ โโโ dri_analysis.py # DRIs ่ฅๅ
ป็ด ๅฏนๆฏๅๆ
|
| 371 |
+
โ โโโ briefing_generator.py # ไปๆฅ็ฎๆฅ็ๆๅจ
|
| 372 |
+
โ โโโ preset_writer.py # ้ข่ฎพๆไปถๅๅ
ฅ
|
| 373 |
+
โ
|
| 374 |
+
โโโ core/ # AI ๆ ธๅฟๅฑ๏ผ็ญๅพ
MiniCPM-o ้จ็ฝฒ๏ผ
|
| 375 |
+
โ โโโ __init__.py
|
| 376 |
+
โ โโโ model_loader.py # ๆจกๅๅ ่ฝฝๅจ๏ผ็ฉบๆฅๅฃ๏ผ
|
| 377 |
+
โ โโโ voice_processor.py # ่ฏญ้ณๅค็ๅจ๏ผ็ฉบๆฅๅฃ๏ผ
|
| 378 |
+
โ โโโ vision_processor.py # ่ง่งๅค็ๅจ๏ผ็ฉบๆฅๅฃ๏ผ
|
| 379 |
+
โ โโโ conversation_manager.py # ๅฏน่ฏ็ฎก็ๅจ๏ผ็ฉบๆฅๅฃ๏ผ
|
| 380 |
+
โ
|
| 381 |
+
โโโ modules/ # ไธๅก้ป่พๅฑ
|
| 382 |
+
โ โโโ __init__.py
|
| 383 |
+
โ โโโ voiceprint.py # ๅฃฐ็บน่ฏๅซ
|
| 384 |
+
โ โโโ meal_recommender.py # ่ๅๆจ่
|
| 385 |
+
โ โโโ diet_logger.py # ้ฅฎ้ฃ่ฎฐๅฝ + Markdown ็ๆ
|
| 386 |
+
โ โโโ nutrition_analyzer.py # ่ฅๅ
ปๅๆ + ๅฏ่งๅ
|
| 387 |
+
โ
|
| 388 |
+
โโโ ui/ # ่กจ็ฐๅฑ
|
| 389 |
+
โ โโโ __init__.py
|
| 390 |
+
โ โโโ app_builder.py # Gradio ็้ข + ไบไปถ็ปๅฎ
|
| 391 |
+
โ
|
| 392 |
+
โโโ data/ # ๆฐๆฎๅญๅจ
|
| 393 |
+
โ โโโ nutrition/
|
| 394 |
+
โ โ โโโ raw/ # โ ไฝ ๅทฒไธ่ฝฝ็ไธไธช MD ๆไปถ
|
| 395 |
+
โ โ โโโ ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟๆจ่ๅผๆ ๅ.md
|
| 396 |
+
โ โ โโโ ไธญๅฝๅญๆๅฆๅฅณ่ณ้ฃๆๅ2022ๅพ็่ฝฌmd็.md
|
| 397 |
+
โ โ โโโ ๅคๅญ&ๅญๆฉไธญๆไธๆๅๅบไนณๆ็ๆๆ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้.md
|
| 398 |
+
โ โโโ presets/ โ ๐ ๆฐๅข # ๆฏๆฅ็ฎๆฅ / ้ข่ฎพๆไปถ
|
| 399 |
+
โ โโโ voices/ # ๅฃฐ็บนๆฐๆฎ
|
| 400 |
+
โ โโโ logs/ # Markdown ้ฅฎ้ฃๆฅๅฟ
|
| 401 |
+
โ โโโ reports/ # ๅฏผๅบๆฅๅ
|
| 402 |
+
โ
|
| 403 |
+
โโโ docs/
|
| 404 |
+
โ โโโ ้กน็ฎ็่งฃ_ๆๆฏๆถๆ.md # โ ๆฌๆๆกฃ
|
| 405 |
+
โ โโโ ๅผๅๆฅๅฟ.md
|
| 406 |
+
โ
|
| 407 |
+
โโโ requirements.txt # ไพ่ตๆธ
ๅ
|
| 408 |
+
โโโ README.md
|
| 409 |
+
```
|
| 410 |
+
|
| 411 |
+
> **ๆนๆณจ๏ผ** ________
|
| 412 |
+
|
| 413 |
+
---
|
| 414 |
+
|
| 415 |
+
## ๅ
ญใๆฐๆฎๆตๅ
จๆฏ
|
| 416 |
+
|
| 417 |
+
```
|
| 418 |
+
data/nutrition/raw/
|
| 419 |
+
โโโ ไฝ้ๆ ๅ.md โโโโโโโโโโโโโโ
|
| 420 |
+
โโโ ่ณ้ฃๆๅ.md โโโโโโโโโโโโโโค
|
| 421 |
+
โโโ DRIs.md โโโโโโโโโโโโโโโโโโค
|
| 422 |
+
โ
|
| 423 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโผโโโโโโโโโโโโโโโโโโโโโโโ
|
| 424 |
+
โ data/presets/ โ
|
| 425 |
+
โ (็ผๅญ็ผ่ฏๅ็็ปๆๅๆฐๆฎ) โ
|
| 426 |
+
โ ไฝ้ๆ ๅ.json ่ณ้ฃๆๅ.json DRIs.json โ
|
| 427 |
+
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 428 |
+
โ
|
| 429 |
+
โผ
|
| 430 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 431 |
+
โ loop.py โ
|
| 432 |
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 433 |
+
โ โ ็ถๆๆบ้ฉฑๅจ (LAUNCHโSUMMARIZEโANALYZEโBRIEF) โ โ
|
| 434 |
+
โ โ โ ไพๆฌก่ฐ็จ Plugin โ โ
|
| 435 |
+
โ โ diet_summary โ weight_check โ dri_analysis โ โ
|
| 436 |
+
โ โ โ โ โ
|
| 437 |
+
โ โ briefing_generator โ โ
|
| 438 |
+
โ โ โ โ โ
|
| 439 |
+
โ โ data/presets/ไปๆฅ็ฎๆฅ.json โ โ
|
| 440 |
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 441 |
+
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 442 |
+
โ
|
| 443 |
+
โผ
|
| 444 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 445 |
+
โ ui/app_builder.py (Gradio ็้ข) โ
|
| 446 |
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 447 |
+
โ โ Tab1 ๅฃฐ็บน่ฏๅซ โ Tab2 ่ๅๆจ่ โ Tab3 ้ฅฎ้ฃ่ฎฐๅฝ โ โ
|
| 448 |
+
โ โ Tab4 ่ฅๅ
ปๆฅๅ โ Tab5 ๅ
ณไบ โ โ
|
| 449 |
+
โ โ โ โ
|
| 450 |
+
โ โ ไปๆฅ็ฎๆฅๆณจๅ
ฅๅฏน่ฏไธไธๆ โ โ
|
| 451 |
+
โ โ AI ็ฅ้๏ผไปๅคฉ่ฏฅๅ
ณๆณจไปไน่ฅๅ
ป็ด โ โ
|
| 452 |
+
โ โ ่ฏฅ้ฎ่ฐไฝ้๏ผ่ฏฅ่ไปไน่ฏ้ข๏ผ โ โ
|
| 453 |
+
โ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 454 |
+
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 455 |
+
โ
|
| 456 |
+
โผ
|
| 457 |
+
modules/diet_logger.py (่ฎฐๅฝๆฐๆฐๆฎ)
|
| 458 |
+
modules/meal_recommender.py (่ณ้ฃๆๅ็บฆๆ)
|
| 459 |
+
modules/nutrition_analyzer.py (DRIs ๅฏนๆฏ)
|
| 460 |
+
โ
|
| 461 |
+
โผ
|
| 462 |
+
ๆฌกๆฅ loop.py ๅๆฌกๅฏๅจ โ ๅพช็ฏ
|
| 463 |
+
```
|
| 464 |
+
|
| 465 |
+
> **ๆนๆณจ๏ผ** ________
|
| 466 |
+
|
| 467 |
+
---
|
| 468 |
+
|
| 469 |
+
## ไธใๆๆฏๆ ไธ่ง
|
| 470 |
+
|
| 471 |
+
| ๅฑ็บง | ๆๆฏ | ็จ้ |
|
| 472 |
+
|------|------|------|
|
| 473 |
+
| ๆ ธๅฟๆจกๅ | **MiniCPM-o 4.5**๏ผ็ปไธๅคๆจกๆๆจกๅ๏ผ | ๅ
จๅๅทฅๆจ็๏ผ่ง่ง+่ฏญ้ณ+ๆๆฌ+่ฏญ้ณ่พๅบ |
|
| 474 |
+
| ๅ็ซฏๆกๆถ | **Gradio 6.x** | Web ็้ข๏ผๅฎๆถๅฏน่ฏไบคไบ |
|
| 475 |
+
| ๅฃฐ็บน่ฏๅซ | Whisper-medium encoder embedding๏ผไผๅ
๏ผ| ่ฏด่ฏไบบ่บซไปฝ่ฏๅซ |
|
| 476 |
+
| ้ข่ฐฑๆนๆก | NumPy + SoundFile๏ผๅค้ fallback๏ผ | ๅฃฐ็บน่ฏๅซๅ
ๅบ |
|
| 477 |
+
| ๆฐๆฎๅญๅจ | JSON + Markdown | ้ฅฎ้ฃ่ฎฐๅฝ + ๆฅๅๅญๆกฃ + ๆฏๆฅ็ฎๆฅ |
|
| 478 |
+
| ่ฅๅ
ปๆ ๅ | ไธไธช MD ๆไปถ๏ผๅทฒไธ่ฝฝ๏ผ | ไฝ้ๆ ๅ/่ณ้ฃๆๅ/DRIs |
|
| 479 |
+
| ๅพช็ฏๅผๆ | ่ช็ ็ถๆๆบ + ๆไปถๆณจๅ | ๆฏๆฅ็ๅฝๅจๆ็ฎก็ |
|
| 480 |
+
| ้จ็ฝฒๅนณๅฐ | HuggingFace Spaces๏ผ็ฎๅ๏ผ+ Modal๏ผๅ็ปญ๏ผ | ไบ็ซฏ้จ็ฝฒ |
|
| 481 |
+
|
| 482 |
+
> **ๆนๆณจ๏ผ** ________
|
| 483 |
+
|
| 484 |
+
---
|
| 485 |
+
|
| 486 |
+
## ๅ
ซใๅพ
่ฎจ่ฎบ้ฎ้ขๆธ
ๅ
|
| 487 |
+
|
| 488 |
+
> ๐ ไธ่กจๆฑๆปไบๆฌๆๆกฃไธญ้่ฆไฝ ๅณ็ญ็้ฎ้ขใ่ฏทๅจ `____` ๅคๆ ๆณจไฝ ็ๆ่ง๏ผๅฆ้ๆดๅค่ฎจ่ฎบ๏ผๅจๅฏนๅบๅฐ่ๆนๆณจๅบ่กฅๅ
๏ผใ
|
| 489 |
+
|
| 490 |
+
| # | ้ฎ้ข | ไฝ ็้ๆฉ / ๆ่ง |
|
| 491 |
+
|---|------|----------------|
|
| 492 |
+
| 1 | **Loop ๅฏๅจๆถๆบ**๏ผGradio ๅฏๅจๆถๅ
่ทๅฎ Loop ๆป็ป้ถๆฎตๅๅผๆๅก๏ผA๏ผ/ ็จๆทๆๅผ้กต้ขๆถๆ่งฆๅ๏ผB๏ผ | ________ |
|
| 493 |
+
| 2 | **็ฎๆฅๆฟ่ฝฝๅฝขๅผ**๏ผJSON ๆไปถ่ฝ็ไฝไธบไธญไป๏ผA๏ผ/ ไป
ๅ
ๅญๅ้ไธ่ฝ็๏ผB๏ผ | ________ |
|
| 494 |
+
| 3 | **Loop ๅคๆๅบฆ่พน็**๏ผๅช้็ฎกๅฅฝๆฏๆฅ็ๅฝๅจๆ 3~5 ไธช้ถๆฎต๏ผ็บฆ 200~300 ่ก๏ผๅๆ๏ผ/ ้่ฆๆดๅคๆ๏ผ่ฏท่ฏดๆ๏ผ | ________ |
|
| 495 |
+
| 4 | **ๆไปถไผๅ
็บง**๏ผDietSummary P0 / WeightCheck P0 / DRIAnalysis P0 / BriefingGenerator P0 / PresetWriter P1๏ผ้่ฆ่ฐๆด๏ผ๏ผ | ________ |
|
| 496 |
+
| 5 | **ไฝ้ๆฐๆฎๆฅๆบ**๏ผ็จๆทๆๅจ่พๅ
ฅ๏ผA๏ผ/ ่ฏญ้ณๅฏน่ฏ AI ่ฏข้ฎ่ฎฐๅฝ๏ผB๏ผ/ ่็ๅๆญฅๆชๆฅๆฉๅฑ๏ผC๏ผ | ________ |
|
| 497 |
+
| 6 | **core/ ๅฑๅค็**๏ผ็ฐ้ถๆฎต Loop ็ดๆฅ่ฐ็จ modules/ ่งๅๅผๆ๏ผcore/ ไฟๆ็ฉบๆฅๅฃ็ญ MiniCPM-o๏ผๅๆ๏ผ๏ผ | ________ |
|
| 498 |
+
| 7 | **่ฟๆไปไนๆๆฒก่่ๅฐ็้ฎ้ข๏ผ** | ________ |
|
| 499 |
+
|
| 500 |
+
---
|
| 501 |
+
|
| 502 |
+
*ๆๆกฃ็ๆๆถ้ด๏ผ2026-06-08 | v4 - ๅผๅ
ฅ Loop ้ฉฑๅจๆถๆ + ไธๆๆกฃๆไฝๆนๆก*
|
data/diet_logs.json
ADDED
|
@@ -0,0 +1,53 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"schema_version": "1.0",
|
| 3 |
+
"records": [
|
| 4 |
+
{
|
| 5 |
+
"id": "rec001",
|
| 6 |
+
"member_name": "ๅฐ็บข",
|
| 7 |
+
"member_relation": "ๅญๅฆ",
|
| 8 |
+
"date": "2026-06-07",
|
| 9 |
+
"meals": {
|
| 10 |
+
"ๆฉ้ค": "ๅ
จ้บฆ้ขๅ
+้ธก่+็ๅฅถ",
|
| 11 |
+
"ๅ้ค": "็ช่็่
ฉ+็ฑณ้ฅญ",
|
| 12 |
+
"ๆ้ค": "้ฒซ้ฑผ่ฑ่
ๆฑค+ๅฐ้ฆๅคด",
|
| 13 |
+
"ๅ ้ค": "่นๆ+้
ธๅฅถ"
|
| 14 |
+
},
|
| 15 |
+
"mood": "ๅฟๆ
ไธ้",
|
| 16 |
+
"notes": "ไปๅคฉ่ๅฃๅพๅฅฝ",
|
| 17 |
+
"extensions": {},
|
| 18 |
+
"created_at": "2026-06-07T20:00:00"
|
| 19 |
+
},
|
| 20 |
+
{
|
| 21 |
+
"id": "rec002",
|
| 22 |
+
"member_name": "ๅฐ็บข",
|
| 23 |
+
"member_relation": "ๅญๅฆ",
|
| 24 |
+
"date": "2026-06-08",
|
| 25 |
+
"meals": {
|
| 26 |
+
"ๆฉ้ค": "ๅฐ็ฑณ็ฒฅ+ๅ
ๅญ",
|
| 27 |
+
"ๅ้ค": "ๆธ
็่ฅฟๅ
ฐ่ฑ+็ณ็ฑณ้ฅญ",
|
| 28 |
+
"ๆ้ค": "็ช่็่+็ฑณ้ฅญ",
|
| 29 |
+
"ๅ ้ค": "ๅๆ+ๆฉๅญ"
|
| 30 |
+
},
|
| 31 |
+
"mood": "ๆ็นๅญๅ",
|
| 32 |
+
"notes": "ๆไธๆ็นไธ่ๆ",
|
| 33 |
+
"extensions": {},
|
| 34 |
+
"created_at": "2026-06-08T20:00:00"
|
| 35 |
+
},
|
| 36 |
+
{
|
| 37 |
+
"id": "rec003",
|
| 38 |
+
"member_name": "ๅฐ็บข",
|
| 39 |
+
"member_relation": "ๅญๅฆ",
|
| 40 |
+
"date": "2026-06-09",
|
| 41 |
+
"meals": {
|
| 42 |
+
"ๆฉ้ค": "็้บฆ็ฒฅ+้ธก่",
|
| 43 |
+
"ๅ้ค": "ๆธ
่ธ้ฒ้ฑผ+ๆ็ฒฎ้ฅญ",
|
| 44 |
+
"ๆ้ค": "็บขๆฃๆธๆ้ธกๆฑค",
|
| 45 |
+
"ๅ ้ค": "็็ดๆก+็ๅฅถ"
|
| 46 |
+
},
|
| 47 |
+
"mood": "ๆบๅฅฝ",
|
| 48 |
+
"notes": "ๆณๅ้
ธ็",
|
| 49 |
+
"extensions": {},
|
| 50 |
+
"created_at": "2026-06-09T12:00:00"
|
| 51 |
+
}
|
| 52 |
+
]
|
| 53 |
+
}
|
data/family/memory.md
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ๅฎถๅบญ่ฎฐๅฟ
|
| 2 |
+
|
| 3 |
+
> ่ฎฐๅฝๅฎถๅบญๅ
ณ็ณปใ้่ฆไบไปถใๆฅๅธธ็นๆปดใ
|
| 4 |
+
|
| 5 |
+
## ๅฎถๅบญๅ
ณ็ณป
|
| 6 |
+
|
| 7 |
+
- **ๅฐ็บข**: ๅญๅฆ๏ผๅญไธญๆ
|
| 8 |
+
- **ๅฐๆ**: ไธๅคซ๏ผ่ด่ดฃๅ้ฅญ
|
| 9 |
+
- **ๅผ ้ฟๅงจ**: ๅฉๅฉ๏ผๅธฎๅฟ็
ง้กพ
|
| 10 |
+
|
| 11 |
+
## ้่ฆไบไปถ
|
| 12 |
+
|
| 13 |
+
- **2026-06-07**: ไธๅคซๅไบ็ช่็่
ฉ๏ผๅญๅฆ่ฏดๅพๅฅฝๅ
|
| 14 |
+
- **2026-06-08**: ๅฉๅฉ็
ฒไบ้ฒซ้ฑผ่ฑ่
ๆฑค๏ผๅญๅฆๅไบไธค็ข
|
| 15 |
+
- **2026-06-09**: ๅญๅฆ่ฏดๆณๅๆธ
่ธ้ฒ้ฑผ
|
| 16 |
+
|
| 17 |
+
## ๆฅๅธธ่ฎฐๅฝ
|
| 18 |
+
|
| 19 |
+
- **2026-06-07**: ๅญๅฆไปๅคฉๅฟๆ
ไธ้๏ผๅไบๅพๅคๆฐดๆ
|
| 20 |
+
- **2026-06-08**: ๅญๅฆๆ็นๅญๅ๏ผไฝๅๆๅไบๆ้ฅญ
|
| 21 |
+
- **2026-06-09**: ๅญๅฆ่ฏดๆ่ฟๆณๅ้
ธ็
|
data/family/preferences.md
ADDED
|
@@ -0,0 +1,23 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ๅฎถๅบญๆๅ้ฅฎ้ฃๅๅฅฝ
|
| 2 |
+
|
| 3 |
+
> ่ฎฐๅฝๆๆๅฎถไบบ็้ฅฎ้ฃๅๅฅฝใๅฟๅฃใ่ฟๆไฟกๆฏใ
|
| 4 |
+
|
| 5 |
+
## ๆๅๅ่กจ
|
| 6 |
+
|
| 7 |
+
### ๆๅ๏ผๅฐ็บข๏ผๅญๅฆ๏ผ
|
| 8 |
+
- **ๅๅฅฝ**: ็ฑๅๆฐดๆใ็ฑๅ้ฑผใ็ฑๅๆธ
ๆทก
|
| 9 |
+
- **ๅฟๅฃ**: ไธๅ่พฃใไธๅๆฒน่
ป
|
| 10 |
+
- **่ฟๆ**: ่ๆ
|
| 11 |
+
- **ๅคๆณจ**: ๅญไธญๆ๏ผ้่ฆ่กฅ้
|
| 12 |
+
|
| 13 |
+
### ๆๅ๏ผๅฐๆ๏ผไธๅคซ๏ผ
|
| 14 |
+
- **ๅๅฅฝ**: ็ฑๅ่ใ็ฑๅ้ข้ฃ
|
| 15 |
+
- **ๅฟๅฃ**: ไธๅ้ฆ่
|
| 16 |
+
- **่ฟๆ**:
|
| 17 |
+
- **ๅคๆณจ**:
|
| 18 |
+
|
| 19 |
+
### ๆๅ๏ผๅผ ้ฟๅงจ๏ผๅฉๅฉ๏ผ
|
| 20 |
+
- **ๅๅฅฝ**: ไผๅๅ็งๆฑค
|
| 21 |
+
- **ๅฟๅฃ**:
|
| 22 |
+
- **่ฟๆ**:
|
| 23 |
+
- **ๅคๆณจ**: ๆ
้ฟ็
ฒๆฑค
|
data/family/recipes.md
ADDED
|
@@ -0,0 +1,35 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ๅฎถๅบญ่่ฐฑ
|
| 2 |
+
|
| 3 |
+
> ่ฎฐๅฝๅฎถไบบไผๅ็่ใ
|
| 4 |
+
|
| 5 |
+
## ่่ฐฑๅ่กจ
|
| 6 |
+
|
| 7 |
+
### ็ช่็่
ฉ
|
| 8 |
+
- **ๅถไฝไบบ**: ไธๅคซ
|
| 9 |
+
- **้พๅบฆ**: ไธญ็ญ
|
| 10 |
+
- **้ฃๆ**: ็ช่, ็่
ฉ, ๅ่ฑ, ่ก่ๅ
|
| 11 |
+
- **ๅคๆณจ**: ๅญๅฆ็ฑๅ
|
| 12 |
+
|
| 13 |
+
### ๆธ
่ธ้ฒ้ฑผ
|
| 14 |
+
- **ๅถไฝไบบ**: ไธๅคซ
|
| 15 |
+
- **้พๅบฆ**: ็ฎๅ
|
| 16 |
+
- **้ฃๆ**: ้ฒ้ฑผ, ่ฑ, ๅง, ่ธ้ฑผ่ฑๆฒน
|
| 17 |
+
- **ๅคๆณจ**: ๆธ
ๆทกๅฅๅบท
|
| 18 |
+
|
| 19 |
+
### ้ฒซ้ฑผ่ฑ่
ๆฑค
|
| 20 |
+
- **ๅถไฝไบบ**: ๅฉๅฉ
|
| 21 |
+
- **้พๅบฆ**: ็ฎๅ
|
| 22 |
+
- **้ฃๆ**: ้ฒซ้ฑผ, ่ฑ่
, ๅง, ่ฑ
|
| 23 |
+
- **ๅคๆณจ**: ไธๅฅถ
|
| 24 |
+
|
| 25 |
+
### ็ช่็่
|
| 26 |
+
- **ๅถไฝไบบ**: ไธๅคซ
|
| 27 |
+
- **้พๅบฆ**: ็ฎๅ
|
| 28 |
+
- **้ฃๆ**: ็ช่, ้ธก่, ่ฑ
|
| 29 |
+
- **ๅคๆณจ**:
|
| 30 |
+
|
| 31 |
+
### ็บขๆฃๆธๆ้ธกๆฑค
|
| 32 |
+
- **ๅถไฝไบบ**: ๅฆๅฆ
|
| 33 |
+
- **้พๅบฆ**: ไธญ็ญ
|
| 34 |
+
- **้ฃๆ**: ้ธก, ็บขๆฃ, ๆธๆ, ๅง
|
| 35 |
+
- **ๅคๆณจ**: ่กฅๆฐ่ก
|
data/nutrition/raw/ไธญๅฝๅญๆๅฆๅฅณ่ณ้ฃๆๅ2022ๅพ็่ฝฌmd็.md
CHANGED
|
@@ -0,0 +1,124 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# ไธญๅฝๅคๅญๅฆๅฅณๅนณ่กก่ณ้ฃๅฎๅก
|
| 2 |
+
|
| 3 |
+
## ๅคๅญๆ ธๅฟๅปบ่ฎฎ
|
| 4 |
+
- ๅถ้
ธ่กฅๅ
ๅ0.4ๆฏซๅ
/ๅคฉ
|
| 5 |
+
- ่ดซ่ก่
ๅจๅป็ๆๅฏผไธ่กฅๅ
้ๅ
|
| 6 |
+
- ๆฏๅคฉ30ๅ้ไปฅไธไธญ็ญๅผบๅบฆ่ฟๅจ
|
| 7 |
+
- ็ๆตไฝ้๏ผ่ฐๆดไฝ้่ณ้ๅฎ่ๅด
|
| 8 |
+
- ๆๆฆๅฟๆ
๏ผๅ
่ถณ็ก็
|
| 9 |
+
- ้ฅฎๆดๅๆฐด๏ผๅฐๅๅซ็ณ้ฅฎๆ
|
| 10 |
+
- ไธๅธ็๏ผ่ฟ็ฆปไบๆ็
|
| 11 |
+
- ไธ้ฅฎ้
|
| 12 |
+
|
| 13 |
+
---
|
| 14 |
+
|
| 15 |
+
## ้ฃ็ฉๆจ่้
|
| 16 |
+
1. **ๅ ็ข้ฃ็**๏ผ5ๅ
|
| 17 |
+
2. **ๆฒน**๏ผ25ๅ
|
| 18 |
+
3. **ๅฅถ็ฑป**๏ผ300ๅ
|
| 19 |
+
4. **ๅคง่ฑ/ๅๆ**๏ผ15ๅ
/ 10ๅ
|
| 20 |
+
5. **่้ฃ่้ฑผ็ฑป**๏ผ130-180ๅ
|
| 21 |
+
- ็็ฆฝ่๏ผ40-65ๅ
|
| 22 |
+
- ้ฑผ่พ็ฑป๏ผ40-65ๅ
|
| 23 |
+
- ่็ฑป๏ผ50ๅ
๏ผๆฏๅคฉไธๆฌก๏ผ็บฆ1ไธช้ธก่๏ผ
|
| 24 |
+
6. **่ฌ่็ฑป**๏ผ300-500ๅ
๏ผๅฏๆฏๅคฉ่ณๅฐไธๆฌกๆทฑ็ปฟ่ฒ่ฌ่๏ผ
|
| 25 |
+
7. **ๆฐดๆ็ฑป**๏ผ200-300ๅ
|
| 26 |
+
8. **่ฐท็ฑป**๏ผ200-250ๅ
|
| 27 |
+
- โโๅ
จ่ฐท็ฉๅๆ่ฑ๏ผ75-130ๅ
|
| 28 |
+
9. **่ฏ็ฑป**๏ผ50ๅ
|
| 29 |
+
10. **ๆฐด**๏ผ1500-1700ๆฏซๅ
|
| 30 |
+
|
| 31 |
+
|
| 32 |
+
---
|
| 33 |
+
|
| 34 |
+
|
| 35 |
+
# ไธญๅฝๅญๆๅฆๅฅณๅนณ่กก่ณ้ฃๅฎๅก
|
| 36 |
+
|
| 37 |
+
## ๅทฆไพง้็จๅปบ่ฎฎ
|
| 38 |
+
- ๅถ้
ธ่กฅๅ
ๅ0.4ๆฏซๅ
/ๅคฉ
|
| 39 |
+
- ่ดซ่กไธฅ้่
ๅจๅป็ๆๅฏผไธ่กฅๅ
้ๅ
|
| 40 |
+
- ้ๅบฆ่ฟๅจ๏ผ็ปๅธธๆทๅคๆดปๅจ
|
| 41 |
+
- ๆฏๅจๆต้ไฝ้๏ผ็ปดๆๅญๆ้ๅฎๅข้
|
| 42 |
+
- ๆๆฆๅฟๆ
๏ผๅ
่ถณ็ก็
|
| 43 |
+
- ้ฅฎๆดๅๆฐด๏ผๅฐๅๅซ็ณ้ฅฎๆ
|
| 44 |
+
- ๅๅคๆฏไนณๅๅ
ป
|
| 45 |
+
- ไธๅธ็๏ผ่ฟ็ฆปไบๆ็
|
| 46 |
+
- ไธ้ฅฎ้
|
| 47 |
+
|
| 48 |
+
---
|
| 49 |
+
|
| 50 |
+
## ๅณไพง้ฃ็ฉๆจ่้
|
| 51 |
+
| ้ฃ็ฉ็ฑปๅซ | ๅญไธญๆ | ๅญๆๆ |
|
| 52 |
+
| :--- | :--- | :--- |
|
| 53 |
+
| ๅ ็ข้ฃ็ | 5ๅ
| 5ๅ
|
|
| 54 |
+
| ๆฒน | 25ๅ
| 25ๅ
|
|
| 55 |
+
| ๅฅถ็ฑป | 300-500ๅ
| 300-500ๅ
|
|
| 56 |
+
| ๅคง่ฑ/ๅๆ | 20ๅ
/10ๅ
| 20ๅ
/10ๅ
|
|
| 57 |
+
| ้ฑผ็ฆฝ่่็ฑป | 150-200ๅ
| 175-225ๅ
|
|
| 58 |
+
| - ็็ฆฝ่็ฑป | 50-75ๅ
| 50-75ๅ
|
|
| 59 |
+
| - ้ฑผ่พ็ฑป | 50-75ๅ
๏ผๆฏๅจ2-3ๆฌก๏ผๅ
ถไธญ1ๆฌกไธบๆทฑๆตท้ฑผ๏ผ | 75-100ๅ
|
|
| 60 |
+
| - ่็ฑป | 50ๅ
| 50ๅ
|
|
| 61 |
+
| ่ฌ่็ฑป | 400-500ๅ
๏ผๆฏๅคฉ่ณๅฐไธๆฌกๆทฑ็ปฟ่ฒ่ฌ่๏ผ | 400-500ๅ
|
|
| 62 |
+
| ๆฐดๆ็ฑป | 200-300ๅ
| 200-350ๅ
|
|
| 63 |
+
| ่ฐท็ฑป | 200-250ๅ
| 225-275ๅ
|
|
| 64 |
+
| - ๅ
จ่ฐท็ฉๅๆ่ฑ | 75-100ๅ
| 75-125ๅ
|
|
| 65 |
+
| ่ฏ็ฑป | 75ๅ
| 75ๅ
|
|
| 66 |
+
| ๆฐด | 1700ๆฏซๅ | 1700ๆฏซๅ |
|
| 67 |
+
|
| 68 |
+
|
| 69 |
+
1. **่ฐๆดๅญๅไฝ้่ณๆญฃๅธธ่ๅด๏ผไฟ่ฏๅญๆไฝ้้ๅฎๅข้ฟ**
|
| 70 |
+
2. **ๅธธๅๅซ้ไธฐๅฏ็้ฃ็ฉ๏ผ้็จ็ข็๏ผๅ็่กฅๅ
ๅถ้
ธๅ็ปด็็ด D**
|
| 71 |
+
3. **ๅญๅไธฅ้่
๏ผๅฏๅฐ้ๅค้ค๏ผไฟ่ฏๆๅ
ฅๅซๅฟ
้้็ขณๆฐดๅๅ็ฉ็้ฃ็ฉ**
|
| 72 |
+
4. **ๅญไธญๆๆ้้ๅขๅ ๅฅถใ้ฑผใ็ฆฝใ่ใ็ฆ่็ๆๅ
ฅ**
|
| 73 |
+
5. **็ปๅธธๆทๅคๆดปๅจ๏ผ็ฆ็้
๏ผไฟๆๅฅๅบท็ๆดปๆนๅผ**
|
| 74 |
+
6. **ๆๅฟซๅญ่ฒๆฐ็ๅฝ๏ผ็งฏๆๅๅคๆฏไนณๅๅ
ป**
|
| 75 |
+
|
| 76 |
+
---
|
| 77 |
+
|
| 78 |
+
|
| 79 |
+
|
| 80 |
+
# ไธญๅฝๅบไนณๆๅฆๅฅณๅนณ่กก่ณ้ฃๅฎๅก
|
| 81 |
+
|
| 82 |
+
---
|
| 83 |
+
|
| 84 |
+
## ๅทฆไพง็ๆดปๅปบ่ฎฎ
|
| 85 |
+
- ๅๆๅบไนณ
|
| 86 |
+
- ้ๅฝๅขๅ ้ฑผ็ฆฝ่่ๅๆตทไบงๅ
|
| 87 |
+
- ๆๆฆๅฟๆ
๏ผๅ
่ถณ็ก็
|
| 88 |
+
- ่ถณ้้ฅฎๆฐด๏ผ้ๅฝๅคๅ็ฒฅใๆฑค
|
| 89 |
+
- ้ๅบฆ่ฟๅจ
|
| 90 |
+
- ๆฏๅจๆต้ไฝ้๏ผ้ๆญฅๆขๅค้ๅฎไฝ้
|
| 91 |
+
- ไธๅธ็๏ผ่ฟ็ฆปไบๆ็
|
| 92 |
+
- ไธ้ฅฎ้
|
| 93 |
+
|
| 94 |
+
---
|
| 95 |
+
|
| 96 |
+
## ๅณไพง้ฃ็ฉๆจ่้
|
| 97 |
+
| ้ฃ็ฉ็ฑปๅซ | ๆฏๆฅๆจ่ๆๅ
ฅ้ | ่กฅๅ
่ฏดๆ |
|
| 98 |
+
| :--- | :--- | :--- |
|
| 99 |
+
| ๅ ็ข้ฃ็ | 5ๅ
| - |
|
| 100 |
+
| ๆฒน | 25ๅ
| - |
|
| 101 |
+
| ๅฅถ็ฑป | 300-500ๅ
| - |
|
| 102 |
+
| ๅคง่ฑ/ๅๆ | 25ๅ
/10ๅ
| - |
|
| 103 |
+
| ้ฑผ็ฆฝ่่็ฑป | 175-225ๅ
| - |
|
| 104 |
+
| - ็็ฆฝ่็ฑป | 50-75ๅ
| - |
|
| 105 |
+
| - ้ฑผ่พ็ฑป | 75-100ๅ
| ๆฏๅจ1-2ๆฌก้ฃ็ฉไธญๅ
ๅซ50gไปฅไธ็้ฑผ็ฑปๆ่ด็ฑป |
|
| 106 |
+
| - ่็ฑป | 50ๅ
| - |
|
| 107 |
+
| ่ฌ่็ฑป | 400-500ๅ
| ๆฏๅคฉ่ณๅฐไธๆฌกๆทฑ็ปฟ่ฒ่ฌ่ |
|
| 108 |
+
| ๆฐดๆ็ฑป | 200-350ๅ
| - |
|
| 109 |
+
| ่ฐท็ฑป | 225-275ๅ
| - |
|
| 110 |
+
| - ๅ
จ่ฐท็ฉๅๆ่ฑ | 75-125ๅ
| - |
|
| 111 |
+
| ่ฏ็ฑป | 75ๅ
| - |
|
| 112 |
+
| ๆฐด | 2100ๆฏซๅ | - |
|
| 113 |
+
|
| 114 |
+
- ๆณจ๏ผๆๅญ่ณ้ฃไบฆ้็จ
|
| 115 |
+
|
| 116 |
+
|
| 117 |
+
1. **ไบง่คฅๆ้ฃ็ฉๅคๆ ทไธ่ฟ้๏ผๅๆๆดไธชๅบไนณๆ่ฅๅ
ปๅ่กก**
|
| 118 |
+
2. **้้ๅขๅ ๅฏๅซไผ่ดจ่็ฝ่ดจๅ็ปด็็ด A็ๅจ็ฉๆง้ฃ็ฉๅๆตทไบงๅ๏ผ้็จ็ข็๏ผๅ็่กฅๅ
็ปด็็ด D**
|
| 119 |
+
3. **ๅฎถๅบญๆฏๆ๏ผๆๆฆๅฟๆ
๏ผๅ
่ถณ็ก็ ๏ผๅๆๆฏไนณๅๅ
ป**
|
| 120 |
+
4. **ๅขๅ ่บซไฝๆดปๅจ๏ผไฟ่ฟไบงๅๆขๅคๅฅๅบทไฝ้**
|
| 121 |
+
5. **ๅคๅๆฑคๅๆฐด๏ผ้ๅถๆต่ถๅๅๅก๏ผๅฟ็้
**
|
| 122 |
+
|
| 123 |
+
---
|
| 124 |
+
|
data/nutrition/raw/ๅคๅญ&ๅญๆฉไธญๆไธๆๅๅบไนณๆ็ๆๆ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้.md
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
ไธ้ขๅฐ**ๅๅผ ่กจๆ ผๅ
จ้จๆๅไธบใ่ฝ้ไธๅฎ้่ฅๅ
ป็ด ใ็ฟ็ฉ่ดจใ็ปด็็ด ใไธๅผ ็ฌ็ซๆ ๅ Markdown ่กจ**๏ผ่ฏญๆณ้็จใๆ ่ถ
ๅฎฝๅๅนถๅ๏ผไธปๆต็ผ่พๅจ/ๆๆกฃๅทฅๅ
ทๅๅฏๆญฃๅธธๆธฒๆ๏ผๅฏ็ดๆฅๅ
จ้ๅคๅถไฝฟ็จใ
|
| 2 |
+
|
| 3 |
+
# ่กจ15 ไธญๅฝ18-49ๅฒๅญๆๅฅณๆง๏ผๅญๆฉๆ๏ผ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้
|
| 4 |
+
### ็ผฉ็ฅ่ฏ่ฏดๆ
|
| 5 |
+
- EAR๏ผๅนณๅ้่ฆ้
|
| 6 |
+
- RNI๏ผๆจ่ๆๅ
ฅ้
|
| 7 |
+
- AI๏ผ้ๅฎๆๅ
ฅ้
|
| 8 |
+
- PI๏ผ้ข้ฒ้ไผ ๆๆงๆ
ขๆง็
ๅปบ่ฎฎๆๅ
ฅ้
|
| 9 |
+
- UL๏ผๅฏ่ๅๆ้ซๆๅ
ฅ้
|
| 10 |
+
- AMDR๏ผๅฎ้่ฅๅ
ป็ด ๅฏๆฅๅ่ๅด
|
| 11 |
+
- PAL๏ผ่บซไฝๆดปๅจๆฐดๅนณ
|
| 12 |
+
|
| 13 |
+
### ไธใ่ฝ้ไธๅฎ้่ฅๅ
ป็ด
|
| 14 |
+
| ่ฝ้/่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | AMDR | PI | UL |
|
| 15 |
+
| ---- | ---- | ---- | ---- | ---- | ---- | ---- |
|
| 16 |
+
| ่ฝ้ PAL(I) | MJ/d | - | 7.11 | - | - | - |
|
| 17 |
+
| ่ฝ้ PAL(II) | MJ/d | - | 8.79 | - | - | - |
|
| 18 |
+
| ่ฝ้ PAL(III) | MJ/d | - | 10.25 | - | - | - |
|
| 19 |
+
| ่็ฝ่ดจ | g/d | 55 | - | 10~20% | - | - |
|
| 20 |
+
| ๆป็ขณๆฐดๅๅ็ฉ | %E | 130# | - | 50~65% | - | - |
|
| 21 |
+
| โ ๆทปๅ ็ณ | %E | - | - | <10 | - | - |
|
| 22 |
+
| ่ณ้ฃ็บค็ปด | g/d | - | - | 25~30(AI) | - | - |
|
| 23 |
+
| ๆป่่ช | %E | - | - | 20~30 | - | - |
|
| 24 |
+
| โ ้ฅฑๅ่่ช้
ธ | %E | - | - | <10 | - | - |
|
| 25 |
+
| โ n-6ๅคไธ้ฅฑๅ่่ช้
ธ | %E | - | - | 2.5~9 | - | - |
|
| 26 |
+
| โ ไบๆฒน้
ธ | %E | - | - | 4.0(AI) | - | - |
|
| 27 |
+
| โ n-3ๅคไธ้ฅฑๅ่่ช้
ธ | %E | - | - | 0.5~2.0 | - | - |
|
| 28 |
+
| โ ฮฑ-ไบ้บป้
ธ | %E | - | - | 0.60(AI) | - | - |
|
| 29 |
+
| โ DHA | %E | - | - | 0.25(0.2%E)(AI) | - | - |
|
| 30 |
+
| ๆฐด | mL/d | - | 1500/2700 | - | - | - |
|
| 31 |
+
|
| 32 |
+
### ไบใ็ฟ็ฉ่ดจ
|
| 33 |
+
| ่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | PI | UL |
|
| 34 |
+
| ---- | ---- | ---- | ---- | ---- | ---- |
|
| 35 |
+
| ้ | mg/d | 650 | 800 | - | 2000 |
|
| 36 |
+
| ็ฃท | mg/d | 600 | 720 | - | 3500 |
|
| 37 |
+
| ้พ | mg/d | - | 2000(AI) | 3600 | - |
|
| 38 |
+
| ้ | mg/d | - | 1500(AI) | โค2000 | - |
|
| 39 |
+
| ้ | mg/d | 300 | 370 | - | - |
|
| 40 |
+
| ๆฐฏ | mg/d | - | 2300(AI) | - | - |
|
| 41 |
+
| ้ | mg/d | 12 | 18 | - | 42 |
|
| 42 |
+
| ็ข | ฮผg/d | 120 | 230 | - | 500 |
|
| 43 |
+
| ้ | mg/d | 8.6 | 10.5 | - | 40 |
|
| 44 |
+
| ็ก | ฮผg/d | 54 | 65 | - | 400 |
|
| 45 |
+
| ้ | mg/d | 0.72 | 0.91 | - | 8.0 |
|
| 46 |
+
| ๆฐ | mg/d | - | 1.5(AI) | - | 3.5 |
|
| 47 |
+
| ้ฌ | ฮผg/d | - | 30(AI) | - | - |
|
| 48 |
+
| ้ฐ | mg/d | - | 4.0(AI) | - | 11 |
|
| 49 |
+
| ้ผ | ฮผg/d | 20 | 25 | - | 900 |
|
| 50 |
+
|
| 51 |
+
### ไธใ็ปด็็ด
|
| 52 |
+
| ่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | PI | UL |
|
| 53 |
+
| ---- | ---- | ---- | ---- | ---- | ---- |
|
| 54 |
+
| ็ปด็็ด A | ฮผgRAE/d | 470 | 660 | - | 3000 |
|
| 55 |
+
| ็ปด็็ด D | ฮผg/d | 8 | 10 | - | 50 |
|
| 56 |
+
| ็ปด็็ด E | mgฮฑ-TE/d | - | 14(AI) | - | 700 |
|
| 57 |
+
| ็ปด็็ด K | ฮผg/d | - | 80(AI) | - | - |
|
| 58 |
+
| ็ปด็็ด Bโ | mg/d | 1.0 | 1.2 | - | - |
|
| 59 |
+
| ็ปด็็ด Bโ | mg/d | 1.0 | 1.2 | - | - |
|
| 60 |
+
| ็้
ธ | mg NE/d | 10 | 12 | - | 35/310# |
|
| 61 |
+
| ็ปด็็ด Bโ | mg/d | 1.9 | 2.2 | - | 60 |
|
| 62 |
+
| ๅถ้
ธ | ฮผg DFE/d | 520 | 600 | - | 1000# |
|
| 63 |
+
| ็ปด็็ด Bโโ | ฮผg/d | 2.4 | 2.9 | - | - |
|
| 64 |
+
| ๆณ้
ธ | mg/d | - | 6.0(AI) | - | - |
|
| 65 |
+
| ็็ฉ็ด | ฮผg/d | - | 50(AI) | - | - |
|
| 66 |
+
| ่็ขฑ | mg/d | - | 460(AI) | - | 3000 |
|
| 67 |
+
| ็ปด็็ด C | mg/d | 85 | 100 | 200 | 2000 |
|
| 68 |
+
|
| 69 |
+
### ๅคๆณจ
|
| 70 |
+
- PAL๏ผ่บซไฝๆดปๅจๆฐดๅนณ๏ผI๏ผไฝๅผบๅบฆ๏ผII๏ผไธญ็ญๅผบๅบฆ๏ผIII๏ผ้ซๅผบๅบฆ๏ผ
|
| 71 |
+
- ๆชๅถๅฎๅ่ๅผ็จโโโ่กจ็คบ๏ผ#ๆ ๆณจ้กนไธบ็นๆฎ้ๅฎๆฐๅผ
|
| 72 |
+
- ๆฐดๆปๆๅ
ฅ้ๅ
ๅซ้ฅฎ็จๆฐดๅ้ฃ็ฉไธญ็ๆฐดๅ
|
| 73 |
+
|
| 74 |
+
---
|
| 75 |
+
|
| 76 |
+
# ่กจ16 ไธญๅฝ18-49ๅฒๅญๆๅฅณๆง๏ผๅญไธญๆ๏ผ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้
|
| 77 |
+
### ็ผฉ็ฅ่ฏ่ฏดๆ
|
| 78 |
+
- EAR๏ผๅนณๅ้่ฆ้
|
| 79 |
+
- RNI๏ผๆจ่ๆๅ
ฅ้
|
| 80 |
+
- AI๏ผ้ๅฎๆๅ
ฅ้
|
| 81 |
+
- PI๏ผ้ข้ฒ้ไผ ๆๆงๆ
ขๆง็
ๅปบ่ฎฎๆๅ
ฅ้
|
| 82 |
+
- UL๏ผๅฏ่ๅๆ้ซๆๅ
ฅ้
|
| 83 |
+
- AMDR๏ผๅฎ้่ฅๅ
ป็ด ๅฏๆฅๅ่ๅด
|
| 84 |
+
- PAL๏ผ่บซไฝๆดปๅจๆฐดๅนณ
|
| 85 |
+
|
| 86 |
+
### ไธใ่ฝ้ไธๅฎ้่ฅๅ
ป็ด
|
| 87 |
+
| ่ฝ้/่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | AMDR | PI | UL |
|
| 88 |
+
| ---- | ---- | ---- | ---- | ---- | ---- | ---- |
|
| 89 |
+
| ่ฝ้ PAL(I) | MJ/d | - | 8.16 | - | - | - |
|
| 90 |
+
| ่ฝ้ PAL(II) | MJ/d | - | 9.84 | - | - | - |
|
| 91 |
+
| ่ฝ้ PAL(III) | MJ/d | - | 11.30 | - | - | - |
|
| 92 |
+
| ่็ฝ่ดจ | g/d | 60 | 70 | 10~20% | - | - |
|
| 93 |
+
| ๆป็ขณๆฐดๅๅ็ฉ | %E | 140 | - | 50~65% | - | - |
|
| 94 |
+
| โ ๆทปๅ ็ณ | %E | - | - | <10 | - | - |
|
| 95 |
+
| ่ณ้ฃ็บค็ปด | g/d | - | - | 29~34(AI) | - | - |
|
| 96 |
+
| ๆป่่ช | %E | - | - | 20~30 | - | - |
|
| 97 |
+
| โ ้ฅฑๅ่่ช้
ธ | %E | - | - | <10 | - | - |
|
| 98 |
+
| โ n-6ๅคไธ้ฅฑๅ่่ช้
ธ | %E | - | - | 2.5~9 | - | - |
|
| 99 |
+
| โ ไบๆฒน้
ธ | %E | - | - | 4.0(AI) | - | - |
|
| 100 |
+
| โ n-3ๅคไธ้ฅฑๅ่่ช้
ธ | %E | - | - | 0.5~2.0 | - | - |
|
| 101 |
+
| โ ฮฑ-ไบ้บป้
ธ | %E | - | - | 0.60(AI) | - | - |
|
| 102 |
+
| โ DHA+EPA | g/d | - | - | 0.25(0.2%E)(AI) | - | - |
|
| 103 |
+
| ๆฐด | mL/d | - | 1700/3000 | - | - | - |
|
| 104 |
+
|
| 105 |
+
### ไบใ็ฟ็ฉ่ดจ
|
| 106 |
+
| ่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | PI | UL |
|
| 107 |
+
| ---- | ---- | ---- | ---- | ---- | ---- |
|
| 108 |
+
| ้ | mg/d | 650 | 800 | - | 2000 |
|
| 109 |
+
| ็ฃท | mg/d | 600 | 720 | - | 3500 |
|
| 110 |
+
| ้พ | mg/d | - | 2000(AI) | 3600 | - |
|
| 111 |
+
| ้ | mg/d | - | 1500(AI) | โค2000 | - |
|
| 112 |
+
| ้ | mg/d | 300 | 370 | - | - |
|
| 113 |
+
| ๆฐฏ | mg/d | - | 2300(AI) | - | - |
|
| 114 |
+
| ้ | mg/d | 19 | 25 | - | 42 |
|
| 115 |
+
| ็ข | ฮผg/d | 160 | 230 | - | 500 |
|
| 116 |
+
| ้ | mg/d | 8.6 | 10.5 | - | 40 |
|
| 117 |
+
| ็ก | ฮผg/d | 54 | 65 | - | 400 |
|
| 118 |
+
| ้ | mg/d | 0.72 | 0.9 | - | 8.0 |
|
| 119 |
+
| ๆฐ | mg/d | - | 1.5(AI) | - | 3.5 |
|
| 120 |
+
| ้ฌ | ฮผg/d | - | 33(AI) | - | - |
|
| 121 |
+
| ้ฐ | mg/d | - | 4.0(AI) | - | 11 |
|
| 122 |
+
| ้ผ | ฮผg/d | 20 | 25 | - | 900 |
|
| 123 |
+
|
| 124 |
+
### ไธใ็ปด็็ด
|
| 125 |
+
| ่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | PI | UL |
|
| 126 |
+
| ---- | ---- | ---- | ---- | ---- | ---- |
|
| 127 |
+
| ็ปด็็ด A | ฮผgRAE/d | 520 | 730 | - | 3000 |
|
| 128 |
+
| ็ปด็็ด D | ฮผg/d | 8 | 10 | - | 50 |
|
| 129 |
+
| ็ปด็็ด E | mgฮฑ-TE/d | - | 14(AI) | - | 700 |
|
| 130 |
+
| ็ปด็็ด K | ฮผg/d | - | 80(AI) | - | - |
|
| 131 |
+
| ็ปด็็ด Bโ | mg/d | 1.1 | 1.4 | - | - |
|
| 132 |
+
| ็ปด็็ด Bโ | mg/d | 1.1 | 1.3 | - | - |
|
| 133 |
+
| ็้
ธ | mg NE/d | 10 | 12 | - | 35/310# |
|
| 134 |
+
| ็ปด็็ด Bโ | mg/d | 1.7 | 2.2 | - | 60 |
|
| 135 |
+
| ๅถ้
ธ | ฮผg DFE/d | 520 | 600 | - | 1000# |
|
| 136 |
+
| ็ปด็็ด Bโโ | ฮผg/d | 2.4 | 2.9 | - | - |
|
| 137 |
+
| ๆณ้
ธ | mg/d | - | 6.0(AI) | - | - |
|
| 138 |
+
| ็็ฉ็ด | ฮผg/d | - | 50(AI) | - | - |
|
| 139 |
+
| ่็ขฑ | mg/d | - | 460(AI) | - | 3000 |
|
| 140 |
+
| ็ปด็็ด C | mg/d | 95 | 115 | 200 | 2000 |
|
| 141 |
+
|
| 142 |
+
### ๅคๆณจ
|
| 143 |
+
- PAL๏ผ่บซไฝๆดปๅจๆฐดๅนณ๏ผI๏ผไฝๅผบๅบฆ๏ผII๏ผไธญ็ญๅผบๅบฆ๏ผIII๏ผ้ซๅผบๅบฆ๏ผ
|
| 144 |
+
- ๆชๅถๅฎๅ่ๅผ็จโโโ่กจ็คบ๏ผ#ๆ ๆณจ้กนไธบ็นๆฎ้ๅฎๆฐๅผ
|
| 145 |
+
- ๆฐดๆปๆๅ
ฅ้ๅ
ๅซ้ฅฎ็จๆฐดๅ้ฃ็ฉไธญ็ๆฐดๅ
|
| 146 |
+
|
| 147 |
+
---
|
| 148 |
+
|
| 149 |
+
# ่กจ17 ไธญๅฝ18-49ๅฒๅญๆๅฅณๆง๏ผๅญๆๆ๏ผ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้
|
| 150 |
+
### ็ผฉ็ฅ่ฏ่ฏดๆ
|
| 151 |
+
- EAR๏ผๅนณๅ้่ฆ้
|
| 152 |
+
- RNI๏ผๆจ่ๆๅ
ฅ้
|
| 153 |
+
- AI๏ผ้ๅฎๆๅ
ฅ้
|
| 154 |
+
- PI๏ผ้ข้ฒ้ไผ ๆๆงๆ
ขๆง็
ๅปบ่ฎฎๆๅ
ฅ้
|
| 155 |
+
- UL๏ผๅฏ่ๅๆ้ซๆๅ
ฅ้
|
| 156 |
+
- AMDR๏ผๅฎ้่ฅๅ
ป็ด ๅฏๆฅๅ่ๅด
|
| 157 |
+
- PAL๏ผ่บซไฝๆดปๅจๆฐดๅนณ
|
| 158 |
+
|
| 159 |
+
### ไธใ่ฝ้ไธๅฎ้่ฅๅ
ป็ด
|
| 160 |
+
| ่ฝ้/่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | AMDR | PI | UL |
|
| 161 |
+
| ---- | ---- | ---- | ---- | ---- | ---- | ---- |
|
| 162 |
+
| ่ฝ้ PAL(I) | MJ/d | - | 8.78 | - | - | - |
|
| 163 |
+
| ่ฝ้ PAL(II) | MJ/d | - | 10.46 | - | - | - |
|
| 164 |
+
| ่ฝ้ PAL(III) | MJ/d | - | 11.92 | - | - | - |
|
| 165 |
+
| ่็ฝ่ดจ | g/d | 75 | 85 | 10~20% | - | - |
|
| 166 |
+
| ๆป็ขณๆฐดๅๅ็ฉ | %E | 155 | - | 50~65% | - | - |
|
| 167 |
+
| โ ๆทปๅ ็ณ | %E | - | - | <10 | - | - |
|
| 168 |
+
| ่ณ้ฃ็บค็ปด | g/d | - | - | 29~34(AI) | - | - |
|
| 169 |
+
| ๆป่่ช | %E | - | - | 20~30 | - | - |
|
| 170 |
+
| โ ้ฅฑๅ่่ช้
ธ | %E | - | - | <10 | - | - |
|
| 171 |
+
| โ n-6ๅคไธ้ฅฑๅ่่ช้
ธ | %E | - | - | 2.5~9 | - | - |
|
| 172 |
+
| โ ไบๆฒน้
ธ | %E | - | - | 4.0(AI) | - | - |
|
| 173 |
+
| โ n-3ๅคไธ้ฅฑๅ่่ช้
ธ | %E | - | - | 0.5~2.0 | - | - |
|
| 174 |
+
| โ ฮฑ-ไบ้บป้
ธ | %E | - | - | 0.60(AI) | - | - |
|
| 175 |
+
| โ DHA+EPA | g/d | - | - | 0.25(0.2%E)(AI) | - | - |
|
| 176 |
+
| ๆฐด | mL/d | - | 1700/3000 | - | - | - |
|
| 177 |
+
|
| 178 |
+
### ไบใ็ฟ็ฉ่ดจ
|
| 179 |
+
| ่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | PI | UL |
|
| 180 |
+
| ---- | ---- | ---- | ---- | ---- | ---- |
|
| 181 |
+
| ้ | mg/d | 650 | 800 | - | 2000 |
|
| 182 |
+
| ็ฃท | mg/d | 600 | 720 | - | 3500 |
|
| 183 |
+
| ้พ | mg/d | - | 2000(AI) | 3600 | - |
|
| 184 |
+
| ้ | mg/d | - | 1500(AI) | โค2000 | - |
|
| 185 |
+
| ้ | mg/d | 300 | 370 | - | - |
|
| 186 |
+
| ๆฐฏ | mg/d | - | 2300(AI) | - | - |
|
| 187 |
+
| ้ | mg/d | 22 | 29 | - | 42 |
|
| 188 |
+
| ็ข | ฮผg/d | 160 | 230 | - | 500 |
|
| 189 |
+
| ้ | mg/d | 8.6 | 10.5 | - | 40 |
|
| 190 |
+
| ็ก | ฮผg/d | 54 | 65 | - | 400 |
|
| 191 |
+
| ้ | mg/d | 0.72 | 0.9 | - | 8.0 |
|
| 192 |
+
| ๆฐ | mg/d | - | 1.5(AI) | - | 3.5 |
|
| 193 |
+
| ้ฌ | ฮผg/d | - | 35(AI) | - | - |
|
| 194 |
+
| ้ฐ | mg/d | - | 4.0(AI) | - | 11 |
|
| 195 |
+
| ้ผ | ฮผg/d | 20 | 25 | - | 900 |
|
| 196 |
+
|
| 197 |
+
### ไธใ็ปด็็ด
|
| 198 |
+
| ่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | PI | UL |
|
| 199 |
+
| ---- | ---- | ---- | ---- | ---- | ---- |
|
| 200 |
+
| ็ปด็็ด A | ฮผgRAE/d | 520 | 730 | - | 3000 |
|
| 201 |
+
| ็ปด็็ด D | ฮผg/d | 8 | 10 | - | 50 |
|
| 202 |
+
| ็ปด็็ด E | mgฮฑ-TE/d | - | 14(AI) | - | 700 |
|
| 203 |
+
| ็ปด็็ด K | ฮผg/d | - | 80(AI) | - | - |
|
| 204 |
+
| ็ปด็็ด Bโ | mg/d | 1.2 | 1.4 | - | - |
|
| 205 |
+
| ็ปด็็ด Bโ | mg/d | 1.2 | 1.5 | - | - |
|
| 206 |
+
| ็้
ธ | mg NE/d | 10 | 12 | - | 35/310# |
|
| 207 |
+
| ็ปด็็ด Bโ | mg/d | 1.9 | 2.2 | - | 60 |
|
| 208 |
+
| ๅถ้
ธ | ฮผg DFE/d | 520 | 600 | - | 1000# |
|
| 209 |
+
| ็ปด็็ด Bโโ | ฮผg/d | 2.4 | 2.9 | - | - |
|
| 210 |
+
| ๆณ้
ธ | mg/d | - | 6.0(AI) | - | - |
|
| 211 |
+
| ็็ฉ็ด | ฮผg/d | - | 50(AI) | - | - |
|
| 212 |
+
| ่็ขฑ | mg/d | - | 460(AI) | - | 3000 |
|
| 213 |
+
| ็ปด็็ด C | mg/d | 95 | 115 | 200 | 2000 |
|
| 214 |
+
|
| 215 |
+
### ๅคๆณจ
|
| 216 |
+
- PAL๏ผ่บซไฝๆดปๅจๆฐดๅนณ๏ผI๏ผไฝๅผบๅบฆ๏ผII๏ผไธญ็ญๅผบๅบฆ๏ผIII๏ผ้ซๅผบๅบฆ๏ผ
|
| 217 |
+
- ๆชๅถๅฎๅ่ๅผ็จโโโ่กจ็คบ๏ผ#ๆ ๆณจ้กนไธบ็นๆฎ้ๅฎๆฐๅผ
|
| 218 |
+
- ๆฐดๆปๆๅ
ฅ้ๅ
ๅซ้ฅฎ็จๆฐดๅ้ฃ็ฉไธญ็ๆฐดๅ
|
| 219 |
+
|
| 220 |
+
---
|
| 221 |
+
|
| 222 |
+
# ่กจ18 ไธญๅฝ18-49ๅฒๅบไนณๆๅฅณๆง่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้
|
| 223 |
+
### ็ผฉ็ฅ่ฏ่ฏดๆ
|
| 224 |
+
- EAR๏ผๅนณๅ้่ฆ้
|
| 225 |
+
- RNI๏ผๆจ่ๆๅ
ฅ้
|
| 226 |
+
- AI๏ผ้ๅฎๆๅ
ฅ้
|
| 227 |
+
- PI๏ผ้ข้ฒ้ไผ ๆๆงๆ
ขๆง็
ๅปบ่ฎฎๆๅ
ฅ้
|
| 228 |
+
- UL๏ผๅฏ่ๅๆ้ซๆๅ
ฅ้
|
| 229 |
+
- AMDR๏ผๅฎ้่ฅๅ
ป็ด ๅฏๆฅๅ่ๅด
|
| 230 |
+
- PAL๏ผ่บซไฝๆดปๅจๆฐดๅนณ
|
| 231 |
+
|
| 232 |
+
### ไธใ่ฝ้ไธๅฎ้่ฅๅ
ป็ด
|
| 233 |
+
| ่ฝ้/่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | AMDR | PI | UL |
|
| 234 |
+
| ---- | ---- | ---- | ---- | ---- | ---- | ---- |
|
| 235 |
+
| ่ฝ้ PAL(I) | MJ/d | - | 8.78 | - | - | - |
|
| 236 |
+
| ่ฝ้ PAL(II) | MJ/d | - | 10.46 | - | - | - |
|
| 237 |
+
| ่ฝ้ PAL(III) | MJ/d | - | 11.92 | - | - | - |
|
| 238 |
+
| ่็ฝ่ดจ | g/d | 70 | 80 | 10~20% | - | - |
|
| 239 |
+
| ๆป็ขณๆฐดๅๅ็ฉ | %E | 170 | - | 50~65% | - | - |
|
| 240 |
+
| โ ๆทปๅ ็ณ | %E | - | - | <10 | - | - |
|
| 241 |
+
| ่ณ้ฃ็บค็ปด | g/d | - | - | 29~34(AI) | - | - |
|
| 242 |
+
| ๆป่่ช | %E | - | - | 20~30 | - | - |
|
| 243 |
+
| โ ้ฅฑๅ่่ช้
ธ | %E | - | - | <10 | - | - |
|
| 244 |
+
| โ n-6ๅคไธ้ฅฑๅ่่ช้
ธ | %E | - | - | 2.5~9 | - | - |
|
| 245 |
+
| โ ไบๆฒน้
ธ | %E | - | - | 4.0(AI) | - | - |
|
| 246 |
+
| โ n-3ๅคไธ้ฅฑๅ่่ช้
ธ | %E | - | - | 0.5~2.0 | - | - |
|
| 247 |
+
| โ ฮฑ-ไบ้บป๏ฟฝ๏ฟฝ | %E | - | - | 0.60(AI) | - | - |
|
| 248 |
+
| โ DHA+EPA | g/d | - | - | 250(200)(AI) | - | - |
|
| 249 |
+
| ๆฐด | mL/d | - | 2100/3800 | - | - | - |
|
| 250 |
+
|
| 251 |
+
### ไบใ็ฟ็ฉ่ดจ
|
| 252 |
+
| ่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | PI | UL |
|
| 253 |
+
| ---- | ---- | ---- | ---- | ---- | ---- |
|
| 254 |
+
| ้ | mg/d | 650 | 800 | - | 2000 |
|
| 255 |
+
| ็ฃท | mg/d | 600 | 720 | - | 3500 |
|
| 256 |
+
| ้พ | mg/d | - | 2400(AI) | 3600 | - |
|
| 257 |
+
| ้ | mg/d | - | 1500(AI) | โค2000 | - |
|
| 258 |
+
| ้ | mg/d | 270 | 330 | - | - |
|
| 259 |
+
| ๆฐฏ | mg/d | - | 2300(AI) | - | - |
|
| 260 |
+
| ้ | mg/d | 18 | 24 | - | 42 |
|
| 261 |
+
| ็ข | ฮผg/d | 170 | 240 | - | 500 |
|
| 262 |
+
| ้ | mg/d | 11 | 13.0 | - | 40 |
|
| 263 |
+
| ็ก | ฮผg/d | 65 | 78 | - | 400 |
|
| 264 |
+
| ้ | mg/d | 1.12 | 1.5 | - | 8.0 |
|
| 265 |
+
| ๆฐ | mg/d | - | 1.5(AI) | - | 3.5 |
|
| 266 |
+
| ้ฌ | ฮผg/d | - | 35(AI) | - | - |
|
| 267 |
+
| ้ฐ | mg/d | - | 4.2(AI) | - | 11 |
|
| 268 |
+
| ้ผ | ฮผg/d | 24 | 30 | - | 900 |
|
| 269 |
+
|
| 270 |
+
### ไธใ็ปด็็ด
|
| 271 |
+
| ่ฅๅ
ป็ด | ๅไฝ | EAR | RNI | PI | UL |
|
| 272 |
+
| ---- | ---- | ---- | ---- | ---- | ---- |
|
| 273 |
+
| ็ปด็็ด A | ฮผgRAE/d | 870 | 1260 | - | 3000 |
|
| 274 |
+
| ็ปด็็ด D | ฮผg/d | 8 | 10 | - | 50 |
|
| 275 |
+
| ็ปด็็ด E | mgฮฑ-TE/d | - | 14(AI) | - | 700 |
|
| 276 |
+
| ็ปด็็ด K | ฮผg/d | - | 85(AI) | - | - |
|
| 277 |
+
| ็ปด็็ด Bโ | mg/d | 1.2 | 1.5 | - | - |
|
| 278 |
+
| ็ปด็็ด Bโ | mg/d | 1.4 | 1.7 | - | - |
|
| 279 |
+
| ็้
ธ | mg NE/d | 13 | 16 | - | 35/310# |
|
| 280 |
+
| ็ปด็็ด Bโ | mg/d | 1.4 | 1.7 | - | 60 |
|
| 281 |
+
| ๅถ้
ธ | ฮผg DFE/d | 450 | 550 | - | 1000# |
|
| 282 |
+
| ็ปด็็ด Bโโ | ฮผg/d | 2.6 | 3.2 | - | - |
|
| 283 |
+
| ๆณ้
ธ | mg/d | - | 7.0(AI) | - | - |
|
| 284 |
+
| ็็ฉ็ด | ฮผg/d | - | 50(AI) | - | - |
|
| 285 |
+
| ่็ขฑ | mg/d | - | 500(AI) | - | 3000 |
|
| 286 |
+
| ็ปด็็ด C | mg/d | 125 | 150 | 200 | 2000 |
|
| 287 |
+
|
| 288 |
+
### ๅคๆณจ
|
| 289 |
+
- PAL๏ผ่บซไฝๆดปๅจๆฐดๅนณ๏ผI๏ผไฝๅผบๅบฆ๏ผII๏ผไธญ็ญๅผบๅบฆ๏ผIII๏ผ้ซๅผบๅบฆ๏ผ
|
| 290 |
+
- ๆชๅถๅฎๅ่ๅผ็จโโโ่กจ็คบ๏ผ#ๆ ๆณจ้กนไธบ็นๆฎ้ๅฎๆฐๅผ
|
| 291 |
+
- ๆฐดๆปๆๅ
ฅ้ๅ
ๅซ้ฅฎ็จๆฐดๅ้ฃ็ฉไธญ็ๆฐดๅ
|
data/nutrition/raw/ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟๆจ่ๅผๆ ๅ.md
ADDED
|
@@ -0,0 +1,92 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
# WS/T 801-2022 ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟๆจ่ๅผๆ ๅ
|
| 2 |
+
*Standard of recommendation for weight gain during pregnancy period*
|
| 3 |
+
|
| 4 |
+
---
|
| 5 |
+
|
| 6 |
+
## 1 ่ๅด
|
| 7 |
+
ๆฌๆ ๅ่งๅฎไบๆๅฝๅฆๅฅณๅ่่ช็ถๅฆๅจ ไฝ้ๅข้ฟๆจ่ๅผใ
|
| 8 |
+
ๆฌๆ ๅ้็จไบๅฏนๆๅฝๅฆๅฅณๅ่่ช็ถๅฆๅจ ไฝ้ๅข้ฟ็ๆๅฏผใ
|
| 9 |
+
ๆฌๆ ๅไธ้็จไบ่บซ้ซไฝไบ140cm๏ผๆๅฆๅจ ๅไฝ้้ซไบ125kg็ๅฆๅฅณใๅฆๅจ ๆๅๅนถ็ๅๅนถๅ็ๆฃ่
ๅบ็ปๅไธดๅบๆ่ง่ฟ่กไธชไฝๅ่ฏไปทใ
|
| 10 |
+
|
| 11 |
+
## 2 ่ง่ๆงๅผ็จๆไปถ
|
| 12 |
+
ๆฌๆ ๅๆฒกๆ่ง่ๆงๅผ็จๆไปถใ
|
| 13 |
+
|
| 14 |
+
## 3 ๆฏ่ฏญๅๅฎไน
|
| 15 |
+
ไธๅๆฏ่ฏญๅๅฎไน้็จไบๆฌๆ ๅใ
|
| 16 |
+
|
| 17 |
+
### 3.1 ๅฆๅจ ๆ pregnancy period
|
| 18 |
+
ไปๆซๆฌกๆ็ป็็ฌฌไธๆฅๅผๅง่ฎก็ฎ๏ผ็บฆไธบ280ๆฅ๏ผ40ๅจ๏ผใ
|
| 19 |
+
ๆณจ๏ผไธดๅบไธๅฐๅฆๅจ ๅ
จ็จๅไธบๅฆๅจ ๆฉๆใๅฆๅจ ไธญๆใๅฆๅจ ๆๆ3ไธชๆถๆใ
|
| 20 |
+
|
| 21 |
+
### 3.2 ๅฆๅจ ๆฉๆ first trimester
|
| 22 |
+
ๅฆๅจ ๆช่พพ14ๅจใ
|
| 23 |
+
|
| 24 |
+
### 3.3 ๅฆๅจ ไธญๆ second trimester
|
| 25 |
+
ๅฆๅจ ็ฌฌ14ๅจ๏ฝ27+6ๅจใ
|
| 26 |
+
|
| 27 |
+
### 3.4 ๅฆๅจ ๆๆ third trimester
|
| 28 |
+
ๅฆๅจ ็ฌฌ28ๅจๅๅ
ถๅใ
|
| 29 |
+
|
| 30 |
+
### 3.5 ไฝ่ดจๆๆฐ body mass index; BMI
|
| 31 |
+
ไธ็ง่ฎก็ฎ่บซ้ซๅซไฝ้็ๆๆฐ๏ผ่ฎก็ฎๆนๆณๆฏไฝ้(kg)ไธ่บซ้ซ(m)็ๅนณๆน็ๆฏๅผใ
|
| 32 |
+
|
| 33 |
+
### 3.6 ๅฆๅจ ๅไฝ้ pre-pregnancy weight
|
| 34 |
+
ๅฆๅจ ไนๅไธไธชๆๅ
็ๅนณๅไฝ้ใ
|
| 35 |
+
|
| 36 |
+
### 3.7 ๅๅจฉๅไฝ้ pre-delivery weight
|
| 37 |
+
ๅๅจฉๅไธๅจๅ
ๆๅไธๆฌก็งฐ้็ไฝ้ใ
|
| 38 |
+
|
| 39 |
+
### 3.8 ๅฆๅจ ๆไฝ้ๆปๅข้ฟๅผ gestational weight gain; GWG
|
| 40 |
+
ๅๅจฉๅไฝ้(kg)ๅๅปๅฆๅจ ๅไฝ้(kg)ๆๅพๆฐๅผใ
|
| 41 |
+
|
| 42 |
+
### 3.9 ๅฆๅจ ๆฉๆไฝ้ๅข้ฟๅผ gestational weight gain in first trimester
|
| 43 |
+
ๅฆๅจ 13ๅจๆซไฝ้(kg)ๅๅปๅฆๅจ ๅไฝ้(kg)ๆๅพๆฐๅผใ
|
| 44 |
+
|
| 45 |
+
### 3.10 ๅฆๅจ ไธญๆไฝ้ๅข้ฟๅผ gestational weight gain in second trimester
|
| 46 |
+
ๅฆๅจ 27ๅจๆซไฝ้(kg)ๅๅปๅฆๅจ 13ๅจๆซไฝ้(kg)ๆๅพๆฐๅผใ
|
| 47 |
+
|
| 48 |
+
### 3.11 ๅฆๅจ ๆๆไฝ้ๅข้ฟๅผ gestational weight gain in third trimester
|
| 49 |
+
ๅๅจฉๅไฝ้(kg)ๅๅปๅฆๅจ 27ๅจๆซไฝ้(kg)ๆๅพๆฐๅผใ
|
| 50 |
+
|
| 51 |
+
## 4 ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟ่ๅดๅๅฆๅจ ไธญๆๅๅฆๅจ ๆๆๆฏๅจไฝ้ๅข้ฟๆจ่ๅผ
|
| 52 |
+
ๆไธญๅฝๆไบบไฝ่ดจๆๆฐๅ็น๏ผๅๅซ็ปไบๅจไธๅๅฆๅจ ๅไฝ่ดจๆๆฐๆ
ๅตไธ๏ผๅ่ๅฆๅจ ๅฆๅฅณไฝ้ๅข้ฟ่ๅดๅๅฆๅจ ไธญๆๅๅฆๅจ ๆๆๆฏๅจไฝ้ๅข้ฟๆจ่ๅผ๏ผ่ง่กจ1ใ
|
| 53 |
+
|
| 54 |
+
**่กจ1 ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟ่ๅดๅๅฆๅจ ไธญๆๅๅฆๅจ ๆๆๆฏๅจไฝ้ๅข้ฟๆจ่ๅผ**
|
| 55 |
+
| ๅฆๅจ ๅไฝ่ดจๆๆฐๅ็ฑป | ๆปๅข้ฟๅผ่ๅด(kg) | ๅฆๅจ ๆฉๆๅข้ฟๅผ่ๅด(kg) | ๅฆๅจ ไธญๆๅๅฆๅจ ๆๆๆฏๅจไฝ้ๅข้ฟๅผๅ่ๅด(kg/week) |
|
| 56 |
+
| ---- | ---- | ---- | ---- |
|
| 57 |
+
| ไฝไฝ้๏ผBMI ๏ผ 18.5 kg/mยฒ๏ผ | 11.0 ~ 16.0 | 0 ~ 2.0 | 0.46๏ผ0.37 ~ 0.56๏ผ |
|
| 58 |
+
| ๆญฃๅธธไฝ้๏ผ18.5 kg/mยฒ โค BMI ๏ผ 24.0 kg/mยฒ๏ผ | 8.0 ~ 14.0 | 0 ~ 2.0 | 0.37๏ผ0.26 ~ 0.48๏ผ |
|
| 59 |
+
| ่ถ
้๏ผ24.0 kg/mยฒ โค BMI ๏ผ 28.0 kg/mยฒ๏ผ | 7.0 ~ 11.0 | 0 ~ 2.0 | 0.30๏ผ0.22 ~ 0.37๏ผ |
|
| 60 |
+
| ่ฅ่๏ผBMI โฅ 28.0 kg/mยฒ๏ผ | 5.0 ~ 9.0 | 0 ~ 2.0 | 0.22๏ผ0.15 ~ 0.30๏ผ |
|
| 61 |
+
|
| 62 |
+
## 5 ๆต้ๆนๆณ
|
| 63 |
+
ๅฆๅจ ๆๅฆๅฅณ่บซ้ซใไฝ้็ๆต้ๆนๆณๅ่ง้ๅฝAใ
|
| 64 |
+
|
| 65 |
+
---
|
| 66 |
+
|
| 67 |
+
## ้ๅฝA๏ผ่ตๆๆง๏ผๅฆๅจ ๆๅฆๅฅณ่บซ้ซใไฝ้็ๆต้ๆนๆณ
|
| 68 |
+
### A.1 ่บซ้ซๆต้
|
| 69 |
+
#### A.1.1 ๆต้ๆกไปถ
|
| 70 |
+
ๆต้ๆถๅฆๅจ ๅฆๅฅณๅบๅ
ๅ ใ่ตค่ถณ๏ผ่งฃๅผๅ้ซป๏ผๅฎคๆธฉ25โๅทฆๅณใ
|
| 71 |
+
|
| 72 |
+
#### A.1.2 ๆต้ๅทฅๅ
ท
|
| 73 |
+
็ซๆฑๅผ่บซ้ซ่ฎก๏ผๅๅบฆๅผ0.1cm๏ผๆๆตๅข่ฃ
็ฝฎใๆปๆตๆฟๅบไธ็ซๆฑๅ็ด๏ผๆปๅจ่ชๅฆใ
|
| 74 |
+
|
| 75 |
+
#### A.1.3 ๆต้ๆนๆณ
|
| 76 |
+
ๅฆๅจ ๅฆๅฅณๅ็ซๆญฃๅงฟๅฟ๏ผ็ซๅจ่ธๆฟไธ๏ผๆบ่ธๆถ่
น๏ผไธค่่ช็ถไธๅ๏ผ่่ท้ ๆข๏ผ่ๅฐๅๅผ็บฆ60ๅบฆใๅ่ๅนถๆขๆบ็ด๏ผไธค็ผๅนณ่งๆญฃๅๆน๏ผ็ผ็ถไธ็ผไธ่ณๅปไธ็ผไฟๆๅจๅไธๆฐดๅนณใ่่ทใ่้จๅไธค่ฉ่่ง้ดไธไธช็นๅๆถๆฅ่งฆ็ซๆฑ๏ผๅคด้จไฟๆๆญฃ็ซไฝ็ฝฎใๆต้่
ๆๆถๆปๆตๆฟ่ฝป่ฝปๅไธๆปๅจ๏ผ็ดๅฐๅบ้ขไธๅคด้ข
้กถ็น็ธๆฅ่งฆ๏ผๆญคๆถ่งๅฏๅฆๅจ ๅฆๅฅณๅงฟๅฟๆญฃ็กฎๅ่ฏปๅๆฐๅผใ
|
| 77 |
+
|
| 78 |
+
#### A.1.4 ่ฏปๆฐไธ่ฎฐๅฝ
|
| 79 |
+
่ฏปๆฐๆถๆต้่
็็ผ็ไธๆปๆตๆฟๅบ้ขๅจๅไธไธชๆฐดๅนณ้ขไธ๏ผ่ฏปๅๆปๆฟๅบ้ขๅฏนๅบ็ซๆฑๆ็คบๆฐๅผ๏ผไปฅๅ็ฑณไธบๅไฝ๏ผ็ฒพ็กฎๅฐ0.1cmใ
|
| 80 |
+
|
| 81 |
+
### A.2 ไฝ้ๆต้
|
| 82 |
+
#### A.2.1 ๆต้ๆกไปถ
|
| 83 |
+
ๆต้ๅบๅจๆธ
ๆจใ็ฉบ่
นใๆๆณๅฎๆฏ็็ถๆไธ่ฟ่ก๏ผๅฎคๆธฉ25โๅทฆๅณใ
|
| 84 |
+
|
| 85 |
+
#### A.2.2 ๆต้ๅทฅๅ
ท
|
| 86 |
+
็ปๆ กๅ็็ตๅญไฝ้็งค๏ผๅๅบฆๅผ โค0.1 kg๏ผๆต้ๆถไฝ้่ฎกๆพ็ฝฎๅนณ็จณๅนถ่ฐ้ถใ
|
| 87 |
+
|
| 88 |
+
#### A.2.3 ๆต้ๆนๆณ
|
| 89 |
+
ๅฆๅจ ๅฆๅฅณๅนณ้็ซ็ซไบไฝ้็งค่ธๆฟไธญๅคฎ๏ผไธค่
ฟๅๅ่ด้๏ผๅ
ๅ ใ่ตค่ถณใ็ฉฟ่ดด่บซ่ๅ
่กฃ่ฃค๏ผๆณจๆๅฎๅ
จใ
|
| 90 |
+
|
| 91 |
+
#### A.2.4 ่ฏปๆฐไธ่ฎฐๅฝ
|
| 92 |
+
ๅ็กฎ่ฎฐๅฝไฝ้็งค่ฏปๆฐ๏ผ็ฒพ็กฎๅฐ0.1kgใ
|
data/presets/.daily_status.json
ADDED
|
@@ -0,0 +1,6 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"2026-06-09": {
|
| 3 |
+
"summary_done": true,
|
| 4 |
+
"completed_at": "2026-06-09T00:31:27.292878"
|
| 5 |
+
}
|
| 6 |
+
}
|
data/presets/ไปๆฅ็ฎๆฅ_2026-06-10.json
ADDED
|
@@ -0,0 +1,15 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
{
|
| 2 |
+
"date": "2026-06-10",
|
| 3 |
+
"generated_from": "2026-06-09",
|
| 4 |
+
"generated_at": "2026-06-09T00:31:27.292878",
|
| 5 |
+
"trimester": "ๅญไธญๆ",
|
| 6 |
+
"nutrient_focus": [],
|
| 7 |
+
"recommended_foods": [],
|
| 8 |
+
"need_ask_weight": false,
|
| 9 |
+
"need_ask_recipe": false,
|
| 10 |
+
"conversation_topics": [
|
| 11 |
+
"ไปๅคฉ็งฐไฝ้ไบๅ๏ผ"
|
| 12 |
+
],
|
| 13 |
+
"family_memory_summary": "{'relationships': ['- **ๅฐ็บข**: ๅญๅฆ๏ผๅญไธญๆ', '- **ๅฐๆ**: ไธๅคซ๏ผ่ด่ดฃๅ้ฅญ', '- **ๅผ ้ฟๅงจ**: ๅฉๅฉ๏ผๅธฎๅฟ็
ง้กพ'], 'recent_events': ['- **2026-06-07**: ไธๅคซๅไบ็ช่็่
ฉ๏ผๅญๅฆ่ฏดๅพๅฅฝๅ', '- **2026-06-08**: ๅฉๅฉ็
ฒไบ้ฒซ้ฑผ่ฑ่
ๆฑค๏ผๅญๅฆๅไบไธค็ข', '- **2026-06-09**: ๅญๅฆ่ฏดๆณๅๆธ
่ธ้ฒ้ฑผ'], 'recent_daily': ['- **2026-06-07**: ๅญๅฆไปๅคฉๅฟๆ
ไธ้๏ผๅไบๅพๅคๆฐดๆ', '- **2026-06-08**: ๅญๅฆๆ็นๅญๅ๏ผไฝๅๆๅไบๆ้ฅญ', '- **2026-06-09**: ๅญๅฆ่ฏดๆ่ฟๆณๅ้
ธ็']}",
|
| 14 |
+
"three_day_summary": {}
|
| 15 |
+
}
|
debug2.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
add: '[OK] ๅทฒๆทปๅ ่่ฐฑ: test'
|
| 2 |
+
load: [{'name': 'test', 'cook': 't', 'difficulty': '', 'ingredients': '', 'notes': ''}]
|
| 3 |
+
len: 1
|
debug4.txt
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
|
|
|
| 1 |
+
result: []
|
| 2 |
+
len: 0
|
debug_out.txt
ADDED
|
@@ -0,0 +1,3 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
add: '[WARN] ่่ฐฑๅทฒๅญๅจ: test'
|
| 2 |
+
load: [{'name': '่ๅ', 'cook': '', 'difficulty': '', 'ingredients': '', 'notes': ''}, {'name': 'test', 'cook': 't', 'difficulty': '', 'ingredients': '', 'notes': ''}]
|
| 3 |
+
len: 2
|
docs/้กน็ฎ็่งฃ_ๆๆฏๆถๆ.md
CHANGED
|
@@ -1,300 +1,656 @@
|
|
| 1 |
-
# ๐ธ PregoPal ้กน็ฎ็่งฃไธๆๆฏๆถๆ๏ผ
|
| 2 |
|
| 3 |
-
> ๆฌๆๆกฃ
|
| 4 |
|
| 5 |
---
|
| 6 |
|
| 7 |
## ไธใไธๅฅ่ฏๅฎไฝ
|
| 8 |
|
| 9 |
-
**ไธไธชๅบไบ
|
| 10 |
|
| 11 |
-
> **
|
| 12 |
|
| 13 |
---
|
| 14 |
|
| 15 |
-
## ไบใ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 16 |
|
| 17 |
-
|
| 18 |
|
| 19 |
-
|
| 20 |
|
| 21 |
-
**
|
| 22 |
-
- ็จๆทๅจๅฎๆถๅฏน่ฏ่ฟ็จไธญ๏ผAI ่ชๅจ่ฏๅซ่ฏด่ฏไบบ่บซไปฝ๏ผไธๅคซ/ๅฉๅฉ/ๅฆๅฆ/ๅญๅฆโฆ๏ผ
|
| 23 |
-
- ๆ ้ๅ็ฌใๆณจๅใๆญฅ้ชค๏ผๅจ่ช็ถๅฏน่ฏไธญๅฎๆๅฃฐ็บน้้ๅ่ฏๅซ
|
| 24 |
-
- ็ปๅๆๅๅคด็ป้ข่พ
ๅฉ็กฎ่ฎค๏ผ่ง่ง+่ฏญ้ณๅคๆจกๆ๏ผ
|
| 25 |
|
| 26 |
-
|
| 27 |
-
|
| 28 |
-
|
| 29 |
-
|
| 30 |
-
|
| 31 |
-
|
| 32 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 33 |
|
| 34 |
-
|
| 35 |
-
|
| 36 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 37 |
|
| 38 |
-
**
|
| 39 |
-
|
| 40 |
-
|
| 41 |
-
|
|
|
|
| 42 |
|
| 43 |
-
> **
|
| 44 |
|
| 45 |
---
|
| 46 |
|
| 47 |
-
##
|
| 48 |
|
| 49 |
-
|
| 50 |
|
| 51 |
-
**
|
| 52 |
-
- ็จๆทๅ AI ๅฏน่ฏ๏ผใไปๅคฉๆณๅ้ฑผใใๆ็นๆฒก่ๅฃใใๅด้ๅ่ฆใโฆ
|
| 53 |
-
- AI ็่งฃไธไธๆ โ ็ๆไธชๆงๅๆจ่
|
| 54 |
-
- ่พๅบไธ้ค+ๅ ้คๆนๆก + ็็ฑ + ๆณจๆไบ้กน
|
| 55 |
|
| 56 |
-
**
|
| 57 |
-
- **MiniCPM-o 4.5๏ผ็ปไธๆจกๅ๏ผ**๏ผ็ดๆฅ็จๅฏน่ฏ่ฝๅๅๆจ่
|
| 58 |
-
- **่ฅๅ
ปๆฐๆฎๆฌๅฐๅตๅ
ฅ**๏ผๆไธญๅฝๅญๆ่ฅๅ
ปๆฐๆฎๆด็ๆ JSON๏ผๅจ็ณป็ปๆ็คบ่ฏไธญๆไพ็ปๆจกๅ
|
| 59 |
-
- **ไธ้่ฆ RAG**๏ผไฝ ่ฏดๅพๅฏน๏ผ่ฟๅบฆ่ฎพ่ฎกไบ๏ผ๏ผๅช้่ฆๆ่ฅๅ
ปๆฐๆฎๆพๅจไธไธๆ้
|
| 60 |
-
- **่งๅๅ
ๅบ**๏ผ`MEAL_TEMPLATES` ไฟ็ไฝไธบ็ฆป็บฟ fallback๏ผๆ ๆจกๅๆถๅฏ็จ๏ผ
|
| 61 |
|
| 62 |
-
**
|
|
|
|
| 63 |
|
| 64 |
-
> **
|
| 65 |
|
| 66 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 67 |
|
| 68 |
-
### ๆจกๅ 3๏ผ๐ ้ฅฎ้ฃ่ฎฐๅฝ โ ๅฏน่ฏไธญ่ชๅจ่ฎฐๅฝ๏ผๅญ Markdown
|
| 69 |
-
|
| 70 |
-
**ๆ ธๅฟๅๅ๏ผไปใๆๅจๅกซ่กจๅใๅไธบใAI ่ชๅจไปๅฏน่ฏไธญๆๅใ**
|
| 71 |
-
|
| 72 |
-
**ไธๅก้ๆฑ๏ผ**
|
| 73 |
-
- AI ๅจๅฏน่ฏไธญ่ฎฐๅฝ๏ผใไปๅคฉไธญๅๅไบ็ช่็่
ฉๅ็ฑณ้ฅญใ
|
| 74 |
-
- ็จๆท็กฎ่ฎคๅ่ชๅจๅญๆกฃ
|
| 75 |
-
- ็ๆ็ปๆๅๆฐๆฎ๏ผJSON๏ผ+ ๅฏ่ฏปๆๆกฃ๏ผMarkdown๏ผ
|
| 76 |
-
- ๅฏนๅๅฒ่ฎฐๅฝๆฏๆๆฅ่ฏข
|
| 77 |
-
|
| 78 |
-
**ๆๆฏ้ๅ๏ผไฟฎๆญฃๅ๏ผ๏ผ**
|
| 79 |
-
|
| 80 |
-
**1. ๆฐๆฎๆๅๆนๅผ๏ผๅ
ณ้ฎ่ฎพ่ฎก๏ผ**
|
| 81 |
-
MiniCPM-o 4.5 **ๆฒกๆ toolcall ๅ่ฝ**๏ผๆไปฅไธ่ฝ็ดๆฅ่ฐ็จ Python ๅฝๆฐใ
|
| 82 |
-
ๆนไธบ **ใๆ ่ฎฐๆ ผๅผ่พๅบ + ๆญฃๅ่งฃๆใ** ๆนๆก๏ผ
|
| 83 |
-
- ๅจ็ณป็ปๆ็คบ่ฏไธญๅ่ฏๆจกๅ๏ผๅฝไฝ ้่ฆ่ฎฐๅฝ้ฅฎ้ฃๆถ๏ผ่ฏท่พๅบไปฅไธๆ ผๅผโโ
|
| 84 |
-
```
|
| 85 |
-
[DIET_RECORD]
|
| 86 |
-
ๆฅๆ: 2026-06-07
|
| 87 |
-
ๆฉ้ค: ๅ
จ้บฆ้ขๅ
+้ธก่+็ๅฅถ
|
| 88 |
-
ๅ้ค: ๆธ
่ธ้ฑผ+็ณ็ฑณ้ฅญ+็ๆถ่ฌ
|
| 89 |
-
ๆ้ค:
|
| 90 |
-
ๅ ้ค: ้
ธๅฅถ+ๅๆ
|
| 91 |
-
ๅฟๆ
: ๆบๅฅฝ
|
| 92 |
-
ๅคๆณจ:
|
| 93 |
-
[/DIET_RECORD]
|
| 94 |
-
```
|
| 95 |
-
- ๅ็ซฏ Python ็จๆญฃๅ่กจ่พพๅผ่งฃๆ `[DIET_RECORD]...[/DIET_RECORD]` ไน้ด็ๅ
ๅฎน
|
| 96 |
-
- ่งฃๆๅๅญๅ
ฅ JSON + ็ๆ Markdown
|
| 97 |
-
|
| 98 |
-
**2. Markdown ๆจกๆฟๅผๆๆฏไปไน๏ผ**
|
| 99 |
-
ๅฐฑๆฏๅฝๅ `diet_logger.py` ไธญ็ `_generate_markdown()` ๆนๆณโโ**็จ Python f-string ๆผๆฅ Markdown ๆๆฌ**ใไธๆฏไปไนๅคๆไธ่ฅฟ๏ผๅฐฑๆฏไธไธชๅญ็ฌฆไธฒๆจกๆฟๅฝๆฐใไฟ็ไธๅ๏ผๅชๆฏๆฐๆฎๆฅๆบไปใ็จๆทๅกซ่กจๅใๅไธบใAI ๅฏน่ฏไธญๆๅใใ
|
| 100 |
-
|
| 101 |
-
**3. ไธบไปไนไธ้่ฆๅ้ๆฃ็ดข๏ผ**
|
| 102 |
-
ไฝ ็ด่งๆญฃ็กฎโโ**็กฎๅฎๅไฝไบ**ใไนๅๆๆๅบๅ้ๆฃ็ดข๏ผChromaDB๏ผๆฏไธบไบๆฏๆ่ฏญไนๆ็ดขใไธๅจไธๅไบไปไน๏ผใ๏ผไฝๅฎ้
ไธ็ดๆฅ็จ JSON ๆๆฅๆ่ฟๆปคๅฐฑ่ฝๅฎ็ฐใๅปๆๆญคๆนๆก๏ผไฟๆ็ฎๅใ
|
| 103 |
-
|
| 104 |
-
**ๆฐๆฎๆตๅ๏ผ**
|
| 105 |
```
|
| 106 |
-
|
| 107 |
-
|
| 108 |
-
|
| 109 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 110 |
```
|
| 111 |
|
| 112 |
-
> **
|
| 113 |
|
| 114 |
-
|
| 115 |
|
| 116 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 117 |
|
| 118 |
-
**
|
| 119 |
|
| 120 |
-
|
| 121 |
-
- ๅบไบไธญๅฝๅฎๆน่ฅๅ
ปๆ ๅๅๅๆ
|
| 122 |
-
- ่พๅบๅฏ่งๅๆฅๅ + ๆนๅๅปบ่ฎฎ
|
| 123 |
-
- ๆจกๆฟ้ขๅ
่ฎพ่ฎกๅฅฝ๏ผ็พ่งไธไธ
|
| 124 |
|
| 125 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 126 |
|
| 127 |
-
|
| 128 |
|
| 129 |
-
|
| 130 |
-
|---|-------------|---------|------------|
|
| 131 |
-
| 1 | **ไธญๅฝ้ฃ็ฉๆๅ่กจ๏ผๆ ๅ็๏ผ** ็ฌฌ6็ | ไธญๅฝ็พๆงไธญๅฟ่ฅๅ
ปไธๅฅๅบทๆ | ๆ็ดข "ไธญๅฝ้ฃ็ฉๆๅ่กจ ๆ ๅ็ ็ฌฌ6็ Excel" ๆ PDF |
|
| 132 |
-
| 2 | **ไธญๅฝๅฑ
ๆฐ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้๏ผDRIs 2023๏ผ** ๆ่ฆ | ไธญๅฝ่ฅๅ
ปๅญฆไผ | ๆ็ดข "DRIs 2023 ไธญๅฝๅฑ
ๆฐ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้" |
|
| 133 |
-
| 3 | **ไธญๅฝๅญๆๅฆๅฅณ่ณ้ฃๆๅ๏ผ2022๏ผ** | ไธญๅฝ่ฅๅ
ปๅญฆไผ | ๆ็ดข "ๅญๆๅฆๅฅณ่ณ้ฃๆๅ 2022 ไธญๅฝ่ฅๅ
ปๅญฆไผ" |
|
| 134 |
-
| 4 | **ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟๆจ่ๅผ๏ผWS/T 801-2022๏ผ** | ๅฝๅฎถๅซๅฅๅง | ๆ็ดข "WS/T 801-2022 ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟๆจ่ๅผ" |
|
| 135 |
|
| 136 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
|
| 138 |
-
**
|
| 139 |
-
ๆๅทฒ็ผๅไบไธไปฝๅบไบ DRIs ๅ
ฌๅผๆฐๆฎ็่ฅๅ
ปๆฐๆฎๅบไฝไธบ baseline๏ผๅฝๅ `DEFAULT_NUTRITION_DB`๏ผ๏ผๅฏไปฅๅ
็จๅฎๅๅๅๅผๅ๏ผ็ญไฝ ๆพๅฐๆญฃๅผๆไปถๅๆฟๆขๅณๅฏใ
|
| 140 |
|
| 141 |
-
|
| 142 |
|
| 143 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 144 |
|
| 145 |
-
|
|
|
|
|
|
|
| 146 |
|
| 147 |
-
|
| 148 |
|
| 149 |
-
|
| 150 |
|
| 151 |
-
##
|
| 152 |
|
| 153 |
```
|
| 154 |
-
|
| 155 |
-
|
| 156 |
-
|
| 157 |
-
|
| 158 |
-
|
| 159 |
-
|
| 160 |
-
|
| 161 |
-
|
| 162 |
-
|
| 163 |
-
|
| 164 |
-
|
| 165 |
-
|
| 166 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 167 |
```
|
| 168 |
|
| 169 |
-
|
| 170 |
|
| 171 |
-
|
| 172 |
-
็จๆทๆๅผๆๅๅคด+้บฆๅ
้ฃ
|
| 173 |
-
โ
|
| 174 |
-
โผ
|
| 175 |
-
AI ๆ นๆฎ็ณป็ปๆ็คบ่ฏไธปๅจ้ฎๅ
|
| 176 |
-
โ
|
| 177 |
-
โผ
|
| 178 |
-
็จๆท่ฏด่ฏ โ MiniCPM-o ๅ
จๅๅทฅๅค็
|
| 179 |
-
โโ ๅฃฐ็บน่ฏๅซ โ ๆดๆฐใๅฝๅ่ฏด่ฏไบบใ
|
| 180 |
-
โโ ็่งฃ่ฏญไน โ ๆดๆฐใๅฝๅๆจกๅผใ
|
| 181 |
-
โโ ็ๆๅๅค โ ๅซ [DIET_RECORD] ๆ ่ฎฐ๏ผๅฆ้๏ผ
|
| 182 |
-
โ
|
| 183 |
-
โผ
|
| 184 |
-
ๅ็ซฏ่งฃๆๅๅค๏ผ
|
| 185 |
-
โโ ๆฃๆตๅฐ [DIET_RECORD] โ ๆๅๆฐๆฎ โ ๅญ JSON + Markdown
|
| 186 |
-
โโ ๆฃๆตๅฐๆจ่่ฏทๆฑ โ ๆพ็คบๆจ่็ปๆๅฐ UI
|
| 187 |
-
โโ ๅ
ถไป โ ๆญฃๅธธๅฏน่ฏ
|
| 188 |
-
```
|
| 189 |
|
| 190 |
-
##
|
| 191 |
|
| 192 |
-
|
| 193 |
-
|
| 194 |
-
|
| 195 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 196 |
|
| 197 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 198 |
|
| 199 |
---
|
| 200 |
|
| 201 |
-
##
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 202 |
|
| 203 |
-
| ๅฑ็บง | ๆๆฏ | ็จ้ |
|
| 204 |
-
|------|------|------|
|
| 205 |
-
| ๆ ธๅฟๆจกๅ | **MiniCPM-o 4.5**๏ผ็ปไธๅคๆจกๆๆจกๅ๏ผ | ๅ
จๅๅทฅๆจ็๏ผ่ง่ง+่ฏญ้ณ+ๆๆฌ+่ฏญ้ณ่พๅบ |
|
| 206 |
-
| ๅ็ซฏๆกๆถ | **Gradio** | Web ็้ข๏ผๅฎๆถๅฏน่ฏไบคไบ |
|
| 207 |
-
| ๅฃฐ็บน่ฏๅซ | **Whisper-medium encoder embedding**๏ผๆจกๅๅ
็ฝฎ๏ผ | ่ฏด่ฏไบบ่บซไปฝ่ฏๅซ |
|
| 208 |
-
| ้ข่ฐฑๆนๆก | **NumPy + SoundFile**๏ผๅค้ fallback๏ผ | ๅฃฐ็บน่ฏๅซๅ
ๅบ |
|
| 209 |
-
| ๆฐๆฎๅญๅจ | **JSON + Markdown**๏ผ็ปๆๅๅฏๆฉๅฑ๏ผ | ้ฅฎ้ฃ่ฎฐๅฝ + ๆฅๅๅญๆกฃ |
|
| 210 |
-
| ่ฅๅ
ปๆ ๅ | **ไธญๅฝๅฎๆน DRIs / ้ฃ็ฉๆๅ่กจ**๏ผไฝ ไธ่ฝฝๅๆๆด็๏ผ | ่ฅๅ
ปๅๆๅบๅ |
|
| 211 |
-
| ้จ็ฝฒๅนณๅฐ | **Modal**๏ผไฝ ๆ้ปๅฎขๆพ้ขๅบฆ๏ผๅ็ปญ้
็ฝฎ๏ผ | ไบ็ซฏ GPU ้จ็ฝฒ |
|
| 212 |
-
|
| 213 |
-
### ๆฐๆฎๅญๅจ Schema ่ฎพ่ฎก๏ผๅฏๆฉๅฑ๏ผ
|
| 214 |
-
|
| 215 |
-
**JSON ๆ ผๅผ๏ผdiet_logs.json๏ผ๏ผ**
|
| 216 |
-
```json
|
| 217 |
-
{
|
| 218 |
-
"schema_version": "1.0",
|
| 219 |
-
"records": [
|
| 220 |
-
{
|
| 221 |
-
"id": "a1b2c3d4",
|
| 222 |
-
"date": "2026-06-07",
|
| 223 |
-
"speaker": {"name": "ๅฐๆ", "relation": "ไธๅคซ"},
|
| 224 |
-
"meals": {"ๆฉ้ค": "...", "ๅ้ค": "...", "ๆ้ค": "", "ๅ ้ค": "..."},
|
| 225 |
-
"mood": "ๆบๅฅฝ",
|
| 226 |
-
"notes": "",
|
| 227 |
-
"extensions": {},
|
| 228 |
-
"created_at": "2026-06-07T10:30:00"
|
| 229 |
-
}
|
| 230 |
-
]
|
| 231 |
-
}
|
| 232 |
```
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 233 |
|
| 234 |
-
-
|
| 235 |
-
-
|
|
|
|
| 236 |
|
| 237 |
-
> **
|
| 238 |
|
| 239 |
---
|
| 240 |
|
| 241 |
-
##
|
| 242 |
|
| 243 |
```
|
| 244 |
-
|
| 245 |
-
โโโ
|
| 246 |
-
โโโ
|
| 247 |
-
|
| 248 |
-
โ
|
| 249 |
-
|
| 250 |
-
|
| 251 |
-
โ
|
| 252 |
-
โ
|
| 253 |
-
|
| 254 |
-
|
| 255 |
-
|
| 256 |
-
|
| 257 |
-
|
| 258 |
-
โ
|
| 259 |
-
|
| 260 |
-
โ
|
| 261 |
-
โ
|
| 262 |
-
|
| 263 |
-
โ
|
| 264 |
-
|
| 265 |
-
โ
|
| 266 |
-
|
| 267 |
-
|
| 268 |
-
|
| 269 |
-
โ
|
| 270 |
-
โ
|
| 271 |
-
|
| 272 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 273 |
```
|
| 274 |
|
| 275 |
-
> **
|
| 276 |
|
| 277 |
---
|
| 278 |
|
| 279 |
-
##
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 280 |
|
| 281 |
-
|
| 282 |
-
|---|------|---------|
|
| 283 |
-
| 1 | ๅฃฐ็บน่ฏๅซๆนๆก๏ผ | **Whisper-medium embedding**๏ผไผๅ
๏ผ๏ผ้ข่ฐฑ็ธไผผๅบฆ๏ผๅค้๏ผ |
|
| 284 |
-
| 2 | ้จ็ฝฒๆนๅผ๏ผ | **Modal**๏ผไฝ ๆ้ปๅฎขๆพ้ขๅบฆ๏ผ๏ผๅ็ปญๆๅธฎไฝ ้
็ฝฎ |
|
| 285 |
-
| 3 | ่ฅๅ
ปๆ ๅ่ฐๆฅๆด็๏ผ | **ไฝ ไธ่ฝฝๆไปถ**ๅฐ `data/nutrition/raw/`๏ผๆๆด็ๆ JSON |
|
| 286 |
-
| 4 | ๆๅๆถๆบ๏ผ | **ๅค็ๅฅฝไธ่ฟฐ้ฎ้ขๅ**็ซๅณๆๅ |
|
| 287 |
|
| 288 |
---
|
| 289 |
|
| 290 |
-
##
|
| 291 |
|
| 292 |
-
|
| 293 |
-
-
|
| 294 |
-
|
| 295 |
-
|
| 296 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 297 |
|
| 298 |
---
|
| 299 |
|
| 300 |
-
*ๆๆกฃ็ๆๆถ้ด๏ผ2026-06-
|
|
|
|
| 1 |
+
# ๐ธ PregoPal ้กน็ฎ็่งฃไธๆๆฏๆถๆ๏ผv5 - ๆดๅๆนๆณจ๏ผ็ปๅๅฎ็ฐ๏ผ
|
| 2 |
|
| 3 |
+
> ๆฌๆๆกฃๅทฒๆดๅไฝ ๆๆๆนๆณจๆ่ง๏ผๆฏไธชๅฐ่ไฟ็ๆนๆณจๅบไพ็ปง็ปญ่ฎจ่ฎบใ
|
| 4 |
|
| 5 |
---
|
| 6 |
|
| 7 |
## ไธใไธๅฅ่ฏๅฎไฝ
|
| 8 |
|
| 9 |
+
**ไธไธชๅบไบๆฏๆฅ็ๅฝๅจๆ Loop ้ฉฑๅจ็ๅญๆ้ชๆค AI ๅฉๆ**๏ผๆฏๅคฉ้ฆๆฌกๅฏๅจๆถ่ชๅจๆป็ปๆจๆฅ้ฅฎ้ฃใๅฏนๆฏๅฝๅฎถ่ฅๅ
ปๆ ๅ๏ผDRIs/่ณ้ฃๆๅ/ไฝ้ๆ ๅ๏ผ๏ผ็ๆไปๆฅ็ฎๆฅๆณจๅ
ฅๅฏน่ฏไธไธๆ๏ผ็ฝๅคฉไธๅฎถๅบญๆๅ๏ผ้่ฟๅฃฐ็บนๅบๅ๏ผ่ช็ถไบคไบ๏ผๅฎๆถ่ฎฐๅฝ้ฅฎ้ฃใๆจ่้ฃ่ฐฑ๏ผๆฌกๆฅๅพช็ฏๅพๅคใ
|
| 10 |
|
| 11 |
+
> **ๆนๆณจ๏ผๅทฒ้็บณ๏ผ๏ผ** ๅฎๆถ่ฎฐๅฝ้ฅฎ้ฃ = ไธปๅจๆๅๅญๅฆ็้ฅฎ้ฃไน ๆฏใๅบๆฏๅ
ๆฌ๏ผโ ๅญๅฆ่ชๅทฑ่ฏดๆณๅไปไน โกๅฎถไบบ่ฏดๅญๅฆไนๅๆณๅไปไน โ ้ฝ่ฎฐๅฝๅฐๅญๅฆ็้ฅฎ้ฃไน ๆฏ md ๆไปถใๅๆถไธปๅจ่ฏข้ฎๅฎถไบบไผๅไปไน่ โ ่ฎฐๅฝๅฐๅฎถๅบญ่ๅใ้่ฟ system prompt + ๆญฃๅๅๆๅๅฎ็ฐใ
|
| 12 |
|
| 13 |
---
|
| 14 |
|
| 15 |
+
## ไบใไธไธช่ฅๅ
ปๆๆกฃ็ๆไฝๆนๆณ
|
| 16 |
+
|
| 17 |
+
ไฝ ๅทฒ็ปไธ่ฝฝๅฐ `data/nutrition/raw/` ็ไธไธชๆไปถ๏ผๅ่ชๆฟๆ
ไธๅ่ง่ฒ๏ผ
|
| 18 |
+
|
| 19 |
+
| ๆๆกฃ | ๆไปถ | ็จ้ | PregoPal ็ๆไฝๆนๅผ |
|
| 20 |
+
|------|------|------|-------------------|
|
| 21 |
+
| **โ ไฝ้ๅข้ฟๆ ๅ** | `ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟๆจ่ๅผๆ ๅ.md` | ไฝ้็ๆตๅบๅ | **ไธปๅจ่ฏข้ฎไฝ้** โ ๆฏๅคฉ Loop ไธญๆฃๆฅๆฏๅฆ้่ฆ่ฏข้ฎ๏ผๅฏน็
ง BMI ๅ็ฑป็ปๅบ่ฏไปท |
|
| 22 |
+
| **โก ่ณ้ฃๆๅ** | `ไธญๅฝๅญๆๅฆๅฅณ่ณ้ฃๆๅ2022ๅพ็่ฝฌmd็.md` | ้ฃ่ฐฑๆจ่ๅบๅ | **ไฝไธบๆจ่้ฃ่ฐฑ็็บฆๆๅบ็ก** โ ๆ นๆฎๅญๆ้ถๆฎต็จๅฎๅกๆจ่้็ๆๆจกๆฟ |
|
| 23 |
+
| **โข DRIs** | `ๅคๅญ&ๅญๆฉไธญๆไธๆๅๅบไนณๆ็ๆๆ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้.md` | ่ฅๅ
ปๅๆๅบๅ | **Agent ๅฎๆๆ่** โ ๆฏๅคฉ่ชๅจๅฏนๆฏ RNI๏ผๅๆไธ่ถณ๏ผๅๅ
ฅๆฌกๆฅ้ข่ฎพ |
|
| 24 |
+
|
| 25 |
+
> **ๆนๆณจ๏ผๅทฒ้็บณ๏ผ๏ผ** ๆๆ md ๆไปถ้ฝ้่ฆๆไปฌ่ชๅทฑๅๅฝๆฐ่ฏปๅ๏ผ่ไธๆฏ่ฎฉๅคงๆจกๅ่ชๅทฑ่ฏปใๆฐๆฎ็ฑป็้่ฆๅๅ
จ้ข็่ฏปๅๆฏ่พๅฝๆฐๆฅๅฃ๏ผๆๆฌ็ฑป็้่ฆ่ฎพ่ฎกๅฅฝ่ชๅจๆๅ่พๅบ็ๅฝๆฐใๆฏๆฅ็ฌฌไธๆฌกๅฏน่ฏๅ PregoPal ่ชๅจๆด็ๅฝๅคฉ็ๅ็ฝฎ system prompt ๆถ๏ผ่ฆ่่๏ผ่ฅๅ
ปใไฝ้ใๅฎถๅบญ่่ฐฑใ่ฅๅ
ป็ด ้ๆฑใๆ ธๅฟ่ฎฐๅฟๆไปถ๏ผๅฎถๅบญๅ
ณ็ณปใ่ฐๅ่ฐไบฒ่ฟใๅฎถ้ๅ็่ฟไปไน๏ผใ
|
| 26 |
+
|
| 27 |
+
### 2.1 ไฝ้ๅข้ฟๆ ๅ โ ไธปๅจ่ฏข้ฎไฝ้
|
| 28 |
+
|
| 29 |
+
**ๅฎ็ฐๆนๅผ**๏ผๅไธไธช `WeightStandardParser` ็ฑป๏ผๅฐ WS/T 801-2022 ่กจ1 ็ผ่ฏไธบ็ปๆๅๆฐๆฎ๏ผๆไพๆฅ่ฏขๆฅๅฃใ
|
| 30 |
+
|
| 31 |
+
```python
|
| 32 |
+
# modules/nutrition_standards.py๏ผๆฐๅข๏ผ
|
| 33 |
+
class WeightStandardParser:
|
| 34 |
+
"""่งฃๆไฝ้ๅข้ฟๆ ๅ md ๆไปถ๏ผๆไพๆฅ่ฏขๆฅๅฃ"""
|
| 35 |
+
|
| 36 |
+
@staticmethod
|
| 37 |
+
def load() -> dict:
|
| 38 |
+
"""่ฏปๅ md ๆไปถ๏ผ่ฟๅ็ปๆๅๆฐๆฎ"""
|
| 39 |
+
# ่ฟๅ๏ผ
|
| 40 |
+
# {
|
| 41 |
+
# "bmi_standards": [
|
| 42 |
+
# {"category": "ไฝไฝ้", "bmi_range": (0, 18.5),
|
| 43 |
+
# "total_gain": (11.0, 16.0), "weekly_gain": 0.46,
|
| 44 |
+
# "weekly_range": (0.37, 0.56)},
|
| 45 |
+
# ...
|
| 46 |
+
# ]
|
| 47 |
+
# }
|
| 48 |
+
|
| 49 |
+
@staticmethod
|
| 50 |
+
def evaluate(bmi_before_pregnancy: float, current_week: int,
|
| 51 |
+
total_gain: float) -> dict:
|
| 52 |
+
"""่ฏไผฐไฝ้ๅข้ฟๆฏๅฆๅจๆจ่่ๅดๅ
"""
|
| 53 |
+
# ่ฟๅ {"status": "ok"/"warning", "message": "...", "suggestion": "..."}
|
| 54 |
+
```
|
| 55 |
+
|
| 56 |
+
**่ฐ็จๆถๆบ**๏ผๆฏๅคฉๆฉไธ Loop ็ `weight_check` ๆไปถ่ฐ็จๆญคๅฝๆฐ๏ผ็ปๆๅๅ
ฅไปๆฅ็ฎๆฅใ
|
| 57 |
|
| 58 |
+
> **ๆนๆณจ๏ผๅทฒ้็บณ๏ผ๏ผ** ๆด็ๆๅฝๆฐ๏ผไธ่ฆๆๅพ
32B ๅฐๅๆฐๆจกๅๅปๅ่ฟไบ๏ผ่ๆฏ่ชๅจๆพๅฐไธไธๆไธญใ
|
| 59 |
|
| 60 |
+
### 2.2 ่ณ้ฃๆๅ โ ้ฃ่ฐฑๆจ่ๅบ็ก
|
| 61 |
|
| 62 |
+
**ๅฎ็ฐๆนๅผ**๏ผๅไธไธช `DietaryGuideParser` ็ฑป๏ผๅฐๅนณ่กก่ณ้ฃๅฎๅก็ผ่ฏไธบ็ปๆๅๆฐๆฎใ
|
|
|
|
|
|
|
|
|
|
| 63 |
|
| 64 |
+
```python
|
| 65 |
+
# modules/nutrition_standards.py
|
| 66 |
+
class DietaryGuideParser:
|
| 67 |
+
"""่งฃๆ่ณ้ฃๆๅ md ๆไปถ๏ผๆไพๅๅญๆๆจ่ๆๅ
ฅ้"""
|
| 68 |
+
|
| 69 |
+
@staticmethod
|
| 70 |
+
def get_recommendations(trimester: str) -> dict:
|
| 71 |
+
"""่ฟๅๆๅฎๅญๆ็้ฃ็ฉๆจ่้"""
|
| 72 |
+
# ่ฟๅๅญไธญๆ/ๅญๆๆ/ๅบไนณๆ็ๅฎๅกๆฐๆฎ
|
| 73 |
+
|
| 74 |
+
@staticmethod
|
| 75 |
+
def get_core_principles() -> list[str]:
|
| 76 |
+
"""่ฟๅๅ
ญๆกๆ ธๅฟๅปบ่ฎฎ"""
|
| 77 |
+
```
|
| 78 |
|
| 79 |
+
**ไธๅฎถๅบญ่่ฐฑ็ปๅ**๏ผ
|
| 80 |
+
- `data/family/recipes.md` โ ่ฎฐๅฝๅฎถไบบไผๅ็่๏ผไธปๅจ่ฏข้ฎๅ่ฎฐๅฝ๏ผ
|
| 81 |
+
- `data/family/preferences.md` โ ่ฎฐๅฝๆๆๅฎถไบบ็้ฅฎ้ฃๅๅฅฝใๅฟๅฃใ่ฟๆ
|
| 82 |
+
- ๆจ่้ฃ่ฐฑๆถ๏ผ่ณ้ฃๆๅ็บฆๆ + ๅฎถๅบญ่่ฐฑ่ฟๆปค + ไธชไบบๅๅฅฝๆๅบ
|
| 83 |
+
|
| 84 |
+
> **ๆนๆณจ๏ผๅทฒ้็บณ๏ผ๏ผ** ้่ฆ่ฎพ่ฎกๅฅฝๅฆไฝไธ็จๆทๅฎถๅบญ่่ฐฑ็ปๅ๏ผ่ไธๆฏๅปๆๅบๅไธไบไธๅฏ่ฝ็่ใ้ฅฎ้ฃๅๅฅฝๅบ่ฏฅ่ฎฐๅฝๆๆๅฎถไบบ๏ผไธๅชๆฏๅญๅฆ๏ผ๏ผๅๆจกๅ่ฎฐๅฝ๏ผ่ฎพ่ฎกๅฅฝๆๅ็ๅฝๆฐๆฅๅฃใๆณจๆ่ฎฐๅฝๅฎถ้ๆๆไบบๆฏๅฆๆๅฟๅฃใ่ฟๆใ
|
| 85 |
+
|
| 86 |
+
### 2.3 DRIs โ Agent ๅฎๆๅๆ๏ผ่ชๅจ่ฟ่ก โ ๅๅ
ฅๆฌกๆฅ้ข่ฎพ๏ผ
|
| 87 |
+
|
| 88 |
+
**ๆน่ฟๆนๆก**๏ผ
|
| 89 |
+
|
| 90 |
+
```python
|
| 91 |
+
# modules/nutrition_standards.py
|
| 92 |
+
class DRIsParser:
|
| 93 |
+
"""่งฃๆ DRIs md ๆไปถ๏ผ่กจ15-18๏ผ๏ผๆไพ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้ๆฅ่ฏข"""
|
| 94 |
+
|
| 95 |
+
@staticmethod
|
| 96 |
+
def get_rni(stage: str) -> dict:
|
| 97 |
+
"""่ฟๅๆๅฎ้ถๆฎต็ RNI ๆฐๆฎ
|
| 98 |
+
stage: "pre_pregnancy" / "early" / "mid" / "late" / "lactation"
|
| 99 |
+
"""
|
| 100 |
+
|
| 101 |
+
@staticmethod
|
| 102 |
+
def compare_with_intake(stage: str, intake: dict) -> dict:
|
| 103 |
+
"""ๅฏนๆฏๅฎ้
ๆๅ
ฅไธ RNI๏ผ่ฟๅๅทฎๅผๅๆ"""
|
| 104 |
+
# ่ฟๅๆฏไธช่ฅๅ
ป็ด ็ๅทฎๅผ็พๅๆฏ + ้็นๅ
ณๆณจๆ ่ฎฐ
|
| 105 |
+
```
|
| 106 |
|
| 107 |
+
**ๅๆๆต็จ**๏ผ
|
| 108 |
+
1. ่ฏปๅๆจๆฅ้ฅฎ้ฃๆฅๅฟ๏ผ`data/logs/้ฅฎ้ฃๆฅๅฟ_YYYY-MM-DD.md`๏ผ
|
| 109 |
+
2. ็จ `DRIsParser.compare_with_intake()` ๅฏนๆฏ
|
| 110 |
+
3. ็ปๅๅฎถๅบญ่่ฐฑ๏ผ็ปๅบใไปๅคฉๅปบ่ฎฎๅคๅๅชไบๅฎถ้่ฝๅ็่ใ
|
| 111 |
+
4. ๅๅ
ฅ `data/presets/ไปๆฅ็ฎๆฅ_YYYY-MM-DD.json`
|
| 112 |
|
| 113 |
+
> **ๆนๆณจ๏ผๅพ
ๆน่ฟ๏ผ๏ผ** ่ฏทๅบไบๅ
ถๅฎๆนๆณจๆน่ฟๆนๆกใโ
ๅทฒๆน่ฟ๏ผ็ปๅๅฎถๅบญ่่ฐฑ๏ผๅปบ่ฎฎๅ
ทไฝๅฏๅ็่ใ
|
| 114 |
|
| 115 |
---
|
| 116 |
|
| 117 |
+
## ไธใๆ ธๅฟๆถๆ๏ผLoop ้ฉฑๅจ๏ผ็ถๆๆบ + ๆไปถๆณจๅ๏ผ
|
| 118 |
|
| 119 |
+
### 3.1 ่ฎพ่ฎก็ๅฟต
|
| 120 |
|
| 121 |
+
PregoPal ไธๆฏไธไธชใ็จๆท็นๆ้ฎ โ ๅบ็ปๆใ็่ขซๅจๅบ็จ๏ผ่ๆฏ**ๆๆฏๆฅ็ๅฝๅจๆ็ไธปๅจไผดไพฃ**ใ
|
|
|
|
|
|
|
|
|
|
| 122 |
|
| 123 |
+
ๅ่ไฝ ๆไพ็ `nanobot_core/agent/loop.py` ไธญ็**็ถๆๆบไบไปถ้ฉฑๅจๆจกๅผ**๏ผPregoPal ็ Loop ๆๅไธคไธชๆ ธๅฟ่ฎพ่ฎก๏ผ
|
|
|
|
|
|
|
|
|
|
|
|
|
| 124 |
|
| 125 |
+
1. **TurnState ็ถๆๆบ** โ ็ฎก็ๆฏๆฅ็ๅฝๅจๆ็้ถๆฎตๆต่ฝฌ
|
| 126 |
+
2. **ๅฏๆณจๅ็ๆฉๅฑ่ฝๅ** โ ๆฏไธช้ถๆฎต็ๅ
ทไฝ้ป่พ็ฑ Plugin ๅฎ็ฐ
|
| 127 |
|
| 128 |
+
> **ๆนๆณจ๏ผๅทฒ้็บณ๏ผ๏ผ** ๅ
ทไฝๅฎ็ฐไธ่ฝๅคชๅคๆ๏ผ่พพๅฐ็ฎ็๏ผๅ
ทๆๅฏๆๅฑๆง๏ผๅ
ทๆ็จณๅฎๆง๏ผไธไผๅ ไธบๆจกๅๅถๅฐ็็ฏ้ๆ่
่พๅบไธ็จณๅฎ่ๅฎๅ
จ้ป่พๆททไนฑ๏ผใ
|
| 129 |
|
| 130 |
+
### 3.2 ๆฏๆฅ็ๅฝๅจๆ๏ผv5 ๆน่ฟ็๏ผ
|
| 131 |
+
|
| 132 |
+
ๆ นๆฎไฝ ็ๆนๆณจ๏ผๅ
ณ้ฎๅๆด๏ผ
|
| 133 |
+
- **่งฆๅๆถๆบ**๏ผๆฏๆ 00:00 ่ชๅจๆป็ป๏ผๆ็จๅบๅฏๅจๆถๆฃๆฅ็ถๆไฝ๏ผ
|
| 134 |
+
- **ๆฐๅข้ถๆฎต**๏ผ`FAMILY_QUIZ`๏ผไธปๅจ่ฏข้ฎๅฎถๅบญ่่ฐฑ/ๅๅฅฝ๏ผใ`THREE_DAY_SUMMARY`๏ผๆฏไธๅคฉๆป็ป๏ผ
|
| 135 |
+
- **็ถๆไฝๆบๅถ**๏ผ`data/presets/.daily_status.json` ่ฎฐๅฝๆฏๆฅๅฎๆ็ถๆ
|
| 136 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 137 |
```
|
| 138 |
+
โโโโโโโโโโโโโโโ
|
| 139 |
+
โ LAUNCH โ โ ๆฃๆฅไปๆฅ็ถๆไฝ
|
| 140 |
+
โ (ๅฏๅจ) โ ่ฅๅทฒๆป็ป โ ็ดๆฅ INTERACT
|
| 141 |
+
โโโโโโโโฌโโโโโโโ ่ฅๆชๆป็ป โ ่ฟๅ
ฅๆป็ปๆต็จ
|
| 142 |
+
โ
|
| 143 |
+
โโโโโโโโโโโโโดโโโโโโโโโโโโ
|
| 144 |
+
โ โ
|
| 145 |
+
ไปๆฅๆชๆป็ป ไปๆฅๅทฒๆป็ป
|
| 146 |
+
โ โ
|
| 147 |
+
โผ โผ
|
| 148 |
+
โโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
|
| 149 |
+
โ FAMILY_QUIZ โ โ โ
|
| 150 |
+
โ (ๅฎถๅบญ้ฎๅท) โ โ โ
|
| 151 |
+
โ โ ๆฃๆฅๆฏๅฆ้่ฆ โ โ โ
|
| 152 |
+
โ โ ่ฏข้ฎๆฐ่่ฐฑ โ โ โ
|
| 153 |
+
โ โ ๆฃๆฅๆฏๅฆ้่ฆ โ โ โ
|
| 154 |
+
โ ่ฏข้ฎไฝ้ โ โ โ
|
| 155 |
+
โโโโโโโโฌโโโโโโโโ โ โ
|
| 156 |
+
โ โ โ
|
| 157 |
+
โผ โ โ
|
| 158 |
+
โโโโโโโโโโโโโโโโ โ โ
|
| 159 |
+
โ SUMMARIZE โ โ โ
|
| 160 |
+
โ (ๆจๆฅๆป็ป) โ โ โ
|
| 161 |
+
โ โ ่ฏปๅ้ฅฎ้ฃๆฅๅฟ โ โ โ
|
| 162 |
+
โ โ ่ฏปๅไฝ้่ฎฐๅฝ โ โ โ
|
| 163 |
+
โ โ ่ฏปๅๅฎถๅบญ่ฎฐๅฟ โ โ โ
|
| 164 |
+
โโโโโโโโฌโโโโโโโโ โ โ
|
| 165 |
+
โ โ โ
|
| 166 |
+
โผ โ โ
|
| 167 |
+
โโโโโโโโโโโโโโโโ โ โ
|
| 168 |
+
โ ANALYZE โ โ โ
|
| 169 |
+
โ (่ฅๅ
ปๅๆ) โ โ โ
|
| 170 |
+
โ โ ๅฏนๆฏDRIs โ โ โ
|
| 171 |
+
โโโโโโโโฌโโโโโโโโ โ โ
|
| 172 |
+
โ โ โ
|
| 173 |
+
โผ โ โ
|
| 174 |
+
โโโโโโโโโโโโโโโโ โ โ
|
| 175 |
+
โ BRIEF โ โ โ
|
| 176 |
+
โ (็ๆ็ฎๆฅ) โ โ โ
|
| 177 |
+
โ โ ๅJSON โ โ โ
|
| 178 |
+
โโโโโโโโฌโโโโโโโโ โ โ
|
| 179 |
+
โ โ โ
|
| 180 |
+
โผ โผ โ
|
| 181 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ โ
|
| 182 |
+
โ INTERACT โโโโ
|
| 183 |
+
โ (็ฝๅคฉไบคไบๆจกๅผ) โ
|
| 184 |
+
โ ๏ฟฝ๏ฟฝ ๅฃฐ็บน่ฏๅซ โ ๅบๅ่ฏด่ฏไบบ โ
|
| 185 |
+
โ โ ๅฏน่ฏ็่งฃ โ ๆญฃๅๆๅ้ฅฎ้ฃ่ฎฐๅฝ โ
|
| 186 |
+
โ โ โ ๅๅ
ฅ้ฅฎ้ฃไน ๆฏ.md โ
|
| 187 |
+
โ โ โ ๅๅ
ฅๅฎถๅบญ่่ฐฑ.md โ
|
| 188 |
+
โ โ ๆจ่ โ ่ณ้ฃๆๅ+ๅฎถๅบญ่่ฐฑ็บฆๆ โ
|
| 189 |
+
โ โ ็ฎๆฅๆณจๅ
ฅ โ AI ็ฅ้ไปๆฅๅ
ณๆณจ็น โ
|
| 190 |
+
โโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโ
|
| 191 |
+
โ
|
| 192 |
+
ๆฏๆ 00:00๏ผๆๅ
ณ้ญๆถ๏ผ
|
| 193 |
+
โ
|
| 194 |
+
โผ
|
| 195 |
+
โโโโโโโโโโโโโโโโ
|
| 196 |
+
โ CONSOLIDATE โ
|
| 197 |
+
โ (ๆ้ดๆด็) โ
|
| 198 |
+
โ โ ๆฑๆปไปๆฅ โ
|
| 199 |
+
โ โ ๆฃๆฅๆฏๅฆๅฐ โ
|
| 200 |
+
โ โ ไธๅคฉๆป็ป โ
|
| 201 |
+
โ โ ๅๆๆฅ้ข่ฎพ โ
|
| 202 |
+
โโโโโโโโฌโโโโโโโโ
|
| 203 |
+
โ
|
| 204 |
+
โผ
|
| 205 |
+
โโโโโโโโโโโโโโโโ
|
| 206 |
+
โ DONE โ
|
| 207 |
+
โ ๆ ่ฎฐไปๆฅๅฎๆ โ
|
| 208 |
+
โโโโโโโโโโโโโโโโ
|
| 209 |
+
```
|
| 210 |
+
|
| 211 |
+
> **ๆนๆณจ๏ผๅทฒ้็บณ๏ผ๏ผ** ๆฏๆ 00:00 ่ชๅจๆป็ป๏ผ่ฎพ็ฝฎ็ถๆไฝใ็จๅบๅ
ณ้ญๅ็ฌฌไบๅคฉๅฏๅจ่ชๅจๆฃๆฅ็ถๆไฝใ็้ข่ฎพ่ฎก๏ผ4 ไธชๅญ้กต้ขใ
|
| 212 |
+
|
| 213 |
+
### 3.3 ็ถๆๆบๅฎไน๏ผv5 ๆน่ฟ็๏ผ
|
| 214 |
+
|
| 215 |
+
```python
|
| 216 |
+
class LoopState(Enum):
|
| 217 |
+
LAUNCH = "launch" # ๅฏๅจๆฃๆฅ๏ผๆฃๆฅไปๆฅ็ถๆไฝ
|
| 218 |
+
FAMILY_QUIZ = "family_quiz" # ๅฎถๅบญ้ฎๅท๏ผๆฃๆฅๆฏๅฆ้่ฆ่ฏข้ฎ่่ฐฑ/ไฝ้
|
| 219 |
+
SUMMARIZE = "summarize" # ๆจๆฅๆป็ป๏ผๅๆๆจๆฅ้ฅฎ้ฃ/ไฝ้/ๅฎถๅบญ่ฎฐๅฟ
|
| 220 |
+
ANALYZE = "analyze" # ่ฅๅ
ปๅๆ๏ผๅฏนๆฏ DRIs
|
| 221 |
+
BRIEF = "brief" # ็ๆไปๆฅ็ฎๆฅ
|
| 222 |
+
INTERACT = "interact" # ็ฝๅคฉไบคไบๆจกๅผ๏ผ็ญๅพ
็จๆทๆไฝ๏ผ
|
| 223 |
+
THREE_DAY = "three_day" # ๆฏไธๅคฉ่ชๅจๆป็ป๏ผ็ฑ CONSOLIDATE ่งฆๅ๏ผ
|
| 224 |
+
CONSOLIDATE = "consolidate" # ๆ้ดๆด็
|
| 225 |
+
DONE = "done"
|
| 226 |
+
|
| 227 |
+
_TRANSITIONS = {
|
| 228 |
+
(LoopState.LAUNCH, "need_summary"): LoopState.FAMILY_QUIZ,
|
| 229 |
+
(LoopState.LAUNCH, "already_done"): LoopState.INTERACT,
|
| 230 |
+
(LoopState.FAMILY_QUIZ, "ok"): LoopState.SUMMARIZE,
|
| 231 |
+
(LoopState.SUMMARIZE, "ok"): LoopState.ANALYZE,
|
| 232 |
+
(LoopState.ANALYZE, "ok"): LoopState.BRIEF,
|
| 233 |
+
(LoopState.BRIEF, "ok"): LoopState.INTERACT,
|
| 234 |
+
(LoopState.INTERACT, "day_ended"): LoopState.CONSOLIDATE,
|
| 235 |
+
(LoopState.CONSOLIDATE, "need_3day"): LoopState.THREE_DAY,
|
| 236 |
+
(LoopState.CONSOLIDATE, "ok"): LoopState.DONE,
|
| 237 |
+
(LoopState.THREE_DAY, "ok"): LoopState.DONE,
|
| 238 |
+
}
|
| 239 |
```
|
| 240 |
|
| 241 |
+
> **ๆนๆณจ๏ผๅทฒ้็บณ๏ผ๏ผ** ็ถๆๆบ่ฎพ่ฎกๆ นๆฎ็ฎ็่ฟญไปฃ๏ผๅทฒๆดๅไธไธๆนๆณจใ
|
| 242 |
|
| 243 |
+
### 3.4 ็ถๆๅค็ๅจ
|
| 244 |
|
| 245 |
+
| ็ถๆ | Handler | ๅ่ฝ |
|
| 246 |
+
|------|---------|------|
|
| 247 |
+
| `LAUNCH` | `_state_launch()` | ่ฏปๅ `data/presets/.daily_status.json` โ ๅณๅฎๆต็จ |
|
| 248 |
+
| `FAMILY_QUIZ` | `_state_family_quiz()` | ๆฃๆฅๆฏๅฆ้่ฆ่ฏข้ฎๆฐ่่ฐฑ/ไฝ้ โ ๅๅ
ฅไปๆฅ็ฎๆฅๅพ
ๅ |
|
| 249 |
+
| `SUMMARIZE` | `_state_summarize()` | ้ๅๆง่ก SUMMARIZE ้ถๆฎต Plugin |
|
| 250 |
+
| `ANALYZE` | `_state_analyze()` | ้ๅๆง่ก ANALYZE ้ถๆฎต Plugin |
|
| 251 |
+
| `BRIEF` | `_state_brief()` | ๆฑๆปไธบ `ไปๆฅ็ฎๆฅ.json` |
|
| 252 |
+
| `INTERACT` | `_state_interact()` | ็ญๅพ
็จๆทไบคไบ๏ผๆถ่ดน Gradio event queue |
|
| 253 |
+
| `THREE_DAY` | `_state_three_day()` | ๆฏไธๅคฉ่ฟ่ก๏ผๅๆ่ฅๅ
ป็ผบๅคฑ โ ๆน่ฟๅฎถๅบญ่ๅๅปบ่ฎฎ |
|
| 254 |
+
| `CONSOLIDATE` | `_state_consolidate()` | ๆ้ดๆด็๏ผๆฃๆฅๆฏๅฆ่งฆๅ THREE_DAY |
|
| 255 |
+
| `DONE` | `_state_done()` | ๅๅ
ฅ็ถๆไฝ๏ผๆธ
็่ตๆบ |
|
| 256 |
+
|
| 257 |
+
> **ๆนๆณจ๏ผๅทฒ้็บณ๏ผ๏ผ** ็ถๆๅค็ๅจๆ นๆฎ็ฎ็่ฟญไปฃ๏ผๅทฒๆดๅไธไธๆนๆณจใ
|
| 258 |
+
|
| 259 |
+
### 3.5 ไธปๅพช็ฏๅ
ฅๅฃ
|
| 260 |
+
|
| 261 |
+
```python
|
| 262 |
+
class PregoPalLoop:
|
| 263 |
+
def __init__(self):
|
| 264 |
+
self.plugins = PluginRegistry()
|
| 265 |
+
self.state = LoopState.LAUNCH
|
| 266 |
+
self._register_default_plugins()
|
| 267 |
+
|
| 268 |
+
async def run(self) -> None:
|
| 269 |
+
while self.state is not LoopState.DONE:
|
| 270 |
+
handler_name = f"_state_{self.state.value}"
|
| 271 |
+
handler = getattr(self, handler_name)
|
| 272 |
+
event = await handler()
|
| 273 |
+
next_state = _TRANSITIONS.get((self.state, event))
|
| 274 |
+
if next_state is None:
|
| 275 |
+
raise RuntimeError(f"No transition from {self.state} on {event}")
|
| 276 |
+
self.state = next_state
|
| 277 |
+
```
|
| 278 |
|
| 279 |
+
> **ๆนๆณจ๏ผ** ________
|
| 280 |
|
| 281 |
+
---
|
|
|
|
|
|
|
|
|
|
| 282 |
|
| 283 |
+
## ๅใๆไปถ็ณป็ป่ฎพ่ฎก๏ผๅฏๆฉๅฑๆง๏ผ
|
| 284 |
+
|
| 285 |
+
### 4.1 ๆไปถๅบ็ฑป
|
| 286 |
+
|
| 287 |
+
```python
|
| 288 |
+
class LoopStage(Enum):
|
| 289 |
+
FAMILY_QUIZ = "family_quiz"
|
| 290 |
+
SUMMARIZE = "summarize"
|
| 291 |
+
ANALYZE = "analyze"
|
| 292 |
+
BRIEF = "brief"
|
| 293 |
+
THREE_DAY = "three_day"
|
| 294 |
+
CONSOLIDATE = "consolidate"
|
| 295 |
+
|
| 296 |
+
@dataclass
|
| 297 |
+
class LoopContext:
|
| 298 |
+
briefing: dict = field(default_factory=dict)
|
| 299 |
+
weight_data: dict = field(default_factory=dict)
|
| 300 |
+
diet_records: list = field(default_factory=list)
|
| 301 |
+
family_recipes: list = field(default_factory=list) # ๆฐๅข๏ผๅฎถๅบญ่่ฐฑ
|
| 302 |
+
family_memory: dict = field(default_factory=dict) # ๆฐๅข๏ผๅฎถๅบญ่ฎฐๅฟ
|
| 303 |
+
analysis_results: dict = field(default_factory=dict)
|
| 304 |
+
errors: list = field(default_factory=list)
|
| 305 |
+
|
| 306 |
+
class LoopPlugin(ABC):
|
| 307 |
+
@abstractmethod
|
| 308 |
+
def stage(self) -> LoopStage: ...
|
| 309 |
+
@abstractmethod
|
| 310 |
+
def name(self) -> str: ...
|
| 311 |
+
@abstractmethod
|
| 312 |
+
async def run(self, ctx: LoopContext) -> PluginResult: ...
|
| 313 |
+
```
|
| 314 |
|
| 315 |
+
> **ๆนๆณจ๏ผ** ________
|
| 316 |
|
| 317 |
+
### 4.2 ๅ
็ฝฎๆไปถๆธ
ๅ๏ผv5 ๆดๆฐ็๏ผ
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 318 |
|
| 319 |
+
| ๆไปถ | ็ฑปๅ | ๆณจๅ้ถๆฎต | ๅ่ฝ | ๆฐๆฎๆบ |
|
| 320 |
+
|------|------|---------|------|--------|
|
| 321 |
+
| ๅฎถๅบญ่่ฐฑๆฃๆฅ | `FamilyRecipeQuizPlugin` | FAMILY_QUIZ | ๆฃๆฅๆฏๅฆ้่ฆ่ฏข้ฎๆฐ่่ฐฑ | `data/family/recipes.md` |
|
| 322 |
+
| ไฝ้่ฏข้ฎๆฃๆฅ | `WeightQuizPlugin` | FAMILY_QUIZ | ๆฃๆฅๆฏๅฆ้่ฆ่ฏข้ฎไฝ้ | `data/logs/` |
|
| 323 |
+
| ๆจๆฅ้ฅฎ้ฃๆป็ป | `DietSummaryPlugin` | SUMMARIZE | ่ฏปๅๆจๆฅ้ฅฎ้ฃๆฅๅฟ๏ผๆฑๆปไธ้ค | `data/logs/*.md` |
|
| 324 |
+
| ไฝ้ๆฃๆฅ | `WeightCheckPlugin` | SUMMARIZE | ๆฃๆฅไฝ้่ฎฐๅฝ๏ผๅฏนๆฏ WS/T 801 | `WeightStandardParser` |
|
| 325 |
+
| ๅฎถๅบญ่ฎฐๅฟๅ ่ฝฝ | `FamilyMemoryPlugin` | SUMMARIZE | ๅ ่ฝฝๅฎถๅบญๅ
ณ็ณป/ไบไปถ่ฎฐๅฟ | `data/family/memory.md` |
|
| 326 |
+
| DRIs ๅๆ | `DRIAnalysisPlugin` | ANALYZE | ๅฏนๆฏ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้ | `DRIsParser` + ๆจๆฅ้ฅฎ้ฃ |
|
| 327 |
+
| ็ฎๆฅ็ๆ | `BriefingGeneratorPlugin` | BRIEF | ๆฑๆปๅๆไธบ็ปๆๅ JSON | `LoopContext` |
|
| 328 |
+
| ไธๅคฉๆป็ป | `ThreeDaySummaryPlugin` | THREE_DAY | ๅๆ่ฅๅ
ป็ผบๅคฑ่ถๅฟ๏ผๆน่ฟๅฎถๅบญ่ๅ | ่ฟไธๅคฉ้ฅฎ้ฃ่ฎฐๅฝ |
|
| 329 |
+
| ้ข่ฎพๅๅ
ฅ | `PresetWriterPlugin` | CONSOLIDATE | ็ๆๆๆฅ้ข่ฎพๆไปถ | `data/presets/` |
|
| 330 |
|
| 331 |
+
> **ๆนๆณจ๏ผ** ________
|
|
|
|
| 332 |
|
| 333 |
+
### 4.3 ๆฉๅฑๆนๅผ
|
| 334 |
|
| 335 |
+
```python
|
| 336 |
+
# ๆฐๅขๅ่ฝๅช้ไธคๆญฅ๏ผ
|
| 337 |
+
class NewPlugin(LoopPlugin):
|
| 338 |
+
def stage(self) -> LoopStage: return LoopStage.SUMMARIZE
|
| 339 |
+
def name(self) -> str: return "new_feature"
|
| 340 |
+
async def run(self, ctx: LoopContext) -> PluginResult: ...
|
| 341 |
|
| 342 |
+
loop.plugins.register(NewPlugin())
|
| 343 |
+
# ไธ้่ฆไฟฎๆน loop.py ็็ถๆๆบไปฃ็
|
| 344 |
+
```
|
| 345 |
|
| 346 |
+
> **ๆนๆณจ๏ผ** ________
|
| 347 |
|
| 348 |
+
---
|
| 349 |
|
| 350 |
+
## ไบใๆดไฝๆไปถ็ปๆ๏ผv5 ๆดๆฐ็๏ผ
|
| 351 |
|
| 352 |
```
|
| 353 |
+
PregoPal/
|
| 354 |
+
โโโ app.py # ไธปๅ
ฅๅฃ๏ผๅฏๅจ Gradio + Loop
|
| 355 |
+
โโโ config.py # ๅ
จๅฑ้
็ฝฎ
|
| 356 |
+
โโโ utils.py # ๅทฅๅ
ทๅฝๆฐ
|
| 357 |
+
โโโ loop.py โ ๐ ๆฐๅข # ๆ ธๅฟๅพช็ฏๅผๆ๏ผ็ถๆๆบ้ฉฑๅจ๏ผ
|
| 358 |
+
โ
|
| 359 |
+
โโโ plugins/ โ ๐ ๆฐๅข # Loop ๆไปถ
|
| 360 |
+
โ โโโ __init__.py
|
| 361 |
+
โ โโโ base.py # LoopPlugin ๅบ็ฑป + PluginRegistry
|
| 362 |
+
โ โโโ family_quiz.py # ๅฎถๅบญ่่ฐฑ/ไฝ้่ฏข้ฎๆฃๆฅ
|
| 363 |
+
โ โโโ diet_summary.py # ๆจๆฅ้ฅฎ้ฃๆป็ป
|
| 364 |
+
โ โโโ weight_check.py # ไฝ้ๆฃๆฅ๏ผWS/T 801๏ผ
|
| 365 |
+
โ โโโ family_memory.py # ๅฎถๅบญ่ฎฐๅฟๅ ่ฝฝ
|
| 366 |
+
โ โโโ dri_analysis.py # DRIs ่ฅๅ
ป็ด ๅฏนๆฏๅๆ
|
| 367 |
+
โ โโโ briefing_generator.py # ไปๆฅ็ฎๆฅ็ๆๅจ
|
| 368 |
+
โ โโโ three_day_summary.py # ๆฏไธๅคฉๆป็ป
|
| 369 |
+
โ โโโ preset_writer.py # ้ข่ฎพๆไปถๅๅ
ฅ
|
| 370 |
+
โ
|
| 371 |
+
โโโ modules/ # ไธๅก้ป่พๅฑ
|
| 372 |
+
โ โโโ __init__.py
|
| 373 |
+
โ โโโ nutrition_standards.py # โ ๐ ๆฐๅข๏ผ่ฅๅ
ปๆ ๅ่งฃๆๅจ
|
| 374 |
+
โ โ โโโ WeightStandardParser # ไฝ้ๆ ๅ่งฃๆ
|
| 375 |
+
โ โ โโโ DietaryGuideParser # ่ณ้ฃๆๅ่งฃๆ
|
| 376 |
+
โ โ โโโ DRIsParser # DRIs ่งฃๆ
|
| 377 |
+
โ โโโ family_manager.py # โ ๐ ๆฐๅข๏ผๅฎถๅบญไฟกๆฏ็ฎก็
|
| 378 |
+
โ โ โโโ ่ฏปๅ/ๅๅ
ฅ recipes.md
|
| 379 |
+
โ โ โโโ ่ฏปๅ/ๅๅ
ฅ preferences.md
|
| 380 |
+
โ โ โโโ ่ฏปๅ/ๅๅ
ฅ memory.md
|
| 381 |
+
โ โโโ diet_extractor.py # โ ๐ ๆฐๅข๏ผsystem prompt + ๆญฃๅๆๅ
|
| 382 |
+
โ โ โโโ ไปๅฏน่ฏไธญๆๅ้ฅฎ้ฃ่ฎฐๅฝ
|
| 383 |
+
โ โ โโโ ไปๅฏน่ฏไธญๆๅ่่ฐฑไฟกๆฏ
|
| 384 |
+
โ โ โโโ ไปๅฏน่ฏไธญๆๅๅฎถๅบญๅ
ณ็ณป
|
| 385 |
+
โ โโโ voiceprint.py # ๅฃฐ็บน่ฏๅซ
|
| 386 |
+
โ โโโ meal_recommender.py # ่ๅๆจ่
|
| 387 |
+
โ โโโ diet_logger.py # ้ฅฎ้ฃ่ฎฐๅฝ + Markdown ็ๆ
|
| 388 |
+
โ โโโ nutrition_analyzer.py # ่ฅๅ
ปๅๆ + ๅฏ่งๅ
|
| 389 |
+
โ
|
| 390 |
+
โโโ core/ # AI ๆ ธๅฟๅฑ๏ผ็ญๅพ
MiniCPM-o๏ผ
|
| 391 |
+
โ โโโ __init__.py
|
| 392 |
+
โ โโโ model_loader.py
|
| 393 |
+
โ โโโ voice_processor.py
|
| 394 |
+
โ โโโ vision_processor.py
|
| 395 |
+
โ โโโ conversation_manager.py
|
| 396 |
+
โ
|
| 397 |
+
โโโ ui/ # ่กจ็ฐๅฑ
|
| 398 |
+
โ โโโ __init__.py
|
| 399 |
+
โ โโโ app_builder.py # Gradio ็้ข
|
| 400 |
+
โ
|
| 401 |
+
โโโ data/
|
| 402 |
+
โ โโโ nutrition/
|
| 403 |
+
โ โ โโโ raw/ # ไธไธช MD ๆไปถ
|
| 404 |
+
โ โโโ family/ โ ๐ ๆฐๅข # ๅฎถๅบญไฟกๆฏ
|
| 405 |
+
โ โ โโโ recipes.md # ๅฎถๅบญ่่ฐฑ๏ผๅฎถไบบไผๅ็่๏ผ
|
| 406 |
+
โ โ โโโ preferences.md # ้ฅฎ้ฃๅๅฅฝ/ๅฟๅฃ/่ฟๆ
|
| 407 |
+
โ โ โโโ memory.md # ๅฎถๅบญ่ฎฐๅฟ๏ผๅ
ณ็ณป/ไบไปถ๏ผ
|
| 408 |
+
โ โโโ presets/ # ๆฏๆฅ็ฎๆฅ
|
| 409 |
+
โ โ โโโ .daily_status.json # ็ถๆไฝๆไปถ
|
| 410 |
+
โ โโโ voices/
|
| 411 |
+
โ โโโ logs/ # Markdown ้ฅฎ้ฃๆฅๅฟ
|
| 412 |
+
โ โโโ reports/ # ๅฏผๅบๆฅๅ
|
| 413 |
+
โ
|
| 414 |
+
โโโ docs/
|
| 415 |
+
โ โโโ ้กน็ฎ็่งฃ_ๆๆฏๆถๆ.md
|
| 416 |
+
โ โโโ ๅผๅๆฅๅฟ.md
|
| 417 |
+
โโโ requirements.txt
|
| 418 |
+
โโโ README.md
|
| 419 |
```
|
| 420 |
|
| 421 |
+
> **ๆนๆณจ๏ผ** ________
|
| 422 |
|
| 423 |
+
---
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 424 |
|
| 425 |
+
## ๅ
ญใUI ็้ข่ฎพ่ฎก๏ผๆ นๆฎๆนๆณจๆฐๅข๏ผ
|
| 426 |
|
| 427 |
+
ๆ นๆฎไฝ ็ๆนๆณจ๏ผGradio ็้ขๆนไธบ **4 ไธชๅญ้กต้ข**๏ผ
|
| 428 |
+
|
| 429 |
+
### ้กต้ข 1๏ผ่ฏญ้ณไบคไบ๏ผไธป็้ข๏ผ
|
| 430 |
+
- ่ฏญ้ณ่พๅ
ฅ/่พๅบ๏ผๆชๆฅๆฏๆ่ง้ข๏ผ
|
| 431 |
+
- **ๆพ็คบ PregoPal ๅฝๅๆ่/ๆไฝๅ
ณ้ฎ่ฏ**๏ผ้่ฟ system prompt + ๆญฃๅๆๅ๏ผๆฏๆฌกๆง่กไธไธๆญฅๆถ็จ็นๅฎๅญ็ฌฆๅ
่ฃนไธไธๆญฅไธป้ข๏ผ
|
| 432 |
+
- **่ชๅจๅฑ็คบ็ธๅ
ณๆไปถๆไฝ็่พๅบ็ปๆ**๏ผๆชๆญ + ็็ฅๅท๏ผ
|
| 433 |
+
- ๅฃฐ็บน่ฏๅซ็ถๆๆพ็คบ
|
| 434 |
+
|
| 435 |
+
### ้กต้ข 2๏ผๅฎถๅบญๆๅ้ฅฎ้ฃไน ๆฏ
|
| 436 |
+
- ๅฑ็คบๆๆๅฎถๅบญๆๅ็้ฅฎ้ฃๅๅฅฝใๅฟๅฃใ่ฟๆ
|
| 437 |
+
- ๅฑ็คบๅฎถๅบญ่่ฐฑ๏ผๅฎถไบบไผๅ็่๏ผ
|
| 438 |
+
- ๆฏๆๆๅจๆทปๅ /ไฟฎๆน
|
| 439 |
+
|
| 440 |
+
### ้กต้ข 3๏ผๆฏไธๅคฉ่ชๅจๆป็ป
|
| 441 |
+
- ๅๆๅญๅฆ้ฅฎ้ฃๆฏๅฆๅญๅจ่ฅๅ
ป็ผบๅคฑ
|
| 442 |
+
- ๅฏนๅฎถๅบญ่ๅ็ปๅบๆน่ฟๅปบ่ฎฎ
|
| 443 |
+
- ็ฑ `THREE_DAY` ็ถๆ่งฆๅ
|
| 444 |
|
| 445 |
+
### ้กต้ข 4๏ผ่ฅๅ
ปๆฅๅ
|
| 446 |
+
- ๅฏ่งๅๆฅๅ๏ผไฟ็ๅๆ๏ผ
|
| 447 |
+
- ไฝ้ๅข้ฟ่ถๅฟๅพ
|
| 448 |
+
- ่ฅๅ
ป็ด ๆๅ
ฅๅฏนๆฏๅพ
|
| 449 |
+
|
| 450 |
+
> **ๆนๆณจ๏ผ** ________
|
| 451 |
|
| 452 |
---
|
| 453 |
|
| 454 |
+
## ไธใsystem prompt + ๆญฃๅๆๅ่ฎพ่ฎก๏ผๆ นๆฎๆนๆณจๆฐๅข๏ผ
|
| 455 |
+
|
| 456 |
+
่ฟๆฏ PregoPal ็ๆ ธๅฟๆบๅถ๏ผ็จไบๅจไธ๏ฟฝ๏ฟฝ๏ฟฝ่ต toolcall ็ๆ
ๅตไธๅฎ็ฐ็ปๆๅๆฐๆฎๆๅใ
|
| 457 |
+
|
| 458 |
+
### 7.1 ๆๅๆ ่ฎฐๆ ผๅผ
|
| 459 |
+
|
| 460 |
+
ๅจ system prompt ไธญๅ่ฏๆจกๅ๏ผๅฝ้่ฆ่ฎฐๅฝไฟกๆฏๆถ๏ผไฝฟ็จไปฅไธๆ ่ฎฐๆ ผๅผ๏ผ
|
| 461 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 462 |
```
|
| 463 |
+
[EXTRACT_DIET]
|
| 464 |
+
ๆฅๆ: 2026-06-08
|
| 465 |
+
้คๆฌก: ๅ้ค
|
| 466 |
+
้ฃ็ฉ: ็ช่็่
ฉ, ็ฑณ้ฅญ
|
| 467 |
+
ไปฝ้: ไธ็ข
|
| 468 |
+
่ฎฐๅฝไบบ: ไธๅคซ
|
| 469 |
+
ๅคๆณจ: ๅญๅฆ่ฏดๆณๅ
|
| 470 |
+
[/EXTRACT_DIET]
|
| 471 |
+
|
| 472 |
+
[EXTRACT_RECIPE]
|
| 473 |
+
่ๅ: ๆธ
่ธ้ฒ้ฑผ
|
| 474 |
+
ๅถไฝไบบ: ไธๅคซ
|
| 475 |
+
้พๅบฆ: ไธญ็ญ
|
| 476 |
+
้ฃๆ: ้ฒ้ฑผ, ่ฑ, ๅง, ่ธ้ฑผ่ฑๆฒน
|
| 477 |
+
ๅคๆณจ: ๅญๅฆ็ฑๅ
|
| 478 |
+
[/EXTRACT_RECIPE]
|
| 479 |
+
|
| 480 |
+
[EXTRACT_PREFERENCE]
|
| 481 |
+
ไบบๅ: ไธๅคซ
|
| 482 |
+
็ฑปๅ: ๅฟๅฃ
|
| 483 |
+
ๅ
ๅฎน: ไธๅ้ฆ่
|
| 484 |
+
[/EXTRACT_PREFERENCE]
|
| 485 |
+
|
| 486 |
+
[EXTRACT_WEIGHT]
|
| 487 |
+
ๆฅๆ: 2026-06-08
|
| 488 |
+
ไฝ้: 62.5
|
| 489 |
+
่ฎฐๅฝไบบ: ๅญๅฆ
|
| 490 |
+
[/EXTRACT_WEIGHT]
|
| 491 |
+
|
| 492 |
+
[THINKING]
|
| 493 |
+
ๅฝๅๆญฅ้ชค: ๅๆๆจๆฅ้ๆๅ
ฅ
|
| 494 |
+
ไธไธๆญฅ: ๅฏนๆฏDRIsๆ ๅ
|
| 495 |
+
[/THINKING]
|
| 496 |
+
```
|
| 497 |
+
|
| 498 |
+
### 7.2 ๅ็ซฏๆญฃๅ่งฃๆ
|
| 499 |
+
|
| 500 |
+
```python
|
| 501 |
+
# modules/diet_extractor.py
|
| 502 |
+
import re
|
| 503 |
+
|
| 504 |
+
class DietExtractor:
|
| 505 |
+
"""ไป AI ๅๅคไธญๆๅ็ปๆๅๆฐๆฎ"""
|
| 506 |
+
|
| 507 |
+
DIET_PATTERN = re.compile(
|
| 508 |
+
r'\[EXTRACT_DIET\](.*?)\[/EXTRACT_DIET\]', re.DOTALL
|
| 509 |
+
)
|
| 510 |
+
RECIPE_PATTERN = re.compile(
|
| 511 |
+
r'\[EXTRACT_RECIPE\](.*?)\[/EXTRACT_RECIPE\]', re.DOTALL
|
| 512 |
+
)
|
| 513 |
+
PREFERENCE_PATTERN = re.compile(
|
| 514 |
+
r'\[EXTRACT_PREFERENCE\](.*?)\[/EXTRACT_PREFERENCE\]', re.DOTALL
|
| 515 |
+
)
|
| 516 |
+
WEIGHT_PATTERN = re.compile(
|
| 517 |
+
r'\[EXTRACT_WEIGHT\](.*?)\[/EXTRACT_WEIGHT\]', re.DOTALL
|
| 518 |
+
)
|
| 519 |
+
THINKING_PATTERN = re.compile(
|
| 520 |
+
r'\[THINKING\](.*?)\[/THINKING\]', re.DOTALL
|
| 521 |
+
)
|
| 522 |
+
|
| 523 |
+
@staticmethod
|
| 524 |
+
def extract_all(text: str) -> dict:
|
| 525 |
+
"""ไปๆๆฌไธญๆๅๆๆ็ปๆๅๆฐๆฎ"""
|
| 526 |
+
return {
|
| 527 |
+
"diets": DietExtractor._parse_diets(text),
|
| 528 |
+
"recipes": DietExtractor._parse_recipes(text),
|
| 529 |
+
"preferences": DietExtractor._parse_preferences(text),
|
| 530 |
+
"weights": DietExtractor._parse_weights(text),
|
| 531 |
+
"thinking": DietExtractor._parse_thinking(text),
|
| 532 |
+
}
|
| 533 |
+
|
| 534 |
+
@staticmethod
|
| 535 |
+
def _parse_diets(text: str) -> list[dict]:
|
| 536 |
+
"""่งฃๆ [EXTRACT_DIET] ๅ"""
|
| 537 |
+
results = []
|
| 538 |
+
for match in DietExtractor.DIET_PATTERN.finditer(text):
|
| 539 |
+
block = match.group(1)
|
| 540 |
+
entry = {}
|
| 541 |
+
for line in block.strip().split('\n'):
|
| 542 |
+
if ':' in line:
|
| 543 |
+
key, val = line.split(':', 1)
|
| 544 |
+
entry[key.strip()] = val.strip()
|
| 545 |
+
if entry:
|
| 546 |
+
results.append(entry)
|
| 547 |
+
return results
|
| 548 |
+
```
|
| 549 |
+
|
| 550 |
+
### 7.3 ็จณๅฎๆง่ฎพ่ฎก
|
| 551 |
|
| 552 |
+
- **ๆญฃๅๅน้
ๅคฑ่ดฅๆถ็ fallback**๏ผๅฆๆๆจกๅ่พๅบๆ ผๅผไธๅฎๆด๏ผๅฐ่ฏ็จๅ
ณ้ฎ่ฏๅน้
๏ผๅฆ "ๅไบ"ใ"ๆณๅ"ใ"่ฎฐๅฝ" ็ญ๏ผ
|
| 553 |
+
- **็จๆท็กฎ่ฎคๆบๅถ**๏ผๆๅ็ๆฐๆฎๅ
ๅฑ็คบ็ป็จๆท็กฎ่ฎค๏ผๅๅๅ
ฅๆไปถ
|
| 554 |
+
- **ๅค่ฝฎ็ดฏ็งฏ**๏ผๅไธ้คๆฌก็ไฟกๆฏๅฏ่ฝๅๆฃๅจๅค่ฝฎๅฏน่ฏไธญ๏ผ้่ฆ็ดฏ็งฏๅๅนถ
|
| 555 |
|
| 556 |
+
> **ๆนๆณจ๏ผ** ________
|
| 557 |
|
| 558 |
---
|
| 559 |
|
| 560 |
+
## ๅ
ซใๆฐๆฎๆตๅ
จๆฏ๏ผv5 ๆดๆฐ็๏ผ
|
| 561 |
|
| 562 |
```
|
| 563 |
+
data/nutrition/raw/ data/family/
|
| 564 |
+
โโโ ไฝ้ๆ ๅ.md โโโ recipes.md
|
| 565 |
+
โโโ ่ณ้ฃๆๅ.md โโโ preferences.md
|
| 566 |
+
โโโ DRIs.md โโโ memory.md
|
| 567 |
+
โ โ
|
| 568 |
+
โผ โผ
|
| 569 |
+
โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโโโโโโโโโ
|
| 570 |
+
โ nutrition_ โ โ family_manager.py โ
|
| 571 |
+
โ standards.py โ โ ่ฏปๅ/ๅๅ
ฅๅฎถๅบญไฟกๆฏ โ
|
| 572 |
+
โ ็ผ่ฏไธบ็ปๆๅๆฐๆฎ โ โโโโโโโโโโโโฌโโโโโโโโโโโโ
|
| 573 |
+
โโโโโโโโโโฌโโโโโโโโโโ โ
|
| 574 |
+
โ โ
|
| 575 |
+
โผ โผ
|
| 576 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 577 |
+
โ loop.py โ
|
| 578 |
+
โ LAUNCH โ FAMILY_QUIZ โ SUMMARIZE โ ANALYZE โ
|
| 579 |
+
โ โ BRIEF โ INTERACT โ CONSOLIDATE โ (THREE_DAY) โ
|
| 580 |
+
โ โ
|
| 581 |
+
โ ๆฏไธช้ถๆฎต่ฐ็จๅฏนๅบ Plugin โ
|
| 582 |
+
โ Plugin ่ฐ็จ modules/ ๅฑ็ๅฝๆฐ โ
|
| 583 |
+
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 584 |
+
โ
|
| 585 |
+
โผ
|
| 586 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 587 |
+
โ data/presets/ไปๆฅ็ฎๆฅ_YYYY-MM-DD.json โ
|
| 588 |
+
โ { โ
|
| 589 |
+
โ "date": "2026-06-08", โ
|
| 590 |
+
โ "weight_check": {"need_ask": true/false}, โ
|
| 591 |
+
โ "recipe_check": {"need_ask": true/false}, โ
|
| 592 |
+
โ "nutrient_focus": ["้", "้", "ๅถ้
ธ"], โ
|
| 593 |
+
โ "recommended_foods": ["่ ่", "็ฆ่", "่ฑ่
"],โ
|
| 594 |
+
โ "family_recipes_available": ["็ช่็่
ฉ",...], โ
|
| 595 |
+
โ "conversation_topics": ["ไปๅคฉๆณๅ้ฑผๅ๏ผ"], โ
|
| 596 |
+
โ "family_memory": "ๆจๅคฉไธๅคซ่ฏด...", โ
|
| 597 |
+
โ "thinking_keywords": "ๅๆ้ๆๅ
ฅ" โ
|
| 598 |
+
โ } โ
|
| 599 |
+
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 600 |
+
โ
|
| 601 |
+
โผ
|
| 602 |
+
โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 603 |
+
โ ui/app_builder.py (Gradio 4้กต้ข) โ
|
| 604 |
+
โ ้กต้ข1: ่ฏญ้ณไบคไบ (ๆพ็คบ thinking_keywords + ๆชๆญ) โ
|
| 605 |
+
โ ้กต้ข2: ๅฎถๅบญ้ฅฎ้ฃไน ๆฏ โ
|
| 606 |
+
โ ้กต้ข3: ไธๅคฉๆป็ป โ
|
| 607 |
+
โ ้กต้ข4: ่ฅๅ
ปๆฅๅ โ
|
| 608 |
+
โโโโโโโโโโโโโโโโโโโโโโโโฌโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
|
| 609 |
+
โ
|
| 610 |
+
โผ
|
| 611 |
+
modules/diet_extractor.py (ไปๅฏน่ฏไธญๆญฃๅๆๅ)
|
| 612 |
+
modules/family_manager.py (ๅๅ
ฅๅฎถๅบญไฟกๆฏ)
|
| 613 |
+
modules/diet_logger.py (่ฎฐๅฝ้ฅฎ้ฃ)
|
| 614 |
+
โ
|
| 615 |
+
โผ
|
| 616 |
+
ๆฌกๆฅ loop.py ๅๆฌกๅฏๅจ โ ๅพช็ฏ
|
| 617 |
```
|
| 618 |
|
| 619 |
+
> **ๆนๆณจ๏ผ** ________
|
| 620 |
|
| 621 |
---
|
| 622 |
|
| 623 |
+
## ไนใๆๆฏๆ ไธ่ง
|
| 624 |
+
|
| 625 |
+
| ๅฑ็บง | ๆๆฏ | ็จ้ |
|
| 626 |
+
|------|------|------|
|
| 627 |
+
| ๆ ธๅฟๆจกๅ | **MiniCPM-o 4.5**๏ผ็ปไธๅคๆจกๆๆจกๅ๏ผ | ๅ
จๅๅทฅๆจ็๏ผ่ง่ง+่ฏญ้ณ+ๆๆฌ+่ฏญ้ณ่พๅบ |
|
| 628 |
+
| ๅ็ซฏๆกๆถ | **Gradio 6.x** | Web ็้ข๏ผ4 ไธชๅญ้กต้ข |
|
| 629 |
+
| ๅฃฐ็บน่ฏๅซ | Whisper-medium encoder embedding๏ผไผๅ
๏ผ| ่ฏด่ฏไบบ่บซไปฝ่ฏๅซ |
|
| 630 |
+
| ้ข่ฐฑๆนๆก | NumPy + SoundFile๏ผๅค้ fallback๏ผ | ๅฃฐ็บน่ฏๅซๅ
ๅบ |
|
| 631 |
+
| ๆฐๆฎๅญๅจ | JSON + Markdown | ้ฅฎ้ฃ่ฎฐๅฝ + ๆฅๅๅญๆกฃ + ๆฏๆฅ็ฎๆฅ + ๅฎถๅบญไฟกๆฏ |
|
| 632 |
+
| ่ฅๅ
ปๆ ๅ | ไธไธช MD ๆไปถ๏ผๅทฒไธ่ฝฝ๏ผ+ ่ชๅ่งฃๆๅจ | ไฝ้ๆ ๅ/่ณ้ฃๆๅ/DRIs |
|
| 633 |
+
| ๅพช็ฏๅผๆ | ่ช็ ็ถๆๆบ + ๆไปถๆณจๅ | ๆฏๆฅ็ๅฝๅจๆ็ฎก็ |
|
| 634 |
+
| ๆฐๆฎๆๅ | ๆญฃๅ่กจ่พพๅผ๏ผsystem prompt ๆ ่ฎฐๆ ผๅผ๏ผ | ไปๅฏน่ฏไธญๆๅ็ปๆๅๆฐๆฎ |
|
| 635 |
+
| ้จ็ฝฒๅนณๅฐ | HuggingFace Spaces๏ผ็ฎๅ๏ผ+ Modal๏ผๅ็ปญ๏ผ | ไบ็ซฏ้จ็ฝฒ |
|
| 636 |
|
| 637 |
+
> **ๆนๆณจ๏ผ** ________
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 638 |
|
| 639 |
---
|
| 640 |
|
| 641 |
+
## ๅใๅพ
่ฎจ่ฎบ้ฎ้ขๆธ
ๅ
|
| 642 |
|
| 643 |
+
| # | ้ฎ้ข | ไฝ ็้ๆฉ / ๆ่ง |
|
| 644 |
+
|---|------|----------------|
|
| 645 |
+
| 1 | **Loop ่งฆๅๆถๆบ**๏ผๆฏๆ 00:00 ่ชๅจๆป็ป + ็จๅบๅฏๅจๆถๆฃๆฅ็ถๆไฝ๏ผๅทฒ้็บณ๏ผ | โ
ๅทฒ็กฎ่ฎค |
|
| 646 |
+
| 2 | **็ฎๆฅๆฟ่ฝฝๅฝขๅผ**๏ผJSON ๆไปถ `data/presets/` ่ฝ็๏ผๅทฒ้็บณ๏ผ | โ
ๅทฒ็กฎ่ฎค |
|
| 647 |
+
| 3 | **็ถๆไฝๆบๅถ**๏ผ`data/presets/.daily_status.json` ่ฎฐๅฝๆฏๆฅๅฎๆ็ถๆ | ________ |
|
| 648 |
+
| 4 | **ๅฎถๅบญไฟกๆฏๆไปถๆ ผๅผ**๏ผไธไธช md ๆไปถ๏ผrecipes.md / preferences.md / memory.md๏ผ | ________ |
|
| 649 |
+
| 5 | **system prompt ๆ ่ฎฐๆ ผๅผ**๏ผ`[EXTRACT_DIET]` / `[EXTRACT_RECIPE]` / `[THINKING]` ็ญ | ________ |
|
| 650 |
+
| 6 | **UI 4 ้กต้ข**๏ผ่ฏญ้ณไบคไบ / ๅฎถๅบญ้ฅฎ้ฃไน ๆฏ / ไธๅคฉๆป็ป / ่ฅๅ
ปๆฅๅ | ________ |
|
| 651 |
+
| 7 | **ไธๅคฉๆป็ป่งฆๅๆกไปถ**๏ผๆฏ่ช็ถๆฅ 00:00 ๆฃๆฅๆฏๅฆๆปก 3 ๅคฉ๏ผ่ฟๆฏๆฏ 3 ๆฌก CONSOLIDATE๏ผ | ________ |
|
| 652 |
+
| 8 | **่ฟๆไปไน้่ฆ่ฐๆด็๏ผ** | ________ |
|
| 653 |
|
| 654 |
---
|
| 655 |
|
| 656 |
+
*ๆๆกฃ็ๆๆถ้ด๏ผ2026-06-08 | v5 - ๆดๅๆนๆณจ๏ผ็ปๅๅฎ็ฐๆนๆก*
|
loop.py
ADDED
|
@@ -0,0 +1,291 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
PregoPal - ๆ ธๅฟๅพช็ฏๅผๆ
|
| 3 |
+
=======================
|
| 4 |
+
็ถๆๆบ้ฉฑๅจ็ๆฏๆฅ็ๅฝๅจๆ็ฎก็ใ
|
| 5 |
+
|
| 6 |
+
็ถๆๆต่ฝฌ๏ผ
|
| 7 |
+
LAUNCH โ FAMILY_QUIZ โ SUMMARIZE โ ANALYZE โ BRIEF โ INTERACT
|
| 8 |
+
โ CONSOLIDATE โ (THREE_DAY) โ DONE
|
| 9 |
+
|
| 10 |
+
็ถๆไฝๆบๅถ๏ผ
|
| 11 |
+
data/presets/.daily_status.json ่ฎฐๅฝๆฏๆฅๅฎๆ็ถๆ
|
| 12 |
+
"""
|
| 13 |
+
|
| 14 |
+
import json
|
| 15 |
+
import datetime
|
| 16 |
+
import asyncio
|
| 17 |
+
from enum import Enum
|
| 18 |
+
from pathlib import Path
|
| 19 |
+
from dataclasses import dataclass, field
|
| 20 |
+
|
| 21 |
+
from plugins.base import LoopPlugin, PluginResult, PluginRegistry, LoopStage, LoopContext
|
| 22 |
+
|
| 23 |
+
PRESETS_DIR = Path("data/presets")
|
| 24 |
+
STATUS_FILE = PRESETS_DIR / ".daily_status.json"
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
# ============================================================
|
| 28 |
+
# ็ถๆๆไธพ
|
| 29 |
+
# ============================================================
|
| 30 |
+
class LoopState(Enum):
|
| 31 |
+
LAUNCH = "launch" # ๅฏๅจๆฃๆฅ๏ผๆฃๆฅไปๆฅ็ถๆไฝ
|
| 32 |
+
FAMILY_QUIZ = "family_quiz" # ๅฎถๅบญ้ฎๅท๏ผๆฃๆฅๆฏๅฆ้่ฆ่ฏข้ฎ่่ฐฑ/ไฝ้
|
| 33 |
+
SUMMARIZE = "summarize" # ๆจๆฅๆป็ป๏ผๅๆๆจๆฅ้ฅฎ้ฃ/ไฝ้/ๅฎถๅบญ่ฎฐๅฟ
|
| 34 |
+
ANALYZE = "analyze" # ่ฅๅ
ปๅๆ๏ผๅฏนๆฏ DRIs
|
| 35 |
+
BRIEF = "brief" # ็ๆไปๆฅ็ฎๆฅ
|
| 36 |
+
INTERACT = "interact" # ็ฝๅคฉไบคไบๆจกๅผ๏ผ็ญๅพ
็จๆทๆไฝ๏ผ
|
| 37 |
+
THREE_DAY = "three_day" # ๆฏไธๅคฉ่ชๅจๆป็ป
|
| 38 |
+
CONSOLIDATE = "consolidate" # ๆ้ดๆด็
|
| 39 |
+
DONE = "done" # ๆ ่ฎฐไปๆฅๅฎๆ
|
| 40 |
+
|
| 41 |
+
|
| 42 |
+
# ============================================================
|
| 43 |
+
# ็ถๆ่ฝฌ็งป่กจ
|
| 44 |
+
# ============================================================
|
| 45 |
+
_TRANSITIONS = {
|
| 46 |
+
(LoopState.LAUNCH, "need_summary"): LoopState.FAMILY_QUIZ,
|
| 47 |
+
(LoopState.LAUNCH, "already_done"): LoopState.INTERACT,
|
| 48 |
+
(LoopState.FAMILY_QUIZ, "ok"): LoopState.SUMMARIZE,
|
| 49 |
+
(LoopState.SUMMARIZE, "ok"): LoopState.ANALYZE,
|
| 50 |
+
(LoopState.ANALYZE, "ok"): LoopState.BRIEF,
|
| 51 |
+
(LoopState.BRIEF, "ok"): LoopState.INTERACT,
|
| 52 |
+
(LoopState.INTERACT, "day_ended"): LoopState.CONSOLIDATE,
|
| 53 |
+
(LoopState.CONSOLIDATE, "need_3day"): LoopState.THREE_DAY,
|
| 54 |
+
(LoopState.CONSOLIDATE, "ok"): LoopState.DONE,
|
| 55 |
+
(LoopState.THREE_DAY, "ok"): LoopState.DONE,
|
| 56 |
+
}
|
| 57 |
+
|
| 58 |
+
|
| 59 |
+
# ============================================================
|
| 60 |
+
# ็ถๆไฝ็ฎก็
|
| 61 |
+
# ============================================================
|
| 62 |
+
class DailyStatus:
|
| 63 |
+
"""็ฎก็ๆฏๆฅ็ถๆไฝ"""
|
| 64 |
+
|
| 65 |
+
STATUS_FILE = STATUS_FILE
|
| 66 |
+
|
| 67 |
+
@staticmethod
|
| 68 |
+
def load() -> dict:
|
| 69 |
+
"""ๅ ่ฝฝ็ถๆไฝๆไปถ"""
|
| 70 |
+
if STATUS_FILE.exists():
|
| 71 |
+
with open(STATUS_FILE, 'r', encoding='utf-8') as f:
|
| 72 |
+
return json.load(f)
|
| 73 |
+
return {}
|
| 74 |
+
|
| 75 |
+
@staticmethod
|
| 76 |
+
def save(status: dict):
|
| 77 |
+
"""ไฟๅญ็ถๆไฝๆไปถ"""
|
| 78 |
+
PRESETS_DIR.mkdir(parents=True, exist_ok=True)
|
| 79 |
+
with open(STATUS_FILE, 'w', encoding='utf-8') as f:
|
| 80 |
+
json.dump(status, f, ensure_ascii=False, indent=2)
|
| 81 |
+
|
| 82 |
+
@staticmethod
|
| 83 |
+
def is_today_done() -> bool:
|
| 84 |
+
"""ๆฃๆฅไปๆฅๆฏๅฆๅทฒๅฎๆๆป็ป"""
|
| 85 |
+
today = datetime.date.today().isoformat()
|
| 86 |
+
status = DailyStatus.load()
|
| 87 |
+
return status.get(today, {}).get("summary_done", False)
|
| 88 |
+
|
| 89 |
+
@staticmethod
|
| 90 |
+
def mark_summary_done():
|
| 91 |
+
"""ๆ ่ฎฐไปๆฅๆป็ปๅฎๆ"""
|
| 92 |
+
today = datetime.date.today().isoformat()
|
| 93 |
+
status = DailyStatus.load()
|
| 94 |
+
status[today] = status.get(today, {})
|
| 95 |
+
status[today]["summary_done"] = True
|
| 96 |
+
status[today]["completed_at"] = datetime.datetime.now().isoformat()
|
| 97 |
+
DailyStatus.save(status)
|
| 98 |
+
|
| 99 |
+
@staticmethod
|
| 100 |
+
def mark_day_ended():
|
| 101 |
+
"""ๆ ่ฎฐไปๆฅ็ปๆ"""
|
| 102 |
+
today = datetime.date.today().isoformat()
|
| 103 |
+
status = DailyStatus.load()
|
| 104 |
+
status[today] = status.get(today, {})
|
| 105 |
+
status[today]["day_ended"] = True
|
| 106 |
+
status[today]["ended_at"] = datetime.datetime.now().isoformat()
|
| 107 |
+
DailyStatus.save(status)
|
| 108 |
+
|
| 109 |
+
@staticmethod
|
| 110 |
+
def get_last_summary_date() -> str | None:
|
| 111 |
+
"""่ทๅๆ่ฟไธๆฌกๆป็ป็ๆฅๆ"""
|
| 112 |
+
status = DailyStatus.load()
|
| 113 |
+
done_dates = [d for d, v in status.items() if v.get("summary_done")]
|
| 114 |
+
return max(done_dates) if done_dates else None
|
| 115 |
+
|
| 116 |
+
@staticmethod
|
| 117 |
+
def days_since_last_summary() -> int:
|
| 118 |
+
"""่ท็ฆปไธๆฌกๆป็ป็ๅคฉๆฐ"""
|
| 119 |
+
last = DailyStatus.get_last_summary_date()
|
| 120 |
+
if last is None:
|
| 121 |
+
return 999
|
| 122 |
+
last_date = datetime.date.fromisoformat(last)
|
| 123 |
+
return (datetime.date.today() - last_date).days
|
| 124 |
+
|
| 125 |
+
@staticmethod
|
| 126 |
+
def should_three_day_summary() -> bool:
|
| 127 |
+
"""ๆฃๆฅๆฏๅฆ้่ฆ่ฟ่กไธๅคฉๆป็ป"""
|
| 128 |
+
return DailyStatus.days_since_last_summary() >= 3
|
| 129 |
+
|
| 130 |
+
|
| 131 |
+
# ============================================================
|
| 132 |
+
# ไธปๅพช็ฏๅผๆ
|
| 133 |
+
# ============================================================
|
| 134 |
+
class PregoPalLoop:
|
| 135 |
+
"""ๆ ธๅฟๅพช็ฏๅผๆ"""
|
| 136 |
+
|
| 137 |
+
def __init__(self):
|
| 138 |
+
self.plugins = PluginRegistry()
|
| 139 |
+
self.state = LoopState.LAUNCH
|
| 140 |
+
self.context = LoopContext()
|
| 141 |
+
self._register_default_plugins()
|
| 142 |
+
|
| 143 |
+
def _register_default_plugins(self):
|
| 144 |
+
"""ๆณจๅ้ป่ฎคๆไปถ"""
|
| 145 |
+
from plugins.family_quiz import FamilyRecipeQuizPlugin, WeightQuizPlugin
|
| 146 |
+
from plugins.diet_summary import DietSummaryPlugin
|
| 147 |
+
from plugins.weight_check import WeightCheckPlugin
|
| 148 |
+
from plugins.family_memory import FamilyMemoryPlugin
|
| 149 |
+
from plugins.dri_analysis import DRIAnalysisPlugin
|
| 150 |
+
from plugins.briefing_generator import BriefingGeneratorPlugin
|
| 151 |
+
from plugins.three_day_summary import ThreeDaySummaryPlugin
|
| 152 |
+
from plugins.preset_writer import PresetWriterPlugin
|
| 153 |
+
|
| 154 |
+
self.plugins.register(FamilyRecipeQuizPlugin())
|
| 155 |
+
self.plugins.register(WeightQuizPlugin())
|
| 156 |
+
self.plugins.register(DietSummaryPlugin())
|
| 157 |
+
self.plugins.register(WeightCheckPlugin())
|
| 158 |
+
self.plugins.register(FamilyMemoryPlugin())
|
| 159 |
+
self.plugins.register(DRIAnalysisPlugin())
|
| 160 |
+
self.plugins.register(BriefingGeneratorPlugin())
|
| 161 |
+
self.plugins.register(ThreeDaySummaryPlugin())
|
| 162 |
+
self.plugins.register(PresetWriterPlugin())
|
| 163 |
+
|
| 164 |
+
async def run(self) -> None:
|
| 165 |
+
"""ไธปๅพช็ฏๅ
ฅๅฃ"""
|
| 166 |
+
while self.state is not LoopState.DONE:
|
| 167 |
+
handler_name = f"_state_{self.state.value}"
|
| 168 |
+
handler = getattr(self, handler_name)
|
| 169 |
+
event = await handler()
|
| 170 |
+
next_state = _TRANSITIONS.get((self.state, event))
|
| 171 |
+
if next_state is None:
|
| 172 |
+
raise RuntimeError(
|
| 173 |
+
f"No transition from {self.state} on '{event}'"
|
| 174 |
+
)
|
| 175 |
+
self.state = next_state
|
| 176 |
+
|
| 177 |
+
# ============================================================
|
| 178 |
+
# ็ถๆๅค็ๅจ
|
| 179 |
+
# ============================================================
|
| 180 |
+
|
| 181 |
+
async def _state_launch(self) -> str:
|
| 182 |
+
"""ๅฏๅจๆฃๆฅ๏ผๆฃๆฅไปๆฅ็ถๆไฝ"""
|
| 183 |
+
if DailyStatus.is_today_done():
|
| 184 |
+
return "already_done"
|
| 185 |
+
return "need_summary"
|
| 186 |
+
|
| 187 |
+
async def _state_family_quiz(self) -> str:
|
| 188 |
+
"""ๅฎถๅบญ้ฎๅท๏ผๆฃๆฅๆฏๅฆ้่ฆ่ฏข้ฎ่่ฐฑ/ไฝ้"""
|
| 189 |
+
for plugin in self.plugins.get_plugins(LoopStage.FAMILY_QUIZ):
|
| 190 |
+
result = await plugin.run(self.context)
|
| 191 |
+
if not result.success:
|
| 192 |
+
self.context.errors.append(result.message)
|
| 193 |
+
return "ok"
|
| 194 |
+
|
| 195 |
+
async def _state_summarize(self) -> str:
|
| 196 |
+
"""ๆจๆฅๆป็ป๏ผๆง่กๆๆ SUMMARIZE ้ถๆฎตๆไปถ"""
|
| 197 |
+
for plugin in self.plugins.get_plugins(LoopStage.SUMMARIZE):
|
| 198 |
+
result = await plugin.run(self.context)
|
| 199 |
+
if not result.success:
|
| 200 |
+
self.context.errors.append(result.message)
|
| 201 |
+
return "ok"
|
| 202 |
+
|
| 203 |
+
async def _state_analyze(self) -> str:
|
| 204 |
+
"""่ฅๅ
ปๅๆ๏ผๆง่กๆๆ ANALYZE ้ถๆฎตๆไปถ"""
|
| 205 |
+
for plugin in self.plugins.get_plugins(LoopStage.ANALYZE):
|
| 206 |
+
result = await plugin.run(self.context)
|
| 207 |
+
if not result.success:
|
| 208 |
+
self.context.errors.append(result.message)
|
| 209 |
+
return "ok"
|
| 210 |
+
|
| 211 |
+
async def _state_brief(self) -> str:
|
| 212 |
+
"""็ๆไปๆฅ็ฎๆฅ๏ผๆง่กๆๆ BRIEF ้ถๆฎตๆไปถ"""
|
| 213 |
+
for plugin in self.plugins.get_plugins(LoopStage.BRIEF):
|
| 214 |
+
result = await plugin.run(self.context)
|
| 215 |
+
if not result.success:
|
| 216 |
+
self.context.errors.append(result.message)
|
| 217 |
+
return "ok"
|
| 218 |
+
|
| 219 |
+
async def _state_interact(self) -> str:
|
| 220 |
+
"""
|
| 221 |
+
็ฝๅคฉไบคไบๆจกๅผ๏ผ็ญๅพ
็จๆทๆไฝ
|
| 222 |
+
ๆญค็ถๆ็ฑๅค้จไบไปถ่งฆๅ๏ผGradio ็้ขไบคไบ๏ผ
|
| 223 |
+
"""
|
| 224 |
+
return "day_ended"
|
| 225 |
+
|
| 226 |
+
async def _state_three_day(self) -> str:
|
| 227 |
+
"""ๆฏไธๅคฉๆป็ป๏ผๆง่กๆๆ THREE_DAY ้ถๆฎตๆไปถ"""
|
| 228 |
+
for plugin in self.plugins.get_plugins(LoopStage.THREE_DAY):
|
| 229 |
+
result = await plugin.run(self.context)
|
| 230 |
+
if not result.success:
|
| 231 |
+
self.context.errors.append(result.message)
|
| 232 |
+
return "ok"
|
| 233 |
+
|
| 234 |
+
async def _state_consolidate(self) -> str:
|
| 235 |
+
"""ๆ้ดๆด็๏ผๆง่กๆๆ CONSOLIDATE ้ถๆฎตๆไปถ"""
|
| 236 |
+
for plugin in self.plugins.get_plugins(LoopStage.CONSOLIDATE):
|
| 237 |
+
result = await plugin.run(self.context)
|
| 238 |
+
if not result.success:
|
| 239 |
+
self.context.errors.append(result.message)
|
| 240 |
+
|
| 241 |
+
if DailyStatus.should_three_day_summary():
|
| 242 |
+
return "need_3day"
|
| 243 |
+
return "ok"
|
| 244 |
+
|
| 245 |
+
async def _state_done(self) -> str:
|
| 246 |
+
"""ๆ ่ฎฐไปๆฅๅฎๆ"""
|
| 247 |
+
DailyStatus.mark_day_ended()
|
| 248 |
+
return "done_complete"
|
| 249 |
+
|
| 250 |
+
# ============================================================
|
| 251 |
+
# ๅค้จๆฅๅฃ
|
| 252 |
+
# ============================================================
|
| 253 |
+
|
| 254 |
+
def get_briefing(self) -> dict:
|
| 255 |
+
"""่ทๅไปๆฅ็ฎๆฅ"""
|
| 256 |
+
return self.context.briefing
|
| 257 |
+
|
| 258 |
+
def get_thinking_keywords(self) -> str:
|
| 259 |
+
"""่ทๅๅฝๅๆ่ๅ
ณ้ฎ่ฏ๏ผ็จไบ UI ๆพ็คบ๏ผ"""
|
| 260 |
+
return self.context.briefing.get("thinking_keywords", "")
|
| 261 |
+
|
| 262 |
+
def get_errors(self) -> list[str]:
|
| 263 |
+
"""่ท๏ฟฝ๏ฟฝ้่ฏฏๅ่กจ"""
|
| 264 |
+
return self.context.errors
|
| 265 |
+
|
| 266 |
+
def run_sync(self):
|
| 267 |
+
"""ๅๆญฅ่ฟ่ก๏ผ็จไบ้ๅผๆญฅ็ฏๅข๏ผ"""
|
| 268 |
+
asyncio.run(self.run())
|
| 269 |
+
|
| 270 |
+
|
| 271 |
+
# ============================================================
|
| 272 |
+
# ไพฟๆทๅฝๆฐ
|
| 273 |
+
# ============================================================
|
| 274 |
+
def run_daily_loop():
|
| 275 |
+
"""่ฟ่กๆฏๆฅๅพช็ฏ๏ผๅๆญฅๅ
ฅๅฃ๏ผ"""
|
| 276 |
+
loop = PregoPalLoop()
|
| 277 |
+
loop.run_sync()
|
| 278 |
+
return loop
|
| 279 |
+
|
| 280 |
+
|
| 281 |
+
def check_and_run_loop() -> PregoPalLoop:
|
| 282 |
+
"""
|
| 283 |
+
ๆฃๆฅๅนถ่ฟ่กๅพช็ฏ๏ผไพ Gradio ๅฏๅจๆถ่ฐ็จ๏ผ
|
| 284 |
+
|
| 285 |
+
ๅฆๆไปๆฅๅทฒๆป็ป๏ผ็ดๆฅ่ฟๅ loop ๅฎไพ๏ผไธๆง่กๆป็ปๆต็จ๏ผ
|
| 286 |
+
ๅฆๆไปๆฅๆชๆป็ป๏ผๆง่กๅฎๆดๆป็ปๆต็จ
|
| 287 |
+
"""
|
| 288 |
+
loop = PregoPalLoop()
|
| 289 |
+
if not DailyStatus.is_today_done():
|
| 290 |
+
loop.run_sync()
|
| 291 |
+
return loop
|
modules/__pycache__/__init__.cpython-313.pyc
ADDED
|
Binary file (309 Bytes). View file
|
|
|
modules/__pycache__/diet_extractor.cpython-311.pyc
ADDED
|
Binary file (12.2 kB). View file
|
|
|
modules/__pycache__/diet_extractor.cpython-313.pyc
ADDED
|
Binary file (11.5 kB). View file
|
|
|
modules/__pycache__/family_manager.cpython-311.pyc
ADDED
|
Binary file (20.7 kB). View file
|
|
|
modules/__pycache__/family_manager.cpython-313.pyc
ADDED
|
Binary file (17.9 kB). View file
|
|
|
modules/__pycache__/nutrition_standards.cpython-311.pyc
ADDED
|
Binary file (16 kB). View file
|
|
|
modules/__pycache__/nutrition_standards.cpython-313.pyc
ADDED
|
Binary file (14.6 kB). View file
|
|
|
modules/diet_extractor.py
ADDED
|
@@ -0,0 +1,274 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
PregoPal - ๅฏน่ฏๅ
ๅฎนๆๅๅจ
|
| 3 |
+
=========================
|
| 4 |
+
ไป AI ๅๅคไธญ้่ฟๆญฃๅ่กจ่พพๅผๆๅ็ปๆๅๆฐๆฎใ
|
| 5 |
+
|
| 6 |
+
ๆๅๆ ่ฎฐๆ ผๅผ๏ผๅจ system prompt ไธญๅ็ฅๆจกๅไฝฟ็จ๏ผ๏ผ
|
| 7 |
+
[EXTRACT_DIET]...[/EXTRACT_DIET] # ้ฅฎ้ฃ่ฎฐๅฝ
|
| 8 |
+
[EXTRACT_RECIPE]...[/EXTRACT_RECIPE] # ่่ฐฑไฟกๆฏ
|
| 9 |
+
[EXTRACT_PREFERENCE]...[/EXTRACT_PREFERENCE] # ๅๅฅฝ/ๅฟๅฃ/่ฟๆ
|
| 10 |
+
[EXTRACT_WEIGHT]...[/EXTRACT_WEIGHT] # ไฝ้่ฎฐๅฝ
|
| 11 |
+
[EXTRACT_MEMORY]...[/EXTRACT_MEMORY] # ๅฎถๅบญ่ฎฐๅฟ
|
| 12 |
+
[THINKING]...[/THINKING] # ๅฝๅๆ่ๆญฅ้ชค
|
| 13 |
+
"""
|
| 14 |
+
|
| 15 |
+
import re
|
| 16 |
+
import datetime
|
| 17 |
+
|
| 18 |
+
|
| 19 |
+
class DietExtractor:
|
| 20 |
+
"""ไป AI ๅๅคไธญๆๅๆๆ็ปๆๅๆฐๆฎ"""
|
| 21 |
+
|
| 22 |
+
# ============================================================
|
| 23 |
+
# ๆญฃๅๆจกๅผ
|
| 24 |
+
# ============================================================
|
| 25 |
+
DIET_PATTERN = re.compile(
|
| 26 |
+
r'\[EXTRACT_DIET\](.*?)\[/EXTRACT_DIET\]', re.DOTALL
|
| 27 |
+
)
|
| 28 |
+
RECIPE_PATTERN = re.compile(
|
| 29 |
+
r'\[EXTRACT_RECIPE\](.*?)\[/EXTRACT_RECIPE\]', re.DOTALL
|
| 30 |
+
)
|
| 31 |
+
PREFERENCE_PATTERN = re.compile(
|
| 32 |
+
r'\[EXTRACT_PREFERENCE\](.*?)\[/EXTRACT_PREFERENCE\]', re.DOTALL
|
| 33 |
+
)
|
| 34 |
+
WEIGHT_PATTERN = re.compile(
|
| 35 |
+
r'\[EXTRACT_WEIGHT\](.*?)\[/EXTRACT_WEIGHT\]', re.DOTALL
|
| 36 |
+
)
|
| 37 |
+
MEMORY_PATTERN = re.compile(
|
| 38 |
+
r'\[EXTRACT_MEMORY\](.*?)\[/EXTRACT_MEMORY\]', re.DOTALL
|
| 39 |
+
)
|
| 40 |
+
THINKING_PATTERN = re.compile(
|
| 41 |
+
r'\[THINKING\](.*?)\[/THINKING\]', re.DOTALL
|
| 42 |
+
)
|
| 43 |
+
|
| 44 |
+
# ============================================================
|
| 45 |
+
# ็ปไธๆๅๆฅๅฃ
|
| 46 |
+
# ============================================================
|
| 47 |
+
@staticmethod
|
| 48 |
+
def extract_all(text: str) -> dict:
|
| 49 |
+
"""ไปๆๆฌไธญๆๅๆๆ็ปๆๅๆฐๆฎ"""
|
| 50 |
+
return {
|
| 51 |
+
"diets": DietExtractor._parse_diets(text),
|
| 52 |
+
"recipes": DietExtractor._parse_recipes(text),
|
| 53 |
+
"preferences": DietExtractor._parse_preferences(text),
|
| 54 |
+
"weights": DietExtractor._parse_weights(text),
|
| 55 |
+
"memories": DietExtractor._parse_memories(text),
|
| 56 |
+
"thinking": DietExtractor._parse_thinking(text),
|
| 57 |
+
}
|
| 58 |
+
|
| 59 |
+
# ============================================================
|
| 60 |
+
# ๅ็ฑปๅ่งฃๆ
|
| 61 |
+
# ============================================================
|
| 62 |
+
@staticmethod
|
| 63 |
+
def _parse_block(text: str, pattern: re.Pattern) -> list[dict]:
|
| 64 |
+
"""้็จ่งฃๆๅ"""
|
| 65 |
+
results = []
|
| 66 |
+
for match in pattern.finditer(text):
|
| 67 |
+
block = match.group(1).strip()
|
| 68 |
+
entry = {}
|
| 69 |
+
for line in block.split('\n'):
|
| 70 |
+
line = line.strip()
|
| 71 |
+
if ':' in line:
|
| 72 |
+
key, val = line.split(':', 1)
|
| 73 |
+
entry[key.strip()] = val.strip()
|
| 74 |
+
if entry:
|
| 75 |
+
results.append(entry)
|
| 76 |
+
return results
|
| 77 |
+
|
| 78 |
+
@staticmethod
|
| 79 |
+
def _parse_diets(text: str) -> list[dict]:
|
| 80 |
+
"""่งฃๆ [EXTRACT_DIET] ๅ"""
|
| 81 |
+
results = []
|
| 82 |
+
for match in DietExtractor.DIET_PATTERN.finditer(text):
|
| 83 |
+
block = match.group(1).strip()
|
| 84 |
+
entry = {"meals": {}}
|
| 85 |
+
for line in block.split('\n'):
|
| 86 |
+
line = line.strip()
|
| 87 |
+
if not line or ':' not in line:
|
| 88 |
+
continue
|
| 89 |
+
key, val = line.split(':', 1)
|
| 90 |
+
key = key.strip()
|
| 91 |
+
val = val.strip()
|
| 92 |
+
if key in ('ๆฅๆ', '่ฎฐๅฝไบบ', 'ๅคๆณจ'):
|
| 93 |
+
entry[key] = val
|
| 94 |
+
elif key in ('ๆฉ้ค', 'ๅ้ค', 'ๆ้ค', 'ๅ ้ค'):
|
| 95 |
+
if val:
|
| 96 |
+
entry["meals"][key] = val
|
| 97 |
+
if entry.get("meals"):
|
| 98 |
+
results.append(entry)
|
| 99 |
+
return results
|
| 100 |
+
|
| 101 |
+
@staticmethod
|
| 102 |
+
def _parse_recipes(text: str) -> list[dict]:
|
| 103 |
+
"""่งฃๆ [EXTRACT_RECIPE] ๅ"""
|
| 104 |
+
return DietExtractor._parse_block(text, DietExtractor.RECIPE_PATTERN)
|
| 105 |
+
|
| 106 |
+
@staticmethod
|
| 107 |
+
def _parse_preferences(text: str) -> list[dict]:
|
| 108 |
+
"""่งฃๆ [EXTRACT_PREFERENCE] ๅ"""
|
| 109 |
+
return DietExtractor._parse_block(text, DietExtractor.PREFERENCE_PATTERN)
|
| 110 |
+
|
| 111 |
+
@staticmethod
|
| 112 |
+
def _parse_weights(text: str) -> list[dict]:
|
| 113 |
+
"""่งฃๆ [EXTRACT_WEIGHT] ๅ"""
|
| 114 |
+
return DietExtractor._parse_block(text, DietExtractor.WEIGHT_PATTERN)
|
| 115 |
+
|
| 116 |
+
@staticmethod
|
| 117 |
+
def _parse_memories(text: str) -> list[dict]:
|
| 118 |
+
"""่งฃๆ [EXTRACT_MEMORY] ๅ"""
|
| 119 |
+
return DietExtractor._parse_block(text, DietExtractor.MEMORY_PATTERN)
|
| 120 |
+
|
| 121 |
+
@staticmethod
|
| 122 |
+
def _parse_thinking(text: str) -> dict | None:
|
| 123 |
+
"""่งฃๆ [THINKING] ๅ๏ผๅชๅ็ฌฌไธไธช๏ผ"""
|
| 124 |
+
match = DietExtractor.THINKING_PATTERN.search(text)
|
| 125 |
+
if not match:
|
| 126 |
+
return None
|
| 127 |
+
block = match.group(1).strip()
|
| 128 |
+
result = {}
|
| 129 |
+
for line in block.split('\n'):
|
| 130 |
+
line = line.strip()
|
| 131 |
+
if ':' in line:
|
| 132 |
+
key, val = line.split(':', 1)
|
| 133 |
+
result[key.strip()] = val.strip()
|
| 134 |
+
return result if result else None
|
| 135 |
+
|
| 136 |
+
# ============================================================
|
| 137 |
+
# Fallback ๅ
ณ้ฎ่ฏๅน้
๏ผๅฝๆญฃๅๅคฑ่ดฅๆถไฝฟ็จ๏ผ
|
| 138 |
+
# ============================================================
|
| 139 |
+
@staticmethod
|
| 140 |
+
def fallback_extract_diet(text: str) -> dict | None:
|
| 141 |
+
"""
|
| 142 |
+
ๅฝ [EXTRACT_DIET] ๆ ผๅผไธๅฎๆดๆถ๏ผ็จๅ
ณ้ฎ่ฏๅน้
ๅฐ่ฏๆๅ
|
| 143 |
+
|
| 144 |
+
ๅน้
ๆจกๅผ๏ผ
|
| 145 |
+
- "ๅไบ" โ ่ฎฐๅฝ้ฃ็ฉ
|
| 146 |
+
- "ๆณๅ" โ ่ฎฐๅฝๆฟๆ
|
| 147 |
+
- "่ฎฐๅฝ" โ ่ฎฐๅฝๅ
ๅฎน
|
| 148 |
+
"""
|
| 149 |
+
result = {"meals": {}, "notes": ""}
|
| 150 |
+
|
| 151 |
+
# ๅฐ่ฏๅน้
"ๅไบ" ๆจกๅผ
|
| 152 |
+
eat_patterns = [
|
| 153 |
+
r'(ๆฉ้ค|ๅ้ค|ๆ้ค|ๅ ้ค).{0,5}(?:ๅไบ|ๅ็|ๅ็ๆฏ|ๆณๅ)(.{1,50})',
|
| 154 |
+
r'(?:ๅไบ|ๅ็|ๅ็ๆฏ|ๆณๅ).{0,5}(ๆฉ้ค|ๅ้ค|ๆ้ค|ๅ ้ค)(.{1,50})',
|
| 155 |
+
]
|
| 156 |
+
for pattern in eat_patterns:
|
| 157 |
+
for match in re.finditer(pattern, text):
|
| 158 |
+
meal_time = match.group(1)
|
| 159 |
+
food = match.group(2).strip()
|
| 160 |
+
if meal_time in ('ๆฉ้ค', 'ๅ้ค', 'ๆ้ค', 'ๅ ้ค') and food:
|
| 161 |
+
result["meals"][meal_time] = food
|
| 162 |
+
|
| 163 |
+
# ๅฐ่ฏๅน้
"่ฎฐๅฝ" ๆจกๅผ
|
| 164 |
+
record_match = re.search(r'่ฎฐๅฝ[ไบ:๏ผ]?\s*(.{1,100})', text)
|
| 165 |
+
if record_match:
|
| 166 |
+
result["notes"] = record_match.group(1).strip()
|
| 167 |
+
|
| 168 |
+
return result if result["meals"] else None
|
| 169 |
+
|
| 170 |
+
@staticmethod
|
| 171 |
+
def fallback_extract_thinking(text: str) -> dict | None:
|
| 172 |
+
"""
|
| 173 |
+
ๅฝ [THINKING] ๆ ผๅผไธๅฎๆดๆถ๏ผ็จๅ
ณ้ฎ่ฏๅน้
ๅฐ่ฏๆๅ
|
| 174 |
+
"""
|
| 175 |
+
result = {}
|
| 176 |
+
step_match = re.search(r'(?:ๅฝๅๆญฅ้ชค|ๆญฃๅจ|ๅฝๅ).{0,5}(.{5,30})', text)
|
| 177 |
+
if step_match:
|
| 178 |
+
result["ๅฝๅๆญฅ้ชค"] = step_match.group(1).strip()
|
| 179 |
+
next_match = re.search(r'(?:ไธไธๆญฅ|ๆฅไธๆฅ|็ถๅ).{0,5}(.{5,30})', text)
|
| 180 |
+
if next_match:
|
| 181 |
+
result["ไธไธๆญฅ"] = next_match.group(1).strip()
|
| 182 |
+
return result if result else None
|
| 183 |
+
|
| 184 |
+
# ============================================================
|
| 185 |
+
# ็ปผๅๆๅ๏ผๆญฃๅไผๅ
+ fallback๏ผ
|
| 186 |
+
# ============================================================
|
| 187 |
+
@staticmethod
|
| 188 |
+
def robust_extract(text: str) -> dict:
|
| 189 |
+
"""็ปผๅๆๅ๏ผๅ
็จๆญฃๅ๏ผๅคฑ่ดฅๆถ็จ fallback"""
|
| 190 |
+
result = DietExtractor.extract_all(text)
|
| 191 |
+
|
| 192 |
+
# ๅฆๆๆญฃๅๆฒกๆๅๅฐ้ฅฎ้ฃ๏ผๅฐ่ฏ fallback
|
| 193 |
+
if not result["diets"]:
|
| 194 |
+
fallback = DietExtractor.fallback_extract_diet(text)
|
| 195 |
+
if fallback:
|
| 196 |
+
result["diets"] = [fallback]
|
| 197 |
+
|
| 198 |
+
# ๅฆๆๆญฃๅๆฒกๆๅๅฐ thinking๏ผๅฐ่ฏ fallback
|
| 199 |
+
if not result["thinking"]:
|
| 200 |
+
fallback = DietExtractor.fallback_extract_thinking(text)
|
| 201 |
+
if fallback:
|
| 202 |
+
result["thinking"] = fallback
|
| 203 |
+
|
| 204 |
+
return result
|
| 205 |
+
|
| 206 |
+
|
| 207 |
+
# ============================================================
|
| 208 |
+
# System Prompt ๆจกๆฟ๏ผๅ็ฅๆจกๅไฝฟ็จๆ ่ฎฐๆ ผๅผ๏ผ
|
| 209 |
+
# ============================================================
|
| 210 |
+
EXTRACT_SYSTEM_PROMPT = """
|
| 211 |
+
## ๆฐๆฎ่ฎฐๅฝๆ ผๅผ
|
| 212 |
+
|
| 213 |
+
ๅฝๅฏน่ฏไธญๅบ็ฐไปฅไธๆ
ๅตๆถ๏ผ่ฏทไฝฟ็จ็นๅฎๆ ่ฎฐๅ
่ฃน็ปๆๅๆฐๆฎ๏ผ
|
| 214 |
+
|
| 215 |
+
### 1. ่ฎฐๅฝ้ฅฎ้ฃ
|
| 216 |
+
ๅฝๅญๅฆๆๅฎถไบบๆๅฐๅไบไปไนใๆณๅไปไนๆถ๏ผ่พๅบ๏ผ
|
| 217 |
+
[EXTRACT_DIET]
|
| 218 |
+
ๆฅๆ: {date}
|
| 219 |
+
้คๆฌก: ๆฉ้ค/ๅ้ค/ๆ้ค/ๅ ้ค
|
| 220 |
+
้ฃ็ฉ: ๅ
ทไฝ้ฃ็ฉๅ็งฐ
|
| 221 |
+
ไปฝ้: ๅคงๆฆไปฝ้
|
| 222 |
+
่ฎฐๅฝไบบ: ่ฏด่ฏไบบ่บซไปฝ
|
| 223 |
+
ๅคๆณจ: ๅญๅฆ่ฏดๆณๅ/ๅญๅฆๅไบ/ๅฎถไบบ่ฏดๅญๅฆๆณๅ
|
| 224 |
+
[/EXTRACT_DIET]
|
| 225 |
+
|
| 226 |
+
### 2. ่ฎฐๅฝ่่ฐฑ
|
| 227 |
+
ๅฝๅฎถไบบๆๅฐไผๅไปไน่ๆถ๏ผ่พๅบ๏ผ
|
| 228 |
+
[EXTRACT_RECIPE]
|
| 229 |
+
่ๅ: ่ๅ
|
| 230 |
+
ๅถไฝไบบ: ่ฐๅ็
|
| 231 |
+
้พๅบฆ: ็ฎๅ/ไธญ็ญ/ๅฐ้พ
|
| 232 |
+
้ฃๆ: ไธป่ฆ้ฃๆ
|
| 233 |
+
ๅคๆณจ: ๅญๅฆ็ฑๅ/ๅฎถไบบ็ฑๅ
|
| 234 |
+
[/EXTRACT_RECIPE]
|
| 235 |
+
|
| 236 |
+
### 3. ่ฎฐๅฝๅๅฅฝ/ๅฟๅฃ/่ฟๆ
|
| 237 |
+
ๅฝๆๅฐ้ฅฎ้ฃๅๅฅฝใๅฟๅฃๆ่ฟๆๆถ๏ผ่พๅบ๏ผ
|
| 238 |
+
[EXTRACT_PREFERENCE]
|
| 239 |
+
ไบบๅ: ๅงๅ
|
| 240 |
+
็ฑปๅ: ๅๅฅฝ/ๅฟๅฃ/่ฟๆ
|
| 241 |
+
ๅ
ๅฎน: ๅ
ทไฝๅ
ๅฎน
|
| 242 |
+
[/EXTRACT_PREFERENCE]
|
| 243 |
+
|
| 244 |
+
### 4. ่ฎฐๅฝไฝ้
|
| 245 |
+
ๅฝๅญๅฆๆๅฐไฝ้ๆถ๏ผ่พๅบ๏ผ
|
| 246 |
+
[EXTRACT_WEIGHT]
|
| 247 |
+
ๆฅๆ: {date}
|
| 248 |
+
ไฝ้: ๆฐๅผ(kg)
|
| 249 |
+
่ฎฐๅฝไบบ: ่ฏด่ฏไบบ่บซไปฝ
|
| 250 |
+
[/EXTRACT_WEIGHT]
|
| 251 |
+
|
| 252 |
+
### 5. ่ฎฐๅฝๅฎถๅบญ่ฎฐๅฟ
|
| 253 |
+
ๅฝๆๅฐๅฎถๅบญๅ
ณ็ณปๆ้่ฆไบไปถๆถ๏ผ่พๅบ๏ผ
|
| 254 |
+
[EXTRACT_MEMORY]
|
| 255 |
+
็ฑปๅ: ๅ
ณ็ณป/ไบไปถ/ๆฅๅธธ
|
| 256 |
+
ๅ
ๅฎน: ๅ
ทไฝๅ
ๅฎน
|
| 257 |
+
[/EXTRACT_MEMORY]
|
| 258 |
+
|
| 259 |
+
### 6. ๆพ็คบๅฝๅๆ่
|
| 260 |
+
ๆฏๆฌกๆง่กไธไธๆญฅๆไฝๆถ๏ผ่พๅบ๏ผ
|
| 261 |
+
[THINKING]
|
| 262 |
+
ๅฝๅๆญฅ้ชค: ๆญฃๅจๅไปไน
|
| 263 |
+
ไธไธๆญฅ: ๆฅไธๆฅ่ฆๅไปไน
|
| 264 |
+
[/THINKING]
|
| 265 |
+
|
| 266 |
+
ๆณจๆ๏ผๆ ่ฎฐๅๅฏไปฅๅบ็ฐๅจๅๅค็ไปปไฝไฝ็ฝฎ๏ผไธๅฝฑๅๆญฃๅธธๅฏน่ฏๅ
ๅฎนใ
|
| 267 |
+
"""
|
| 268 |
+
|
| 269 |
+
|
| 270 |
+
def get_extract_prompt(date_str: str = None) -> str:
|
| 271 |
+
"""่ทๅๅธฆๆฅๆ็ๆๅๆ็คบ่ฏ"""
|
| 272 |
+
if date_str is None:
|
| 273 |
+
date_str = datetime.date.today().isoformat()
|
| 274 |
+
return EXTRACT_SYSTEM_PROMPT.format(date=date_str)
|
modules/family_manager.py
ADDED
|
@@ -0,0 +1,320 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
PregoPal - ๅฎถๅบญไฟกๆฏ็ฎก็
|
| 3 |
+
=======================
|
| 4 |
+
็ฎก็ๅฎถๅบญ่่ฐฑใ้ฅฎ้ฃๅๅฅฝ/ๅฟๅฃ/่ฟๆใๅฎถๅบญ่ฎฐๅฟ๏ผๅ
ณ็ณป/ไบไปถ๏ผใ
|
| 5 |
+
|
| 6 |
+
ๆฐๆฎๆไปถ๏ผ
|
| 7 |
+
data/family/
|
| 8 |
+
โโโ recipes.md # ๅฎถๅบญ่่ฐฑ๏ผๅฎถไบบไผๅ็่๏ผ
|
| 9 |
+
โโโ preferences.md # ้ฅฎ้ฃๅๅฅฝ/ๅฟๅฃ/่ฟๆ
|
| 10 |
+
โโโ memory.md # ๅฎถๅบญ่ฎฐๅฟ๏ผๅ
ณ็ณป/ไบไปถ๏ผ
|
| 11 |
+
"""
|
| 12 |
+
|
| 13 |
+
import datetime
|
| 14 |
+
import re
|
| 15 |
+
from pathlib import Path
|
| 16 |
+
|
| 17 |
+
FAMILY_DIR = Path("data/family")
|
| 18 |
+
|
| 19 |
+
|
| 20 |
+
# ============================================================
|
| 21 |
+
# ็กฎไฟ็ฎๅฝๅญๅจ
|
| 22 |
+
# ============================================================
|
| 23 |
+
def ensure_family_dir():
|
| 24 |
+
FAMILY_DIR.mkdir(parents=True, exist_ok=True)
|
| 25 |
+
|
| 26 |
+
|
| 27 |
+
# ============================================================
|
| 28 |
+
# 1. ๅฎถๅบญ่่ฐฑ็ฎก็
|
| 29 |
+
# ============================================================
|
| 30 |
+
class RecipeManager:
|
| 31 |
+
"""็ฎก็ๅฎถๅบญ่่ฐฑ๏ผๅฎถไบบไผๅ็่๏ผ"""
|
| 32 |
+
|
| 33 |
+
RECIPES_FILE = FAMILY_DIR / "recipes.md"
|
| 34 |
+
|
| 35 |
+
@classmethod
|
| 36 |
+
def ensure_file(cls):
|
| 37 |
+
ensure_family_dir()
|
| 38 |
+
if not cls.RECIPES_FILE.exists():
|
| 39 |
+
with open(cls.RECIPES_FILE, 'w', encoding='utf-8') as f:
|
| 40 |
+
f.write("# ๅฎถๅบญ่่ฐฑ\n\n> ่ฎฐๅฝๅฎถไบบไผๅ็่ใ\n\n## ่่ฐฑๅ่กจ\n\n")
|
| 41 |
+
|
| 42 |
+
@classmethod
|
| 43 |
+
def load_all(cls) -> list[dict]:
|
| 44 |
+
"""่ฏปๅๆๆ่่ฐฑ"""
|
| 45 |
+
cls.ensure_file()
|
| 46 |
+
content = cls.RECIPES_FILE.read_text(encoding='utf-8')
|
| 47 |
+
recipes = []
|
| 48 |
+
blocks = re.split(r'\n### ', content)[1:]
|
| 49 |
+
for block in blocks:
|
| 50 |
+
lines = block.strip().split('\n')
|
| 51 |
+
name = lines[0].strip()
|
| 52 |
+
if not name or name.startswith('<!--'):
|
| 53 |
+
continue
|
| 54 |
+
recipe = {"name": name, "cook": "", "difficulty": "", "ingredients": "", "notes": ""}
|
| 55 |
+
for line in lines[1:]:
|
| 56 |
+
line = line.strip()
|
| 57 |
+
if line.startswith('- **ๅถไฝไบบ**'):
|
| 58 |
+
recipe["cook"] = line.split(':', 1)[-1].strip()
|
| 59 |
+
elif line.startswith('- **้พๅบฆ**'):
|
| 60 |
+
recipe["difficulty"] = line.split(':', 1)[-1].strip()
|
| 61 |
+
elif line.startswith('- **้ฃๆ**'):
|
| 62 |
+
recipe["ingredients"] = line.split(':', 1)[-1].strip()
|
| 63 |
+
elif line.startswith('- **ๅคๆณจ**'):
|
| 64 |
+
recipe["notes"] = line.split(':', 1)[-1].strip()
|
| 65 |
+
if name:
|
| 66 |
+
recipes.append(recipe)
|
| 67 |
+
return recipes
|
| 68 |
+
|
| 69 |
+
@classmethod
|
| 70 |
+
def add_recipe(cls, name: str, cook: str = "", difficulty: str = "",
|
| 71 |
+
ingredients: str = "", notes: str = "") -> str:
|
| 72 |
+
"""ๆทปๅ ไธ้่่ฐฑ"""
|
| 73 |
+
cls.ensure_file()
|
| 74 |
+
existing = cls.load_all()
|
| 75 |
+
if any(r["name"] == name for r in existing):
|
| 76 |
+
return "[WARN] ่่ฐฑๅทฒๅญๅจ: " + name
|
| 77 |
+
|
| 78 |
+
entry = f"""
|
| 79 |
+
### {name}
|
| 80 |
+
- **ๅถไฝไบบ**: {cook}
|
| 81 |
+
- **้พๅบฆ**: {difficulty}
|
| 82 |
+
- **้ฃๆ**: {ingredients}
|
| 83 |
+
- **ๅคๆณจ**: {notes}
|
| 84 |
+
"""
|
| 85 |
+
with open(cls.RECIPES_FILE, 'a', encoding='utf-8') as f:
|
| 86 |
+
f.write(entry)
|
| 87 |
+
return "[OK] ๅทฒๆทปๅ ่่ฐฑ: " + name
|
| 88 |
+
|
| 89 |
+
@classmethod
|
| 90 |
+
def format_for_prompt(cls) -> str:
|
| 91 |
+
"""ๆ ผๅผๅไธบ system prompt ๅฏ็จ็ๆๆฌ"""
|
| 92 |
+
recipes = cls.load_all()
|
| 93 |
+
if not recipes:
|
| 94 |
+
return "ใๅฎถๅบญ่่ฐฑใๆๆ ่ฎฐๅฝ๏ผ่ฏทไธปๅจ่ฏข้ฎๅฎถไบบไผๅไปไน่ใ"
|
| 95 |
+
lines = ["ใๅฎถๅบญ่่ฐฑใ"]
|
| 96 |
+
for r in recipes:
|
| 97 |
+
lines.append(f" - {r['name']}๏ผ{r['cook']}ไผๅ๏ผ")
|
| 98 |
+
return "\n".join(lines)
|
| 99 |
+
|
| 100 |
+
@classmethod
|
| 101 |
+
def get_names(cls) -> list[str]:
|
| 102 |
+
"""่ทๅๆๆ่ๅ"""
|
| 103 |
+
return [r["name"] for r in cls.load_all()]
|
| 104 |
+
|
| 105 |
+
|
| 106 |
+
# ============================================================
|
| 107 |
+
# 2. ้ฅฎ้ฃๅๅฅฝ็ฎก็
|
| 108 |
+
# ============================================================
|
| 109 |
+
class PreferenceManager:
|
| 110 |
+
"""็ฎก็ๆๆๅฎถๅบญๆๅ็้ฅฎ้ฃๅๅฅฝใๅฟๅฃใ่ฟๆ"""
|
| 111 |
+
|
| 112 |
+
PREFERENCES_FILE = FAMILY_DIR / "preferences.md"
|
| 113 |
+
|
| 114 |
+
@classmethod
|
| 115 |
+
def ensure_file(cls):
|
| 116 |
+
ensure_family_dir()
|
| 117 |
+
if not cls.PREFERENCES_FILE.exists():
|
| 118 |
+
with open(cls.PREFERENCES_FILE, 'w', encoding='utf-8') as f:
|
| 119 |
+
f.write("# ๅฎถๅบญๆๅ้ฅฎ้ฃๅๅฅฝ\n\n> ่ฎฐๅฝๆๆๅฎถไบบ็้ฅฎ้ฃๅๅฅฝใๅฟๅฃใ่ฟๆไฟกๆฏใ\n\n## ๆๅๅ่กจ\n\n")
|
| 120 |
+
|
| 121 |
+
@classmethod
|
| 122 |
+
def load_all(cls) -> list[dict]:
|
| 123 |
+
"""่ฏปๅๆๆๆๅๅๅฅฝ"""
|
| 124 |
+
cls.ensure_file()
|
| 125 |
+
content = cls.PREFERENCES_FILE.read_text(encoding='utf-8')
|
| 126 |
+
members = []
|
| 127 |
+
blocks = re.split(r'\n### ๆๅ[๏ผ:]', content)[1:]
|
| 128 |
+
for block in blocks:
|
| 129 |
+
lines = block.strip().split('\n')
|
| 130 |
+
name_line = lines[0].strip()
|
| 131 |
+
if not name_line or name_line.startswith('<!--'):
|
| 132 |
+
continue
|
| 133 |
+
# ๆๅ็บฏๅ็งฐ๏ผๅปๆๆฌๅทไธญ็่ง่ฒไฟกๆฏ๏ผ
|
| 134 |
+
clean_name = name_line.split('๏ผ')[0].strip() if '๏ผ' in name_line else name_line
|
| 135 |
+
member = {"name": clean_name, "role": "", "preferences": "", "avoid": "", "allergies": "", "notes": ""}
|
| 136 |
+
for line in lines[1:]:
|
| 137 |
+
line = line.strip()
|
| 138 |
+
if line.startswith('- **ๅๅฅฝ**'):
|
| 139 |
+
member["preferences"] = line.split(':', 1)[-1].strip()
|
| 140 |
+
elif line.startswith('- **ๅฟๅฃ**'):
|
| 141 |
+
member["avoid"] = line.split(':', 1)[-1].strip()
|
| 142 |
+
elif line.startswith('- **่ฟๆ**'):
|
| 143 |
+
member["allergies"] = line.split(':', 1)[-1].strip()
|
| 144 |
+
elif line.startswith('- **ๅคๆณจ**'):
|
| 145 |
+
member["notes"] = line.split(':', 1)[-1].strip()
|
| 146 |
+
if clean_name:
|
| 147 |
+
members.append(member)
|
| 148 |
+
return members
|
| 149 |
+
|
| 150 |
+
@classmethod
|
| 151 |
+
def add_member(cls, name: str, role: str = "", preferences: str = "",
|
| 152 |
+
avoid: str = "", allergies: str = "", notes: str = "") -> str:
|
| 153 |
+
"""ๆทปๅ ๆๆดๆฐๆๅๅๅฅฝ"""
|
| 154 |
+
cls.ensure_file()
|
| 155 |
+
existing = cls.load_all()
|
| 156 |
+
remaining = [m for m in existing if m["name"] != name]
|
| 157 |
+
|
| 158 |
+
content = "# ๅฎถๅบญๆๅ้ฅฎ้ฃๅๅฅฝ\n\n> ่ฎฐๅฝๆๆๅฎถไบบ็้ฅฎ้ฃๅๅฅฝใๅฟๅฃใ่ฟๆไฟกๆฏใ\n\n## ๆๅๅ่กจ\n\n"
|
| 159 |
+
for m in remaining:
|
| 160 |
+
role_str = f"๏ผ{m['role']}๏ผ" if m['role'] else ""
|
| 161 |
+
content += f"""### ๆๅ๏ผ{m['name']}{role_str}
|
| 162 |
+
- **ๅๅฅฝ**: {m['preferences']}
|
| 163 |
+
- **ๅฟๅฃ**: {m['avoid']}
|
| 164 |
+
- **่ฟๆ**: {m['allergies']}
|
| 165 |
+
- **ๅคๆณจ**: {m['notes']}
|
| 166 |
+
|
| 167 |
+
"""
|
| 168 |
+
role_str = f"๏ผ{role}๏ผ" if role else ""
|
| 169 |
+
content += f"""### ๆๅ๏ผ{name}{role_str}
|
| 170 |
+
- **ๅๅฅฝ**: {preferences}
|
| 171 |
+
- **ๅฟๅฃ**: {avoid}
|
| 172 |
+
- **่ฟๆ**: {allergies}
|
| 173 |
+
- **ๅคๆณจ**: {notes}
|
| 174 |
+
|
| 175 |
+
"""
|
| 176 |
+
with open(cls.PREFERENCES_FILE, 'w', encoding='utf-8') as f:
|
| 177 |
+
f.write(content)
|
| 178 |
+
return "[OK] ๅทฒไฟๅญ " + role + " - " + name + " ็้ฅฎ้ฃๅๅฅฝ"
|
| 179 |
+
|
| 180 |
+
@classmethod
|
| 181 |
+
def format_for_prompt(cls) -> str:
|
| 182 |
+
"""ๆ ผๅผๅไธบ system prompt ๅฏ็จ็ๆๆฌ"""
|
| 183 |
+
members = cls.load_all()
|
| 184 |
+
if not members:
|
| 185 |
+
return "ใๅฎถๅบญๆๅ้ฅฎ้ฃๅๅฅฝใๆๆ ่ฎฐๅฝใ"
|
| 186 |
+
lines = ["ใๅฎถๅบญๆๅ้ฅฎ้ฃๅๅฅฝใ"]
|
| 187 |
+
for m in members:
|
| 188 |
+
parts = [f" - {m['name']}๏ผ{m['role']}๏ผ"]
|
| 189 |
+
if m['preferences']:
|
| 190 |
+
parts.append(f"ๅๅฅฝ: {m['preferences']}")
|
| 191 |
+
if m['avoid']:
|
| 192 |
+
parts.append(f"ๅฟๅฃ: {m['avoid']}")
|
| 193 |
+
if m['allergies']:
|
| 194 |
+
parts.append(f"่ฟๆ: {m['allergies']}")
|
| 195 |
+
lines.append(" | ".join(parts))
|
| 196 |
+
return "\n".join(lines)
|
| 197 |
+
|
| 198 |
+
|
| 199 |
+
# ============================================================
|
| 200 |
+
# 3. ๅฎถๅบญ่ฎฐๅฟ็ฎก็
|
| 201 |
+
# ============================================================
|
| 202 |
+
class MemoryManager:
|
| 203 |
+
"""็ฎก็ๅฎถๅบญ่ฎฐๅฟ๏ผๅ
ณ็ณปใไบไปถใๆฅๅธธ๏ผ"""
|
| 204 |
+
|
| 205 |
+
MEMORY_FILE = FAMILY_DIR / "memory.md"
|
| 206 |
+
|
| 207 |
+
@classmethod
|
| 208 |
+
def ensure_file(cls):
|
| 209 |
+
ensure_family_dir()
|
| 210 |
+
if not cls.MEMORY_FILE.exists():
|
| 211 |
+
with open(cls.MEMORY_FILE, 'w', encoding='utf-8') as f:
|
| 212 |
+
f.write("# ๅฎถๅบญ่ฎฐๅฟ\n\n> ่ฎฐๅฝๅฎถๅบญๅ
ณ็ณปใ้่ฆไบไปถใๆฅๅธธ็นๆปดใ\n\n## ๅฎถๅบญๅ
ณ็ณป\n\n## ้่ฆไบไปถ\n\n## ๆฅๅธธ่ฎฐๅฝ\n\n")
|
| 213 |
+
|
| 214 |
+
@classmethod
|
| 215 |
+
def load_all(cls) -> dict:
|
| 216 |
+
"""่ฏปๅๆๆๅฎถๅบญ่ฎฐๅฟ"""
|
| 217 |
+
cls.ensure_file()
|
| 218 |
+
content = cls.MEMORY_FILE.read_text(encoding='utf-8')
|
| 219 |
+
sections = re.split(r'\n## ', content)
|
| 220 |
+
|
| 221 |
+
result = {"relationships": [], "events": [], "daily": []}
|
| 222 |
+
|
| 223 |
+
for section in sections:
|
| 224 |
+
if section.startswith("ๅฎถๅบญๅ
ณ็ณป"):
|
| 225 |
+
for line in section.split('\n'):
|
| 226 |
+
if line.strip().startswith('- **'):
|
| 227 |
+
result["relationships"].append(line.strip())
|
| 228 |
+
elif section.startswith("้่ฆไบไปถ"):
|
| 229 |
+
for line in section.split('\n'):
|
| 230 |
+
if line.strip().startswith('- **'):
|
| 231 |
+
result["events"].append(line.strip())
|
| 232 |
+
elif section.startswith("ๆฅๅธธ่ฎฐๅฝ"):
|
| 233 |
+
for line in section.split('\n'):
|
| 234 |
+
if line.strip().startswith('- **'):
|
| 235 |
+
result["daily"].append(line.strip())
|
| 236 |
+
|
| 237 |
+
return result
|
| 238 |
+
|
| 239 |
+
@classmethod
|
| 240 |
+
def _append_to_section(cls, section_title: str, entry: str):
|
| 241 |
+
"""ๅฐๆก็ฎ่ฟฝๅ ๅฐๆๅฎ็ซ ่ไธ"""
|
| 242 |
+
cls.ensure_file()
|
| 243 |
+
content = cls.MEMORY_FILE.read_text(encoding='utf-8')
|
| 244 |
+
marker = f"## {section_title}"
|
| 245 |
+
idx = content.find(marker)
|
| 246 |
+
if idx == -1:
|
| 247 |
+
# ็ซ ่ไธๅญๅจ๏ผ่ฟฝๅ ๅฐๆซๅฐพ
|
| 248 |
+
content += f"\n{marker}\n{entry}\n"
|
| 249 |
+
else:
|
| 250 |
+
# ๅจ็ซ ่ๆ ้ขๅๆๅ
ฅ
|
| 251 |
+
after_title = content[idx + len(marker):]
|
| 252 |
+
# ๆพๅฐ็ซ ่ๅ
ๅฎน็ๆซๅฐพ๏ผไธไธไธช ## ๆๆไปถๆซๅฐพ๏ผ
|
| 253 |
+
next_section = after_title.find("\n## ")
|
| 254 |
+
if next_section == -1:
|
| 255 |
+
insert_pos = len(content)
|
| 256 |
+
else:
|
| 257 |
+
insert_pos = idx + len(marker) + next_section
|
| 258 |
+
content = content[:insert_pos] + "\n" + entry + content[insert_pos:]
|
| 259 |
+
cls.MEMORY_FILE.write_text(content, encoding='utf-8')
|
| 260 |
+
|
| 261 |
+
@classmethod
|
| 262 |
+
def add_event(cls, description: str) -> str:
|
| 263 |
+
"""ๆทปๅ ไธๆก้่ฆไบไปถ"""
|
| 264 |
+
date_str = datetime.date.today().isoformat()
|
| 265 |
+
entry = f"- **{date_str}**: {description}"
|
| 266 |
+
cls._append_to_section("้่ฆไบไปถ", entry)
|
| 267 |
+
return "[OK] ๅทฒ่ฎฐๅฝไบไปถ"
|
| 268 |
+
|
| 269 |
+
@classmethod
|
| 270 |
+
def add_daily(cls, content: str) -> str:
|
| 271 |
+
"""ๆทปๅ ไธๆกๆฅๅธธ่ฎฐๅฝ"""
|
| 272 |
+
date_str = datetime.date.today().isoformat()
|
| 273 |
+
entry = f"- **{date_str}**: {content}"
|
| 274 |
+
cls._append_to_section("ๆฅๅธธ่ฎฐๅฝ", entry)
|
| 275 |
+
return "[OK] ๅทฒ่ฎฐๅฝๆฅๅธธ"
|
| 276 |
+
|
| 277 |
+
@classmethod
|
| 278 |
+
def format_for_prompt(cls) -> str:
|
| 279 |
+
"""ๆ ผๅผๅไธบ system prompt ๅฏ็จ็ๆๆฌ"""
|
| 280 |
+
data = cls.load_all()
|
| 281 |
+
lines = ["ใๅฎถๅบญ่ฎฐๅฟใ"]
|
| 282 |
+
if data["relationships"]:
|
| 283 |
+
lines.append(" ๅฎถๅบญๅ
ณ็ณป๏ผ")
|
| 284 |
+
for r in data["relationships"][:5]:
|
| 285 |
+
lines.append(f" {r}")
|
| 286 |
+
if data["events"]:
|
| 287 |
+
lines.append(" ้่ฆไบไปถ๏ผ")
|
| 288 |
+
for e in data["events"][:5]:
|
| 289 |
+
lines.append(f" {e}")
|
| 290 |
+
if data["daily"]:
|
| 291 |
+
lines.append(" ่ฟๆๆฅๅธธ๏ผ")
|
| 292 |
+
for d in data["daily"][-3:]:
|
| 293 |
+
lines.append(f" {d}")
|
| 294 |
+
if not any(data.values()):
|
| 295 |
+
lines.append(" ๆๆ ่ฎฐๅฝ")
|
| 296 |
+
return "\n".join(lines)
|
| 297 |
+
|
| 298 |
+
|
| 299 |
+
# ============================================================
|
| 300 |
+
# 4. ็ปไธๅ ่ฝฝๆฅๅฃ
|
| 301 |
+
# ============================================================
|
| 302 |
+
def load_all_family_info() -> dict:
|
| 303 |
+
"""ๅ ่ฝฝๆๆๅฎถๅบญไฟกๆฏ"""
|
| 304 |
+
return {
|
| 305 |
+
"recipes": RecipeManager.load_all(),
|
| 306 |
+
"preferences": PreferenceManager.load_all(),
|
| 307 |
+
"memory": MemoryManager.load_all(),
|
| 308 |
+
}
|
| 309 |
+
|
| 310 |
+
|
| 311 |
+
def format_all_for_prompt() -> str:
|
| 312 |
+
"""ๅฐๆๆๅฎถๅบญไฟกๆฏๆ ผๅผๅไธบ system prompt ๆๆฌ"""
|
| 313 |
+
parts = [
|
| 314 |
+
RecipeManager.format_for_prompt(),
|
| 315 |
+
"",
|
| 316 |
+
PreferenceManager.format_for_prompt(),
|
| 317 |
+
"",
|
| 318 |
+
MemoryManager.format_for_prompt(),
|
| 319 |
+
]
|
| 320 |
+
return "\n".join(parts)
|
modules/nutrition_standards.py
ADDED
|
@@ -0,0 +1,377 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
PregoPal - ่ฅๅ
ปๆ ๅ่งฃๆๅจ
|
| 3 |
+
=========================
|
| 4 |
+
่งฃๆไธไธชๅฎๆน MD ๆไปถ๏ผไฝ้ๆ ๅ/่ณ้ฃๆๅ/DRIs๏ผ๏ผๆไพ็ปๆๅๆฅ่ฏขๆฅๅฃใ
|
| 5 |
+
|
| 6 |
+
ๆฐๆฎๆฅๆบ๏ผ
|
| 7 |
+
data/nutrition/raw/
|
| 8 |
+
โโโ ๅฆๅจ ๆๅฆๅฅณไฝ้ๅข้ฟๆจ่ๅผๆ ๅ.md
|
| 9 |
+
โโโ ไธญๅฝๅญๆๅฆๅฅณ่ณ้ฃๆๅ2022ๅพ็่ฝฌmd็.md
|
| 10 |
+
โโโ ๅคๅญ&ๅญๆฉไธญๆไธๆๅๅบไนณๆ็ๆๆ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้.md
|
| 11 |
+
"""
|
| 12 |
+
|
| 13 |
+
import re
|
| 14 |
+
import json
|
| 15 |
+
from pathlib import Path
|
| 16 |
+
|
| 17 |
+
NUTRITION_RAW_DIR = Path("data/nutrition/raw")
|
| 18 |
+
PRESETS_DIR = Path("data/presets")
|
| 19 |
+
|
| 20 |
+
|
| 21 |
+
# ============================================================
|
| 22 |
+
# 1. ไฝ้ๅข้ฟๆ ๅ่งฃๆๅจ
|
| 23 |
+
# ============================================================
|
| 24 |
+
class WeightStandardParser:
|
| 25 |
+
"""่งฃๆ WS/T 801-2022 ไฝ้ๅข้ฟๆ ๅ๏ผๆไพๆฅ่ฏขๆฅๅฃ"""
|
| 26 |
+
|
| 27 |
+
# ็กฌ็ผ็ ๆ ๅ่กจ๏ผWS/T 801-2022 ่กจ1๏ผ
|
| 28 |
+
BMI_STANDARDS = [
|
| 29 |
+
{"category": "ไฝไฝ้", "bmi_range": (0, 18.5),
|
| 30 |
+
"total_gain": (11.0, 16.0), "weekly_gain": 0.46,
|
| 31 |
+
"weekly_range": (0.37, 0.56)},
|
| 32 |
+
{"category": "ๆญฃๅธธ", "bmi_range": (18.5, 24.0),
|
| 33 |
+
"total_gain": (8.0, 14.0), "weekly_gain": 0.37,
|
| 34 |
+
"weekly_range": (0.26, 0.48)},
|
| 35 |
+
{"category": "่ถ
้", "bmi_range": (24.0, 28.0),
|
| 36 |
+
"total_gain": (7.0, 11.0), "weekly_gain": 0.30,
|
| 37 |
+
"weekly_range": (0.22, 0.37)},
|
| 38 |
+
{"category": "่ฅ่", "bmi_range": (28.0, 999),
|
| 39 |
+
"total_gain": (5.0, 9.0), "weekly_gain": 0.22,
|
| 40 |
+
"weekly_range": (0.15, 0.30)},
|
| 41 |
+
]
|
| 42 |
+
|
| 43 |
+
@classmethod
|
| 44 |
+
def load(cls) -> dict:
|
| 45 |
+
"""่ฏปๅ md ๆไปถ๏ผ่ฟๅ็ปๆๅๆฐๆฎ๏ผๅ
ผๅฎนๆฅๅฃ๏ผ"""
|
| 46 |
+
return {"bmi_standards": cls.BMI_STANDARDS}
|
| 47 |
+
|
| 48 |
+
@classmethod
|
| 49 |
+
def get_standard(cls, bmi_before_pregnancy: float) -> dict | None:
|
| 50 |
+
"""ๆ นๆฎๅญๅ BMI ่ทๅๅฏนๅบ็ๅข้ฟๆ ๅ"""
|
| 51 |
+
for std in cls.BMI_STANDARDS:
|
| 52 |
+
low, high = std["bmi_range"]
|
| 53 |
+
if low <= bmi_before_pregnancy < high:
|
| 54 |
+
return std
|
| 55 |
+
return None
|
| 56 |
+
|
| 57 |
+
@classmethod
|
| 58 |
+
def evaluate(cls, bmi_before_pregnancy: float, current_week: int,
|
| 59 |
+
total_gain: float) -> dict:
|
| 60 |
+
"""
|
| 61 |
+
่ฏไผฐไฝ้ๅข้ฟๆฏๅฆๅจๆจ่่ๅดๅ
|
| 62 |
+
|
| 63 |
+
Args:
|
| 64 |
+
bmi_before_pregnancy: ๅญๅ BMI
|
| 65 |
+
current_week: ๅฝๅๅญๅจ
|
| 66 |
+
total_gain: ๅฝๅๆปๅข้ฟๅผ (kg)
|
| 67 |
+
|
| 68 |
+
Returns:
|
| 69 |
+
{"status": "ok"/"warning", "message": "...", "suggestion": "..."}
|
| 70 |
+
"""
|
| 71 |
+
std = cls.get_standard(bmi_before_pregnancy)
|
| 72 |
+
if std is None:
|
| 73 |
+
return {"status": "error", "message": "ๆ ๆณๅน้
BMI ๅ็ฑป", "suggestion": ""}
|
| 74 |
+
|
| 75 |
+
low, high = std["total_gain"]
|
| 76 |
+
|
| 77 |
+
if low <= total_gain <= high:
|
| 78 |
+
return {
|
| 79 |
+
"status": "ok",
|
| 80 |
+
"message": f"โ
ไฝ้ๅข้ฟๅจ {std['category']} ๆ ๅ่ๅดๅ
๏ผ{low}~{high}kg๏ผ๏ผ็ปง็ปญไฟๆ๏ผ",
|
| 81 |
+
"suggestion": f"ๅปบ่ฎฎๆฏๅจๅข้ฟ {std['weekly_gain']}kg ๅทฆๅณ๏ผ่ๅด {std['weekly_range'][0]}~{std['weekly_range'][1]}kg๏ผ"
|
| 82 |
+
}
|
| 83 |
+
elif total_gain < low:
|
| 84 |
+
return {
|
| 85 |
+
"status": "warning",
|
| 86 |
+
"message": f"โ ๏ธ ไฝ้ๅข้ฟๅๆ
ข๏ผๅฝๅ {total_gain}kg๏ผๆ ๅ {low}~{high}kg๏ผ",
|
| 87 |
+
"suggestion": "ๅปบ่ฎฎๅขๅ ่ฅๅ
ปๆๅ
ฅ๏ผ็นๅซๆฏไผ่ดจ่็ฝๅๅฅๅบท่่ช๏ผๅจ่ฏขๅป็ๆฏๅฆ้่ฆ่ฐๆด้ฅฎ้ฃ"
|
| 88 |
+
}
|
| 89 |
+
else:
|
| 90 |
+
return {
|
| 91 |
+
"status": "warning",
|
| 92 |
+
"message": f"โ ๏ธ ไฝ้ๅข้ฟๅๅฟซ๏ผๅฝๅ {total_gain}kg๏ผๆ ๅ {low}~{high}kg๏ผ",
|
| 93 |
+
"suggestion": "ๅปบ่ฎฎๆงๅถ้ซ็ณ้ซ่้ฃ็ฉๆๅ
ฅ๏ผ้ๅฝๅขๅ ่ฟๅจ้๏ผๅจ่ฏขๅป็ๆฏๅฆ้่ฆ่ฐๆด้ฅฎ้ฃ"
|
| 94 |
+
}
|
| 95 |
+
|
| 96 |
+
|
| 97 |
+
# ============================================================
|
| 98 |
+
# 2. ่ณ้ฃๆๅ่งฃๆๅจ
|
| 99 |
+
# ============================================================
|
| 100 |
+
class DietaryGuideParser:
|
| 101 |
+
"""่งฃๆไธญๅฝๅญๆๅฆๅฅณ่ณ้ฃๆๅ๏ผๆไพๅๅญๆๆจ่ๆๅ
ฅ้"""
|
| 102 |
+
|
| 103 |
+
# ไธญๅฝๅญๆๅฆๅฅณๅนณ่กก่ณ้ฃๅฎๅก๏ผ็ปๆๅๆฐๆฎ๏ผ
|
| 104 |
+
FOOD_PAGODA = {
|
| 105 |
+
"ๅคๅญ": {
|
| 106 |
+
"ๅฅถ็ฑป": "300g",
|
| 107 |
+
"้ฑผ็ฆฝ่่็ฑป": "150g",
|
| 108 |
+
"่ฐท็ฑป": "200-250g",
|
| 109 |
+
"่ฌ่": "400-500g",
|
| 110 |
+
"ๆฐดๆ": "200-300g",
|
| 111 |
+
"่ฏ็ฑป": "75g",
|
| 112 |
+
"ๅคง่ฑ": "20g",
|
| 113 |
+
"ๅๆ": "10g",
|
| 114 |
+
"ๆฒน": "25g",
|
| 115 |
+
"็": "5g",
|
| 116 |
+
},
|
| 117 |
+
"ๅญไธญๆ": {
|
| 118 |
+
"ๅฅถ็ฑป": "300-500g",
|
| 119 |
+
"้ฑผ็ฆฝ่่็ฑป": "150-200g",
|
| 120 |
+
"่ฐท็ฑป": "200-250g",
|
| 121 |
+
"่ฌ่": "400-500g",
|
| 122 |
+
"ๆฐดๆ": "200-300g",
|
| 123 |
+
"่ฏ็ฑป": "75g",
|
| 124 |
+
"ๅคง่ฑ": "20g",
|
| 125 |
+
"ๅๆ": "10g",
|
| 126 |
+
"ๆฒน": "25g",
|
| 127 |
+
"็": "5g",
|
| 128 |
+
},
|
| 129 |
+
"ๅญๆๆ": {
|
| 130 |
+
"ๅฅถ็ฑป": "300-500g",
|
| 131 |
+
"้ฑผ็ฆฝ่่็ฑป": "175-225g",
|
| 132 |
+
"่ฐท็ฑป": "225-275g",
|
| 133 |
+
"่ฌ่": "400-500g",
|
| 134 |
+
"ๆฐดๆ": "200-350g",
|
| 135 |
+
"่ฏ๏ฟฝ๏ฟฝ": "75g",
|
| 136 |
+
"ๅคง่ฑ": "20g",
|
| 137 |
+
"ๅๆ": "10g",
|
| 138 |
+
"ๆฒน": "25g",
|
| 139 |
+
"็": "5g",
|
| 140 |
+
},
|
| 141 |
+
"ๅบไนณๆ": {
|
| 142 |
+
"ๅฅถ็ฑป": "300-500g",
|
| 143 |
+
"้ฑผ็ฆฝ่่็ฑป": "200-250g",
|
| 144 |
+
"่ฐท็ฑป": "250-300g",
|
| 145 |
+
"่ฌ่": "400-500g",
|
| 146 |
+
"ๆฐดๆ": "200-350g",
|
| 147 |
+
"่ฏ็ฑป": "75g",
|
| 148 |
+
"ๅคง่ฑ": "25g",
|
| 149 |
+
"ๅๆ": "10g",
|
| 150 |
+
"ๆฒน": "25g",
|
| 151 |
+
"็": "5g",
|
| 152 |
+
},
|
| 153 |
+
}
|
| 154 |
+
|
| 155 |
+
CORE_PRINCIPLES = [
|
| 156 |
+
"1. ่ฐๆดๅญๅไฝ้่ณๆญฃๅธธ่ๅด",
|
| 157 |
+
"2. ๅธธๅๅซ้้ฃ็ฉ๏ผ้็จ็ข็๏ผ่กฅๅ
ๅถ้
ธๅ็ปด็็ด D",
|
| 158 |
+
"3. ๅญๅไธฅ้่
ๅฐ้ๅค้ค",
|
| 159 |
+
"4. ๅญไธญๆๆๅขๅ ๅฅถใ้ฑผใ็ฆฝใ่ใ็ฆ่",
|
| 160 |
+
"5. ็ปๅธธๆทๅคๆดปๅจ๏ผ็ฆ็้
",
|
| 161 |
+
"6. ๆๅฟซๅญ่ฒๆฐ็ๅฝ๏ผ็งฏๆๅๅคๆฏไนณๅๅ
ป",
|
| 162 |
+
]
|
| 163 |
+
|
| 164 |
+
@classmethod
|
| 165 |
+
def load(cls) -> dict:
|
| 166 |
+
"""่ฏปๅ md ๆไปถ๏ผ่ฟๅ็ปๆๅๆฐๆฎ๏ผๅ
ผๅฎนๆฅๅฃ๏ผ"""
|
| 167 |
+
return {"food_pagoda": cls.FOOD_PAGODA, "core_principles": cls.CORE_PRINCIPLES}
|
| 168 |
+
|
| 169 |
+
@classmethod
|
| 170 |
+
def get_recommendations(cls, trimester: str) -> dict:
|
| 171 |
+
"""่ฟๅๆๅฎๅญๆ็้ฃ็ฉๆจ่้"""
|
| 172 |
+
return cls.FOOD_PAGODA.get(trimester, cls.FOOD_PAGODA["ๅญไธญๆ"])
|
| 173 |
+
|
| 174 |
+
@classmethod
|
| 175 |
+
def get_core_principles(cls) -> list[str]:
|
| 176 |
+
"""่ฟๅๅ
ญๆกๆ ธๅฟๅปบ่ฎฎ"""
|
| 177 |
+
return cls.CORE_PRINCIPLES
|
| 178 |
+
|
| 179 |
+
@classmethod
|
| 180 |
+
def format_for_prompt(cls, trimester: str) -> str:
|
| 181 |
+
"""ๆ ผๅผๅไธบ system prompt ๅฏ็จ็ๆๆฌ"""
|
| 182 |
+
recs = cls.get_recommendations(trimester)
|
| 183 |
+
lines = [f"ใ{trimester}ๅนณ่กก่ณ้ฃๅฎๅกๆจ่้ใ"]
|
| 184 |
+
for food, amount in recs.items():
|
| 185 |
+
lines.append(f" {food}: {amount}")
|
| 186 |
+
lines.append("")
|
| 187 |
+
lines.append("ใ่ณ้ฃๆๅๅ
ญๆกๆ ธๅฟๅปบ่ฎฎใ")
|
| 188 |
+
for p in cls.CORE_PRINCIPLES:
|
| 189 |
+
lines.append(f" {p}")
|
| 190 |
+
return "\n".join(lines)
|
| 191 |
+
|
| 192 |
+
|
| 193 |
+
# ============================================================
|
| 194 |
+
# 3. DRIs ่งฃๆๅจ
|
| 195 |
+
# ============================================================
|
| 196 |
+
class DRIsParser:
|
| 197 |
+
"""่งฃๆ่ณ้ฃ่ฅๅ
ป็ด ๅ่ๆๅ
ฅ้๏ผๆไพ RNI ๆฅ่ฏขๅๅฏนๆฏ"""
|
| 198 |
+
|
| 199 |
+
# ๅ
ณ้ฎ่ฅๅ
ป็ด RNI ๆฐๆฎ๏ผๆฅ่ชๅฎๆน DRIs ่กจ15-18๏ผ
|
| 200 |
+
# ๅไฝ๏ผ่ฝ้(MJ)ใ่็ฝ่ดจ(g)ใ้(mg)ใ้(mg)ใ้(mg)ใ
|
| 201 |
+
# ็ปด็็ด A(ฮผg RAE)ใ็ปด็็ด D(ฮผg)ใ็ปด็็ด E(mg ฮฑ-TE)ใ
|
| 202 |
+
# ็ปด็็ด B1(mg)ใ็ปด็็ด B2(mg)ใๅถ้
ธ(ฮผg DFE)ใ็ข(ฮผg)
|
| 203 |
+
RNI_DATA = {
|
| 204 |
+
"ๅญๆฉๆ": {
|
| 205 |
+
"่ฝ้(MJ)": 8.81, "่็ฝ่ดจ(g)": 65, "้(mg)": 800,
|
| 206 |
+
"้(mg)": 20, "้(mg)": 9.5, "็ปด็็ด A(ฮผg RAE)": 770,
|
| 207 |
+
"็ปด็็ด D(ฮผg)": 10, "็ปด็็ด E(mg ฮฑ-TE)": 14,
|
| 208 |
+
"็ปด็็ด B1(mg)": 1.2, "็ปด็็ด B2(mg)": 1.2,
|
| 209 |
+
"ๅถ้
ธ(ฮผg DFE)": 600, "็ข(ฮผg)": 230,
|
| 210 |
+
},
|
| 211 |
+
"ๅญไธญๆ": {
|
| 212 |
+
"่ฝ้(MJ)": 9.84, "่็ฝ่ดจ(g)": 70, "้(mg)": 800,
|
| 213 |
+
"้(mg)": 25, "้(mg)": 11, "็ปด็็ด A(ฮผg RAE)": 770,
|
| 214 |
+
"็ปด็็ด D(ฮผg)": 10, "็ปด็็ด E(mg ฮฑ-TE)": 14,
|
| 215 |
+
"็ปด็็ด B1(mg)": 1.4, "็ปด็็ด B2(mg)": 1.4,
|
| 216 |
+
"ๅถ้
ธ(ฮผg DFE)": 600, "็ข(ฮผg)": 230,
|
| 217 |
+
},
|
| 218 |
+
"ๅญๆๆ": {
|
| 219 |
+
"่ฝ้(MJ)": 9.84, "่็ฝ่ดจ(g)": 85, "้(mg)": 800,
|
| 220 |
+
"้(mg)": 29, "้(mg)": 11, "็ปด็็ด A(ฮผg RAE)": 770,
|
| 221 |
+
"็ปด็็ด D(ฮผg)": 10, "็ปด็็ด E(mg ฮฑ-TE)": 14,
|
| 222 |
+
"็ปด็็ด B1(mg)": 1.4, "็ปด็็ด B2(mg)": 1.4,
|
| 223 |
+
"ๅถ้
ธ(ฮผg DFE)": 600, "็ข(ฮผg)": 230,
|
| 224 |
+
},
|
| 225 |
+
"ๅบไนณๆ": {
|
| 226 |
+
"่ฝ้(MJ)": 10.46, "่็ฝ่ดจ(g)": 80, "้(mg)": 1000,
|
| 227 |
+
"้(mg)": 24, "้(mg)": 13.5, "็ปด็็ด A(ฮผg RAE)": 1300,
|
| 228 |
+
"็ปด็็ด D(ฮผg)": 10, "็ปด็็ด E(mg ฮฑ-TE)": 17,
|
| 229 |
+
"็ปด็็ด B1(mg)": 1.5, "็ปด็็ด B2(mg)": 1.5,
|
| 230 |
+
"ๅถ้
ธ(ฮผg DFE)": 550, "็ข(ฮผg)": 240,
|
| 231 |
+
},
|
| 232 |
+
}
|
| 233 |
+
|
| 234 |
+
# ่ฅๅ
ป็ด ๅ็ฑป๏ผ็จไบ็ๆๅปบ่ฎฎ๏ผ
|
| 235 |
+
NUTRIENT_CATEGORIES = {
|
| 236 |
+
"่ฝ้(MJ)": "ๅฎ้่ฅๅ
ป็ด ", "่็ฝ่ดจ(g)": "ๅฎ้่ฅๅ
ป็ด ",
|
| 237 |
+
"้(mg)": "็ฟ็ฉ่ดจ", "้(mg)": "็ฟ็ฉ่ดจ", "้(mg)": "็ฟ็ฉ่ดจ",
|
| 238 |
+
"็ปด็็ด A(ฮผg RAE)": "็ปด็็ด ", "็ปด็็ด D(ฮผg)": "็ปด็็ด ",
|
| 239 |
+
"็ปด็็ด E(mg ฮฑ-TE)": "็ปด็็ด ", "็ปด็็ด B1(mg)": "็ปด็็ด ",
|
| 240 |
+
"็ปด็็ด B2(mg)": "็ปด็็ด ", "ๅถ้
ธ(ฮผg DFE)": "็ปด็็ด ",
|
| 241 |
+
"็ข(ฮผg)": "็ฟ็ฉ่ดจ",
|
| 242 |
+
}
|
| 243 |
+
|
| 244 |
+
# ๅฏๅซๅ่ฅๅ
ป็ด ็้ฃ็ฉ๏ผ็จไบ็ๆๅปบ่ฎฎ๏ผ
|
| 245 |
+
RICH_FOODS = {
|
| 246 |
+
"้(mg)": ["็ๅฅถ", "้
ธๅฅถ", "่ฑ่
", "่้บป", "ๅฐ้ฑผๅนฒ", "่ฅฟๅ
ฐ่ฑ"],
|
| 247 |
+
"้(mg)": ["็บข่", "ๅจ็ฉ่่", "่ ่", "้ปๆจ่ณ", "็บขๆฃ", "็ฆ่"],
|
| 248 |
+
"ๅถ้
ธ(ฮผg DFE)": ["่ ่", "่ฅฟๅ
ฐ่ฑ", "่ฆ็ฌ", "็่", "่ฑ็ฑป", "ๆฉๅญ"],
|
| 249 |
+
"่็ฝ่ดจ(g)": ["้ธก่", "้ธก่", "้ฑผ่", "่ฑ่
", "็ๅฅถ", "่พ"],
|
| 250 |
+
"็ปด็็ด D(ฮผg)": ["่้ป", "่่", "ไธๆ้ฑผ", "่่", "ๆๅคช้ณ"],
|
| 251 |
+
"้(mg)": ["็ก่", "็ฆ่", "ๅๆ", "ๅ
จ่ฐท็ฉ", "่ฑ็ฑป"],
|
| 252 |
+
"็ข(ฮผg)": ["ๆตทๅธฆ", "๏ฟฝ๏ฟฝ่", "็ข็", "ๆตท้ฑผ", "่ด็ฑป"],
|
| 253 |
+
"็ปด็็ด A(ฮผg RAE)": ["่ก่ๅ", "ๅ็", "่ ่", "่่", "็บข่ฏ"],
|
| 254 |
+
"็ปด็็ด B1(mg)": ["ๅ
จ่ฐท็ฉ", "็ฆ่", "่ฑ็ฑป", "ๅๆ"],
|
| 255 |
+
"็ปด็็ด B2(mg)": ["ๅฅถๅถๅ", "้ธก่", "็ฆ่", "็ปฟๅถ่ฌ่"],
|
| 256 |
+
"็ปด็็ด E(mg ฮฑ-TE)": ["ๅๆ", "ๆค็ฉๆฒน", "ๅ
จ่ฐท็ฉ", "็ปฟๅถ่ฌ่"],
|
| 257 |
+
"่ฝ้(MJ)": ["ไธป้ฃ", "่็ฑป", "ๅๆ", "ๆค็ฉๆฒน"],
|
| 258 |
+
}
|
| 259 |
+
|
| 260 |
+
@classmethod
|
| 261 |
+
def load(cls) -> dict:
|
| 262 |
+
"""่ฏปๅ md ๆไปถ๏ผ่ฟๅ็ปๆๅๆฐๆฎ๏ผๅ
ผๅฎนๆฅๅฃ๏ผ"""
|
| 263 |
+
return {"rni_data": cls.RNI_DATA}
|
| 264 |
+
|
| 265 |
+
@classmethod
|
| 266 |
+
def get_rni(cls, stage: str) -> dict:
|
| 267 |
+
"""่ฟๅๆๅฎ้ถๆฎต็ RNI ๆฐๆฎ"""
|
| 268 |
+
return cls.RNI_DATA.get(stage, cls.RNI_DATA["ๅญไธญๆ"])
|
| 269 |
+
|
| 270 |
+
@classmethod
|
| 271 |
+
def get_stages(cls) -> list[str]:
|
| 272 |
+
"""่ฟๅๆๆ้ถๆฎตๅ็งฐ"""
|
| 273 |
+
return list(cls.RNI_DATA.keys())
|
| 274 |
+
|
| 275 |
+
@classmethod
|
| 276 |
+
def compare_with_intake(cls, stage: str, intake: dict) -> dict:
|
| 277 |
+
"""
|
| 278 |
+
ๅฏนๆฏๅฎ้
ๆๅ
ฅไธ RNI๏ผ่ฟๅๅทฎๅผๅๆ
|
| 279 |
+
|
| 280 |
+
Args:
|
| 281 |
+
stage: ๅญๆ้ถๆฎต
|
| 282 |
+
intake: ๅฎ้
ๆๅ
ฅ้ๅญๅ
ธ {่ฅๅ
ป็ด ๅ: ๆฐๅผ}
|
| 283 |
+
|
| 284 |
+
Returns:
|
| 285 |
+
{
|
| 286 |
+
"stage": stage,
|
| 287 |
+
"comparisons": [{nutrient, rni, intake, diff_pct, status}, ...],
|
| 288 |
+
"focus_nutrients": [...], # ๅทฎๅผ่ถ
่ฟ20%็้็นๅ
ณๆณจ
|
| 289 |
+
"summary": "่ช็ถ่ฏญ่จๆป็ป"
|
| 290 |
+
}
|
| 291 |
+
"""
|
| 292 |
+
rni = cls.get_rni(stage)
|
| 293 |
+
comparisons = []
|
| 294 |
+
focus_nutrients = []
|
| 295 |
+
|
| 296 |
+
for nutrient, rni_value in rni.items():
|
| 297 |
+
actual = intake.get(nutrient, 0)
|
| 298 |
+
if actual == 0:
|
| 299 |
+
diff_pct = -100
|
| 300 |
+
status = "missing"
|
| 301 |
+
else:
|
| 302 |
+
diff_pct = round((actual - rni_value) / rni_value * 100, 1)
|
| 303 |
+
if diff_pct >= 0:
|
| 304 |
+
status = "sufficient"
|
| 305 |
+
elif diff_pct >= -20:
|
| 306 |
+
status = "slight_deficit"
|
| 307 |
+
else:
|
| 308 |
+
status = "deficit"
|
| 309 |
+
|
| 310 |
+
comparisons.append({
|
| 311 |
+
"nutrient": nutrient,
|
| 312 |
+
"category": cls.NUTRIENT_CATEGORIES.get(nutrient, "ๅ
ถไป"),
|
| 313 |
+
"rni": rni_value,
|
| 314 |
+
"intake": actual,
|
| 315 |
+
"diff_pct": diff_pct,
|
| 316 |
+
"status": status,
|
| 317 |
+
})
|
| 318 |
+
|
| 319 |
+
if status in ("deficit", "missing"):
|
| 320 |
+
focus_nutrients.append(nutrient)
|
| 321 |
+
|
| 322 |
+
# ็ๆๆป็ป
|
| 323 |
+
summary_lines = []
|
| 324 |
+
if focus_nutrients:
|
| 325 |
+
summary_lines.append(f"โ ๏ธ ไปฅไธ่ฅๅ
ป็ด ๆๅ
ฅไธ่ถณ๏ผๅทฎๅผ่ถ
่ฟ20%๏ผ๏ผ")
|
| 326 |
+
for n in focus_nutrients[:5]:
|
| 327 |
+
foods = cls.RICH_FOODS.get(n, [])
|
| 328 |
+
food_str = "ใ".join(foods[:4]) if foods else "ๅคๆ ทๅ้ฅฎ้ฃ"
|
| 329 |
+
summary_lines.append(f" โข {n}๏ผๅปบ่ฎฎๅคๅ {food_str}")
|
| 330 |
+
else:
|
| 331 |
+
summary_lines.append("โ
ๅ่ฅๅ
ป็ด ๆๅ
ฅๅบๆฌ่พพๆ ๏ผ")
|
| 332 |
+
|
| 333 |
+
return {
|
| 334 |
+
"stage": stage,
|
| 335 |
+
"comparisons": comparisons,
|
| 336 |
+
"focus_nutrients": focus_nutrients,
|
| 337 |
+
"summary": "\n".join(summary_lines),
|
| 338 |
+
}
|
| 339 |
+
|
| 340 |
+
@classmethod
|
| 341 |
+
def format_comparison_table(cls, comparisons: list[dict], max_rows: int = 8) -> str:
|
| 342 |
+
"""ๆ ผๅผๅไธบๆๆฌๅฏนๆฏ่กจ"""
|
| 343 |
+
lines = [
|
| 344 |
+
"โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ",
|
| 345 |
+
"โ ่ฅๅ
ป็ด RNI ๅฎ้
ๆๅ
ฅ ๅทฎๅผ โ",
|
| 346 |
+
"โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโค",
|
| 347 |
+
]
|
| 348 |
+
for c in comparisons[:max_rows]:
|
| 349 |
+
status_icon = "โ
" if c["status"] == "sufficient" else ("โ ๏ธ" if c["status"] == "slight_deficit" else "โ")
|
| 350 |
+
diff_str = f"{c['diff_pct']:+.1f}%" if c["status"] != "missing" else "ๆ ๆฐๆฎ"
|
| 351 |
+
lines.append(
|
| 352 |
+
f"โ {status_icon} {c['nutrient']:<14s} {c['rni']:<8.1f} {c['intake']:<12.1f} {diff_str:<12s} โ"
|
| 353 |
+
)
|
| 354 |
+
lines.append("โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ")
|
| 355 |
+
return "\n".join(lines)
|
| 356 |
+
|
| 357 |
+
|
| 358 |
+
# ============================================================
|
| 359 |
+
# 4. ็ปไธๅ ่ฝฝๆฅๅฃ
|
| 360 |
+
# ============================================================
|
| 361 |
+
def load_all_standards() -> dict:
|
| 362 |
+
"""ๅ ่ฝฝๆๆ่ฅๅ
ปๆ ๅ๏ผ่ฟๅ็ปๆๅๆฐๆฎ"""
|
| 363 |
+
return {
|
| 364 |
+
"weight": WeightStandardParser.load(),
|
| 365 |
+
"dietary_guide": DietaryGuideParser.load(),
|
| 366 |
+
"dris": DRIsParser.load(),
|
| 367 |
+
}
|
| 368 |
+
|
| 369 |
+
|
| 370 |
+
def compile_standards_to_presets():
|
| 371 |
+
"""ๅฐ่ฅๅ
ปๆ ๅ็ผ่ฏไธบ JSON ็ผๅญๆไปถ"""
|
| 372 |
+
PRESETS_DIR.mkdir(parents=True, exist_ok=True)
|
| 373 |
+
data = load_all_standards()
|
| 374 |
+
cache_path = PRESETS_DIR / "nutrition_standards.json"
|
| 375 |
+
with open(cache_path, 'w', encoding='utf-8') as f:
|
| 376 |
+
json.dump(data, f, ensure_ascii=False, indent=2)
|
| 377 |
+
return cache_path
|
plugins/__init__.py
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
"""
|
| 2 |
+
PregoPal - Loop ๆไปถๅ
|
| 3 |
+
======================
|
| 4 |
+
ๆๆๆไปถ็ปงๆฟ base.LoopPlugin๏ผๆณจๅๅฐไธๅ LoopStageใ
|
| 5 |
+
"""
|
plugins/__pycache__/__init__.cpython-311.pyc
ADDED
|
Binary file (303 Bytes). View file
|
|
|
plugins/__pycache__/__init__.cpython-313.pyc
ADDED
|
Binary file (286 Bytes). View file
|
|
|
plugins/__pycache__/base.cpython-311.pyc
ADDED
|
Binary file (5.42 kB). View file
|
|
|
plugins/__pycache__/base.cpython-313.pyc
ADDED
|
Binary file (4.53 kB). View file
|
|
|
plugins/__pycache__/briefing_generator.cpython-311.pyc
ADDED
|
Binary file (5.01 kB). View file
|
|
|
plugins/__pycache__/briefing_generator.cpython-313.pyc
ADDED
|
Binary file (4.58 kB). View file
|
|
|
plugins/__pycache__/diet_summary.cpython-311.pyc
ADDED
|
Binary file (3.35 kB). View file
|
|
|
plugins/__pycache__/diet_summary.cpython-313.pyc
ADDED
|
Binary file (3.08 kB). View file
|
|
|
plugins/__pycache__/dri_analysis.cpython-311.pyc
ADDED
|
Binary file (3.21 kB). View file
|
|
|
plugins/__pycache__/dri_analysis.cpython-313.pyc
ADDED
|
Binary file (2.98 kB). View file
|
|
|
plugins/__pycache__/family_memory.cpython-311.pyc
ADDED
|
Binary file (2.27 kB). View file
|
|
|
plugins/__pycache__/family_memory.cpython-313.pyc
ADDED
|
Binary file (2.04 kB). View file
|
|
|
plugins/__pycache__/family_quiz.cpython-311.pyc
ADDED
|
Binary file (3.95 kB). View file
|
|
|
plugins/__pycache__/family_quiz.cpython-313.pyc
ADDED
|
Binary file (3.69 kB). View file
|
|
|
plugins/__pycache__/preset_writer.cpython-311.pyc
ADDED
|
Binary file (3.83 kB). View file
|
|
|
plugins/__pycache__/preset_writer.cpython-313.pyc
ADDED
|
Binary file (3.51 kB). View file
|
|
|
plugins/__pycache__/three_day_summary.cpython-311.pyc
ADDED
|
Binary file (5.7 kB). View file
|
|
|
plugins/__pycache__/three_day_summary.cpython-313.pyc
ADDED
|
Binary file (5.11 kB). View file
|
|
|
plugins/__pycache__/weight_check.cpython-311.pyc
ADDED
|
Binary file (2.23 kB). View file
|
|
|
plugins/__pycache__/weight_check.cpython-313.pyc
ADDED
|
Binary file (2.06 kB). View file
|
|
|