Chuyển tới nội dung chính

Dinh dưỡng thể hình - Công cụ lập kế hoạch tập luyện và theo dõi dinh dưỡng

{/* Trang này được tạo tự động từ SKILL.md của kỹ năng bởi website/scripts/generate-skill-docs.py. Chỉnh sửa nguồn SKILL.md, không phải trang này. */}`#Dinh dưỡng thể hình

Kế hoạch tập luyện phòng tập thể dục và theo dõi dinh dưỡng. Tìm kiếm hơn 690 bài tập theo cơ, thiết bị hoặc danh mục thông qua wger. Tra cứu macro và calo cho hơn 380.000 loại thực phẩm thông qua USDA FoodData Central. Tính toán chỉ số BMI, TDEE, mức tối đa một lần lặp lại, phân chia macro và lượng mỡ trong cơ thể - Python thuần túy, không cần cài đặt pip. Được xây dựng dành cho những ai đang theo đuổi mục tiêu tăng cân, giảm cân hoặc chỉ cố gắng ăn uống tốt hơn.

Siêu dữ liệu kỹ năng

NguồnTùy chọn — cài đặt với
`Hermes skills install official/health/fitness-nutrition
`
Đường dẫn

optional-skills/health/fitness-nutrition ` | | Phiên bản |

1.0.0 ` | | Giấy phép | MIT | | Nền tảng | Linux, macOS, Windows | | Thẻ |

health

, `fitness

, `nutrition

, `gym

, `workout

, `diet

, exercise |

Tham khảo: đầy đủ SKILL.md

thông tin

Sau đây là định nghĩa kỹ năng đầy đủ mà Hermes tải khi kỹ năng này được kích hoạt. Đây là những gì tác nhân coi là hướng dẫn khi kỹ năng được kích hoạt.

Thể hình & Dinh dưỡng

Huấn luyện viên thể hình chuyên nghiệp và kỹ năng dinh dưỡng thể thao. Hai nguồn dữ liệu cộng với máy tính ngoại tuyến — mọi thứ mà người tập gym cần ở một nơi.

