

从一个"办了健身卡只去过五次"的办公室白领,到拥有一个 7×24 在线的专属 AI 教练——这篇文章记录了完整的构建过程。
我是个典型的办公室白领:早上 9 点坐到工位,晚上 9 点才离开,中间除了吃饭几乎不起身。颈椎僵、腰酸、小腹赘肉——标准的"久坐综合征"。
我也尝试过改变:
复盘下来,核心问题不是"不知道怎么练",而是 缺乏持续的外部监督和个性化反馈。App 的推送通知我直接划掉,视频教程不会根据我的状态调整,私教虽然好但一周见一次管不住剩下的六天。
我需要的不是一个"健身百科",而是一个 主动盯着我练的教练。
这就是 QClaw 吸引我的地方。
QClaw 是一个 Agent 运行框架,和 ChatGPT、Claude 这类对话式 AI 有本质区别:
能力 | 普通对话 AI | QClaw Agent |
|---|---|---|
对话 | 你问它答 | 你问它答 ✅ |
定时主动提醒 | ❌ | ✅ cron 系统支持任意周期任务 |
持久记忆 | ❌ 每次对话从零开始 | ✅ MEMORY.md + 每日笔记跨会话记忆 |
可扩展能力 | ❌ 固定能力 | ✅ Skills 技能插件机制 |
文件操作 | ❌ | ✅ 独立 workspace,可读写文件 |
多渠道触达 | ❌ 只能在 App 里聊 | ✅ 微信/企微/飞书/Web 多端 |
人设定制 | ❌ | ✅ SOUL.md + IDENTITY.md |
最关键的三个差异化能力:
简单起见,我们可以直接在QClaw的专家广场找到默认的专家,使用教练的对话过程如下:


运行效果如下:

QClaw 通过三个核心文件定义 Agent 身份,它们放在 Agent 的 workspace 目录下。
# IDENTITY.md
- Name: 私人健身教练
- Emoji: 🏋️
- Vibe: 不卖课不画饼,只给你一份练了就有效的计划这决定了 Agent 在 QClaw 商城里展示的名字和头像,也让用户一眼识别它的角色定位。
这是最关键的文件,决定了 Agent 的沟通风格和决策逻辑:
# SOUL.md
QClaw的智能Agent,说话简洁直接,先给结论再给论据,
不说正确的废话,不堆砌冗余修饰,
善用结构化的方式让信息一目了然。
语气像一个靠谱的朋友兼顾问——
有专业深度但不端架子,态度温和但不讨好,
该纠正就纠正,绝不编造事实。为什么这段话很重要?因为健身领域充斥着两种极端:
我要的教练风格是:先告诉你练什么,再解释为什么,不废话不兜圈子。这段 SOUL.md 就是在约束这种行为。
# AGENTS.md
## Red Lines
- Don't exfiltrate private data. Ever.
- Don't run destructive commands without asking.
- When in doubt, ask.健身场景会涉及体重、体脂率、饮食记录等隐私数据,必须明确隐私红线。AGENTS.md 就是 Agent 的"法律"。
设计原则:人设文件不要写太多,够用就好。SOUL.md 控制说话风格,IDENTITY.md 控制展示信息,AGENTS.md 控制行为边界。各自职责清晰,不要互相覆盖。
光有人设还不够,一个只会说"加油"的教练不是好教练。它需要真正的知识库。
这是 QClaw 的内置技能,提供三大核心能力:
① 动作库(wger API,690+ 动作)
# 搜索动作
curl "https://wger.de/api/v2/exercise/search/?term=dead%20bug&language=english&format=json"
# 返回结果包含:动作ID、名称、分类
# {
# "suggestions": [
# {"data": {"id": 123, "name": "Dead Bug", "category": "Core"}}
# ]
# }# 获取动作详情
curl "https://wger.de/api/v2/exerciseinfo/123/?format=json"
# 返回:目标肌群、辅助肌群、器械需求、动作描述、动作图解这意味着当用户问"死虫式怎么做"时,Agent 不会瞎编,而是从专业数据库拉取真实动作数据,翻译成中文后输出。
② 身体计算器(离线)
python3 scripts/body_calc.py bmi 70 175
# → BMI: 22.9 (正常)
python3 scripts/body_calc.py tdee 70 175 30 M 2
# → BMR: 1680 kcal | TDEE: 2016 kcal (轻度活动)
python3 scripts/body_calc.py macros 2016 cut
# → 蛋白质: 151g | 碳水: 151g | 脂肪: 56g (减脂方案)输入体重、身高、年龄、性别、活动量,就能算出 TDEE 和宏量营养素分配。用户说"我想减脂",Agent 可以直接给数字,不用含糊地说"少吃点"。
③ 营养数据(USDA FoodData Central,38万+ 食物)
python3 scripts/nutrition_search.py "chicken breast" "brown rice" "broccoli"
# 每100g数据:
# 鸡胸肉: 165 kcal | 蛋白质31g | 碳水0g | 脂肪3.6g
# 糙米: 123 kcal | 蛋白质2.7g | 碳水26g | 脂肪1g
# 西兰花: 34 kcal | 蛋白质2.8g | 碳水7g | 脂肪0.4g用户说"我午饭吃了鸡胸肉和糙米",Agent 可以精确计算热量和蛋白质摄入。
在 QClaw 中安装技能只需要一步:
用户:安装 fitness-nutrition 技能
Agent:自动调用 skillhub_install 工具,一键完成技能安装后,SKILL.md 文件会被放到 ~/.qclaw/skills/ 目录下,Agent 在需要时自动读取并执行。
我的输入很随意:
"我是一个没有锻炼基础的小白,办公室白领工作,长期伏案对着电脑,请给我一个入门的健身方案,并能监督我实施,最好以月为计划"
Agent 的输出很有条理——先给4周概览,再逐步细化。但这还不够,我说"太抽象了,难以执行",然后它就展开了每个动作的:
这才是"可执行"的计划。关键在于:不要只告诉用户"做什么",要告诉用户"怎么做"和"做不了怎么办"。
4周计划的底层逻辑:
第1周:只做仰卧/俯卧/四点跪姿动作 → 重力辅助,最安全
第2周:引入站立动作(深蹲)+ 上肢推(俯卧撑)→ 增加挑战
第3周:加入单侧训练(后撤步)+ 侧向稳定(侧平板)→ 更高维度
第4周:循环训练(多个动作连续做)→ 提升心肺+肌耐力这不是随便排的。从仰卧到站立,从双侧到单侧,从独立动作到循环组合——这是运动科学中"从稳定性到功能性"的经典进阶路径。
Agent 自动把计划写入 workspace 文件 fitness_plan_4week.md,这样:
这里有一个技术细节:QClaw 的内置 write 工具硬编码 UTF-8 无 BOM,在 Windows 上用 Excel 打开 CSV 会乱码。所以写文本文件必须走 qclaw-text-file 技能的 write_file.py 脚本,它自动处理编码和换行符适配。
这是整个方案中最有价值的部分。
我设计了两层提醒:
第一层:每日训练提醒(8:00)
第二层:办公室微运动提醒(15:00,仅工作日)
每天8:00训练提醒:
{
"action": "add",
"job": {
"name": "每日训练提醒",
"agentId": "w5w1naf9p940xgcz",
"schedule": {
"kind": "cron",
"expr": "0 8 * * *",
"tz": "Asia/Shanghai"
},
"sessionTarget": "isolated",
"payload": {
"kind": "agentTurn",
"message": "你是私人健身教练的提醒助手。今天是健身计划执行日,请用简短有力的话提醒用户:该做今天的训练了!加上一句鼓励。要求:(1) 不要回复 HEARTBEAT_OK (2) 不要调用 message 工具 (3) 直接输出提醒文字 (4) 控制在 2-3 句话以内"
},
"delivery": {"mode": "none"}
}
}工作日15:00微运动提醒:
{
"action": "add",
"job": {
"name": "办公室微运动提醒",
"agentId": "w5w1naf9p940xgcz",
"schedule": {
"kind": "cron",
"expr": "0 15 * * 1-5",
"tz": "Asia/Shanghai"
},
"sessionTarget": "isolated",
"payload": {
"kind": "agentTurn",
"message": "提醒用户做办公室微运动:站起来走动2分钟,做靠墙静蹲30秒×2组,坐姿收腹5秒×10次。简短俏皮。要求同上。"
},
"delivery": {"mode": "none"}
}
}参数 | 值 | 含义 |
|---|---|---|
|
| 使用 cron 表达式定义周期 |
|
| 分 时 日 月 星期 → 每天8:00 |
|
| 工作日15:00 |
|
| 在独立会话中执行,不打扰当前对话 |
|
| 以 Agent 身份执行,可以用 Skills |
|
| 本地渠道(webchat),直接渲染 |
坑1:delivery 的 mode 必须显式传
不要省略 delivery,也不要省略 mode。本地渠道必须传 "mode":"none",外部渠道必须传 "mode":"announce" + channel + to。
坑2:payload.message 末尾必须加行为约束
要求:(1) 不要回复 HEARTBEAT_OK (2) 不要调用 message 工具 (3) 直接输出提醒文字 (4) 控制在 2-3 句话以内不加的话,Agent 可能会调 message 工具发消息,或者输出一大段废话。这四条约束确保提醒内容简短有效。
坑3:agentId 必须传当前的
从 sessionKey 或 workspace 路径中提取当前 agentId,不要硬编码 "main"。
# 查看所有定时任务
openclaw cron list
# 临时暂停(出差/休假)
openclaw cron edit <jobId> --enabled false
# 恢复
openclaw cron edit <jobId> --enabled true
# 删除
openclaw cron remove <jobId>
# 手动触发一次(测试用)
openclaw cron run <jobId>普通 AI 每次对话从零开始,但健身是一个持续过程。如果我昨天告诉 Agent "深蹲时膝盖有点不舒服",下周它应该记住这件事,而不是让我重新描述一遍。
QClaw 的记忆系统分为两层:
① 每日笔记:memory/YYYY-MM-DD.md
② 长期记忆:MEMORY.md
# MEMORY.md
## 用户画像
- 办公室白领,长期伏案
- 零健身基础
- 颈椎和腰椎有轻微不适
- 每周能训练4天
## 训练进度
- 2026-06-18: 开始第1周训练,完成死虫式+臀桥+拉伸
- 深蹲时膝盖有轻微不适 → 调整为箱式蹲退阶版
## 饮食偏好
- 午饭经常外卖
- 不喜欢水煮鸡胸,偏好煎烤做法有了这个文件,Agent 在任何新会话中都能快速"回忆"用户状态,不需要重复询问。
Agent 在 Heartbeat(心跳轮询)时自动维护记忆:
memory/YYYY-MM-DD.md 文件MEMORY.md这就像人类定期复盘日记,把重要的经验沉淀下来。
QClaw 提供了 qclaw_tdoc_mcp_call 工具直连腾讯文档 API,没有内容长度限制:
{
"tool_name": "create_smartcanvas_by_mdx",
"arguments": {
"title": "第1周训练报告-私人教练龙虾",
"mdx": "# 第1周训练报告\n\n## 本周完成情况\n| 指标 | 目标 | 实际 |\n|------|------|------|\n| 训练次数 | 4 | 4 |\n| 动作完成率 | 100% | 92% |\n\n## 身体数据变化\n- 体重:70.5kg → 69.8kg\n- 主观感受:颈椎僵硬感减轻,睡眠质量改善\n\n## 动作反馈\n- 死虫式:能标准完成3组×8次\n- 臀桥:第3组最后2次腰部轻微拱起,需注意\n- 深蹲:改为箱式蹲后膝盖不适消失\n\n## 下周调整\n- 臀桥降低1次(3组×9次),强调腰部贴地\n- 深蹲继续箱式蹲,椅面高度降低5cm\n- 新增跪姿俯卧撑3组×6次"
}
}不要通过 mcporter CLI 传递长内容,它有长度限制,会截断。必须用 qclaw_tdoc_mcp_call 直连 HTTP,这是 QClaw 的最佳实践。
┌─────────────────────────────────────────────────┐
│ 用户 │
│ (Web / 微信 / 企微 / 飞书) │
└──────────────┬──────────────────────────────────┘
│ 对话
▼
┌─────────────────────────────────────────────────┐
│ QClaw Agent Runtime │
│ │
│ ┌──────────┐ ┌──────────┐ ┌───────────────┐ │
│ │ SOUL.md │ │IDENTITY │ │ AGENTS.md │ │
│ │ 说话风格 │ │ 身份定义 │ │ 行为边界 │ │
│ └──────────┘ └──────────┘ └───────────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ Skills 技能层 │ │
│ │ │ │
│ │ fitness-nutrition qclaw-cron-skill │ │
│ │ ├─ wger 动作库 ├─ 定时任务管理 │ │
│ │ ├─ 身体计算器 └─ 提醒消息生成 │ │
│ │ └─ USDA 营养查询 │ │
│ │ │ │
│ │ qclaw-text-file 腾讯文档 MCP │ │
│ │ ├─ 编码自适应 ├─ 智能文档写入 │ │
│ │ └─ BOM/换行处理 └─ 训练报告生成 │ │
│ └──────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ Workspace 工作区 │ │
│ │ │ │
│ │ MEMORY.md memory/ │ │
│ │ ├─ 用户画像 ├─ 2026-06-18.md │ │
│ │ ├─ 训练进度 └─ ... │ │
│ │ └─ 饮食偏好 │ │
│ │ │ │
│ │ fitness_plan_4week.md 训练计划文档 │ │
│ └──────────────────────────────────────────┘ │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ Cron 定时任务系统 │ │
│ │ │ │
│ │ 每天 8:00 → 训练提醒(isolated会话) │ │
│ │ 工作日 15:00 → 微运动提醒(isolated会话) │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘用户:我是一个没有锻炼基础的小白,办公室白领工作,长期伏案对着电脑,请给我一个入门的健身方案
Agent:先给4周概览表,按周列出每个动作名称、组数、次数。
用户:还是太抽象了,感觉难以执行,能否更加细化可行性高的方案
Agent:展开每个动作的具体步骤(1/2/3/4编号)、关键要点(加粗)、退阶方案、计时要求、热身拉伸具体动作和时间。
这两轮对话的关键洞察:第一版输出是"教练视角"(我给你排了计划),第二版才是"学员视角"(我拿到就能练)。Agent 的迭代能力比任何固定模板都强。
任务 | 触发时间 | 实际表现 |
|---|---|---|
每日训练提醒 | 8:00 | 准时触发,输出2-3句鼓励+当日训练内容 |
微运动提醒 | 15:00(工作日) | 准时触发,提醒站起来活动 |
注意:webchat 渠道的 cron 任务 delivery.mode 为 "none",意味着提醒内容直接在本地 UI 渲染,不会推送到手机。如果要推送到微信/企微,需要配置外部渠道并设置 delivery.mode = "announce"。
查询 | 结果 |
|---|---|
BMI(70kg, 175cm) | 22.9 正常 |
TDEE(70kg, 175cm, 30岁, 男, 轻度活动) | 2016 kcal |
减脂宏量(2016kcal) | 蛋白质151g / 碳水151g / 脂肪56g |
鸡胸肉营养(每100g) | 165kcal / 蛋白质31g / 脂肪3.6g |
用户拍照发来午餐,Agent 调用视觉能力识别食物 → USDA 查询营养数据 → 计算当日摄入 → 和 TDEE 目标对比 → 给出晚餐建议。
用户:"今天深蹲的时候膝盖有点不舒服"
Agent → 记录到 memory/2026-06-18.md
Agent → 下次提到深蹲时自动建议退阶版
Agent → 更新 MEMORY.md 中的健康注意事项创建一个每周一的 cron 任务,读取上周 memory/ 文件,自动生成训练报告写入腾讯文档:
{
"schedule": {"kind":"cron","expr":"0 20 * * 0","tz":"Asia/Shanghai"},
"payload": {
"kind":"agentTurn",
"message":"读取 workspace 中 memory/ 下上周的每日记录和训练计划,生成上周训练周报,写入腾讯文档。要求:统计训练次数、动作完成情况、身体变化、下周调整建议。"
}
}QClaw 支持多 Agent,未来可以:
三个 Agent 各司其职,通过 workspace 文件和 MEMORY.md 协同工作。
QClaw 的价值不在于"AI 能回答健身问题",而在于"AI 能持续陪你练下去"。
从回答问题到监督执行,从单次对话到持续陪伴,从固定模板到动态调整——这才是私人教练 Agent 该有的样子。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。