Install
openclaw skills install triathlon-ai-coach根据你的比赛目标和身体状态,智能生成并动态调整个性化每日铁人三项训练计划,支持TrainingPeaks和Garmin数据同步。
openclaw skills install triathlon-ai-coach智能生成每日训练计划,根据你的比赛目标和身体状态动态调整。
📋 今日训练复盘(数据来源:TrainingPeaks)
📅 周二 2026-04-14
✅ 完成 1/1 项计划
➕ 额外训练 Running 6.9km 36min HR139 TSS67
总距离: 6.9km | TSS: 67 | 能量: 492 kcal
💪 今天训练完成很好,保持这个节奏!
📅 周三 2026-04-15
[具体训练内容]
☀️ 天气: Patchy rain nearby | 7°C
📊 体能状态: CTL 33.1 | TSB -16.5 | 疲劳积累
💓 Garmin健康: 睡眠 56/100 | 准备度 LOW 26/100 | HRV 54ms | 压力 20.0
⚠️ 准备度过低,自动调整为休息
CookieProduction_tpAuth= 的完整 cookie 值(一长串字符串)方式A(推荐):写入文件
mkdir -p ~/.trainingpeaks
echo "你的cookie值" > ~/.trainingpeaks/cookie
chmod 600 ~/.trainingpeaks/cookie
方式B:设置环境变量
export TP_AUTH_COOKIE="你的cookie值"
⚠️ 安全提示:cookie 文件包含认证凭证,请务必设置
chmod 600限制权限,不要分享或上传到公开仓库。
python3 ~/.openclaw/workspace/skills/ai-coach/scripts/tp_client.py auth "你的cookie值"
有 TP → TP 训练数据(CTL/TSB)+ Garmin 健康
无 TP → Garmin 运动 + Garmin 健康
配置方式:在 user_config.json 中设置 garmin_email 和 garmin_password,或设置环境变量 GARMIN_EMAIL / GARMIN_PASSWORD
~/.garmin_tokens/使用方式(garth v0.2+ API):
import garth
from garminconnect import Garmin
client = Garmin()
client.garth.load("~/.garmin_tokens") # garth v0.2+ 用 garth.Client 加载目录
# 无需重新登录,直接获取数据
sleep = client.get_sleep_data(today)
readiness = client.get_training_readiness(today)
健康数据字段:
sleep_score:睡眠得分sleep_hours:睡眠时长readiness_score:训练准备度readiness_level:准备度等级 (LOW/MODERATE/HIGH)hrv:心率变异性 (ms)avg_stress:平均压力水平支持多个比赛,AI 自动选择最近比赛倒计时:
{
"races": [
{"name": "金海湖游跑两项", "date": "2026-05-17", "type": "aquathlon", "goal": "站台"}
]
}
| 阶段 | 倒计时 | 特点 |
|---|---|---|
| 基础期 | >90天 | 有氧基础 |
| 构建期 | 43-90天 | 强度增加 |
| 冲刺期 | 15-42天 | 高强度 |
| 减量期 | 1-14天 | 减量保持 |
| 恢复期 | 赛后 | 休息 |
综合评分 = 准备度(50%) + 睡眠(30%) + TSB(20%)
| 综合评分 | 强度 |
|---|---|
| >75 | 高强度 |
| 50-75 | 中等 |
| 30-50 | 低强度 |
| <30 | 休息 |
ai-coach/
├── SKILL.md
├── user_config.json # 用户配置(比赛、推送模式)
├── config.yaml # 默认配置
├── scripts/
│ ├── trainer.py # 主入口:计划生成 + 复盘(向后兼容)
│ ├── plan_engine.py # 计划生成引擎
│ ├── formatter.py # 格式化输出
│ ├── send_daily_plan.py # IMA 推送入口
│ ├── garmin_sync.py # Garmin 健康数据同步
│ └── tp_sync.py # TrainingPeaks 数据同步
└── data/
└── coach_knowledge_base.json
API 调用方式:
import json, urllib.request
headers = {
"ima-openapi-clientid": client_id, # ~/.config/ima/client_id
"ima-openapi-apikey": api_key, # ~/.config/ima/api_key
"Content-Type": "application/json"
}
data = {
"content_format": 1, # 1 = Markdown
"content": markdown_content,
"title": "训练日报 2026-04-08"
}
req = urllib.request.Request(
"https://ima.qq.com/openapi/note/v1/import_doc",
data=json.dumps(data, ensure_ascii=False).encode('utf-8'),
headers=headers,
method="POST"
)
⚠️ 注意事项:
Markdown2Json fail 错误| 模块 | 依赖 | 来源 |
|---|---|---|
| trainer.py / plan_engine.py | garminconnect, garth | pip install |
| formatter.py | 无外部依赖 | 标准库 |
| garmin_sync.py | garminconnect, garth | pip install |
⚠️ garminconnect 库 v0.2+ API 变更:不再接受
token_dir,需用garth.Client.load(目录路径)初始化。
| 日期 | Bug | 修复 |
|---|---|---|
| 2026-04-14 | 复盘日期硬编码为"周二 2026-03-24" | 改为 datetime 动态计算 |
| 2026-04-14 | garminconnect API 变更导致 Garmin 连接失败 | 改用 garth.Client.load(目录) |
| 2026-04-14 | daily_plans.json 重复记录导致复盘重复 | log_daily_plan 增加去重逻辑 |
| 2026-04-14 | CTL/TSB 小数位数过多(15位) | 保留 1 位小数 |
| 2026-04-14 | emoji 导致 IMA Markdown2Json 错误 | emoji 替换为文字 LOW/NORMAL/GOOD |
user_config.json(比赛信息、推送模式)python3 trainer.py 验证