Nguồn dữ liệu (tất cả đều miễn phí, không phụ thuộc vào pip):

  • wger (https://wger.de/API/v2/) — cơ sở dữ liệu bài tập mở, hơn 690 bài tập về cơ bắp, thiết bị, hình ảnh. Điểm cuối công cộng không cần xác thực.
  • USDA FoodData Central (https://API.nal.usda.gov/fdc/v1/) — Cơ sở dữ liệu dinh dưỡng của chính phủ Hoa Kỳ, hơn 380.000 loại thực phẩm. DEMO_KEY hoạt động ngay lập tức; đăng ký miễn phí cho các giới hạn cao hơn.

Máy tính ngoại tuyến (Python stdlib thuần túy):

  • BMI, TDEE (Mifflin-St Jeor), tối đa một lần lặp lại (Epley/Brzycki/Lombardi), chia nhỏ macro, % mỡ cơ thể (phương pháp của Hải quân Hoa Kỳ)

Khi nào nên sử dụng

Kích hoạt kỹ năng này khi người dùng hỏi về:

  • Bài tập, tập luyện, thói quen tập gym, nhóm cơ, chia tập luyện
  • Macro thực phẩm, lượng calo, hàm lượng protein, lập kế hoạch bữa ăn, tính lượng calo
  • Thành phần cơ thể: BMI, mỡ cơ thể, TDEE, dư/thâm hụt calo
  • Ước tính tối đa một lần, tỷ lệ đào tạo, quá tải lũy tiến
  • Tỷ lệ vĩ mô để cắt, đóng gói hoặc bảo trì

Thủ tục

Tra cứu bài tập (API wger)

Tất cả các điểm cuối công khai đều trả về JSON và không yêu cầu xác thực. Luôn thêm format=JSON language=2 (tiếng Anh) để thực hiện các truy vấn.

Bước 1 — Xác định điều người dùng muốn:

  • Bằng cơ → sử dụng

/API/v2/exercise/?muscles={id}&language=2&status=2&format=JSON

  • Theo danh mục → sử dụng

/API/v2/exercise/?category={id}&language=2&status=2&format=JSON

  • Theo thiết bị → sử dụng

/API/v2/exercise/?equipment={id}&language=2&status=2&format=JSON

  • Theo tên → sử dụng

/API/v2/exercise/search/?term={query}&language=english&format=JSON

  • Chi tiết đầy đủ → sử dụng

/API/v2/exerciseinfo/{exercise_id}/?format=JSON ``Bước 2 — ID tham chiếu (vì vậy bạn không cần thêm lệnh gọi API):

Các hạng mục bài tập:

IDDanh mục
8Vũ khí
9Chân
10Cơ bụng
11Ngực
12Quay lại
13Vai
14
15Tim mạch

Cơ bắp:

IDCơ bắpIDCơ bắp
1Bắp tay cánh tay2Cơ delta trước
3Serratus trước4Cơ ngực chính
5Obliquus bên ngoài6Dạ dày
7Cơ bụng trực tràng8Cơ mông cực đại
9Hình thang10Cơ tứ đầu đùi
11Bắp tay đùi12Latissimus dorsi
13Cánh tay14Cơ tam đầu cánh tay
15Đế

Thiết bị:

IDThiết bị
1Thanh tạ
3Quả tạ
4Thảm tập thể dục
5Bóng Thụy Sĩ
6Thanh kéo
7không có (trọng lượng cơ thể)
8Băng ghế
9Ghế nghiêng
10Ấm đun nước

Bước 3 - Tìm nạp và hiển thị kết quả:


# Search exercises by name
QUERY="$1"
ENCODED=$(Python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$QUERY")
curl -s "https://wger.de/API/v2/exercise/search/?term=$\{ENCODED}&language=english&format=JSON" \
| Python3 -c "
import JSON,sys
data=JSON.load(sys.stdin)
for s in data.get('suggestions',[])[:10]:
d=s.get('data',\{})
print(f\" ID \{d.get('id','?'):>4} | \{d.get('name','N/A'):<35} | Category: \{d.get('category','N/A')}\")
"

`

`
``` bash

# Get full details for a specific exercise
EXERCISE_ID="$1"
curl -s "https://wger.de/API/v2/exerciseinfo/$\{EXERCISE_ID}/?format=JSON" \
| Python3 -c "
import JSON,sys,html,re
data=JSON.load(sys.stdin)
trans=[t for t in data.get('translations',[]) if t.get('language')==2]
t=trans[0] if trans else data.get('translations',[\{}])[0]
desc=re.sub('<[^>]+>','',html.unescape(t.get('description','N/A')))
print(f\"Exercise : \{t.get('name','N/A')}\")
print(f\"Category : \{data.get('category',\{}).get('name','N/A')}\")
print(f\"Primary : \{', '.join(m.get('name_en','') for m in data.get('muscles',[])) or 'N/A'}\")
print(f\"Secondary : \{', '.join(m.get('name_en','') for m in data.get('muscles_secondary',[])) or 'none'}\")
print(f\"Equipment : \{', '.join(e.get('name','') for e in data.get('equipment',[])) or 'bodyweight'}\")
print(f\"How to : \{desc[:500]}\")
imgs=data.get('images',[])
if imgs: print(f\"Image : \{imgs[0].get('image','')}\")
"

`

`
``` bash

# List exercises filtering by muscle, category, or equipment
# Combine filters as needed: ?muscles=4&equipment=1&language=2&status=2
FILTER="$1" # e.g. "muscles=4" or "category=11" or "equipment=3"
curl -s "https://wger.de/API/v2/exercise/?$\{FILTER}&language=2&status=2&limit=20&format=JSON" \
| Python3 -c "
import JSON,sys
data=JSON.load(sys.stdin)
print(f'Found \{data.get(\"count\",0)} exercises.')
for ex in data.get('results',[]):
print(f\" ID \{ex['id']:>4} | muscles: \{ex.get('muscles',[])} | equipment: \{ex.get('equipment',[])}\")
"

`

### Tra cứu dinh dưỡng (USDA FoodData Central)

Sử dụng
`USDA_API_KEY
` env var nếu được đặt, nếu không thì quay lại
`DEMO_KEY

.
DEMO_KEY = 30 yêu cầu/giờ. Key đăng ký miễn phí = 1.000 yêu cầu/giờ.

``` bash

# Search foods by name
FOOD="$1"
API_KEY="$\{USDA_API_KEY:-DEMO_KEY}"
ENCODED=$(Python3 -c "import urllib.parse,sys; print(urllib.parse.quote(sys.argv[1]))" "$FOOD")
curl -s "https://API.nal.usda.gov/fdc/v1/foods/search?API_key=$\{API_KEY}&query=$\{ENCODED}&pageSize=5&dataType=Foundation,SR%20Legacy" \
| Python3 -c "
import JSON,sys
data=JSON.load(sys.stdin)
foods=data.get('foods',[])
if not foods: print('No foods found.'); sys.exit()
for f in foods:
n=\{x['nutrientName']:x.get('value','?') for x in f.get('foodNutrients',[])}
cal=n.get('Energy','?'); prot=n.get('Protein','?')
fat=n.get('Total lipid (fat)','?'); carb=n.get('Carbohydrate, by difference','?')
print(f\"\{f.get('description','N/A')}\")
print(f\" Per 100g: \{cal} kcal | \{prot}g protein | \{fat}g fat | \{carb}g carbs\")
print(f\" FDC ID: \{f.get('fdcId','N/A')}\")
print()
"

`

`
``` bash

# Detailed nutrient profile by FDC ID
FDC_ID="$1"
API_KEY="$\{USDA_API_KEY:-DEMO_KEY}"
curl -s "https://API.nal.usda.gov/fdc/v1/food/$\{FDC_ID}?API_key=$\{API_KEY}" \
| Python3 -c "
import JSON,sys
d=JSON.load(sys.stdin)
print(f\"Food: \{d.get('description','N/A')}\")
print(f\"\{'Nutrient':<40} \{'Amount':>8} \{'Unit'}\")
print('-'*56)
for x in sorted(d.get('foodNutrients',[]),key=lambda x:x.get('nutrient',\{}).get('rank',9999)):
nut=x.get('nutrient',\{}); amt=x.get('amount',0)
if amt and float(amt)>0:
print(f\" \{nut.get('name',''):<38} \{amt:>8} \{nut.get('unitName','')}\")
"

`

### Máy tính ngoại tuyến

Sử dụng tập lệnh trợ giúp trong
`scripts/
` cho các hoạt động hàng loạt,
hoặc chạy nội tuyến cho các phép tính đơn lẻ:-
`Python3 scripts/body_calc.py bmi <weight_kg <height_cm

-
`Python3 scripts/body_calc.py tdee <weight_kg <height_cm <age <M|F <activity 1-5

-
`Python3 scripts/body_calc.py 1rm <weight <reps

-
`Python3 scripts/body_calc.py macros <tdee_kcal <cut|maintain|bulk

-
`Python3 scripts/body_calc.py bodyfat <M|F <neck_cm <waist_cm [hip_cm] <height_cm
``Xem
`references/FORMULAS.md
` để biết tính khoa học đằng sau mỗi công thức.

---

## cạm bẫy
- điểm cuối của bài tập wger trả về **tất cả ngôn ngữ theo mặc định** — luôn thêm
`language=2
` cho tiếng Anh
- wger bao gồm **bài gửi của người dùng chưa được xác minh** — thêm
`status=2
` để chỉ nhận các bài tập đã được phê duyệt
- USDA
`DEMO_KEY
` có **30 yêu cầu/giờ** — thêm
`sleep 2
` giữa các yêu cầu hàng loạt hoặc nhận khóa miễn phí
- Dữ liệu của USDA là **trên 100g** — nhắc nhở người dùng chia tỷ lệ theo khẩu phần thực tế của họ
- BMI không phân biệt cơ với mỡ - BMI cao ở người cơ bắp không nhất thiết là không tốt cho sức khỏe
- Công thức lượng mỡ trong cơ thể là **ước tính** (±3-5%) — khuyên bạn nên quét DEXA để có độ chính xác
- Công thức 1RM mất độ chính xác trên 10 lần lặp lại — sử dụng hiệp 3-5 để có ước tính tốt nhất
- điểm cuối
`exercise/search
` của wger sử dụng
`term
` chứ không phải
`query
` làm tên tham số

---

## Xác minh

Sau khi chạy tìm kiếm bài tập: xác nhận kết quả bao gồm tên bài tập, nhóm cơ và thiết bị.
Sau khi tra cứu dinh dưỡng: xác nhận mỗi 100g macro sẽ được trả về kcal, protein, fat, carbs.
Sau máy tính: kết quả đầu ra để kiểm tra độ tỉnh táo (ví dụ: TDEE phải là 1500-3500 đối với hầu hết người lớn).

---

## Tham khảo nhanh

| Nhiệm vụ | Nguồn | Điểm cuối |
|------|--------|----------|
| Tìm kiếm bài tập theo tên | cá cược |

GET /API/v2/exercise/search/?term=&language=english
` |
| Chi tiết bài tập | cá cược |

GET /API/v2/exerciseinfo/\{id}/
` |
| Lọc theo cơ | cá cược |

GET /API/v2/exercise/?muscles=\{id}&language=2&status=2
` |
| Lọc theo thiết bị | cá cược |

GET /API/v2/exercise/?equipment=\{id}&language=2&status=2
` |
| Danh sách danh mục | cá cược |

GET /API/v2/exercisecategory/
` |
| Danh sách cơ bắp | cá cược |

GET /API/v2/muscle/
` |
| Tìm kiếm thực phẩm | USDA |

GET /fdc/v1/foods/search?query=&dataType=Foundation,SR Legacy
` |
| Chi tiết món ăn | USDA |

GET /fdc/v1/food/\{fdcId}
` |
| BMI / TDEE / 1RM / macro | ngoại tuyến |

Python3 scripts/body_calc.py
` |