Skill 开发实战:本地健康管理助手
健康管理最怕两件事:记录断档 和 临时找不到关键信息。这篇实战会带你基于 OpenClaw 搭建一个“本地优先”的家庭健康助手,把日常记录、趋势追踪、就医前整理串成一条可复用流程。
跑通后,你会得到一个可长期使用的健康数据中枢:平时能记、随时能查、就医前能快速整理。
第一部分:自己动手实现一个最小健康 Skill(从 0 到 1)
如果你想自己练手,不必一上来就做完整系统。先做一个最小可用版:
- 能添加家庭成员
- 能记录每日指标(如血压、心率)
- 能查询最近几条记录
先跑通这 3 件事,再逐步加饮食、体重、就医摘要等能力。
1.1 先定最小目标(MVP)
第一个版本只做 3 个动作:
add-member:新增成员add-metric:记录指标summary:查看最近健康记录
这样做的好处是:
- 结构简单,不容易卡在复杂设计上
- 很快能验证“对话 → 结构化数据 → 查询结果”这条核心链路
- 后续扩展时不会推翻重来
1.2 建目录
Bash
skills/
└── local-health-mini/
├── SKILL.md
├── scripts/
│ ├── member.py
│ ├── metric.py
│ └── query.py
└── data/
└── health.db1.3 直接贴代码:最小可运行示例
A) scripts/member.py(成员管理)
python
#!/usr/bin/env python3
import argparse
import sqlite3
from pathlib import Path
DB = Path(__file__).resolve().parent.parent / "data" / "health.db"
def init_db(conn):
conn.execute(
"""
CREATE TABLE IF NOT EXISTS members (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
relation TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
"""
)
def list_members(conn):
rows = conn.execute("SELECT id, name, relation FROM members ORDER BY id").fetchall()
if not rows:
print("暂无成员")
return
for r in rows:
print(f"{r[0]}. {r[1]}({r[2]})")
def add_member(conn, name, relation):
conn.execute("INSERT INTO members (name, relation) VALUES (?, ?)", (name, relation))
conn.commit()
print(f"已添加成员:{name}({relation})")
def main():
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest="cmd", required=True)
sub.add_parser("list")
p_add = sub.add_parser("add")
p_add.add_argument("--name", required=True)
p_add.add_argument("--relation", required=True)
args = parser.parse_args()
DB.parent.mkdir(parents=True, exist_ok=True)
conn = sqlite3.connect(DB)
init_db(conn)
if args.cmd == "list":
list_members(conn)
elif args.cmd == "add":
add_member(conn, args.name, args.relation)
if __name__ == "__main__":
main()B) scripts/metric.py(指标记录)
python
#!/usr/bin/env python3
import argparse
import sqlite3
from pathlib import Path
DB = Path(__file__).resolve().parent.parent / "data" / "health.db"
def init_db(conn):
conn.execute(
"""
CREATE TABLE IF NOT EXISTS metrics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
member_id INTEGER NOT NULL,
type TEXT NOT NULL,
value TEXT NOT NULL,
measured_at TEXT NOT NULL,
created_at DATETIME DEFAULT CURRENT_TIMESTAMP
)
"""
)
def add_metric(conn, member_id, mtype, value, measured_at):
conn.execute(
"INSERT INTO metrics (member_id, type, value, measured_at) VALUES (?, ?, ?, ?)",
(member_id, mtype, value, measured_at),
)
conn.commit()
print(f"已记录指标:member_id={member_id}, {mtype}={value}, 时间={measured_at}")
def main():
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest="cmd", required=True)
p_add = sub.add_parser("add")
p_add.add_argument("--member-id", type=int, required=True)
p_add.add_argument("--type", required=True)
p_add.add_argument("--value", required=True)
p_add.add_argument("--measured-at", required=True)
args = parser.parse_args()
DB.parent.mkdir(parents=True, exist_ok=True)
conn = sqlite3.connect(DB)
init_db(conn)
if args.cmd == "add":
add_metric(conn, args.member_id, args.type, args.value, args.measured_at)
if __name__ == "__main__":
main()C) scripts/query.py(最近记录摘要)
python
#!/usr/bin/env python3
import argparse
import sqlite3
from pathlib import Path
DB = Path(__file__).resolve().parent.parent / "data" / "health.db"
def summary(conn, member_id, days):
rows = conn.execute(
"""
SELECT type, value, measured_at
FROM metrics
WHERE member_id = ?
AND date(measured_at) >= date('now', ?)
ORDER BY measured_at DESC
LIMIT 20
""",
(member_id, f"-{days} day"),
).fetchall()
if not rows:
print(f"最近 {days} 天暂无记录。")
return
print(f"最近 {days} 天记录(member_id={member_id}):")
for t, v, m in rows:
print(f"- {m} | {t}: {v}")
def main():
parser = argparse.ArgumentParser()
sub = parser.add_subparsers(dest="cmd", required=True)
p_sum = sub.add_parser("summary")
p_sum.add_argument("--member-id", type=int, required=True)
p_sum.add_argument("--days", type=int, default=7)
args = parser.parse_args()
conn = sqlite3.connect(DB)
if args.cmd == "summary":
summary(conn, args.member_id, args.days)
if __name__ == "__main__":
main()D) SKILL.md(最小动作映射示例)
markdown
---
name: local-health-mini
description: 本地最小健康记录 Skill(成员、指标、摘要)
---
# local-health-mini
当用户提到以下意图时,按规则调用脚本:
1. 添加成员
- 先执行:`python3 {baseDir}/scripts/member.py list`
- 再执行:`python3 {baseDir}/scripts/member.py add --name "<姓名>" --relation "<关系>"`
2. 记录指标(血压/心率/血糖/体重)
- 执行:`python3 {baseDir}/scripts/metric.py add --member-id <id> --type <type> --value "<value>" --measured-at "<日期时间>"`
3. 查看最近健康情况
- 执行:`python3 {baseDir}/scripts/query.py summary --member-id <id> --days 7`
返回给用户时,把结果整理成自然语言,不直接贴原始结构化输出。1.4 用 6 句对话做验收
把下面 6 句都跑通,你的最小健康 Skill 就完成了:
Plain
帮我添加一个家庭成员,叫李阿姨,是我妈妈
帮李阿姨记录今天血压 138/88
帮李阿姨记录今天心率 76
帮李阿姨记录今天空腹血糖 6.4
帮我看一下李阿姨最近 7 天健康情况
把最近异常指标单独列出来1.5 再按优先级扩展(推荐顺序)
在最小版稳定后,再逐步加:
- 图片/PDF 识别录入
- 用药与提醒
- 饮食记录
- 体重与运动趋势
- 就医前摘要(文本 → 图片/PDF)
第二部分:直接使用现成的健康管理 Skill(/mediwise-health-suite)
如果你更希望“直接可用”,可以直接安装成熟方案 mediwise-health-suite。
2.1 先看这个现成 Skill 能做什么
MediWise Health Suite 是一个面向家庭场景的 OpenClaw Skill 套件,核心能力是把健康相关信息统一管理在本地,并支持对话式录入与查询。
它可以覆盖以下高频需求:
- 识图记录:识别体检报告、化验单、处方图片/PDF,并提取关键健康信息
- 健康管理:家庭成员档案、病程记录、用药追踪、血压/血糖/心率等指标管理
- 运动管理:体重目标、运动记录与消耗追踪、趋势分析
- 就诊管理:就医前摘要整理(近期病情、既往史、在用药)
- 定时提醒:按计划做健康记录、复查与日常提醒
- 本地优先隐私保护:默认 SQLite 本地存储,医疗与生活方式数据分库存储
这种方式的直接好处是:
- 个人健康数据由自己掌控,日常管理不依赖外部平台
- 本地存储更稳妥,减少不必要的外部暴露面
- 支持后续导出与迁移,换设备或换环境时可持续使用历史数据
2.2 这里以 MediWise 为例
这个案例以开源项目 MediWise 为例:
- GitHub:https://github.com/JuneYaooo/mediwise-health-suite
- ClawHub:https://clawhub.ai/JuneYaooo/mediwise-health-suite
这里仅把它作为一个可运行示例,方便演示“记录、追踪、整理”这一类健康管理工作流的搭建方式。你也可以替换成自己已有的健康管理 Skill,方法是一样的。

