下载地址
https://www.zhengdianxue.com/wp-content/uploads/skills/szgran--szgran-inquiry-skill.zip将提示词发送给你的 AI 安装该 skills
请根据 https://skillhub.cn/install/skillhub.md,安装 @szgran/szgran-inquiry-skill。查询歌蓝健康平台上的个人健康数据。适用场景:用户询问健康概况、体检时间、健康指标(血压/血糖/血脂等)、体检报告解读、影像资料/检查图片、药盒/用药信息;用户主动描述身体不适症状(头晕、恶心、乏力、心慌、胸闷、头疼、口渴、水肿等)时,也应加载本 skill,先用 health-indicators 查询相关健康指标再作答。
触发词示例:体检、健康、指标、报告、解读、药盒、头晕、恶心、乏力、心慌、不舒服、难受。
阅读全文 (展开查看完整说明)
概述
Node.js CLI 健康数据查询
index.js 是查询歌蓝健康平台体检和健康数据的 Node.js 命令行工具。
环境和安装依赖
index.js 运行需要node环境,所有运行必须安装node
index.js的位置在scripts/index.js
所有的命令命令都应该在与index.js所在的目录下运行
node index.js --version- 所有命令统一使用
node index.js <子命令>(后续所有命令同理,不再重复说明)。 - 查看命令的帮助信息:
node index.js --help、node index.js <子命令> --help。
登录(所有查询命令的前置条件)
check-login ──► 已登录 ──► 直接进入查询流程
└─► 未登录 ──► 能打开浏览器:login(浏览器扫码)
└─► 不能打开浏览器:set-unionid(手动设置凭证,凭证在歌蓝健康小程序)
登录后再次 check-login 验证Step 1: 检查登录状态
node index.js auth check-login- 已登录:跳过本节,直接进入标准查询流程
- 未登录:继续 Step 2
Step 2: 登录
根据当前环境是否能打开浏览器,选择登录方式:
方式 A:浏览器扫码登录(推荐,能打开浏览器时使用)
用户电脑如果是Linux系统,则使用方式B,在Windows系统下使用浏览器扫码登录
node index.js auth login- 自动打开浏览器并展示微信授权二维码
- 执行后必须提示用户:请用微信扫描浏览器页面中的二维码完成授权
- 等待用户完成扫码授权
方式 B:手动设置凭证(无法打开浏览器时使用)
node index.js auth set-unionid --unionid <unionid>--unionid:微信 unionid(28 位,以oGY7V5开头)--token:歌蓝健康 API Token- 无法自动打开浏览器时,通过
set-unionid设置unionid或token实现登录功能,unionid和token任意设置一个就可以,优先设置 unionid,不要同时设置unionid和token
Step 3: 验证登录结果
登录操作完成后,再次运行 node index.js auth check-login 确认:
- 成功:继续用户原本的查询请求
- 失败:告知用户登录未成功及可能原因(如扫码超时、凭证无效),引导重试一次;仍失败则终止并说明
标准查询流程(严格按序,不可跳步)
1. user-exists → 无数据:直接告知用户「账号下暂无健康数据」,终止
2. name-list → 确定 name 参数(规则见下)
3. 执行具体查询命令(含依赖的前置命令)name 参数确定规则
| name-list 返回 | 处理方式 |
|---|---|
| 多人 | 必须向用户确认查询谁;若用户已口述姓名且能与列表唯一匹配(含同音/别字近似),使用列表中的原文;无法唯一匹配时列出候选让用户选择。禁止默认查询所有人 |
| 一人 | 直接使用该姓名,无需询问 |
| 空 | 姓名字段为空:name 可选的命令不传该参数;name 必填的命令(health-summary、pill-box)告知用户无法使用 |
--name的值必须逐字来自name-list返回值,绝不直接使用用户口述文本。
日期参数规则
- 用户使用相对时间("去年"、"最近一次"、"上半年")时,先换算为
yyyy-mm-dd;"最近一次"可先用medical-examination-time确定具体日期再查询。 - 用户未提及时间时,
--start-date/--end-date可不传。
命令说明
基础命令
| 命令 | 参数 | 说明 |
|---|---|---|
user-exists | 无 | 检查账号是否有数据,所有查询的第一步 |
name-list | 无 | 返回人员姓名列表,按人员查询的前置依赖 |
medical-examination-time | --name(可选) | 体检检查日期;不指定 name 返回全部人员 |
按人员查询
health-summary — 健康概况
node index.js dataquery health-summary --name <str> # name 必填适用:"某人身体怎么样/健康状况如何"等整体性问题。
health-indicators — 健康指标(语义查询)
node index.js dataquery health-indicators --vector-input <str> [--name <str>] [--start-date <yyyy-mm-dd>] [--end-date <yyyy-mm-dd>] [--other-info <str>]--vector-input(必填):语义关键词,如"血糖情况"、"肝功能指标"、"近期体检异常项目"--other-info:医院、科室、检查地点等附加语义信息- 为提高准确性,尽量同时指定 name 和时间范围
- 向量查询只返回余弦相似度的前10条数据,如果指定姓名,并且用户授权,会查询当前账号下的弦相似度前10条的数据和每个授权账号下弦相似度前5条的数据
适用:询问具体指标(血压、血糖、血脂等)。
症状触发(用户描述身体不适时)
当用户描述身体不适症状而非直接问指标时(如"我头晕"、"我有点恶心"、"最近老是乏力/心慌/胸闷"、"我不舒服"),同样加载并使用本 skill:先用 health-indicators 查询与该症状相关的健康指标,再结合查到的数据回答用户。
流程:
用户描述症状
→ user-exists → name-list(确定 name,规则同上)
→ 把症状映射为语义关键词,调用 health-indicators --vector-input "<关键词>"
→ 查到数据:结合 data 组织回答(可再补充 health-summary 作整体参考)
→ 查不到数据:不再提数据,直接就用户的问题本身作答--vector-input直接使用症状本身加相关指标名,例如:"头晕 血压 血红蛋白 血脂"、"恶心 肝功能 胃部检查"。- 一个症状可能对应多类指标,必要时分多次调用
health-indicators,覆盖不同指标方向后再汇总。 - 症状与常见相关指标对照(仅用于选取查询关键词,不作为诊断依据):
| 用户症状 | vector-input 关键词参考 |
|---|---|
| 头晕、头昏 | 血压、血红蛋白/贫血、血糖、血脂、颈动脉、心率 |
| 恶心、想吐、食欲差 | 肝功能、胆囊、胃部检查、肾功能、血糖 |
| 乏力、疲倦 | 血红蛋白/贫血、甲状腺功能、血糖、肝功能、电解质 |
| 心慌、胸闷、气短 | 血压、心率/心电图、血脂、血红蛋白、甲状腺功能 |
| 头疼 | 血压、血脂、颈动脉、血糖 |
| 口渴、多尿 | 血糖、糖化血红蛋白、尿常规、肾功能 |
| 水肿 | 肾功能、尿蛋白、肝功能、心功能 |
| 关节/腰腿痛 | 尿酸、血钙、骨密度、炎症指标 |
- **查询不到数据时(
user-exists无数据、data为空、或结果与症状无关):不要围绕数据展开,
直接针对用户的问题本身作答即可**——不需要结合数据,也不用反复强调"没有数据"或追问更多信息,更不要把缺数据当成回答的主要内容。
- 查到数据时才客观陈述指标数值与参考范围,并说明这些数据不能解释或确诊症状原因。
- 无论是否有数据,症状明显或持续时都建议用户及时就医,严禁给出诊断、病因判断或用药建议。
pill-box — 药盒数据
node index.js dataquery pill-box --name <str> # name 必填两步链式查询
报告解读(必须两步,order_id 不可凭空构造)
node index.js dataquery report-interpretation-date [--name <str>] # 第一步:获取解读时间和 order_id
node index.js dataquery report-interpretations --order-id <str> # 第二步:order_id 必须来自第一步返回值多条 order_id 时,按用户指定的时间筛选;不明确时向用户确认或默认取最近一次并说明。
影像资料(按分类筛选时必须两步)
node index.js dataquery report-category [--name <str>] # 前置:获取合法分类值
node index.js dataquery image-info-list [--name <str>] [--start-date <yyyy-mm-dd>] [--end-date <yyyy-mm-dd>] [--report-category <str>]--report-category的值必须来自report-category返回值,否则查询不到数据- 不需要按分类筛选时可直接调用
image-info-list
查看整理和归纳结果(按 order_id)
# 分支 A:用户已知 order_id
node index.js dataquery order_id_status <order_id> # 第一步:检查 order_id 状态
node index.js dataquery tidy-induction-results <order_id> # 第二步:状态为已归纳时查看整理结果
# 分支 B:用户不知道 order_id
node index.js dataquery order-id-date-list [--page <page>] # 第一步:列出 order_id 和上传时间,让用户选择
node index.js dataquery order_id_status <order_id> # 第二步:用户选择后检查该 order_id 状态
node index.js dataquery tidy-induction-results <order_id> # 第三步:状态为已归纳时查看整理结果order_id必须来自order-id-date-list或report-interpretation-date的返回值,不可凭空构造- 使用
order_id_status确认状态为已归纳后,再调用tidy-induction-results;未归纳时告知用户当前状态,不直接查看结果 - 用户不知道
order_id时,先列出候选让其选择,选择后再走「检查状态 → 查看结果」流程
依赖关系图
user-exists ──► name-list ──┬──► health-summary (name 必填)
├──► pill-box (name 必填)
├──► health-indicators (name 可选)
├──► medical-examination-time (name 可选)
├──► image-info-list (name 可选)
├──► report-category ────────► image-info-list --report-category
├──► report-interpretation-date ──► report-interpretations --order-id
└──► order-id-date-list ────────► order_id_status ──► tidy-induction-results
已知 order_id 时:order_id_status ──► tidy-induction-results场景 → 命令速查
| 用户问题示例 | 命令路径 |
|---|---|
| 账号里有谁的体检数据? | name-list |
| 某人什么时候体检的? | medical-examination-time |
| 某人身体怎么样? | health-summary |
| 血压/血糖/某项指标怎么样? | health-indicators |
| 我头晕/恶心/乏力/心慌/不舒服 | health-indicators --vector-input "<症状+相关指标>"(症状映射表见上),必要时多次调用 |
| 报告解读结果是什么? | report-interpretation-date → report-interpretations |
| 查看体检影像/检查图片 | (report-category →)image-info-list |
| 药盒/用药信息 | pill-box |
| 最近一次体检异常项? | medical-examination-time 定位日期 → health-indicators --vector-input "异常项目" |
| 查看某 order_id 的整理和归纳结果 | 已知 order_id:order_id_status → tidy-induction-results;未知 order_id:order-id-date-list → 用户选择 → order_id_status → tidy-induction-results |
输出解析与错误处理
命令输出为 JSON,含 code 和 data 字段:
| 情况 | 处理 |
|---|---|
code == 200 且 data 非空 | 仅使用 data 内容组织回答 |
code == 200 但 data 为空 | 不结合数据作答:直接回答用户原本的问题;简短说明未查到相关数据即可,不要展开、不要反复追问 |
| 输出含"未登录"提示 | 引导登录后重试一次 |
| 其他错误码 / 非 JSON 输出 | 向用户简要说明查询失败,不展示原始错误堆栈 |
回答规范
- 只返回与问题相关的信息,不要附带命令调用过程、原始 JSON、冗余日志。
- 指标数据尽量带上数值、单位、参考范围和检查日期,异常项可明确标注。
- 涉及异常指标时客观陈述数据,不给出诊断性结论;必要时建议咨询医生。
- 用户描述症状(头晕、恶心等)时,先查指标再回答;回答中说明"以下为体检指标数据,不能作为症状原因的判断",并提示症状持续或加重请及时就医。
- 查不到用户数据时(无健康数据 /
data为空 / 结果与问题无关):不要结合数据回答,直接就用户的问题本身作答;缺数据只需一句带过,不作为回答重点,也不必建议反复调整关键词或时间范围。 - 健康数据属敏感个人信息,仅回答用户所问,不主动扩散无关人员的数据。