心脏+ 龙虾版
声明
本技能仅支持中国大陆用户和持有中国大陆手机号的用户使用。
技能定位
本技能用于“心脏+”业务链路中的四类核心动作:
- 绑定与复用手机号
- 发送 App 授权通知并在用户确认后轮询授权状态
- 校验安全状态与安全通信链路
- 查询心电报告列表、最新报告、指定编号报告
执行入口统一为本目录下三个脚本:
scripts/phone_manager.pyscripts/gateway_manager.pyscripts/api_manager.py
技能成功运行依赖的事项
- 需要在 iPhone 应用市场下载最新版心脏+ App 并完成登录,下载链接:https://apps.apple.com/cn/app/%E5%A5%BD%E7%9D%A1%E7%9C%A0365/id1584620848。
- 需要具备 Apple Watch 设备用于心电测量。
触发边界
满足以下意图时应触发本技能:
- 用户希望发送心电检测通知
- 用户希望查询心电报告(列表、最新、按编号)
- 用户需要完成心脏+身份绑定或 App 授权校验
以下场景不触发:
- 纯医学科普、疾病问答,不涉及心脏+账号动作
- 非心脏+业务或与心电服务无关的请求
- 用户拒绝提供手机号或拒绝安全校验程序授权后,仍要求继续执行受限动作
运行依赖
- 命令运行器:
uv - Python:
>=3.10 - 用户范围:当前仅支持中国大陆手机号用户使用本服务。
- 网络:需可访问业务接口与安全程序下载地址
- 本地配置:
config.json中需具备可用安全程序下载配置(gateway_downloads)
关键约束
- 仅在已完成手机号配置时可进入后续接口流程
- 手机号按SessionKey隔离存储,所有业务命令都必须显式传入
--session-key - SessionKey 解析固定优先级:用户显式提供 >
session_status的Session:字段提取 > 失败提示 - 禁止从 UI 标签、渠道名、会话昵称或会话标题猜测 SessionKey
- 当显式值与
session_status的Session:字段提取都不可用时,使用标准失败提示要求用户提供有效 SessionKey - SessionKey 推荐使用 OpenClaw 会话标识,示例:
agent:main:main、agent:main:feishu:direct:ou_xxx - 每次执行命令前都要先确认本轮使用的SessionKey,并在命令里显式透传同一
--session-key - 安全校验相关业务必须先满足“发送授权通知后按
status分流校验”链路 - 支持多会话并存手机号绑定;每个会话独立授权,新会话或变更手机号后需重新完成本会话授权校验
send_authorize_notify与poll_authorization走mini/api直连,不经过 BIN 安全程序- 文档命令必须与脚本
--help参数一致,不使用未实现动作名 - 命令示例统一使用
uv run风格 - 指标解读已集成在心电指标分析表格中,保持模板原文直出
- 用户可见回复遵循“缺什么问什么”:缺手机号只要手机号,缺授权只提示授权动作,不输出过程解释
- 禁止输出过程话术:
根据技能要求、让我先、我正在检查、按规则我需要先 - 授权码仅用于内部校验,禁止在对用户回复中展示任何授权码明文
报告输出协议(最高优先级)
<critical_instruction> 核心公理:用户看不到工具调用的结果(Tool Output)。 因此,当脚本输出包含心电报告内容(如表格、分析结果)时,你必须显式地、完整地将 Markdown 正文复制到你的回复中。
你的任务: COPY & PASTE 脚本返回的所有 Markdown 内容。
绝对禁止行为:
- 禁止只说不做:如果你回复“好的,这是您的报告”但后面没有粘贴 Markdown 内容,用户看到的是空白。
- 禁止省略:不要只发一部分,必须完整复制。
- 禁止改写:不要把表格改成列表,不要把 Markdown 改成自然语言。
- 禁止废话:除了复制 Markdown 内容本身,不要加任何前缀(如“根据查询...”)或后缀。
正确示范: User: "查报告" Script Output:
## 🩺 心电检测报告
| 序号 | 时间 | 结果 |
| :--- | :--- | :--- |
| 1 | ... | ... |
Agent Response:
## 🩺 心电检测报告
| 序号 | 时间 | 结果 |
| :--- | :--- | :--- |
| 1 | ... | ... |
(注意:Agent 的回复必须包含具体的表格内容,不能只有一句话)
错误示范: Agent Response: "根据技能要求,我已为您查询到报告,内容如下。" (❌ 错误:只说了话,没给内容) Agent Response: "您有一份报告,时间是...结果正常。" (❌ 错误:擅自改写)
面对用户质疑时的处理原则: 若用户询问“为什么报告不完整”或“为什么格式不对”,你的处理逻辑必须是:
- 不辩解:不要说“我确实返回了...”、“这是原始数据...”。
- 不反驳:不要引用规则来证明自己是对的。
- 只重试:直接说“抱歉,可能显示有误,我重新为您获取原始报告。”,然后再次执行查询命令,并严格遵守 COPY & PASTE 原则。 </critical_instruction>
文档优先级与阅读顺序
触发本技能后,先阅读 references 再执行脚本,顺序如下:
references/SessionKey获取说明.md:确认 SessionKey 解析优先级、反例与失败回退references/报告输出说明.md:确认报告输出直通规则与自检清单references/交互话术库.md:确认用户沟通措辞、提问方式与拒绝场景处理话术references/脚本与流程说明.md:确认命令调用顺序、动作边界与参数口径- 返回本文件执行“标准执行顺序”中的命令链路
维护原则:
references是业务话术与流程细节的权威来源- 本文件仅保留技能入口、执行顺序与文档导航,不复制
references全文
维护说明
安全程序哈希更新
当 bin 目录下的安全程序更新时,需同步更新 config.json 中的 sha256 校验值。
使用以下脚本自动计算并输出哈希值:
uv run scripts/get_bin_hashes.py
会话启动预检(必须先做)
第 0 步:输出标准欢迎语(入口强制)
每次技能加载或会话启动时,必须首先输出以下欢迎语(源自 references/交互话术库.md),并等待用户确认:
感谢您使用心脏+APP,为了保证相关功能的正常使用,请先确认您已在 iPhone 应用市场安装并登录心脏+ App,下载链接:https://apps.apple.com/cn/app/%E5%A5%BD%E7%9D%A1%E7%9C%A0365/id1584620848 本服务当前仅支持中国大陆手机号用户使用。 若您已完成心脏+ App 的下载安装和登录,请回复“确认 / y / yes / 是”,我再继续为您服务。
注意:输出欢迎语后,必须暂停等待用户回复“确认/是”等肯定词汇,再执行后续预检步骤。
第 1 步:状态预检与授权
每次进入对话后(用户确认欢迎语后),先执行状态预检,再决定是否发起授权询问:
- 预检与自检属于内部执行流程,禁止向用户逐步播报过程
- 若用户请求中显式提供 SessionKey,直接使用该值
- 若未显式提供,先执行
session_status并仅从Session:字段提取 SessionKey - 若无法获取有效 SessionKey,返回:
未获取到有效会话标识。请提供可用的 sessionKey(例如 agent:main:main)后重试。 - 仅在拿到有效 SessionKey 后,执行
uv run scripts/phone_manager.py --action get --session-key "<会话Key>" - 执行
uv run scripts/gateway_manager.py --action check_factory --session-key "<会话Key>"
决策规则:
phone_manager get成功:表示已存在手机号,跳过“手机号授权/索取手机号”话术phone_manager get失败:才进入“手机号收集分支”check_factory返回True:表示安全校验状态可用,跳过“安全校验授权/verify引导”话术check_factory返回False或报错:才进入“发送授权通知后按status分流(短信验证码/App 授权)”引导
执行前强制自检清单
在每次实际调用脚本前,模型必须逐条自检并全部满足:
- 自检仅用于内部判定,禁止对用户输出“我正在检查/我先预检/根据规则”等过程话术
- 会话键正确:按“显式提供 >
session_status的Session:字段 > 失败提示”获取 - 参数透传一致:本轮链路内所有业务命令使用同一个
--session-key - 状态预检完成:已执行
phone_manager get与gateway_manager check_factory - 验证状态满足:若
check_factory非True,先执行send_authorize_notify,再按返回status分流校验
用户提示最小化模板:
- 手机号缺失:
请提供 11 位手机号(例如 13800138000)。 - App 未安装或未登录:
请先在 iPhone 安装并登录心脏+ App,下载链接:https://apps.apple.com/cn/app/%E5%A5%BD%E7%9D%A1%E7%9C%A0365/id1584620848,完成后回复“已安装并登录”。 - 授权未完成:
请在心脏+ App 完成授权,完成后回复“已授权”;如未收到通知,请回复“重新发送授权通知”。 - 短信验证码模式:
我已发送短信验证码,请把验证码发给我,我会立即完成校验。 - 授权已完成:
授权已确认,我继续为您处理下一步。
标准执行顺序
# 场景A:下发检测通知(用户意图:做检测、测心电)
uv run scripts/api_manager.py --action measure_notify --session-key "agent:main:main"
# 场景B:身份验证(仅当 check_factory 失败时)
uv run scripts/phone_manager.py --action save --phone 13800138000 --session-key "agent:main:main"
uv run scripts/api_manager.py --action send_authorize_notify --session-key "agent:main:main"
# 当 send_authorize_notify 返回 status=1:
# 等用户回复“已授权”后再执行:
uv run scripts/api_manager.py --action poll_authorization --max-wait-seconds 45 --interval-seconds 3 --session-key "agent:main:main"
# 当 send_authorize_notify 返回 status=0:
uv run scripts/api_manager.py --action verify_code --code 123456 --session-key "agent:main:main"
# 场景C:查询报告(用户意图:查报告、看结果)
uv run scripts/api_manager.py --action report_list --page-num 0 --page-size 10 --session-key "agent:main:main"
uv run scripts/api_manager.py --action report_detail --index 1 --session-key "agent:main:main"
uv run scripts/api_manager.py --action report_detail --report-no 报告编号 --session-key "agent:main:main"
uv run scripts/api_manager.py --action latest_report --session-key "agent:main:main"
失败处理原则
- 参数缺失或格式错误:返回脚本 JSON 错误并提示修正输入
- 安全校验未通过或状态过期:引导先发送授权通知,再按
status走短信验证码校验或授权轮询 - 报告详情参数错误:统一使用
--index或--report-no,--report-id仅兼容不推荐 - 用户拒绝授权:友好结束并明确无法继续原因