2.3 直接安装
Bash
# 先进入你的 OpenClaw 工作区
cd ~/.openclaw/workspace-health
# 安装到当前目录的 skills/
clawdhub install JuneYaooo/mediwise-health-suite或手动安装:
Bash
git clone https://github.com/JuneYaooo/mediwise-health-suite.git \
~/.openclaw/workspace-health/skills/mediwise-health-suite2.4 使用方式(两种都可以)
方式 A:斜杠入口(如果你的客户端支持)
Plain
/mediwise-health-suite方式 B:直接自然语言(通用)
Plain
帮我添加一个家庭成员,叫王叔叔,62岁
帮王叔叔记录今天血压 145/92,心率 80
帮我整理一下王叔叔最近的健康情况2.5 安装后先做一次快速验证(含多模态)
方式 A:让龙虾代装 Skill(对话方式)
如果你的 OpenClaw 已经可正常联网与执行安装命令,可以先用自然语言让它安装:
Plain
请帮我安装这个 skill:JuneYaooo/mediwise-health-suite
安装到当前工作区的 skills 目录,并在完成后告诉我安装路径。安装后,建议继续做下面的路径检查和多模态验证。
方式 B:命令行安装与检查
Bash
# 先进入你的 OpenClaw agent 工作区(路径按实际配置)
cd ~/.openclaw/workspace-health
# 安装 skill 到当前目录下 skills/
clawdhub install JuneYaooo/mediwise-health-suite注意:请先进入正确工作区再安装,避免触发
escapes plugin root问题。
安装后可运行路径检测脚本:
Bash
bash ~/.openclaw/workspace-health/skills/mediwise-health-suite/install-check.sh多模态配置(用于图片/PDF 识别)
Bash
cd ~/.openclaw/workspace-health/skills/mediwise-health-suite/mediwise-health-tracker/scripts
# 查看可用视觉模型预设
python3 setup.py list-vision-providers
# 配置视觉模型(示例)
python3 setup.py set-vision \
--provider siliconflow \
--api-key sk-xxx
# 测试多模态配置是否可用
python3 setup.py test-vision前端界面操作示意(保留图示)
1)在前端下载并安装 skills
| 1 | 2 |
|---|---|
![]() | ![]() |
2)配置多模态模型与上传测试图片验证识别
| 1 | 2 | 3 |
|---|---|---|
![]() | ![]() | ![]() |
对话验证
安装完成后,重启 OpenClaw 会话,发送以下任意一句:
Plain
帮我添加一个家庭成员,叫张三,是我爸爸
帮我记录今天血压 130/85,心率 72
帮我看看最近的健康情况
2.6 推荐你先体验这 4 个现成能力
- 家庭成员与病程记录(
mediwise-health-tracker) - 饮食记录(
diet-tracker) - 体重与运动管理(
weight-manager) - 就医前摘要整理(先文本,再导出图片/PDF)

2.7 推荐实战工作流:从日常记录到就医前整理
建议按下面顺序体验完整闭环:
- 建立家庭成员档案
- 上传一次化验单/体检报告,验证识图录入
- 连续记录 3~7 天健康指标(血压、心率、血糖)
- 补充运动与体重记录
- 触发“就医前摘要”请求
- 添加一个定时提醒(如每日晚间记录血压)
示例对话:
Plain
帮我添加一个家庭成员,叫张爸爸,65岁
我上传一张体检报告图片,请帮我提取关键指标并记录
帮张爸爸记录今天血压 150/95,心率 78
记录今天运动:快走 45 分钟
记录今天体重 65kg
我准备去看医生,帮我整理一下最近的情况
请每天晚上 9 点提醒我记录血压结语
- 想学习实现:走第一部分,先做最小版(可复制代码)
- 想马上可用:走第二部分,直接安装
/mediwise-health-suite
两条路径可以并行:先用成熟方案解决当下需求,再用最小版练会核心实现。




