[{"data":1,"prerenderedAt":1944},["ShallowReactive",2],{"content-\u002Fzh\u002Fblog\u002Ftech\u002Fbuilding-a-personal-fitness-assistant-with-openclaw":3,"content-query-14B8ucWdh5":1080},{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"enName":10,"publishedAt":11,"tags":12,"body":14,"_type":1075,"_id":1076,"_source":1077,"_file":1078,"_stem":1079,"_extension":523},"\u002Fzh\u002Fblog\u002Ftech\u002Fbuilding-a-personal-fitness-assistant-with-openclaw","tech",false,"","用 OpenClaw 搭建个人运动助手","把“小龙虾”变成真正懂我的跑步搭档","Building-a-Personal-Fitness-Assistant-with-OpenClaw","2026-04-23",[13],"技术",{"type":15,"children":16,"toc":1057},"root",[17,25,31,36,41,45,51,56,82,87,92,95,101,115,120,132,137,142,152,161,166,169,175,180,208,213,216,222,227,240,249,262,271,281,286,450,455,458,464,469,490,513,518,529,539,544,557,642,647,656,661,664,670,675,687,697,702,707,715,720,743,748,751,757,762,767,836,841,897,902,911,916,921,924,929,934,943,948,951,956,976,985,990,995,998,1003,1008,1013,1046,1051],{"type":18,"tag":19,"props":20,"children":22},"element","h3",{"id":21},"前言",[23],{"type":24,"value":21},"text",{"type":18,"tag":26,"props":27,"children":28},"p",{},[29],{"type":24,"value":30},"最近玩了一下 OpenClaw，越用越觉得它很适合做一个长期运行的个人助手。",{"type":18,"tag":26,"props":32,"children":33},{},[34],{"type":24,"value":35},"我平时喜欢跑步和徒步，于是就冒出了一个很具体的想法：能不能把它改造成一个真正懂我的运动搭档？不只是被动回答问题，而是能主动分析我的跑步数据、帮我生成训练计划并推送到 Garmin，甚至在我跑完步之后，给我一份像教练一样的分析报告。",{"type":18,"tag":26,"props":37,"children":38},{},[39],{"type":24,"value":40},"折腾下来，我发现这件事不仅可行，而且一旦跑通，体验会非常顺手。真正的关键，不在于“让 AI 什么都自己想”，而在于把高频操作固化，把深度分析留给 AI。这样才能既省 Token，又保证实用性。",{"type":18,"tag":42,"props":43,"children":44},"hr",{},[],{"type":18,"tag":46,"props":47,"children":49},"h2",{"id":48},"硬件和工具选择",[50],{"type":24,"value":48},{"type":18,"tag":26,"props":52,"children":53},{},[54],{"type":24,"value":55},"我的配置很简单：",{"type":18,"tag":57,"props":58,"children":59},"ul",{},[60,72],{"type":18,"tag":61,"props":62,"children":63},"li",{},[64,70],{"type":18,"tag":65,"props":66,"children":67},"strong",{},[68],{"type":24,"value":69},"设备",{"type":24,"value":71},"：树莓派 5",{"type":18,"tag":61,"props":73,"children":74},{},[75,80],{"type":18,"tag":65,"props":76,"children":77},{},[78],{"type":24,"value":79},"聊天入口",{"type":24,"value":81},"：Telegram Bot",{"type":18,"tag":26,"props":83,"children":84},{},[85],{"type":24,"value":86},"树莓派 5 的优势非常适合这种场景：可以 24 小时在线运行，功耗低、噪音小，放在家里几乎没有存在感。\n而 Telegram Bot 的好处，则是可以自定义菜单按钮，交互非常直接。日常使用时，我只需要打开 Telegram，点一下菜单命令，就能立刻看到今天的健康数据、昨晚的睡眠情况，或者最近一次跑步的分析。",{"type":18,"tag":26,"props":88,"children":89},{},[90],{"type":24,"value":91},"从“可用性”来说，这一点很重要。因为运动助手不是做出来展示的，而是要真的进入日常使用。",{"type":18,"tag":42,"props":93,"children":94},{},[],{"type":18,"tag":46,"props":96,"children":98},{"id":97},"第一个坑token-消耗比想象中高得多",[99],{"type":24,"value":100},"第一个坑：Token 消耗比想象中高得多",{"type":18,"tag":26,"props":102,"children":103},{},[104,106,113],{"type":24,"value":105},"OpenClaw 默认会在 ",{"type":18,"tag":107,"props":108,"children":110},"code",{"className":109},[],[111],{"type":24,"value":112},"workspace",{"type":24,"value":114}," 目录下生成大量上下文文件，包括人格设定、用户档案、工作规则、巡检配置、会话记忆和技能模块等。问题在于，这些内容在运行时会不断被带入上下文，Token 消耗很容易迅速放大。",{"type":18,"tag":26,"props":116,"children":117},{},[118],{"type":24,"value":119},"OpenClaw 工作目录大致像这样（这些 .md 文件都会被作为上下文记忆带入查询中）：",{"type":18,"tag":121,"props":122,"children":127},"pre",{"className":123,"code":125,"language":126,"meta":7},[124],"language-bash","~\u002F.openclaw\u002Fworkspace\u002F\n├── SOUL.md          # AI 人格定义\n├── USER.md          # 用户档案\n├── AGENTS.md        # 工作规则和命令处理\n├── HEARTBEAT.md     # 主动巡检配置\n├── memory\u002F          # 每次会话的记忆文件\n│   ├── 2026-04-20-long-run-analysis.md\n│   └── 2026-04-20-weekly-training-plan.md\n└── skills\u002F          # 技能模块\n","bash",[128],{"type":18,"tag":107,"props":129,"children":130},{"__ignoreMap":7},[131],{"type":24,"value":125},{"type":18,"tag":26,"props":133,"children":134},{},[135],{"type":24,"value":136},"我一开始接的是 DeepSeek 的 API，以为成本会比较低，结果实际跑起来，几天就烧了不少钱。问题不在单次调用，而在于它面对这种“模糊任务”时，很容易进入一种高频试探状态：不断测试、不断生成临时代码、不断确认上下文。每一轮都在消耗 Token，但真正的有效产出并不高。",{"type":18,"tag":26,"props":138,"children":139},{},[140],{"type":24,"value":141},"后来我开始用 Claude 来完善我的运动助手需求，明显感觉它在这类任务上更收敛，不太会在同一个问题上来回打转，需求到代码的转换高效且清晰。当然对于 OpenClaw 日常的 API 调用还是用 DeepSeek，主要由于 DeepSeek API 价格实惠，中文好。",{"type":18,"tag":26,"props":143,"children":144},{},[145,147],{"type":24,"value":146},"这也让我意识到一个关键点：",{"type":18,"tag":65,"props":148,"children":149},{},[150],{"type":24,"value":151},"不要把高频、确定性的任务交给 AI 现想现做，而应该先把这些任务工程化。",{"type":18,"tag":153,"props":154,"children":160},"markdown-image",{"alt":155,"folder":156,"img-type":157,"img-width":158,"src":159},"DeepSeek","blog","png","80%","OpenClaw\u002FDeepSeek",[],{"type":18,"tag":26,"props":162,"children":163},{},[164],{"type":24,"value":165},"上图可以看到在前几天需求模糊情况下，使用量激增（当日最高 Token 消耗 8 千万）。在需求明确之后进入稳定的工程化任务之后，整体的使用量不到先前的 1%。",{"type":18,"tag":42,"props":167,"children":168},{},[],{"type":18,"tag":46,"props":170,"children":172},{"id":171},"核心思路三步把-openclaw-变成真正可用的运动助手",[173],{"type":24,"value":174},"核心思路：三步把 OpenClaw 变成真正可用的运动助手",{"type":18,"tag":26,"props":176,"children":177},{},[178],{"type":24,"value":179},"整个方案最后可以归纳成三步：",{"type":18,"tag":181,"props":182,"children":183},"ol",{},[184,192,200],{"type":18,"tag":61,"props":185,"children":186},{},[187],{"type":18,"tag":65,"props":188,"children":189},{},[190],{"type":24,"value":191},"把常用命令写成清晰脚本",{"type":18,"tag":61,"props":193,"children":194},{},[195],{"type":18,"tag":65,"props":196,"children":197},{},[198],{"type":24,"value":199},"把脚本包装成 OpenClaw Skill",{"type":18,"tag":61,"props":201,"children":202},{},[203],{"type":18,"tag":65,"props":204,"children":205},{},[206],{"type":24,"value":207},"把查询和分析拆开，分别处理",{"type":18,"tag":26,"props":209,"children":210},{},[211],{"type":24,"value":212},"这三步看起来简单，但基本决定了这套系统到底是“好玩”，还是“好用”。",{"type":18,"tag":42,"props":214,"children":215},{},[],{"type":18,"tag":46,"props":217,"children":219},{"id":218},"第一步把常用命令固化成脚本",[220],{"type":24,"value":221},"第一步：把常用命令固化成脚本",{"type":18,"tag":26,"props":223,"children":224},{},[225],{"type":24,"value":226},"与其每次都让 AI 临时思考“怎么获取 Garmin 数据”“怎么生成训练计划”，不如直接把这些高频操作封装成脚本。",{"type":18,"tag":26,"props":228,"children":229},{},[230,232,238],{"type":24,"value":231},"比如，我写了一个统一入口 ",{"type":18,"tag":107,"props":233,"children":235},{"className":234},[],[236],{"type":24,"value":237},"garmin_commands.py",{"type":24,"value":239},"，把最常用的健康数据和跑步查询都整理成明确命令：",{"type":18,"tag":121,"props":241,"children":244},{"className":242,"code":243,"language":126,"meta":7},[124],"# 今日健康数据\npython3 scripts\u002Fgarmin_commands.py health_data\n\n# 昨夜睡眠分析\npython3 scripts\u002Fgarmin_commands.py sleep_analysis\n\n# 最近一次跑步\npython3 scripts\u002Fgarmin_commands.py last_run\n",[245],{"type":18,"tag":107,"props":246,"children":247},{"__ignoreMap":7},[248],{"type":24,"value":243},{"type":18,"tag":26,"props":250,"children":251},{},[252,254,260],{"type":24,"value":253},"训练生成和推送，则走另一个统一入口 ",{"type":18,"tag":107,"props":255,"children":257},{"className":256},[],[258],{"type":24,"value":259},"integrated_openclaw_skill.py",{"type":24,"value":261},"：",{"type":18,"tag":121,"props":263,"children":266},{"className":264,"code":265,"language":126,"meta":7},[124],"# 生成并推送轻松跑到 Garmin Connect\npython3 ~\u002F.openclaw\u002Fworkspace\u002Fskills\u002Fgarmin-workout\u002Fscripts\u002Fintegrated_openclaw_skill.py \\\n  --command generate_and_push --args '{\"command\": \"\u002Feasy_run 8公里 明天\"}'\n",[267],{"type":18,"tag":107,"props":268,"children":269},{"__ignoreMap":7},[270],{"type":24,"value":265},{"type":18,"tag":26,"props":272,"children":273},{},[274,276],{"type":24,"value":275},"这样做的意义非常直接：\n",{"type":18,"tag":65,"props":277,"children":278},{},[279],{"type":24,"value":280},"AI 不再需要“想办法”，只需要“调用工具”。",{"type":18,"tag":26,"props":282,"children":283},{},[284],{"type":24,"value":285},"我目前支持 6 种训练类型，每种都预设了相应的结构和配速区间：",{"type":18,"tag":287,"props":288,"children":289},"table",{},[290,314],{"type":18,"tag":291,"props":292,"children":293},"thead",{},[294],{"type":18,"tag":295,"props":296,"children":297},"tr",{},[298,304,309],{"type":18,"tag":299,"props":300,"children":301},"th",{},[302],{"type":24,"value":303},"命令",{"type":18,"tag":299,"props":305,"children":306},{},[307],{"type":24,"value":308},"类型",{"type":18,"tag":299,"props":310,"children":311},{},[312],{"type":24,"value":313},"结构",{"type":18,"tag":315,"props":316,"children":317},"tbody",{},[318,341,363,385,407,429],{"type":18,"tag":295,"props":319,"children":320},{},[321,331,336],{"type":18,"tag":322,"props":323,"children":324},"td",{},[325],{"type":18,"tag":107,"props":326,"children":328},{"className":327},[],[329],{"type":24,"value":330},"\u002Feasy_run",{"type":18,"tag":322,"props":332,"children":333},{},[334],{"type":24,"value":335},"轻松跑",{"type":18,"tag":322,"props":337,"children":338},{},[339],{"type":24,"value":340},"热身 → 主跑 @6:30–7:00\u002Fkm → 放松",{"type":18,"tag":295,"props":342,"children":343},{},[344,353,358],{"type":18,"tag":322,"props":345,"children":346},{},[347],{"type":18,"tag":107,"props":348,"children":350},{"className":349},[],[351],{"type":24,"value":352},"\u002Ftempo_run",{"type":18,"tag":322,"props":354,"children":355},{},[356],{"type":24,"value":357},"节奏跑",{"type":18,"tag":322,"props":359,"children":360},{},[361],{"type":24,"value":362},"热身 → 主跑 @5:20–5:40\u002Fkm → 放松",{"type":18,"tag":295,"props":364,"children":365},{},[366,375,380],{"type":18,"tag":322,"props":367,"children":368},{},[369],{"type":18,"tag":107,"props":370,"children":372},{"className":371},[],[373],{"type":24,"value":374},"\u002Flong_run",{"type":18,"tag":322,"props":376,"children":377},{},[378],{"type":24,"value":379},"长距离跑",{"type":18,"tag":322,"props":381,"children":382},{},[383],{"type":24,"value":384},"热身 → 主跑 @5:50–6:10\u002Fkm → 放松",{"type":18,"tag":295,"props":386,"children":387},{},[388,397,402],{"type":18,"tag":322,"props":389,"children":390},{},[391],{"type":18,"tag":107,"props":392,"children":394},{"className":393},[],[395],{"type":24,"value":396},"\u002Finterval_run",{"type":18,"tag":322,"props":398,"children":399},{},[400],{"type":24,"value":401},"间歇跑",{"type":18,"tag":322,"props":403,"children":404},{},[405],{"type":24,"value":406},"热身 → repeat 结构 → 放松",{"type":18,"tag":295,"props":408,"children":409},{},[410,419,424],{"type":18,"tag":322,"props":411,"children":412},{},[413],{"type":18,"tag":107,"props":414,"children":416},{"className":415},[],[417],{"type":24,"value":418},"\u002Frecovery_run",{"type":18,"tag":322,"props":420,"children":421},{},[422],{"type":24,"value":423},"恢复跑",{"type":18,"tag":322,"props":425,"children":426},{},[427],{"type":24,"value":428},"热身 → 主跑 @7:15–7:45\u002Fkm → 放松",{"type":18,"tag":295,"props":430,"children":431},{},[432,441,446],{"type":18,"tag":322,"props":433,"children":434},{},[435],{"type":18,"tag":107,"props":436,"children":438},{"className":437},[],[439],{"type":24,"value":440},"\u002Ffartlek_run",{"type":18,"tag":322,"props":442,"children":443},{},[444],{"type":24,"value":445},"法特莱克",{"type":18,"tag":322,"props":447,"children":448},{},[449],{"type":24,"value":406},{"type":18,"tag":26,"props":451,"children":452},{},[453],{"type":24,"value":454},"这一步完成之后，很多日常命令的响应速度可以控制在几秒内，而且几乎不再额外消耗推理成本。",{"type":18,"tag":42,"props":456,"children":457},{},[],{"type":18,"tag":46,"props":459,"children":461},{"id":460},"第二步把脚本包装成-openclaw-skill",[462],{"type":24,"value":463},"第二步：把脚本包装成 OpenClaw Skill",{"type":18,"tag":26,"props":465,"children":466},{},[467],{"type":24,"value":468},"只有脚本还不够。真正让这套系统稳定运行的关键，是把它们包装成 OpenClaw 的 Skill。",{"type":18,"tag":26,"props":470,"children":471},{},[472,474,480,482,488],{"type":24,"value":473},"Skill 的核心是一个 ",{"type":18,"tag":107,"props":475,"children":477},{"className":476},[],[478],{"type":24,"value":479},"SKILL.md",{"type":24,"value":481}," 文件，放在 ",{"type":18,"tag":107,"props":483,"children":485},{"className":484},[],[486],{"type":24,"value":487},"skills\u002Fgarmin-workout\u002F",{"type":24,"value":489}," 目录下。它本质上是在告诉 AI：",{"type":18,"tag":57,"props":491,"children":492},{},[493,498,503,508],{"type":18,"tag":61,"props":494,"children":495},{},[496],{"type":24,"value":497},"这个技能是做什么的",{"type":18,"tag":61,"props":499,"children":500},{},[501],{"type":24,"value":502},"遇到什么需求时应该调用它",{"type":18,"tag":61,"props":504,"children":505},{},[506],{"type":24,"value":507},"调用的命令应该长什么样",{"type":18,"tag":61,"props":509,"children":510},{},[511],{"type":24,"value":512},"参数怎么传",{"type":18,"tag":26,"props":514,"children":515},{},[516],{"type":24,"value":517},"例如：",{"type":18,"tag":121,"props":519,"children":524},{"className":520,"code":522,"language":523,"meta":7},[521],"language-md","---\nname: garmin-workout\ndescription: Garmin Connect 训练集成。用户询问训练计划、推送训练到 Garmin、\n             查询健康数据（睡眠\u002FVO2 Max\u002F心率\u002F身体电量）时使用。\n             覆盖全部 6 种训练类型。需要 python3 和 garminconnect。\n---\n","md",[525],{"type":18,"tag":107,"props":526,"children":527},{"__ignoreMap":7},[528],{"type":24,"value":522},{"type":18,"tag":26,"props":530,"children":531},{},[532,534],{"type":24,"value":533},"这一层非常重要，因为它解决了一个现实问题：\n",{"type":18,"tag":65,"props":535,"children":536},{},[537],{"type":24,"value":538},"AI 重启之后，不能靠“记得”来工作，只能靠“结构化入口”来工作。",{"type":18,"tag":26,"props":540,"children":541},{},[542],{"type":24,"value":543},"脚本放在那里，只是工具存在；\nSkill 写清楚之后，AI 才真正知道什么时候该用、怎么用。",{"type":18,"tag":26,"props":545,"children":546},{},[547,549,555],{"type":24,"value":548},"同时，我还在 ",{"type":18,"tag":107,"props":550,"children":552},{"className":551},[],[553],{"type":24,"value":554},"AGENTS.md",{"type":24,"value":556}," 里把 Telegram 命令和具体执行脚本做了映射，例如：",{"type":18,"tag":287,"props":558,"children":559},{},[560,576],{"type":18,"tag":291,"props":561,"children":562},{},[563],{"type":18,"tag":295,"props":564,"children":565},{},[566,571],{"type":18,"tag":299,"props":567,"children":568},{},[569],{"type":24,"value":570},"Telegram 命令",{"type":18,"tag":299,"props":572,"children":573},{},[574],{"type":24,"value":575},"执行脚本",{"type":18,"tag":315,"props":577,"children":578},{},[579,600,621],{"type":18,"tag":295,"props":580,"children":581},{},[582,591],{"type":18,"tag":322,"props":583,"children":584},{},[585],{"type":18,"tag":107,"props":586,"children":588},{"className":587},[],[589],{"type":24,"value":590},"\u002Flast_run",{"type":18,"tag":322,"props":592,"children":593},{},[594],{"type":18,"tag":107,"props":595,"children":597},{"className":596},[],[598],{"type":24,"value":599},"python3 ...\u002Fgarmin_commands.py last_run",{"type":18,"tag":295,"props":601,"children":602},{},[603,612],{"type":18,"tag":322,"props":604,"children":605},{},[606],{"type":18,"tag":107,"props":607,"children":609},{"className":608},[],[610],{"type":24,"value":611},"\u002Fsleep_analysis",{"type":18,"tag":322,"props":613,"children":614},{},[615],{"type":18,"tag":107,"props":616,"children":618},{"className":617},[],[619],{"type":24,"value":620},"python3 ...\u002Fgarmin_commands.py sleep_analysis",{"type":18,"tag":295,"props":622,"children":623},{},[624,633],{"type":18,"tag":322,"props":625,"children":626},{},[627],{"type":18,"tag":107,"props":628,"children":630},{"className":629},[],[631],{"type":24,"value":632},"\u002Feasy_run 8km 明天",{"type":18,"tag":322,"props":634,"children":635},{},[636],{"type":18,"tag":107,"props":637,"children":639},{"className":638},[],[640],{"type":24,"value":641},"integrated_openclaw_skill.py --command generate_and_push ...",{"type":18,"tag":26,"props":643,"children":644},{},[645],{"type":24,"value":646},"规则也尽量写得很直接：",{"type":18,"tag":648,"props":649,"children":650},"blockquote",{},[651],{"type":18,"tag":26,"props":652,"children":653},{},[654],{"type":24,"value":655},"收到这些命令后，立即运行对应脚本并原样返回输出；不要再追问用户想要什么数据，也不要临时生成探索性代码。",{"type":18,"tag":26,"props":657,"children":658},{},[659],{"type":24,"value":660},"这样做之后，整个系统的行为会稳定很多：不绕路、不试探、不反复确认，直接执行。",{"type":18,"tag":42,"props":662,"children":663},{},[],{"type":18,"tag":46,"props":665,"children":667},{"id":666},"第三步保留-ai-的深度分析能力",[668],{"type":24,"value":669},"第三步：保留 AI 的深度分析能力",{"type":18,"tag":26,"props":671,"children":672},{},[673],{"type":24,"value":674},"把高频任务都脚本化，并不意味着放弃 AI 的价值。恰恰相反，真正值得让 AI 出场的，是“分析”，而不是“查数据”。",{"type":18,"tag":26,"props":676,"children":677},{},[678,680,685],{"type":24,"value":679},"例如，我跑完步之后，先发一个 ",{"type":18,"tag":107,"props":681,"children":683},{"className":682},[],[684],{"type":24,"value":590},{"type":24,"value":686},"，先拿到结构化数据摘要：",{"type":18,"tag":121,"props":688,"children":692},{"className":689,"code":691,"language":24,"meta":7},[690],"language-text","🏃 2026-04-21 跑步数据\n\n📋 Xuhui - 节奏跑 5.0km_2026-04-21\n\n📏 距离: 5.09 km\n⏱️ 用时: 33分钟\n⚡ 均速: 6:30\u002Fkm\n\n🚀 最快1km: 5:38\n🚀 最快5km: 32:19\n\n💓 均心率: 139 bpm\n🔴 最大心率: 162 bpm\n\n📊 心率区间:\nZ1 热身: 0分钟 (1%)\nZ2 有氧: 6分钟 (20%)\nZ3 阈值: 23分钟 (70%)\nZ4 无氧: 2分钟 (9%)\n\n👟 步频: 174 spm\n⛰️ 爬升: 16 m\n🔥 消耗: 302 kcal\n🔋 体能消耗: 9 点\n\n📈 有氧效果: 3.0\n\n🐸 好好分析，跑得更快！\n",[693],{"type":18,"tag":107,"props":694,"children":695},{"__ignoreMap":7},[696],{"type":24,"value":691},{"type":18,"tag":26,"props":698,"children":699},{},[700],{"type":24,"value":701},"这一阶段只是脚本执行，几乎不消耗什么 Token。\n如果我接着追问：“这次跑得怎么样？下次该怎么调整？”这时才让 AI 进入分析模式。",{"type":18,"tag":26,"props":703,"children":704},{},[705],{"type":24,"value":706},"它就可以基于心率区间、配速控制、步频、有氧效果等指标，给出更像真人教练的建议，比如：",{"type":18,"tag":648,"props":708,"children":709},{},[710],{"type":18,"tag":26,"props":711,"children":712},{},[713],{"type":24,"value":714},"相比4月17日节奏跑（7:03\u002Fkm，HR132）：配速提升33秒\u002Fkm；\n心率从132→139 bpm：强度适当增加；\n训练效果从2.8→3.0：进步明显",{"type":18,"tag":26,"props":716,"children":717},{},[718],{"type":24,"value":719},"我后来越来越觉得，这种“两步走”设计特别关键：",{"type":18,"tag":57,"props":721,"children":722},{},[723,733],{"type":18,"tag":61,"props":724,"children":725},{},[726,731],{"type":18,"tag":65,"props":727,"children":728},{},[729],{"type":24,"value":730},"查询",{"type":24,"value":732},"走脚本：快、稳、省 Token",{"type":18,"tag":61,"props":734,"children":735},{},[736,741],{"type":18,"tag":65,"props":737,"children":738},{},[739],{"type":24,"value":740},"分析",{"type":24,"value":742},"走 AI：慢一点没关系，但要有质量",{"type":18,"tag":26,"props":744,"children":745},{},[746],{"type":24,"value":747},"也正因为做了这层拆分，这套系统才真正兼顾了日常可用性和 AI 的价值。",{"type":18,"tag":42,"props":749,"children":750},{},[],{"type":18,"tag":46,"props":752,"children":754},{"id":753},"实际使用体验它开始像一个真正的日常助手",[755],{"type":24,"value":756},"实际使用体验：它开始像一个真正的日常助手",{"type":18,"tag":26,"props":758,"children":759},{},[760],{"type":24,"value":761},"现在我的 Telegram 菜单里大致有这些命令。",{"type":18,"tag":19,"props":763,"children":765},{"id":764},"训练相关",[766],{"type":24,"value":764},{"type":18,"tag":57,"props":768,"children":769},{},[770,781,792,803,814,825],{"type":18,"tag":61,"props":771,"children":772},{},[773,779],{"type":18,"tag":107,"props":774,"children":776},{"className":775},[],[777],{"type":24,"value":778},"\u002Ftraining_plan",{"type":24,"value":780}," —— 查看接下来一周的训练计划",{"type":18,"tag":61,"props":782,"children":783},{},[784,790],{"type":18,"tag":107,"props":785,"children":787},{"className":786},[],[788],{"type":24,"value":789},"\u002Feasy_run 5km 今天",{"type":24,"value":791}," —— 生成轻松跑并推送到 Garmin",{"type":18,"tag":61,"props":793,"children":794},{},[795,801],{"type":18,"tag":107,"props":796,"children":798},{"className":797},[],[799],{"type":24,"value":800},"\u002Ftempo_run 8km 明天",{"type":24,"value":802}," —— 生成节奏跑",{"type":18,"tag":61,"props":804,"children":805},{},[806,812],{"type":18,"tag":107,"props":807,"children":809},{"className":808},[],[810],{"type":24,"value":811},"\u002Flong_run 10km 周末",{"type":24,"value":813}," —— 生成长距离训练",{"type":18,"tag":61,"props":815,"children":816},{},[817,823],{"type":18,"tag":107,"props":818,"children":820},{"className":819},[],[821],{"type":24,"value":822},"\u002Finterval_run 今天",{"type":24,"value":824}," —— 生成间歇跑",{"type":18,"tag":61,"props":826,"children":827},{},[828,834],{"type":18,"tag":107,"props":829,"children":831},{"className":830},[],[832],{"type":24,"value":833},"\u002Fgarmin_workouts",{"type":24,"value":835}," —— 查看本周已排期训练",{"type":18,"tag":19,"props":837,"children":839},{"id":838},"健康数据相关",[840],{"type":24,"value":838},{"type":18,"tag":57,"props":842,"children":843},{},[844,855,865,875,886],{"type":18,"tag":61,"props":845,"children":846},{},[847,853],{"type":18,"tag":107,"props":848,"children":850},{"className":849},[],[851],{"type":24,"value":852},"\u002Fhealth_data",{"type":24,"value":854}," —— 今日健康总览",{"type":18,"tag":61,"props":856,"children":857},{},[858,863],{"type":18,"tag":107,"props":859,"children":861},{"className":860},[],[862],{"type":24,"value":611},{"type":24,"value":864}," —— 昨夜睡眠分析",{"type":18,"tag":61,"props":866,"children":867},{},[868,873],{"type":18,"tag":107,"props":869,"children":871},{"className":870},[],[872],{"type":24,"value":590},{"type":24,"value":874}," —— 最近一次跑步分析",{"type":18,"tag":61,"props":876,"children":877},{},[878,884],{"type":18,"tag":107,"props":879,"children":881},{"className":880},[],[882],{"type":24,"value":883},"\u002Frunning_stats",{"type":24,"value":885}," —— 过去 7 天跑步统计",{"type":18,"tag":61,"props":887,"children":888},{},[889,895],{"type":18,"tag":107,"props":890,"children":892},{"className":891},[],[893],{"type":24,"value":894},"\u002Fbody_battery",{"type":24,"value":896}," —— 今日身体电量",{"type":18,"tag":26,"props":898,"children":899},{},[900],{"type":24,"value":901},"比如我发一条：",{"type":18,"tag":121,"props":903,"children":906},{"className":904,"code":905,"language":24,"meta":7},[690],"\u002Feasy_run 8公里 明天\n",[907],{"type":18,"tag":107,"props":908,"children":909},{"__ignoreMap":7},[910],{"type":24,"value":905},{"type":18,"tag":26,"props":912,"children":913},{},[914],{"type":24,"value":915},"几秒钟之后，Garmin Connect 的日历里就会多出一条明天的训练安排，包含热身、主跑和放松三段结构，对应的配速目标也都已经设好。",{"type":18,"tag":26,"props":917,"children":918},{},[919],{"type":24,"value":920},"这种感觉很不一样。因为它不再只是“你问我答”的聊天工具，而开始变成一个真的能执行动作的个人运动助手。",{"type":18,"tag":42,"props":922,"children":923},{},[],{"type":18,"tag":46,"props":925,"children":927},{"id":926},"当前目录结构",[928],{"type":24,"value":926},{"type":18,"tag":26,"props":930,"children":931},{},[932],{"type":24,"value":933},"整个项目目前大致是这样的：",{"type":18,"tag":121,"props":935,"children":938},{"className":936,"code":937,"language":126,"meta":7},[124],"~\u002F.openclaw\u002Fworkspace\u002F\n├── AGENTS.md          # Telegram 命令处理规则（核心）\n├── SOUL.md            # AI 人格定义\n├── USER.md            # 用户信息\n├── HEARTBEAT.md       # 主动巡检任务\n├── scripts\u002F\n│   └── garmin_commands.py    # 健康数据统一入口\n├── memory\u002F\n│   ├── 2026-04-20-long-run-analysis.md\n│   └── 2026-04-20-weekly-training-plan.md\n└── skills\u002F\n    └── garmin-workout\u002F\n        ├── SKILL.md                   # 技能描述（AI 的入口）\n        ├── scripts\u002F\n        │   ├── integrated_openclaw_skill.py  # 训练生成 + 推送\n        │   ├── garmin_auth.py                # 认证管理\n        │   ├── generate_workout.py           # 生成训练 JSON\n        │   ├── fitcoach_simple.py            # FitCoach AI 规划\n        │   └── ...\n        └── workouts_template\u002F\n            ├── easy_run_5km.json\n            ├── tempo_run_5km.json\n            ├── long_run_10km.json\n            └── ...\n",[939],{"type":18,"tag":107,"props":940,"children":941},{"__ignoreMap":7},[942],{"type":24,"value":937},{"type":18,"tag":26,"props":944,"children":945},{},[946],{"type":24,"value":947},"从工程角度看，这种结构的优点也很明显：职责清晰、便于维护，也方便以后继续扩展更多训练类型或健康指标。",{"type":18,"tag":42,"props":949,"children":950},{},[],{"type":18,"tag":46,"props":952,"children":954},{"id":953},"备份也要提前想好",[955],{"type":24,"value":953},{"type":18,"tag":26,"props":957,"children":958},{},[959,961,967,969,974],{"type":24,"value":960},"OpenClaw 的配置、记忆和技能，基本都集中在 ",{"type":18,"tag":107,"props":962,"children":964},{"className":963},[],[965],{"type":24,"value":966},"~\u002F.openclaw",{"type":24,"value":968}," 目录下。所以最简单直接的做法，就是定期备份整个目录，或者至少备份 ",{"type":18,"tag":107,"props":970,"children":972},{"className":971},[],[973],{"type":24,"value":112},{"type":24,"value":975},"。",{"type":18,"tag":121,"props":977,"children":980},{"className":978,"code":979,"language":126,"meta":7},[124],"# 备份整个 openclaw 配置\ntar -czf openclaw_backup_$(date +%Y%m%d).tar.gz ~\u002F.openclaw\n\n# 或者只备份 workspace（技能、脚本、记忆）\ntar -czf workspace_backup_$(date +%Y%m%d).tar.gz ~\u002F.openclaw\u002Fworkspace\n",[981],{"type":18,"tag":107,"props":982,"children":983},{"__ignoreMap":7},[984],{"type":24,"value":979},{"type":18,"tag":26,"props":986,"children":987},{},[988],{"type":24,"value":989},"再加一个 cron 定时任务，每天自动同步到外部存储或云端，就能把风险降到比较低。这样即使以后 SD 卡损坏，训练记忆、Skill 配置、Telegram 菜单设置这些关键内容也都能比较快地恢复。",{"type":18,"tag":26,"props":991,"children":992},{},[993],{"type":24,"value":994},"对于这种长期运行的个人助手来说，备份不是“以后再说”的事，而应该从一开始就纳入方案设计。",{"type":18,"tag":42,"props":996,"children":997},{},[],{"type":18,"tag":46,"props":999,"children":1001},{"id":1000},"总结",[1002],{"type":24,"value":1000},{"type":18,"tag":26,"props":1004,"children":1005},{},[1006],{"type":24,"value":1007},"这次折腾 OpenClaw，我最大的感受是：\n想把它做成一个真正好用的个人运动助手，关键不在于让 AI 更“聪明”，而在于让系统分工更清楚。",{"type":18,"tag":26,"props":1009,"children":1010},{},[1011],{"type":24,"value":1012},"核心思路其实很简单：",{"type":18,"tag":57,"props":1014,"children":1015},{},[1016,1026,1036],{"type":18,"tag":61,"props":1017,"children":1018},{},[1019,1024],{"type":18,"tag":65,"props":1020,"children":1021},{},[1022],{"type":24,"value":1023},"把高频操作固化成脚本",{"type":24,"value":1025},"：Garmin 查询、训练生成这类确定性任务，直接调用，不交给 AI 即兴发挥",{"type":18,"tag":61,"props":1027,"children":1028},{},[1029,1034],{"type":18,"tag":65,"props":1030,"children":1031},{},[1032],{"type":24,"value":1033},"用 Skill 持久化入口",{"type":24,"value":1035},"：让 AI 每次启动后都知道工具在哪里、什么时候该调用",{"type":18,"tag":61,"props":1037,"children":1038},{},[1039,1044],{"type":18,"tag":65,"props":1040,"children":1041},{},[1042],{"type":24,"value":1043},"把查询和分析拆开",{"type":24,"value":1045},"：日常查数据走脚本，深度建议才交给 AI",{"type":18,"tag":26,"props":1047,"children":1048},{},[1049],{"type":24,"value":1050},"当树莓派 24 小时在线，Telegram 成为交互入口，Garmin 负责训练落地之后，这整套系统就不再只是一个“能聊天的 AI”，而更像一个真正融入日常生活的运动搭档。",{"type":18,"tag":153,"props":1052,"children":1056},{"alt":1053,"folder":156,"img-type":157,"img-width":1054,"src":1055},"OpenClaw Chat","100%","OpenClaw\u002FOpenClaw-Chat",[],{"title":7,"searchDepth":1058,"depth":1058,"links":1059},2,[1060,1062,1063,1064,1065,1066,1067,1068,1072,1073,1074],{"id":21,"depth":1061,"text":21},3,{"id":48,"depth":1058,"text":48},{"id":97,"depth":1058,"text":100},{"id":171,"depth":1058,"text":174},{"id":218,"depth":1058,"text":221},{"id":460,"depth":1058,"text":463},{"id":666,"depth":1058,"text":669},{"id":753,"depth":1058,"text":756,"children":1069},[1070,1071],{"id":764,"depth":1061,"text":764},{"id":838,"depth":1061,"text":838},{"id":926,"depth":1058,"text":926},{"id":953,"depth":1058,"text":953},{"id":1000,"depth":1058,"text":1000},"markdown","content:zh:blog:5.Tech:Building-a-Personal-Fitness-Assistant-with-OpenClaw.md","content","zh\u002Fblog\u002F5.Tech\u002FBuilding-a-Personal-Fitness-Assistant-with-OpenClaw.md","zh\u002Fblog\u002F5.Tech\u002FBuilding-a-Personal-Fitness-Assistant-with-OpenClaw",{"_path":4,"_dir":5,"_draft":6,"_partial":6,"_locale":7,"title":8,"description":9,"enName":10,"publishedAt":11,"tags":1081,"body":1082,"_type":1075,"_id":1076,"_source":1077,"_file":1078,"_stem":1079,"_extension":523},[13],{"type":15,"children":1083,"toc":1928},[1084,1088,1092,1096,1100,1103,1107,1111,1130,1134,1138,1141,1145,1155,1159,1167,1171,1175,1183,1186,1190,1193,1197,1201,1225,1229,1232,1236,1240,1250,1258,1268,1276,1284,1288,1426,1430,1433,1437,1441,1457,1476,1480,1488,1496,1500,1510,1587,1591,1598,1602,1605,1609,1613,1623,1631,1635,1639,1646,1650,1669,1673,1676,1680,1684,1688,1745,1749,1797,1801,1809,1813,1817,1820,1824,1828,1836,1840,1843,1847,1863,1871,1875,1879,1882,1886,1890,1894,1921,1925],{"type":18,"tag":19,"props":1085,"children":1086},{"id":21},[1087],{"type":24,"value":21},{"type":18,"tag":26,"props":1089,"children":1090},{},[1091],{"type":24,"value":30},{"type":18,"tag":26,"props":1093,"children":1094},{},[1095],{"type":24,"value":35},{"type":18,"tag":26,"props":1097,"children":1098},{},[1099],{"type":24,"value":40},{"type":18,"tag":42,"props":1101,"children":1102},{},[],{"type":18,"tag":46,"props":1104,"children":1105},{"id":48},[1106],{"type":24,"value":48},{"type":18,"tag":26,"props":1108,"children":1109},{},[1110],{"type":24,"value":55},{"type":18,"tag":57,"props":1112,"children":1113},{},[1114,1122],{"type":18,"tag":61,"props":1115,"children":1116},{},[1117,1121],{"type":18,"tag":65,"props":1118,"children":1119},{},[1120],{"type":24,"value":69},{"type":24,"value":71},{"type":18,"tag":61,"props":1123,"children":1124},{},[1125,1129],{"type":18,"tag":65,"props":1126,"children":1127},{},[1128],{"type":24,"value":79},{"type":24,"value":81},{"type":18,"tag":26,"props":1131,"children":1132},{},[1133],{"type":24,"value":86},{"type":18,"tag":26,"props":1135,"children":1136},{},[1137],{"type":24,"value":91},{"type":18,"tag":42,"props":1139,"children":1140},{},[],{"type":18,"tag":46,"props":1142,"children":1143},{"id":97},[1144],{"type":24,"value":100},{"type":18,"tag":26,"props":1146,"children":1147},{},[1148,1149,1154],{"type":24,"value":105},{"type":18,"tag":107,"props":1150,"children":1152},{"className":1151},[],[1153],{"type":24,"value":112},{"type":24,"value":114},{"type":18,"tag":26,"props":1156,"children":1157},{},[1158],{"type":24,"value":119},{"type":18,"tag":121,"props":1160,"children":1162},{"className":1161,"code":125,"language":126,"meta":7},[124],[1163],{"type":18,"tag":107,"props":1164,"children":1165},{"__ignoreMap":7},[1166],{"type":24,"value":125},{"type":18,"tag":26,"props":1168,"children":1169},{},[1170],{"type":24,"value":136},{"type":18,"tag":26,"props":1172,"children":1173},{},[1174],{"type":24,"value":141},{"type":18,"tag":26,"props":1176,"children":1177},{},[1178,1179],{"type":24,"value":146},{"type":18,"tag":65,"props":1180,"children":1181},{},[1182],{"type":24,"value":151},{"type":18,"tag":153,"props":1184,"children":1185},{"alt":155,"folder":156,"img-type":157,"img-width":158,"src":159},[],{"type":18,"tag":26,"props":1187,"children":1188},{},[1189],{"type":24,"value":165},{"type":18,"tag":42,"props":1191,"children":1192},{},[],{"type":18,"tag":46,"props":1194,"children":1195},{"id":171},[1196],{"type":24,"value":174},{"type":18,"tag":26,"props":1198,"children":1199},{},[1200],{"type":24,"value":179},{"type":18,"tag":181,"props":1202,"children":1203},{},[1204,1211,1218],{"type":18,"tag":61,"props":1205,"children":1206},{},[1207],{"type":18,"tag":65,"props":1208,"children":1209},{},[1210],{"type":24,"value":191},{"type":18,"tag":61,"props":1212,"children":1213},{},[1214],{"type":18,"tag":65,"props":1215,"children":1216},{},[1217],{"type":24,"value":199},{"type":18,"tag":61,"props":1219,"children":1220},{},[1221],{"type":18,"tag":65,"props":1222,"children":1223},{},[1224],{"type":24,"value":207},{"type":18,"tag":26,"props":1226,"children":1227},{},[1228],{"type":24,"value":212},{"type":18,"tag":42,"props":1230,"children":1231},{},[],{"type":18,"tag":46,"props":1233,"children":1234},{"id":218},[1235],{"type":24,"value":221},{"type":18,"tag":26,"props":1237,"children":1238},{},[1239],{"type":24,"value":226},{"type":18,"tag":26,"props":1241,"children":1242},{},[1243,1244,1249],{"type":24,"value":231},{"type":18,"tag":107,"props":1245,"children":1247},{"className":1246},[],[1248],{"type":24,"value":237},{"type":24,"value":239},{"type":18,"tag":121,"props":1251,"children":1253},{"className":1252,"code":243,"language":126,"meta":7},[124],[1254],{"type":18,"tag":107,"props":1255,"children":1256},{"__ignoreMap":7},[1257],{"type":24,"value":243},{"type":18,"tag":26,"props":1259,"children":1260},{},[1261,1262,1267],{"type":24,"value":253},{"type":18,"tag":107,"props":1263,"children":1265},{"className":1264},[],[1266],{"type":24,"value":259},{"type":24,"value":261},{"type":18,"tag":121,"props":1269,"children":1271},{"className":1270,"code":265,"language":126,"meta":7},[124],[1272],{"type":18,"tag":107,"props":1273,"children":1274},{"__ignoreMap":7},[1275],{"type":24,"value":265},{"type":18,"tag":26,"props":1277,"children":1278},{},[1279,1280],{"type":24,"value":275},{"type":18,"tag":65,"props":1281,"children":1282},{},[1283],{"type":24,"value":280},{"type":18,"tag":26,"props":1285,"children":1286},{},[1287],{"type":24,"value":285},{"type":18,"tag":287,"props":1289,"children":1290},{},[1291,1309],{"type":18,"tag":291,"props":1292,"children":1293},{},[1294],{"type":18,"tag":295,"props":1295,"children":1296},{},[1297,1301,1305],{"type":18,"tag":299,"props":1298,"children":1299},{},[1300],{"type":24,"value":303},{"type":18,"tag":299,"props":1302,"children":1303},{},[1304],{"type":24,"value":308},{"type":18,"tag":299,"props":1306,"children":1307},{},[1308],{"type":24,"value":313},{"type":18,"tag":315,"props":1310,"children":1311},{},[1312,1331,1350,1369,1388,1407],{"type":18,"tag":295,"props":1313,"children":1314},{},[1315,1323,1327],{"type":18,"tag":322,"props":1316,"children":1317},{},[1318],{"type":18,"tag":107,"props":1319,"children":1321},{"className":1320},[],[1322],{"type":24,"value":330},{"type":18,"tag":322,"props":1324,"children":1325},{},[1326],{"type":24,"value":335},{"type":18,"tag":322,"props":1328,"children":1329},{},[1330],{"type":24,"value":340},{"type":18,"tag":295,"props":1332,"children":1333},{},[1334,1342,1346],{"type":18,"tag":322,"props":1335,"children":1336},{},[1337],{"type":18,"tag":107,"props":1338,"children":1340},{"className":1339},[],[1341],{"type":24,"value":352},{"type":18,"tag":322,"props":1343,"children":1344},{},[1345],{"type":24,"value":357},{"type":18,"tag":322,"props":1347,"children":1348},{},[1349],{"type":24,"value":362},{"type":18,"tag":295,"props":1351,"children":1352},{},[1353,1361,1365],{"type":18,"tag":322,"props":1354,"children":1355},{},[1356],{"type":18,"tag":107,"props":1357,"children":1359},{"className":1358},[],[1360],{"type":24,"value":374},{"type":18,"tag":322,"props":1362,"children":1363},{},[1364],{"type":24,"value":379},{"type":18,"tag":322,"props":1366,"children":1367},{},[1368],{"type":24,"value":384},{"type":18,"tag":295,"props":1370,"children":1371},{},[1372,1380,1384],{"type":18,"tag":322,"props":1373,"children":1374},{},[1375],{"type":18,"tag":107,"props":1376,"children":1378},{"className":1377},[],[1379],{"type":24,"value":396},{"type":18,"tag":322,"props":1381,"children":1382},{},[1383],{"type":24,"value":401},{"type":18,"tag":322,"props":1385,"children":1386},{},[1387],{"type":24,"value":406},{"type":18,"tag":295,"props":1389,"children":1390},{},[1391,1399,1403],{"type":18,"tag":322,"props":1392,"children":1393},{},[1394],{"type":18,"tag":107,"props":1395,"children":1397},{"className":1396},[],[1398],{"type":24,"value":418},{"type":18,"tag":322,"props":1400,"children":1401},{},[1402],{"type":24,"value":423},{"type":18,"tag":322,"props":1404,"children":1405},{},[1406],{"type":24,"value":428},{"type":18,"tag":295,"props":1408,"children":1409},{},[1410,1418,1422],{"type":18,"tag":322,"props":1411,"children":1412},{},[1413],{"type":18,"tag":107,"props":1414,"children":1416},{"className":1415},[],[1417],{"type":24,"value":440},{"type":18,"tag":322,"props":1419,"children":1420},{},[1421],{"type":24,"value":445},{"type":18,"tag":322,"props":1423,"children":1424},{},[1425],{"type":24,"value":406},{"type":18,"tag":26,"props":1427,"children":1428},{},[1429],{"type":24,"value":454},{"type":18,"tag":42,"props":1431,"children":1432},{},[],{"type":18,"tag":46,"props":1434,"children":1435},{"id":460},[1436],{"type":24,"value":463},{"type":18,"tag":26,"props":1438,"children":1439},{},[1440],{"type":24,"value":468},{"type":18,"tag":26,"props":1442,"children":1443},{},[1444,1445,1450,1451,1456],{"type":24,"value":473},{"type":18,"tag":107,"props":1446,"children":1448},{"className":1447},[],[1449],{"type":24,"value":479},{"type":24,"value":481},{"type":18,"tag":107,"props":1452,"children":1454},{"className":1453},[],[1455],{"type":24,"value":487},{"type":24,"value":489},{"type":18,"tag":57,"props":1458,"children":1459},{},[1460,1464,1468,1472],{"type":18,"tag":61,"props":1461,"children":1462},{},[1463],{"type":24,"value":497},{"type":18,"tag":61,"props":1465,"children":1466},{},[1467],{"type":24,"value":502},{"type":18,"tag":61,"props":1469,"children":1470},{},[1471],{"type":24,"value":507},{"type":18,"tag":61,"props":1473,"children":1474},{},[1475],{"type":24,"value":512},{"type":18,"tag":26,"props":1477,"children":1478},{},[1479],{"type":24,"value":517},{"type":18,"tag":121,"props":1481,"children":1483},{"className":1482,"code":522,"language":523,"meta":7},[521],[1484],{"type":18,"tag":107,"props":1485,"children":1486},{"__ignoreMap":7},[1487],{"type":24,"value":522},{"type":18,"tag":26,"props":1489,"children":1490},{},[1491,1492],{"type":24,"value":533},{"type":18,"tag":65,"props":1493,"children":1494},{},[1495],{"type":24,"value":538},{"type":18,"tag":26,"props":1497,"children":1498},{},[1499],{"type":24,"value":543},{"type":18,"tag":26,"props":1501,"children":1502},{},[1503,1504,1509],{"type":24,"value":548},{"type":18,"tag":107,"props":1505,"children":1507},{"className":1506},[],[1508],{"type":24,"value":554},{"type":24,"value":556},{"type":18,"tag":287,"props":1511,"children":1512},{},[1513,1527],{"type":18,"tag":291,"props":1514,"children":1515},{},[1516],{"type":18,"tag":295,"props":1517,"children":1518},{},[1519,1523],{"type":18,"tag":299,"props":1520,"children":1521},{},[1522],{"type":24,"value":570},{"type":18,"tag":299,"props":1524,"children":1525},{},[1526],{"type":24,"value":575},{"type":18,"tag":315,"props":1528,"children":1529},{},[1530,1549,1568],{"type":18,"tag":295,"props":1531,"children":1532},{},[1533,1541],{"type":18,"tag":322,"props":1534,"children":1535},{},[1536],{"type":18,"tag":107,"props":1537,"children":1539},{"className":1538},[],[1540],{"type":24,"value":590},{"type":18,"tag":322,"props":1542,"children":1543},{},[1544],{"type":18,"tag":107,"props":1545,"children":1547},{"className":1546},[],[1548],{"type":24,"value":599},{"type":18,"tag":295,"props":1550,"children":1551},{},[1552,1560],{"type":18,"tag":322,"props":1553,"children":1554},{},[1555],{"type":18,"tag":107,"props":1556,"children":1558},{"className":1557},[],[1559],{"type":24,"value":611},{"type":18,"tag":322,"props":1561,"children":1562},{},[1563],{"type":18,"tag":107,"props":1564,"children":1566},{"className":1565},[],[1567],{"type":24,"value":620},{"type":18,"tag":295,"props":1569,"children":1570},{},[1571,1579],{"type":18,"tag":322,"props":1572,"children":1573},{},[1574],{"type":18,"tag":107,"props":1575,"children":1577},{"className":1576},[],[1578],{"type":24,"value":632},{"type":18,"tag":322,"props":1580,"children":1581},{},[1582],{"type":18,"tag":107,"props":1583,"children":1585},{"className":1584},[],[1586],{"type":24,"value":641},{"type":18,"tag":26,"props":1588,"children":1589},{},[1590],{"type":24,"value":646},{"type":18,"tag":648,"props":1592,"children":1593},{},[1594],{"type":18,"tag":26,"props":1595,"children":1596},{},[1597],{"type":24,"value":655},{"type":18,"tag":26,"props":1599,"children":1600},{},[1601],{"type":24,"value":660},{"type":18,"tag":42,"props":1603,"children":1604},{},[],{"type":18,"tag":46,"props":1606,"children":1607},{"id":666},[1608],{"type":24,"value":669},{"type":18,"tag":26,"props":1610,"children":1611},{},[1612],{"type":24,"value":674},{"type":18,"tag":26,"props":1614,"children":1615},{},[1616,1617,1622],{"type":24,"value":679},{"type":18,"tag":107,"props":1618,"children":1620},{"className":1619},[],[1621],{"type":24,"value":590},{"type":24,"value":686},{"type":18,"tag":121,"props":1624,"children":1626},{"className":1625,"code":691,"language":24,"meta":7},[690],[1627],{"type":18,"tag":107,"props":1628,"children":1629},{"__ignoreMap":7},[1630],{"type":24,"value":691},{"type":18,"tag":26,"props":1632,"children":1633},{},[1634],{"type":24,"value":701},{"type":18,"tag":26,"props":1636,"children":1637},{},[1638],{"type":24,"value":706},{"type":18,"tag":648,"props":1640,"children":1641},{},[1642],{"type":18,"tag":26,"props":1643,"children":1644},{},[1645],{"type":24,"value":714},{"type":18,"tag":26,"props":1647,"children":1648},{},[1649],{"type":24,"value":719},{"type":18,"tag":57,"props":1651,"children":1652},{},[1653,1661],{"type":18,"tag":61,"props":1654,"children":1655},{},[1656,1660],{"type":18,"tag":65,"props":1657,"children":1658},{},[1659],{"type":24,"value":730},{"type":24,"value":732},{"type":18,"tag":61,"props":1662,"children":1663},{},[1664,1668],{"type":18,"tag":65,"props":1665,"children":1666},{},[1667],{"type":24,"value":740},{"type":24,"value":742},{"type":18,"tag":26,"props":1670,"children":1671},{},[1672],{"type":24,"value":747},{"type":18,"tag":42,"props":1674,"children":1675},{},[],{"type":18,"tag":46,"props":1677,"children":1678},{"id":753},[1679],{"type":24,"value":756},{"type":18,"tag":26,"props":1681,"children":1682},{},[1683],{"type":24,"value":761},{"type":18,"tag":19,"props":1685,"children":1686},{"id":764},[1687],{"type":24,"value":764},{"type":18,"tag":57,"props":1689,"children":1690},{},[1691,1700,1709,1718,1727,1736],{"type":18,"tag":61,"props":1692,"children":1693},{},[1694,1699],{"type":18,"tag":107,"props":1695,"children":1697},{"className":1696},[],[1698],{"type":24,"value":778},{"type":24,"value":780},{"type":18,"tag":61,"props":1701,"children":1702},{},[1703,1708],{"type":18,"tag":107,"props":1704,"children":1706},{"className":1705},[],[1707],{"type":24,"value":789},{"type":24,"value":791},{"type":18,"tag":61,"props":1710,"children":1711},{},[1712,1717],{"type":18,"tag":107,"props":1713,"children":1715},{"className":1714},[],[1716],{"type":24,"value":800},{"type":24,"value":802},{"type":18,"tag":61,"props":1719,"children":1720},{},[1721,1726],{"type":18,"tag":107,"props":1722,"children":1724},{"className":1723},[],[1725],{"type":24,"value":811},{"type":24,"value":813},{"type":18,"tag":61,"props":1728,"children":1729},{},[1730,1735],{"type":18,"tag":107,"props":1731,"children":1733},{"className":1732},[],[1734],{"type":24,"value":822},{"type":24,"value":824},{"type":18,"tag":61,"props":1737,"children":1738},{},[1739,1744],{"type":18,"tag":107,"props":1740,"children":1742},{"className":1741},[],[1743],{"type":24,"value":833},{"type":24,"value":835},{"type":18,"tag":19,"props":1746,"children":1747},{"id":838},[1748],{"type":24,"value":838},{"type":18,"tag":57,"props":1750,"children":1751},{},[1752,1761,1770,1779,1788],{"type":18,"tag":61,"props":1753,"children":1754},{},[1755,1760],{"type":18,"tag":107,"props":1756,"children":1758},{"className":1757},[],[1759],{"type":24,"value":852},{"type":24,"value":854},{"type":18,"tag":61,"props":1762,"children":1763},{},[1764,1769],{"type":18,"tag":107,"props":1765,"children":1767},{"className":1766},[],[1768],{"type":24,"value":611},{"type":24,"value":864},{"type":18,"tag":61,"props":1771,"children":1772},{},[1773,1778],{"type":18,"tag":107,"props":1774,"children":1776},{"className":1775},[],[1777],{"type":24,"value":590},{"type":24,"value":874},{"type":18,"tag":61,"props":1780,"children":1781},{},[1782,1787],{"type":18,"tag":107,"props":1783,"children":1785},{"className":1784},[],[1786],{"type":24,"value":883},{"type":24,"value":885},{"type":18,"tag":61,"props":1789,"children":1790},{},[1791,1796],{"type":18,"tag":107,"props":1792,"children":1794},{"className":1793},[],[1795],{"type":24,"value":894},{"type":24,"value":896},{"type":18,"tag":26,"props":1798,"children":1799},{},[1800],{"type":24,"value":901},{"type":18,"tag":121,"props":1802,"children":1804},{"className":1803,"code":905,"language":24,"meta":7},[690],[1805],{"type":18,"tag":107,"props":1806,"children":1807},{"__ignoreMap":7},[1808],{"type":24,"value":905},{"type":18,"tag":26,"props":1810,"children":1811},{},[1812],{"type":24,"value":915},{"type":18,"tag":26,"props":1814,"children":1815},{},[1816],{"type":24,"value":920},{"type":18,"tag":42,"props":1818,"children":1819},{},[],{"type":18,"tag":46,"props":1821,"children":1822},{"id":926},[1823],{"type":24,"value":926},{"type":18,"tag":26,"props":1825,"children":1826},{},[1827],{"type":24,"value":933},{"type":18,"tag":121,"props":1829,"children":1831},{"className":1830,"code":937,"language":126,"meta":7},[124],[1832],{"type":18,"tag":107,"props":1833,"children":1834},{"__ignoreMap":7},[1835],{"type":24,"value":937},{"type":18,"tag":26,"props":1837,"children":1838},{},[1839],{"type":24,"value":947},{"type":18,"tag":42,"props":1841,"children":1842},{},[],{"type":18,"tag":46,"props":1844,"children":1845},{"id":953},[1846],{"type":24,"value":953},{"type":18,"tag":26,"props":1848,"children":1849},{},[1850,1851,1856,1857,1862],{"type":24,"value":960},{"type":18,"tag":107,"props":1852,"children":1854},{"className":1853},[],[1855],{"type":24,"value":966},{"type":24,"value":968},{"type":18,"tag":107,"props":1858,"children":1860},{"className":1859},[],[1861],{"type":24,"value":112},{"type":24,"value":975},{"type":18,"tag":121,"props":1864,"children":1866},{"className":1865,"code":979,"language":126,"meta":7},[124],[1867],{"type":18,"tag":107,"props":1868,"children":1869},{"__ignoreMap":7},[1870],{"type":24,"value":979},{"type":18,"tag":26,"props":1872,"children":1873},{},[1874],{"type":24,"value":989},{"type":18,"tag":26,"props":1876,"children":1877},{},[1878],{"type":24,"value":994},{"type":18,"tag":42,"props":1880,"children":1881},{},[],{"type":18,"tag":46,"props":1883,"children":1884},{"id":1000},[1885],{"type":24,"value":1000},{"type":18,"tag":26,"props":1887,"children":1888},{},[1889],{"type":24,"value":1007},{"type":18,"tag":26,"props":1891,"children":1892},{},[1893],{"type":24,"value":1012},{"type":18,"tag":57,"props":1895,"children":1896},{},[1897,1905,1913],{"type":18,"tag":61,"props":1898,"children":1899},{},[1900,1904],{"type":18,"tag":65,"props":1901,"children":1902},{},[1903],{"type":24,"value":1023},{"type":24,"value":1025},{"type":18,"tag":61,"props":1906,"children":1907},{},[1908,1912],{"type":18,"tag":65,"props":1909,"children":1910},{},[1911],{"type":24,"value":1033},{"type":24,"value":1035},{"type":18,"tag":61,"props":1914,"children":1915},{},[1916,1920],{"type":18,"tag":65,"props":1917,"children":1918},{},[1919],{"type":24,"value":1043},{"type":24,"value":1045},{"type":18,"tag":26,"props":1922,"children":1923},{},[1924],{"type":24,"value":1050},{"type":18,"tag":153,"props":1926,"children":1927},{"alt":1053,"folder":156,"img-type":157,"img-width":1054,"src":1055},[],{"title":7,"searchDepth":1058,"depth":1058,"links":1929},[1930,1931,1932,1933,1934,1935,1936,1937,1941,1942,1943],{"id":21,"depth":1061,"text":21},{"id":48,"depth":1058,"text":48},{"id":97,"depth":1058,"text":100},{"id":171,"depth":1058,"text":174},{"id":218,"depth":1058,"text":221},{"id":460,"depth":1058,"text":463},{"id":666,"depth":1058,"text":669},{"id":753,"depth":1058,"text":756,"children":1938},[1939,1940],{"id":764,"depth":1061,"text":764},{"id":838,"depth":1061,"text":838},{"id":926,"depth":1058,"text":926},{"id":953,"depth":1058,"text":953},{"id":1000,"depth":1058,"text":1000},1776933363651]