| name | fat-loss-coach |
| description | 减脂教练技能。帮助用户制定并执行减脂计划,包括:初始化用户档案、创建飞书多维表格(训练/饮食/体重体脂/每日计划记录)、记录训练动作、记录饮食营养素、查询历史记录、追踪减脂进度、生成日报/周报/月报、给出重量进阶建议。当用户提到"记录训练"、"记录饮食"、"查看进度"、"体重体脂"、"减脂计划"、"训练计划"、"饮食计划"、"营养素"、"热量"、"打卡"、"日报"、"周报"、"月报"时使用此 Skill。也用于初始化新用户(无表格时自动创建)。HEARTBEAT 触发日报/周报/月报时也使用此 Skill。 |
Fat Loss Coach Skill
私人减脂教练操作手册。覆盖从用户初始化到日常记录的完整流程。
核心原则
- 表格是唯一数据源:查询记录必须调用飞书 API,不能用聊天上下文代替
- 营养素独立计算:每种食物单独算,最后加总,不按比例缩放旧数据
- 训练双表同步:训练记录(总览)+ 动作明细,必须同时写入
- 四项营养素必填:每条饮食记录热量/碳水/蛋白质/脂肪必须全部填写,不能缺失
- 日期时间戳:必须用脚本计算,禁止手动推算(见下方)
- 禁止重复追问已知信息:用户相关的训练计划、碳日安排、营养目标等信息,必须优先从飞书表格(每日计划表、训练记录表)中读取,读到了就直接用,不能反问用户"今天是什么训练日""你的目标是多少"等已经可以从表格获取的问题。只有表格中确实没有数据时,才询问用户。
- 补录数据后必须重新查表验证结论:当用户补发历史训练/饮食数据、我补录进表格后,若之前给出过任何统计结论(如"上周训练3次"),必须重新查表,用最新数据重新计算,再给出更新后的结论。不能沿用补录前的旧结论。
- ⚠️ 涉及饮食/训练记录的任何回复,必须先查表再开口:只要用户询问"进度如何"、"记录了吗"、"上周怎样"、"今天吃了什么"等任何与记录相关的问题,必须先调用 feishu_bitable_app_table_record 查询飞书表格,基于表格实际数据回答,严禁凭聊天上下文或记忆直接作答。违反此原则会让用户质疑数据是否真实记录。
日期时间戳计算
每次写入飞书表格前,必须先执行以下命令获取当天时间戳,禁止使用记忆中的时间戳或手动推算。
node -e "console.log(new Date(new Date().toLocaleDateString('en-CA', {timeZone:'Asia/Shanghai'}) + 'T00:00:00+08:00').getTime())"
这条命令会自动取当天(GMT+8)零点的毫秒时间戳,无需手动填日期。
飞书表格结构(6张表)
| 表名 | 用途 |
|---|
| 训练记录 | 每天训练总览:类型、时长、消耗热量 |
| 动作明细 | 每个动作一行:名称、组数、次数、重量 |
| 饮食记录 | 每餐一行:餐次、食物、四大营养素 |
| 体重体脂记录 | 每次测量:体重、体脂率、净肌量 |
| 每日计划 | 每天一行:碳日类型、营养目标、实际摄入(公式自动汇总)、训练消耗、净热量缺口 |
| 常吃食品库 | 用户常吃食物的营养素数据库,记录食品名称、品牌、分量、四大营养素 |
详细字段定义见 references/bitable-schema.md。
常吃食品库使用规则
- 用户提到已在食品库中的食物时,直接从常吃食品库(tblxjaZEn0SE5GnR)查询营养素数据,无需重新搜索或计算
- 查询方式:按食品名称筛选,取对应营养素数值写入饮食记录
- 若食品库中无对应数据,再用 web_search 查询,并将新数据补录入食品库
- 食品库是累积的,每次录入新食物时同步更新
流程一:初始化新用户
0. 飞书权限一次性授权
初始化第一步:引导用户完成飞书 OAuth 授权,确保后续所有操作有权限。
调用 feishu_oauth_batch_auth,一次性申请以下所有权限:
| 权限类型 | 用途 |
|---|
| 多维表格读写(bitable) | 创建表格、写入/读取训练、饮食、体重体脂、每日计划记录 |
| 消息发送(im) | 发送日报/周报/月报到飞书私聊 |
| 用户信息(contact) | 获取用户 open_id,用于消息推送 |
如果用户已授权,跳过此步。若后续 API 返回 token_expired,调用 feishu_oauth action=revoke 撤销后重新发起。
1. 收集基础数据
向用户询问:
- 性别(影响 BMR 公式)
- 身高 / 体重 / 年龄 / 当前体脂率(估算也可)
- 运动基础(无 / 偶尔 / 有规律)及训练天数、时长
- 训练节奏(如"练三休一"、具体肌群轮换顺序,如胸→背→腿→休息)
- 训练场地(健身房 / 家)
- 饮食限制
- 作息时间
2. 选择减脂方案
读取 references/diet-plans.md,推荐方案并让用户确认:
- 训练基础 < 6个月 / 新手 → 推荐方案 A(凯圣王模式)
- 训练基础 ≥ 6个月 + 执行力强 → 可选方案 B(谭成义模式)
- 体脂 > 20% → 优先方案 B
3. 计算营养目标
BMR(男)= 10×体重kg + 6.25×身高cm - 5×年龄 + 5
BMR(女)= 10×体重kg + 6.25×身高cm - 5×年龄 - 161
活动系数:久坐1.2 / 轻度1.375 / 中度1.55 / 高强度1.725
TDEE = BMR × 活动系数
按选定方案计算每类碳日的营养目标,详见 references/diet-plans.md。
4. 创建飞书多维表格
优先级:字段准确性 > 速度。确认每张表字段正确后,再进行下一步。
创建顺序
第一批(无依赖,可同时发起):
调用 feishu_bitable_app action=create,名称:[用户名] 减脂日志,获得 app_token。
然后同时创建以下 5 张表(每张带完整 fields,详见 references/bitable-schema.md):
- 训练记录(总览字段)
- 动作明细
- 饮食记录
- 体重体脂记录
- 常吃食品库(字段:食品名称、品牌/来源、分量说明、热量kcal、蛋白质g、碳水g、脂肪g、备注)
创建后立即验证:调用 feishu_bitable_app_table_field action=list 确认每张表的字段名和 field_id 与预期一致,记录下来备用。
第二批(依赖第一批的 field_id):
创建「每日计划」表:
- 先创建基础字段(日期、碳日类型、各营养目标)
- 查询各表 field_id(训练记录日期、饮食记录日期、热量/碳水/蛋白质/脂肪字段)
- 逐个创建公式字段(实际摄入汇总、差值、训练消耗、净热量缺口)
公式字段必须在引用的表和字段全部存在后才能写入,不可跳过验证步骤。
5. 预排碳日计划 + 训练记录
根据用户训练节奏,用脚本生成未来 2~4 周每天的时间戳,同时批量写入两张表:
每日计划表(tblXXX):每行写入日期 + 碳日类型 + 各营养目标
碳日映射规则:腿日→高碳日,胸/背/肩→中碳日,休息→低碳日
训练记录表(tblXXX):每行写入日期 + 训练类型(含休息日)
肌群轮换顺序按用户提供的节奏填入,如:胸日→背日→腿日→休息
两张表必须同步预排,否则日报时训练消耗公式无法正确关联。
6. 更新档案
将 app_token、各 table_id、营养方案写入 MEMORY.md。
流程二:记录训练
- 解析用户输入:训练类型、时长、动作列表
- 计算训练消耗热量(见下方规则)
- 写入训练记录表(总览),同时将「训练状态」字段更新为「已完成」
- 写入动作明细表(每个动作一行)
⚠️ 两张表必须同时写入。
训练消耗热量估算规则
优先级:用户设备数据 > 公式估算
- 若用户有心率手表并提供消耗数据:直接填写设备数据
- 若用户无设备或未提供:按以下公式估算
训练消耗(kcal) = 体重(kg) × 时长(分钟) × MET系数 / 60
MET 系数参考:
- 力量训练(一般):MET = 3.5
- 高强度力量训练(大重量、超级组):MET = 5.0
- HIIT / 循环训练:MET = 6.0
- 有氧(跑步/椭圆机等):MET = 7.0
示例:72kg × 60分钟 × 3.5 / 60 ≈ 252 kcal
- 若用户未提供时长:按默认 60 分钟估算,在日报中标注为「估算值」
- 将估算来源写入训练记录表「备注」字段,如「无设备,按体重估算」
训练状态标记规则
训练记录表包含「训练状态」字段(单选):
| 状态 | 含义 | 写入时机 |
|---|
| 待完成 | 预排计划,尚未执行 | 初始化预排时批量写入 |
| 已完成 | 用户确认完成训练 | 用户打卡/上报训练数据时更新 |
| 已跳过 | 用户主动跳过或请假 | 用户说"今天跳过"/"休息"时更新 |
日报逻辑:
- 「已完成」→ 使用实际消耗热量
- 「待完成」(当天结束仍未打卡)→ 标记为「⚠️ 未打卡,消耗计为 0」
- 「已跳过」→ 消耗计为 0,不扣分
流程三:记录饮食
每种食物独立计算营养素,最后加总。 不确定的食物用 web_search 查询。
图片识别流程(用户发送食物图片时)
收到食物图片后,按以下步骤系统性分析,提高识别准确度:
第一步:识别食材
- 逐一列出图片中所有可见食材(主食、蛋白质来源、蔬菜、酱汁/配料)
- 注意区分:颜色≠食材(红色可能是酱汁/卤汁,不一定是番茄/辣椒)
- 对不确定的食材,优先选择"最常见搭配"而非猜测
第二步:估算分量
- 主食(米饭/面条):参考碗的大小,普通碗约150-200g熟重
- 肉类:手掌大小约100g,拳头大小约150g
- 蔬菜:一般配菜约80-150g
- 外食酱汁/油:默认加算 30-50 kcal(不可见但必然存在)
- 煲仔饭/盖浇饭:米饭默认200g,除非明显更少
第三步:计算营养素
- 每种食材独立计算,最后加总
- 外食蛋白质来源(肉类)优先按实际可见量估算,不高估
- 不确定的食材用 web_search 查询每100g营养数据
常见误判提醒:
- 煲仔饭的红色酱汁 ≠ 番茄
- 炒菜的深色 ≠ 酱油(可能是老抽/蚝油)
- 白色块状 ≠ 豆腐(可能是鱼豆腐/鸡蛋白)
常用食物参考(每 100g):
- 鸡胸肉:165kcal,蛋白质31g,碳水0g,脂肪3.6g
- 米饭(熟):130kcal,蛋白质2.7g,碳水28g,脂肪0.3g
- 鸡蛋(约50g/个):72kcal,蛋白质6g,碳水0.4g,脂肪5g
写入饮食记录表(每餐一行),热量/碳水/蛋白质/脂肪四项必须全部填写。
写入后必须立即执行:
- 查每日计划表(按当天日期筛选),获取碳日类型、各营养目标、实际摄入汇总
- 直接给出当天进度:已摄入 vs 目标、各项差值
- 禁止询问"今天是什么训练日"——训练日类型从每日计划表读取,不问用户
流程四:查询记录
按日期筛选时使用:
{
"filter": {
"conjunction": "and",
"conditions": [{"field_name": "日期", "operator": "is", "value": ["ExactDate", "<毫秒时间戳>"]}]
}
}
流程五:进度追踪
用户提供体重/体脂时,写入体重体脂记录表,计算:
还需减脂 = 体重×体脂率 - 体重×目标体脂率
预计周数 = 还需减脂 ÷ 0.4kg/周
流程六:日报 / 周报 / 月报
读取 references/reports.md,查飞书表格生成报告。
- 日报:每天 21:00,包含训练/饮食/差值/进阶建议/明日碳日
- 周报:每周日 21:00
- 月报:每月最后一天 21:00
⚠️ 禁止使用 cron 任务推送主动消息。 所有主动推送(早间提醒、午间提醒、傍晚提醒等)均已废除。原因:cron 任务无法在发送前查询飞书表格,会生成无依据的通用建议,破坏用户信任。
主动推送只通过 HEARTBEAT 触发,且必须先调用 feishu_bitable_app_table_record 查当天记录,再决定发什么内容。
参考文件
references/bitable-schema.md — 6 张表字段定义、公式写法
references/diet-plans.md — 两种减脂方案(凯圣王 / 谭成义)
references/reports.md — 日报/周报/月报生成逻辑与格式
references/food-nutrition.md — 食物营养速查表(主食/蛋白质/蔬菜/水果/坚果/调味品/外食估算)
饮食记录营养素查询优先级
- 飞书常吃食品库(tblxjaZEn0SE5GnR)— 用户常吃的品牌食品,最高优先级
- food-nutrition.md(references/food-nutrition.md)— 通用食物营养数据,覆盖主食/蛋白质/蔬菜/外食估算等
- web_search — 以上两处都查不到时才使用,查到后补录入食品库