Unified AI Gateway

开发者接口文档

面向前端、客户端和第三方调用方。本文档按业务 TAB 分组,包含参数字段、字段解释、请求示例、 返回 JSON 示例和返回字段说明。自动生成的 Swagger 仍保留在 /docs。

公共调用规则

Base URL

https://ai.gateway.uahpet.com

本地开发常用:http://127.0.0.1:18000

鉴权

Authorization: Bearer uah_xxx

除 GET /health、/demo、/api-docs 外,业务接口都需要 API Key。

异步任务

图片/视频生成接口先返回 task_id。客户端应按 poll_after_seconds 等待后再查询,避免触发 429。

统一错误 JSON

身份字段规则:形象生成、日记、日记配图、配图图库选择等业务接口必须传入 user_id 和 pet_id(日记的宠物 ID 在 dailyDiarySnapshot.petProfile.petId 里),形象资产、日记、AI 洞察的列表查询必须传 user_id。网关按宠物 ID 统计调用量和成本,用户 ID 作为附加信息。为兼容旧版调用方,未传时网关按 temporary 占位处理,并在用量日志中标记为缺 ID。日记配图选择了 identity_asset_id 时,用户和宠物 ID 以身份资源上的为准,可以不传。

{
  "error": {
    "code": "invalid_request",
    "message": "Request validation failed.",
    "request_id": "req_xxx"
  }
}
错误码HTTP说明
unauthorized401缺少 API Key 或 Key 无效。
forbidden403Key 没有访问该接口、模型或图片/视频生成权限。
invalid_request422字段缺失、类型错误、枚举值错误、上传格式错误。
not_found404任务、图片、日记或身份资源不存在。
rate_limit_exceeded429请求过快或超出当前 Key 限流。
provider_error502上游模型服务失败。

基础接口

GET /health

服务健康检查。无需 API Key。

请求参数

无。

请求示例

curl https://ai.gateway.uahpet.com/health

生成响应示例

{
  "status": "ok",
  "service": "uah-ai-gateway",
  "version": "0.3.0"
}
字段类型说明
statusstring服务状态,正常为 ok。
servicestring服务名。
versionstring服务版本。

GET /v1/models

查询当前 API Key 可见模型别名。

请求参数

字段位置必填说明
AuthorizationHeader是Bearer uah_xxx。

请求示例

curl -H "Authorization: Bearer uah_xxx" \
  https://ai.gateway.uahpet.com/v1/models

返回 JSON

{
  "data": [
    { "id": "uah-general", "type": "text" },
    { "id": "uah-avatar", "type": "image" }
  ]
}
字段类型说明
dataarray模型列表。
data[].idstring网关模型别名,调用其他接口时使用。
data[].typestring模型类型,例如 text、image、video。

姿态图生成

POST /v1/pet-avatar/generate

上传宠物照片或提供图片 URL,创建四姿态头像生成任务。兼容路径:/v1/pet-avatars/generate。

请求参数

字段位置类型必填默认/枚举说明
AuthorizationHeaderstring是-Bearer API Key。需要 uah-avatar 且允许图片生成;当前实现也要求 Key 具备 uah-animation 视频能力,用于后续身份资源联动。
source_imageForm filefile二选一-宠物原图文件。与 source_image_url 只能传一个,图片需满足服务端配置的最小尺寸和最大体积限制。
source_image_urlForm/JSONstring二选一HTTP/HTTPS宠物原图 URL。后端会下载图片并按上传文件相同规则校验和保存到 COS;兼容复制出的 Markdown 链接格式 [url](url)。
speciesForm/JSONstring是dog / cat宠物物种,用于提示词、场景和后续日记配图库资源锁定。
user_idForm/JSONstring是-用户 ID,长度 1-128。为兼容旧版调用方,未传时网关按 temporary 占位处理,并在用量日志中标记为缺 ID。
pet_idForm/JSONstring是-宠物 ID,长度 1-128,只能包含字母、数字、_ 和 -。为兼容旧版调用方,未传时网关按 temporary 占位处理,并在用量日志中标记为缺 ID。
pet_nameForm/JSONstring否-宠物名,长度 1-128。
breedForm/JSONstring否-品种补充,长度 1-128。
poseForm/JSONstring否all单姿态选择:all、lying、sitting、walking、running。
posesForm repeat/JSONstring[]否-多姿态选择;Form 可重复传字段,JSON 传字符串数组。支持 lying、sitting、walking、running,不能重复。传了 poses 时优先于 pose。
localeForm/JSONstring否en-US语言环境:en-US 或 zh-CN。

姿态图请求/响应枚举取值

字段枚举值说明
speciesdog / cat宠物物种枚举;请求和身份资源返回均使用该取值。
items[].speciesdog / cat请求强校验;身份资源返回同样取值。
poseall / lying / sitting / walking / running请求强校验;all 表示全部四姿态。
poses[]lying / sitting / walking / running单个姿态枚举。
imageslying / sitting / walking / running单个姿态枚举。
items[].poseslying / sitting / walking / running单个姿态枚举。
localeen-US / zh-CN请求强校验;默认 en-US。
statuspending / processing / success / partial_success / failed头像任务状态。
images.*.statuspending / processing / success / failed单姿态生成状态。
identity.statussuccess / partial_success / animation_pending / failed身份资源状态;animation_pending 表示姿态图可用但动图仍未完成。
items[].statusstring|null身份资源状态,例如 success、partial_success、animation_pending 或 failed。
items[].poses.*.animation_statuspending / processing / success / partial_success / failed / delete_failed关联动图任务状态,可能为空。

请求示例

curl -X POST "https://ai.gateway.uahpet.com/v1/pet-avatar/generate" \
  -H "Authorization: Bearer uah_xxx" \
  -F "source_image=@pet_image.png" \
  -F "species=dog" \
  -F "poses=sitting" \
  -F "poses=running"

请求示例:图片 URL

curl -X POST "https://ai.gateway.uahpet.com/v1/pet-avatar/generate" \
  -H "Authorization: Bearer uah_xxx" \
  -F "source_image_url=https://example.com/pet.png" \
  -F "species=dog" \
  -F "poses=all"

请求示例:JSON 图片 URL

curl -X POST "https://ai.gateway.uahpet.com/v1/pet-avatar/generate" \
  -H "Authorization: Bearer uah_xxx" \
  -H "Content-Type: application/json" \
  -d '{
    "pet_name": "yu",
    "species": "cat",
    "pose": "sitting",
    "source_image_url": "https://example.com/pet.png",
    "locale": "en-US",
    "breed": "Poodle"
  }'

返回 JSON

{
  "request_id": "req_xxx",
  "task_id": "avatar_task_xxx",
  "status": "pending",
  "message": "Avatar generation task created.",
  "poll_after_seconds": 8
}
字段类型说明
request_idstring请求 ID。
task_idstring头像任务 ID,后续查询任务使用。
statusstring初始通常是 pending。
messagestring任务创建说明。
poll_after_secondsinteger|null建议等待多少秒后查询任务。

GET /v1/pet-avatar/tasks/{task_id}

查询头像任务。兼容路径:/v1/pet-avatars/tasks/{task_id}。

请求参数

字段位置类型必填说明
AuthorizationHeaderstring是Bearer API Key,需要 uah-avatar 和图片权限。
task_idPathstring是创建任务时返回的头像任务 ID。

请求示例

curl -H "Authorization: Bearer uah_xxx" \
  "https://ai.gateway.uahpet.com/v1/pet-avatar/tasks/avatar_task_xxx"

返回 JSON

{
  "request_id": "req_xxx",
  "task_id": "avatar_task_xxx",
  "status": "success",
  "user_id": "temporary",
  "pet_id": "temporary",
  "provider": "apiyi",
  "model": "gpt-image-2-all",
  "source_cos_key": "ai-gateway/avatar/source/...",
  "source_url": "https://...",
  "identity_asset_id": "identity_xxx",
  "images": {
    "sitting": {
      "status": "success",
      "generated_cos_key": "ai-gateway/avatar/generated/...",
      "generated_url": "https://..."
    },
    "running": {
      "status": "failed",
      "error_code": "provider_error",
      "error_message": "Avatar generation failed."
    }
  }
}
字段类型说明
statusstring任务状态:pending、processing、success、partial_success、failed。
source_urlstring原图可访问链接,可能是带有效期的签名 URL。
identity_asset_idstring|null头像成功后生成的宠物身份资源 ID。日记配图会用它。
imagesobject按姿态聚合的结果,key 为 lying/sitting/walking/running。
images.*.generated_urlstring|null姿态图 URL,仅成功时返回。
images.*.error_codestring|null姿态生成失败时返回。
poll_after_secondsinteger|null任务未结束时返回,表示建议下次查询间隔。

GET /v1/pet-avatars

分页查询宠物身份资源。

请求参数

字段位置类型必填默认/限制说明
AuthorizationHeaderstring是-Bearer API Key,需要 uah-avatar 和图片权限。
user_idQuerystring是1-128只返回该用户的身份资源。为兼容旧版调用方,未传时网关按 temporary 占位处理,并在用量日志中标记为缺 ID。
pageQueryinteger否默认 1,最小 1当前页码。
page_sizeQueryinteger否默认 20,1-100每页数量。

请求示例

curl -H "Authorization: Bearer uah_xxx" \
  "https://ai.gateway.uahpet.com/v1/pet-avatars?page=1&page_size=20"

返回 JSON

{
  "page": 1,
  "page_size": 20,
  "total": 1,
  "items": [
    {
      "identity_asset_id": "identity_xxx",
      "avatar_task_id": "avatar_task_xxx",
      "animation_task_id": "anim_task_xxx",
      "user_id": "temporary",
      "pet_id": "temporary",
      "species": "dog",
      "status": "ready",
      "source_url": "https://...",
      "poses": {
        "sitting": {
          "image_url": "https://...",
          "animation_status": "success",
          "webp_url": "https://...",
          "mp4_url": "https://..."
        }
      }
    }
  ]
}
字段类型说明
items[].identity_asset_idstring身份资源 ID。
items[].statusstring身份资源状态,例如 ready、animation_pending。
items[].posesobject姿态资源,key 为姿态名。
items[].poses.*.image_urlstring姿态静态图 URL。
items[].poses.*.webp_urlstring|null关联动图 WebP URL,有动图任务成功时返回。

GET /v1/pet-avatars/{identity_asset_id}

查询单个身份资源详情。

请求参数

字段位置类型必填说明
identity_asset_idPathstring是身份资源 ID。

请求示例

curl -H "Authorization: Bearer uah_xxx" \
  "https://ai.gateway.uahpet.com/v1/pet-avatars/identity_xxx"

返回 JSON

{
  "identity_asset_id": "identity_xxx",
  "avatar_task_id": "avatar_task_xxx",
  "animation_task_id": "anim_task_xxx",
  "user_id": "temporary",
  "pet_id": "temporary",
  "species": "dog",
  "status": "ready",
  "source_url": "https://...",
  "poses": {
    "sitting": {
      "image_url": "https://...",
      "animation_status": "success",
      "webp_url": "https://...",
      "mp4_url": "https://..."
    }
  }
}

字段含义与列表接口的 items[] 单项一致。

POST /v1/pet-avatars/feedback

Submit feedback for one or more generated pet-avatar images. Re-submitting a COS key updates its latest feedback.

Request example

{
  "feedbacks": [
    {"cos_key": "ai-gateway/avatars/generated/task-1/sitting.png", "liked": true, "selected": true},
    {"cos_key": "ai-gateway/avatars/generated/task-2/walking.png", "liked": false, "selected": false}
  ]
}
feedbacksarrayrequired1–100 image feedback records.
feedbacks[].cos_keystringrequiredAvatar-task generated COS key; unknown or duplicate keys are rejected.
feedbacks[].likedbooleanone requiredWhether the user likes the image.
feedbacks[].selectedbooleanone requiredWhether the user selected the image.

Provide liked, selected, or both. An omitted value does not overwrite an existing annotation.

Response example

{
  "result": {
    "code": 200,
    "message": "success",
    "request_id": "req_xxx"
  }
}

循环动图生成

POST /v1/pet-animation/generate

使用头像任务的姿态图生成 WebP/MP4 动图。

请求参数

字段位置类型必填默认/枚举说明
avatar_task_idBodystring是1-128已完成或部分成功的头像任务 ID。
poseBodystring否allall、lying、sitting、walking、running。

循环动图请求/响应枚举取值

字段枚举值说明
poseall / lying / sitting / walking / running请求强校验。
images keylying / sitting / walking / running单姿态枚举。
statuspending / processing / success / partial_success / failed / deleting / delete_failed动图任务状态。
images.*.statuspending / processing / success / failed单姿态动图状态。
output_formats[]webp / mp4当前输出格式。

请求示例

{
  "avatar_task_id": "avatar_task_xxx",
  "pose": "all"
}

返回 JSON

{
  "request_id": "req_xxx",
  "task_id": "anim_task_xxx",
  "status": "pending",
  "message": "Animation generation task created.",
  "poll_after_seconds": 15
}
字段类型说明
task_idstring动图任务 ID。
statusstring任务初始状态。
poll_after_secondsinteger建议查询间隔。

GET /v1/pet-animation/tasks/{task_id}

查询动图任务。

请求参数

字段位置类型必填说明
task_idPathstring是动图任务 ID。

返回 JSON

{
  "request_id": "req_xxx",
  "task_id": "anim_task_xxx",
  "avatar_task_id": "avatar_task_xxx",
  "status": "success",
  "user_id": "temporary",
  "pet_id": "temporary",
  "provider": "openrouter",
  "model": "bytedance/seedance-2.0-fast",
  "duration_seconds": 4,
  "output_formats": ["webp", "mp4"],
  "images": {
    "sitting": {
      "status": "success",
      "mp4_cos_key": "ai-gateway/animation/generated/.../sitting/result.mp4",
      "mp4_url": "https://...",
      "webp_cos_key": "ai-gateway/animation/generated/.../sitting/result.webp",
      "webp_url": "https://...",
      "error_code": null,
      "error_message": null
    }
  }
}
字段类型说明
duration_secondsinteger生成视频时长。
output_formatsstring[]输出格式,当前为 webp 和 mp4。
images.*.webp_cos_keystring|nullWebP 动图 COS 对象 Key,仅成功时返回;可用于后端持久引用或重新签名。
images.*.webp_urlstring|nullWebP 动图 URL,可能是带有效期的签名 URL。
images.*.mp4_cos_keystring|nullMP4 视频 COS 对象 Key,仅成功时返回;可用于后端持久引用或重新签名。
images.*.mp4_urlstring|nullMP4 视频 URL。
images.*.error_codestring|null单姿态失败时返回错误码和错误说明。
images.*.error_messagestring|null单姿态失败时返回错误码和错误说明。

DELETE /v1/pet-animation/tasks/{task_id}

删除已完成、失败、部分成功或删除失败状态的动图任务和存储文件。

请求参数

字段位置类型必填说明
task_idPathstring是动图任务 ID。

成功响应

204 No Content,无响应体。

日记配图生成

POST /v1/pet-diary-image-libraries/select

从已生成图库中按日期和事实选择当天最合适的配图。

请求参数

字段位置类型必填说明
user_idBodystring是用户 ID。为兼容旧版调用方,未传时网关按 temporary 占位处理,并在用量日志中标记为缺 ID。
pet_idBodystring是宠物 ID。为兼容旧版调用方,未传时网关按 temporary 占位处理,并在用量日志中标记为缺 ID。
diary_idBodystring|null否关联日记 ID。
dateBodydate是日记日期,格式 YYYY-MM-DD。
facts.speciesBodystring是dog 或 cat。
facts.seasonBodystring|null否季节。
facts.weatherBodystring|null否天气。
facts.locationBodystring|null否地点。
facts.activityBodystring|null否活动。
facts.moodBodystring|null否心情。
facts.holidayBodystring|null否节日。

请求示例

{
  "date": "2026-07-01",
  "facts": {
    "species": "dog",
    "season": "summer",
    "weather": "sunny",
    "activity": "walk",
    "mood": "happy"
  }
}

返回 JSON

{
  "selection_id": "diary_sel_xxx",
  "image_id": "diary_lib_img_xxx",
  "generated_cos_key": "ai-gateway/diary-images/generated/...",
  "scene_id": "outdoor_walk_spring",
  "image_url": "https://...",
  "match_reason": {
    "score": 12,
    "matched": ["season", "activity"]
  }
}

POST /v1/pet-diary-images/generate

创建日记配图任务。参考图支持三种来源:传 identity_asset_id 使用已生成身份资源,传 source_image_url 使用外部图片 URL,或传 cos_key 直接复用 COS 内已有图片。三者必须且只能传一个。

请求参数

字段位置类型必填说明
user_idBodystringURL/COS Key 模式必填用户 ID。身份资源模式以身份资源上的为准。为兼容旧版调用方,未传时网关按 temporary 占位处理,并在用量日志中标记为缺 ID。
pet_idBodystringURL/COS Key 模式必填宠物 ID。身份资源模式以身份资源上的为准。为兼容旧版调用方,未传时网关按 temporary 占位处理,并在用量日志中标记为缺 ID。
diary_idBodystring|null否关联日记 ID。
identity_asset_idBodystring|null三选一宠物身份资源 ID。使用该模式时服务端自动按身份资源物种校验场景。
source_image_urlBodystring|null三选一HTTP/HTTPS 图片 URL。服务端会下载、校验尺寸和格式后保存到 COS,再创建任务。
cos_keyBodystring|null三选一已存在图片的 COS Object Key。仅接受 ai-gateway/ 前缀且对象必须存在;服务端直接复用该图片,不下载也不复制。
speciesBodystringURL/COS Key 模式必填宠物物种:dog 或 cat。身份资源模式以身份资源物种为准。
scene_idsBodystring[]是当前默认 V4.3 日记配图库场景 ID 数组。V3.0/V4.0/V4.1/V4.2 仍保留,可通过元数据接口 version 参数切换;单张生成也传数组,例如 ["indoor_curl_sleep"];多张生成传多个 ID。三种参考图来源都支持。场景目录从 /v1/app-metadata/diary-image-library-scenes 获取。
prompt_versionBodystring|null否日记配图提示词版本。可传短写 V4.3/V4.2/V4.1/V4.0/V3.0,也可传完整版本号;不传使用默认 V4.3。
force_regenerateBodyboolean否多场景图库生成时保留的参数,默认 false。

请求示例:身份资源模式

{
  "identity_asset_id": "identity_xxx",
  "scene_ids": ["indoor_curl_sleep"],
  "prompt_version": "V4.3",
  "diary_id": "dia_xxx"
}

请求示例:图片 URL 模式

{
  "source_image_url": "https://example.com/pet.png",
  "species": "dog",
  "scene_ids": ["indoor_curl_sleep"],
  "diary_id": "dia_xxx"
}

请求示例:COS Key 模式

{
  "cos_key": "ai-gateway/avatar/generated/temporary/avatar_task_xxx/sitting.png",
  "species": "dog",
  "scene_ids": ["indoor_curl_sleep", "outdoor_walk_spring"],
  "prompt_version": "V4.3"
}

请求示例:多场景图库模式

{
  "identity_asset_id": "identity_xxx",
  "scene_ids": ["indoor_curl_sleep", "outdoor_walk_spring"],
  "force_regenerate": false
}

日记配图请求/响应枚举取值

字段枚举值说明
selected_poselying / sitting / walking / running后端强校验;由场景推荐姿态决定。
recommended_poselying / sitting / walking / running后端强校验;由场景推荐姿态决定。
scene.speciesall / dog / cat日记配图场景适用物种。
scene.categorycommon / federal_holiday / personal / species_day日记配图场景分类。
statuspending / processing / success / failed日记配图任务状态。

返回 JSON

{
  "request_id": "req_xxx",
  "task_id": "diary_image_xxx",
  "status": "pending",
  "selected_pose": "sitting",
  "poll_after_seconds": 2
}

返回 JSON:多场景图库模式

{
  "request_id": "req_xxx",
  "task_id": "diary_lib_xxx",
  "status": "pending",
  "profile": "dog",
  "total_count": 2,
  "poll_after_seconds": 2
}
字段类型说明
request_idstring请求 ID。
task_idstring日记配图任务 ID,用于查询任务结果。
statusstring初始通常为 pending。
selected_posestring场景自动选择的参考姿态,枚举见上表。
poll_after_secondsnumber建议客户端等待多少秒后查询任务。

GET /v1/pet-diary-images/tasks/{task_id}

查询日记配图任务。

请求参数

字段位置类型必填说明
task_idPathstring是日记配图任务 ID。

返回 JSON

{
  "task_id": "diary_image_xxx",
  "request_id": "req_xxx",
  "user_id": "temporary",
  "pet_id": "temporary",
  "diary_id": "dia_xxx",
  "identity_asset_id": null,
  "scene_id": "home_sofa",
  "selected_pose": "lying",
  "status": "success",
  "generated_cos_key": "ai-gateway/diary-images/generated/...",
  "image_id": "diary_img_xxx",
  "image_url": "https://..."
}
字段类型说明
task_idstring任务 ID 与请求追踪 ID。
request_idstring请求 ID。
user_idQuerystring|null否1-128用户 ID;不传时使用临时默认用户。
pet_idQuerystring|null否1-128宠物 ID;不传时不过滤宠物。
diary_idstring|null请求中传入的关联日记 ID。
identity_asset_idstring|null身份资源模式返回身份资源 ID;图片 URL 模式为 null。
scene_idstring日记配图场景 ID。
selected_posestring自动选择的姿态。
generated_cos_keystring|nullCOS 对象 Key,生成成功后返回;与 image_url 指向同一张图。
statusstring任务状态,枚举见上表。
image_idstring|null生成成功后的图片 ID。
image_urlstring|null生成成功后的图片 URL,可能是带有效期的签名 URL。
error_codestring|null失败时返回的错误码;成功时为空。
error_messagestring|nullError message returned on failure.
poll_after_secondsnumber|null处理中任务的建议轮询间隔;终态通常不返回。

GET /v1/pet-diary-images 返回分页列表;测试环境未传 user_id 时返回全部历史任务,传入后仅返回该用户的任务。GET /v1/pet-diary-images/{image_id} 按图片 ID 查询,单项结构同上。

AI洞察生成

POST /v1/home-insights/generate

生成首页洞察卡片(确定性模板,不调用模型)。旧接口 POST /v1/ai-insights/generate 已于 2026-10-07 下线;GET /v1/ai-insights 与 GET /v1/ai-insights/{insight_id} 继续用于查询已生成的卡片。请求与响应契约见主服务接入文档。

健康详情洞察 v3

POST /v1/health-detail-insights/generate

AI Gateway 是被动洞察服务:主服务传入已标准化的事实,Gateway 校验 Day / Week / Month 日历窗口、推导确定性规则,并仅对已验证结论进行 AI 润色。

schemaVersion:六个指标 activity、rest、hr、hrv、rr、bark 全部固定为 health-detail-v3。locale 仅支持 en-US 或 zh-CN,缺省为 en-US,响应只返回所选语言的 summary。

支持 18 种组合:activity / rest / hr / hrv / rr / bark 各自的 day、week、month。请求不接受旧版 quality、预计算偏离结论或旧字段;响应统一使用 camelCase。

查看完整 v3 字段表、18 个请求示例、校验边界和规则矩阵

在本页展开完整协议
# 健康详情 AI 洞察接口接入规范(主服务)

**协议版本:** `health-detail-v3`(2026-10-09 起为 C4 精简版)
**接口:** `POST /v1/health-detail-insights/generate`
**调用方:** Pulse Server FeedAuto(`CurrentDetailInsightService` 组装,`AiGatewaySubcriber` 发送)
**服务方:** AI Gateway(校验请求,按服务端评级与文案目录确定性生成一段正文,不调用模型)

> 本文是主服务唯一的健康详情接入协议。产品口径见飞书「健康详情页 AI 洞察实现逻辑」第 13 章(2026-10-08 现行口径)。Gateway 不补数据、不重算调用方给的聚合、不拿请求里的范围自己下结论。

## 0. 2026-10-09 变化(整改 C1 / C2)

- **只收 C4 请求。** 不带 `insightContext` 的旧格式请求返回 422;旧的范围判定引擎、上一周期比较、模型润色和模型评审已删除。生产流量自 09-21 起已全部是 C4 请求。
- **占位字段不再要求。** 全 `unavailable` 的基线块、全 `null` 的佩戴数组、24 个空小时点、白天休息占位、`anomalyNights`、`previousPeriod: null`、宠物耐受度等都可以不发;缺省即等同原占位值。10-09 前的 FeedAuto 照发占位时,Gateway 仍按原规则校验并给出完全相同的正文(`tests/unit/test_feedauto_c4_wire.py` 逐份核对)。
- **上线顺序:** Gateway 先于 FeedAuto(新 FeedAuto 的精简请求会被旧 Gateway 拒收)。
- 2026-10-12(第二轮优化 E 批):吠叫正文讲约时长(与页头主数字、评估、▲% 同一个量),次数放括号;吠叫日视图可带个体上限 `comparison.usualUpper`(只有上限,旧 Gateway 会拒收,所以 Gateway 先上);今天到此刻的体征 / 吠叫只说平时范围,不下结论。
- 2026-10-10:过渡模式已删除——不再接受 `recent_complete_days`,`last_night` 只用于休息(体征的今天讲全天,用 `today_so_far`)。这两种模式只有 10-08 前的 FeedAuto 发过,留档显示 10-08 起为 0。

## 1. 请求

### 1.1 顶层

| 字段 | 类型 | 必填 | 说明 |
| --- | --- | --- | --- |
| `schemaVersion` | string | 是 | 固定 `health-detail-v3` |
| `userId` / `petId` | string | 是 | 留档时 `petId` 存 HMAC 哈希 |
| `metric` | enum | 是 | `activity` / `rest` / `hr` / `hrv` / `rr` / `bark` |
| `viewWindow` | enum | 是 | `day` / `week`(周一起)/ `month`(自然月) |
| `locale` | enum | 否 | `zh-CN` / `en-US` / `es`,默认 `en-US` |
| `petProfile.name` / `petProfile.species` | string / enum | 是 | 正文用名字;`species` 为 `dog` / `cat` |
| `period.startDate` / `period.endDate` | date | 是 | 宠物所在时区的本地日期 |
| `period.timezone` | string | 是 | IANA 时区 |
| `period.isCompleted` | boolean | 是 | 窗口是否已结束;含今天的窗口为 `false` |
| `period.elapsedNights` / `period.validNights` | integer | 休息、体征的周 / 月必填 | 已过去夜数 / 有合格记录的夜数 |
| `insightContext` | object | 是 | 见 1.2 |
| `suppliedJudgment` | object | 休息、体征必填 | 见 1.3 |
| `metrics` | object | 是 | 见 1.4 |
| `previousPeriod` | null | 否 | 只为旧版 FeedAuto 保留;带对象会被拒收 |

### 1.2 `insightContext`

| 字段 | 说明 |
| --- | --- |
| `mode` | `today_so_far`(今天到此刻)/ `last_night`(休息:08:00 后看今天的标签讲昨夜)/ `selected_window`(选中的历史日或周 / 月) |
| `asOf` | 查看时刻(带偏移的 ISO 8601);`isCompleted=true` 的窗口必须早于它的本地日期 |
| `observedThrough` | 最近一次上报时刻;`today_so_far` 必填 |
| `factVersion` | 事实指纹 |
| `sourceSnapshot` | 休息的来源快照;带评级时须为完整的 versioned 快照 |
| `baselineProgress` | `validDays` / `requiredDays`:个体范围建立前,日视图说一句进度 |
| `comparison` | 页面同源比较,全部可选、只读:`usualLower` / `usualUpper`(个体范围,仅 personal;吠叫是单侧指标,只给 `usualUpper`,单位秒;其他指标两者成对)、`changePercent`(与页头 ▲% 同值)、`consecutiveUnusualDays`(≥2 才说)、`unusualLowDays` / `unusualHighDays`(活动,两者之和等于关注天数才分开说)、`restRatingFactors`(休息一般 / 较差时的扣分项)、`pageEvaluationBasis`(`personal` / `breed` / `general`) |

### 1.3 `suppliedJudgment`(服务端评级,只认个体范围)

| 指标 | `ruleVersion` | `rating` | 天数字段 |
| --- | --- | --- | --- |
| 休息 | `sleep-rating-c2-v1` | `Good` / `Fair` / `Poor` / null | `ratedNights`、`lowRestDays` |
| 心率 / HRV / 呼吸率 | `vital-judgment-c1-v1` | `normal` / `balanced` / `fluctuating` / `low` / `high` / null | `judgedDays`、`unusualDays` |
| 活动 | `activity-judgment-v1` | `normal` / `fluctuating` / `low` / `high` / null | `judgedDays`、`unusualDays` |
| 吠叫 | `bark-judgment-v1` | `calm` / `active` / `frequent` / null | `judgedDays`、`unusualDays` |

- `rating`、`direction`(-1 / 0 / 1 / null)、`baselineSource` 三个键必须出现(值可为 null)。
- 关注天数是个体范围下 L2 且恶化方向的天数,与页面「异常天数」同口径;还没有评级的窗口天数为 0、关注天数为 null。
- `deteriorating`(可选):评级方向本身是否算变差;`false` 时只陈述、不给建议。
- 周 / 月:评级天数达到周 3 / 月 10 才给整期结论(0 天关注 → `normal`,≥1 → `attention` 附建议)。

### 1.4 `metrics`(页面同源事实)

| 指标 · 窗口 | 字段 |
| --- | --- |
| 活动 · 日 | `activityTime.activityMinutes`(必填)、`activityTime.activityMinutesGoal`(设了目标时)、`steps.steps` |
| 活动 · 周 / 月 | `activityTime.averageDailyActivityMinutes`(只算已结束的日子,没有则 null)、`activityTime.dailyActivityMinutes`(按日历顺序,未来留 null)、`steps.averageDailySteps` / `steps.dailySteps` |
| 休息 · 日 | `night.startAt` / `night.endAt`(前一天 22:00 到当天 08:00)/ `night.isCompleted`、`night.nightRest.minutes`、`night.interruptions.count`、`night.nightActivity.minutes`、`night.longestRestBlockMinutes`(可为 null)、`night.wearingMinutes`、`day.hourlyRestMinutes`(有白天记录时) |
| 休息 · 周 / 月 | `nightRest.averageMinutes`、`interruptions.averageCount`、`nightActivity.averageMinutes`、`nightlyRestDurations[]`(`nightDate` / `lightMovementMinutes` / `deepRestMinutes`);有白天记录时 `dailyDayRestMinutes` 与 `dayRest.averageMinutes`(只算已结束的日子) |
| 体征 · 日 | `night`、`nightRest{X}Average` 与 `allDayRest{X}Average`(`value` / `sampleCount`,X = Hr / Rmssd / Rr) |
| 体征 · 周 / 月 | 上述两个均值、`dailyNightRest{X}[]`、`dailyAllDayRest{X}[]`、`aggregationMethod: daily_median_mean_v1`;夜间均值只算 ≥4 个样本的合格夜,全天均值只算已结束的日子 |
| 吠叫 · 日 | `measurementMode: estimated`、`barkDurationSeconds`、`barkEventCount`、`longestBarkEventDurationSeconds` |
| 吠叫 · 周 / 月 | `averageDailyBarkDurationSeconds`、`barkEventCount`、`averageDailyBarkEventCount`、`dailyBarkDurations[]`(`date` / `barkDurationSeconds`) |

## 2. 响应

| 字段 | 说明 |
| --- | --- |
| `insightId` | Gateway 生成 |
| `petId` / `metric` / `viewWindow` / `period` | 原样返回 |
| `status` | `attention` / `normal` / `observation` / `insufficient_data`;`observation` 是中性陈述,不等于正常 |
| `severity` | 关注为 `low`,其余 `none` |
| `summary` | 一段正文:事实句 + 至多一句补充(建议 / 建立进度 / 佩戴提示);不写等待句、内部用语、算法参数和诊断 |
| `generation` | `ruleId` / `ruleVersion` / `generatedAt` / `aiPolished`(恒为 false) |

422 不回传字段详情,按 `X-Request-ID` 查两端日志。

## 3. 示例

全部来自场景库(`app/health_detail/scenarios.py`,基于 FeedAuto 真实序列化的样本 `app/health_detail/samples/`);37 个场景的三语正文见演示页、`/api-docs` 与 `scripts/validate_health_detail_journeys.py` 生成的 `report.md`。

### 3.1 心率 · 历史某天 · 在平时范围内

请求:

```json
{
  "period": {
    "endDate": "2026-09-08",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-08",
    "isCompleted": true
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "hr",
  "insightContext": {
    "mode": "selected_window",
    "comparison": {
      "usualUpper": 80.0,
      "usualLower": 64.0,
      "pageEvaluationBasis": "personal"
    },
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-08T08:00+08:00",
    "factVersion": "ee84aff0255fb9f96caf24d4bfd238fb17ce5b4a7f46bec69ccc739fa3f962fe"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 0,
    "judgedDays": 1,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": "normal",
    "baselineSource": "personal",
    "direction": 0
  },
  "metrics": {
    "allDayRestHrAverage": {
      "sampleCount": 8,
      "value": 78.0
    },
    "night": {
      "endAt": "2026-09-08T08:00+08:00",
      "startAt": "2026-09-07T22:00+08:00",
      "isCompleted": true
    },
    "nightRestHrAverage": {
      "sampleCount": 3,
      "value": 78.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}
```

返回:

```json
{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "hr",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-08",
    "endDate": "2026-09-08",
    "timezone": "Asia/Shanghai",
    "isCompleted": true
  },
  "status": "normal",
  "severity": "none",
  "summary": "9月8日,Pocky 的静息心率是 78 次/分,在它平时的范围内(64–80 次/分)。",
  "generation": {
    "ruleId": "HR_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}
```

### 3.2 心率 · 已结束的一周 · 都在平时范围内

请求:

```json
{
  "period": {
    "elapsedNights": 4,
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-07",
    "validNights": 0,
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "hr",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "aa925ec23bdebca62f1f83b70bb713d5b4e067cccb94615589ebe60374a85f40",
    "comparison": {
      "changePercent": -3.4
    }
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 0,
    "judgedDays": 5,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": null,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "dailyAllDayRestHr": [
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      }
    ],
    "allDayRestHrAverage": {
      "sampleCount": 9,
      "value": 80.0
    },
    "dailyNightRestHr": [
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "nightRestHrAverage": null
      }
    ],
    "aggregationMethod": "daily_median_mean_v1",
    "nightRestHrAverage": {
      "sampleCount": 0,
      "value": null
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "week"
}
```

返回:

```json
{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "hr",
  "viewWindow": "week",
  "period": {
    "startDate": "2026-09-07",
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "isCompleted": false,
    "elapsedNights": 4,
    "validNights": 0
  },
  "status": "normal",
  "severity": "none",
  "summary": "本周 Pocky 的静息心率平均 80 次/分,比上周低 3%,5 天都在它平时的范围内。",
  "generation": {
    "ruleId": "HR_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}
```

### 3.3 休息 · 昨夜较差且连续 2 晚

请求:

```json
{
  "period": {
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-10",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "rest",
  "insightContext": {
    "mode": "last_night",
    "comparison": {
      "pageEvaluationBasis": "personal",
      "restRatingFactors": [
        "duration"
      ],
      "consecutiveUnusualDays": 2
    },
    "asOf": "2026-09-10T15:00+08:00",
    "sourceSnapshot": {
      "snapshotState": "versioned",
      "snapshotId": "rs_e4d748b697b4e5de994d544c58884b6d",
      "asOf": 1788998400000,
      "computedAt": 1788998400000,
      "sourceCompleteness": "complete",
      "sourceWatermarks": {
        "posture": {
          "cursor": null,
          "observedThrough": 1788998400000,
          "completeThrough": 1788998400000
        },
        "wear": {
          "cursor": null,
          "observedThrough": 1788998400000,
          "completeThrough": 1788998400000
        },
        "step": {
          "cursor": null,
          "observedThrough": 1788998400000,
          "completeThrough": 1788998400000
        }
      },
      "aggregateVersion": "rest-detail-v2-c2"
    },
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "8aa77bd699e369b955b3c23e7d57b77637d303d2d2257d924fbed1293821ecf7"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "lowRestDays": 1,
    "ruleVersion": "sleep-rating-c2-v1",
    "rating": "Poor",
    "ratedNights": 1,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "night": {
      "interruptions": {
        "count": 5
      },
      "nightRest": {
        "minutes": 210.0
      },
      "longestRestBlockMinutes": 80.0,
      "nightActivity": {
        "minutes": 300.0
      },
      "endAt": "2026-09-10T08:00+08:00",
      "startAt": "2026-09-09T22:00+08:00",
      "isCompleted": true,
      "wearingMinutes": 600.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}
```

返回:

```json
{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "rest",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-10",
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "attention",
  "severity": "low",
  "summary": "昨夜,Pocky 休息了 3 小时 30 分钟,中间醒了 5 次。睡得不太好,主要是休息时间比平时短,已经连续 2 晚。回看夜里的环境和作息有没有变化,也给它留些安静休息的时间。",
  "generation": {
    "ruleId": "REST_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}
```

### 3.4 活动 · 今天离目标还差

请求:

```json
{
  "period": {
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-10",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "activity",
  "insightContext": {
    "mode": "today_so_far",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "1f2f0d71af4f4b0be54aa1226ae515b0346e26ed364a93a400c51ae405eecbf8"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": null,
  "metrics": {
    "activityTime": {
      "activityMinutes": 10.0,
      "activityMinutesGoal": 60.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}
```

返回:

```json
{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "activity",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-10",
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "observation",
  "severity": "none",
  "summary": "今天到 08:00,Pocky 已经活动了 10 分钟,离每天 1 小时的目标还差 50 分钟。",
  "generation": {
    "ruleId": "ACTIVITY_IN_PROGRESS_SUMMARY",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}
```

### 3.5 活动 · 本周 1 天偏少、1 天偏多

请求:

```json
{
  "period": {
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-07",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "activity",
  "insightContext": {
    "mode": "selected_window",
    "comparison": {
      "unusualLowDays": 1,
      "changePercent": 12.3,
      "unusualHighDays": 1
    },
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "c0736b1a2a89d04f65b69ccace8874a80b529a6c255a350ee4aadd86a24903d9"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 2,
    "judgedDays": 3,
    "ruleVersion": "activity-judgment-v1",
    "rating": null,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "activityTime": {
      "averageDailyActivityMinutes": 30.0,
      "dailyActivityMinutes": [
        30.0,
        30.0,
        30.0,
        10.0,
        null,
        null,
        null
      ]
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "week"
}
```

返回:

```json
{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "activity",
  "viewWindow": "week",
  "period": {
    "startDate": "2026-09-07",
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "attention",
  "severity": "low",
  "summary": "本周有 1 天 Pocky 的活动比平时少、1 天比平时多,日均 30 分钟,比上周多 12%。留意精神、食欲和外出意愿有没有变化。",
  "generation": {
    "ruleId": "ACTIVITY_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}
```

### 3.6 吠叫 · 历史某天叫得明显多

请求:

```json
{
  "period": {
    "endDate": "2026-09-08",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-08",
    "isCompleted": true
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "bark",
  "insightContext": {
    "mode": "selected_window",
    "comparison": {
      "usualUpper": 180.0,
      "pageEvaluationBasis": "personal"
    },
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-08T08:00+08:00",
    "factVersion": "05e78c6791135aee436e826b376945a0b99a792d979fdc65341875d0690cfa65"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 1,
    "judgedDays": 1,
    "ruleVersion": "bark-judgment-v1",
    "rating": "frequent",
    "baselineSource": "personal",
    "deteriorating": true,
    "direction": 1
  },
  "metrics": {
    "measurementMode": "estimated",
    "longestBarkEventDurationSeconds": 60.0,
    "barkDurationSeconds": 420.0,
    "barkEventCount": 14
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}
```

返回:

```json
{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "bark",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-08",
    "endDate": "2026-09-08",
    "timezone": "Asia/Shanghai",
    "isCompleted": true
  },
  "status": "attention",
  "severity": "low",
  "summary": "9月8日,Pocky 叫了约 7 分钟(14 次),明显比它平时多(平时一天不超过约 3 分钟)。回看叫声多的时段,看看是否有访客、声音或作息变化。",
  "generation": {
    "ruleId": "BARK_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}
```

## 4. 主服务调用检查清单

- 每个请求都带 `insightContext`;休息与体征带 `suppliedJudgment`(还没评级时 `rating` 为 null、天数为 0)。
- 均值只算已结束的日子;逐日数组与窗口等长、按日历顺序,未来的日子留 null。
- 没有可信来源的字段不发,不填 0、不填占位。
- 发送前跑 `CurrentDetailPreflight`;Gateway 仍做完整校验。
- 改了文案目录(`config/health_detail_copy.yaml`)就看一遍三语对照报告,西语上线前请懂西语的同事审阅。
健康指标
时间窗口

活动 · 日

接口简介

活动日视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-10",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "activity",
  "insightContext": {
    "mode": "today_so_far",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "1f2f0d71af4f4b0be54aa1226ae515b0346e26ed364a93a400c51ae405eecbf8"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": null,
  "metrics": {
    "activityTime": {
      "activityMinutes": 10.0,
      "activityMinutesGoal": 60.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject否服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:日视图的开始和结束日期必须是同一天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "activity",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-10",
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "observation",
  "severity": "none",
  "summary": "今天到 08:00,Pocky 已经活动了 10 分钟,离每天 1 小时的目标还差 50 分钟。",
  "generation": {
    "ruleId": "ACTIVITY_IN_PROGRESS_SUMMARY",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
activity-today-below-goal
今天 · 离目标还差
observation今天到 08:00,Pocky 已经活动了 10 分钟,离每天 1 小时的目标还差 50 分钟。As of 08:00, Pocky has been active for 10 min today, 50 min short of its 1h daily goal.Hoy hasta las 08:00, Pocky lleva 10 min de actividad, a 50 min de su meta diaria de 1 h.
activity-today-goal-met
今天 · 已达到目标
observation今天到 08:00,Pocky 已经活动了 1 小时 1 分钟,已经达到每天 1 小时的目标。As of 08:00, Pocky has been active for 1h 1m today, already meeting its 1h daily goal.Hoy hasta las 08:00, Pocky lleva 1 h 1 min de actividad y ya cumplió su meta diaria de 1 h.
activity-day-high
历史某天 · 活动偏多
attention9月8日,Pocky 活动了 2 小时 30 分钟,多于它平时的范围(40 分钟–1 小时 20 分钟)。活动之间留些安静休息的时间,备好饮水。On Sep 8, Pocky was active for 2h 30m, more than its usual range (40 min–1h 20m). Leave quiet rest between activities and keep water handy.El 8 de sept., Pocky tuvo 2 h 30 min de actividad, más que su rango habitual (40 min–1 h 20 min). Deja ratos de descanso tranquilo entre actividades y ten agua a mano.
activity-day-normal
历史某天 · 在平时范围内
normal9月8日,Pocky 活动了 1 小时,在它平时的范围内(40 分钟–1 小时 20 分钟)。On Sep 8, Pocky was active for 1h, within its usual range (40 min–1h 20m).El 8 de sept., Pocky tuvo 1 h de actividad, dentro de su rango habitual (40 min–1 h 20 min).

活动 · 周

接口简介

活动周视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-07",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "activity",
  "insightContext": {
    "mode": "selected_window",
    "comparison": {
      "unusualLowDays": 1,
      "changePercent": 12.3,
      "unusualHighDays": 1
    },
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "c0736b1a2a89d04f65b69ccace8874a80b529a6c255a350ee4aadd86a24903d9"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 2,
    "judgedDays": 3,
    "ruleVersion": "activity-judgment-v1",
    "rating": null,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "activityTime": {
      "averageDailyActivityMinutes": 30.0,
      "dailyActivityMinutes": [30.0, 30.0, 30.0, 10.0, null, null, null]
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "week"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject否服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:周视图必须是从周一开始的连续 7 天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "activity",
  "viewWindow": "week",
  "period": {
    "startDate": "2026-09-07",
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "attention",
  "severity": "low",
  "summary": "本周有 1 天 Pocky 的活动比平时少、1 天比平时多,日均 30 分钟,比上周多 12%。留意精神、食欲和外出意愿有没有变化。",
  "generation": {
    "ruleId": "ACTIVITY_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
activity-week-mixed
本周 · 1 天偏少、1 天偏多
attention本周有 1 天 Pocky 的活动比平时少、1 天比平时多,日均 30 分钟,比上周多 12%。留意精神、食欲和外出意愿有没有变化。This week, Pocky was less active than usual on 1 day and more active on 1 day, averaging 30 min a day, 12% more than last week. Watch for changes in energy, appetite, and interest in going out.Esta semana, Pocky tuvo menos actividad de lo habitual 1 día y más 1 día; promedió 30 min al día, un 12% más que la semana pasada. Observa si hay cambios en su energía, su apetito o sus ganas de salir.
activity-week-normal
本周 · 都在平时范围内
normal本周 Pocky 日均活动 30 分钟,比上周多 12%,3 天都在它平时的范围内。This week, Pocky's activity stayed within its usual range on all 3 days, averaging 30 min a day, 12% more than last week.Esta semana, la actividad de Pocky se mantuvo dentro de su rango habitual los 3 días, con 30 min al día en promedio, un 12% más que la semana pasada.
activity-week-few-days
本周 · 只有 2 天有记录
observation本周 Pocky 日均活动 30 分钟(只有 2 天有记录)。This week, Pocky averaged 30 min of activity a day (only 2 days with records).Esta semana, Pocky tuvo 30 min de actividad al día en promedio (solo 2 días con registros).

活动 · 月

接口简介

活动月视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-08-31",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-08-01",
    "isCompleted": true
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "activity",
  "insightContext": {
    "mode": "selected_window",
    "comparison": {
      "unusualLowDays": 1,
      "changePercent": -6.2,
      "unusualHighDays": 0
    },
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-08-31T08:00+08:00",
    "factVersion": "38a6112e3a1f023587fcbd587e02ffb071e47fdffe85b2553f3a16aa0754a18a"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 1,
    "judgedDays": 16,
    "ruleVersion": "activity-judgment-v1",
    "rating": null,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "activityTime": {
      "averageDailyActivityMinutes": 55.0,
      "dailyActivityMinutes": [40.0, null, 42.0, null, 44.0, null, 46.0, null, 48.0, null, 50.0, null, 52.0, null, 54.0, null, 56.0, null, 58.0, null, 60.0, null, 62.0, null, 64.0, null, 66.0, null, 68.0, null, 70.0]
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "month"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject否服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:月视图必须覆盖一个完整的自然月。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "activity",
  "viewWindow": "month",
  "period": {
    "startDate": "2026-08-01",
    "endDate": "2026-08-31",
    "timezone": "Asia/Shanghai",
    "isCompleted": true
  },
  "status": "attention",
  "severity": "low",
  "summary": "这个月有 1 天 Pocky 的活动比平时少,日均 55 分钟,比前一个月少 6%。留意精神、食欲和外出意愿有没有变化。",
  "generation": {
    "ruleId": "ACTIVITY_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
activity-month-low
上个月 · 1 天偏少
attention这个月有 1 天 Pocky 的活动比平时少,日均 55 分钟,比前一个月少 6%。留意精神、食欲和外出意愿有没有变化。That month, Pocky was less active than usual on 1 day, averaging 55 min a day, 6% less than the month before. Watch for changes in energy, appetite, and interest in going out.Ese mes, Pocky tuvo menos actividad de lo habitual 1 día; promedió 55 min al día, un 6% menos que el mes anterior. Observa si hay cambios en su energía, su apetito o sus ganas de salir.

休息 · 日

接口简介

休息日视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-10",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "rest",
  "insightContext": {
    "mode": "last_night",
    "comparison": {
      "pageEvaluationBasis": "personal"
    },
    "asOf": "2026-09-10T15:00+08:00",
    "sourceSnapshot": {
      "snapshotState": "versioned",
      "snapshotId": "rs_e4d748b697b4e5de994d544c58884b6d",
      "asOf": 1788998400000,
      "computedAt": 1788998400000,
      "sourceCompleteness": "complete",
      "sourceWatermarks": {
        "posture": {
          "cursor": null,
          "observedThrough": 1788998400000,
          "completeThrough": 1788998400000
        },
        "wear": {
          "cursor": null,
          "observedThrough": 1788998400000,
          "completeThrough": 1788998400000
        },
        "step": {
          "cursor": null,
          "observedThrough": 1788998400000,
          "completeThrough": 1788998400000
        }
      },
      "aggregateVersion": "rest-detail-v2-c2"
    },
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "8aa77bd699e369b955b3c23e7d57b77637d303d2d2257d924fbed1293821ecf7"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "lowRestDays": null,
    "ruleVersion": "sleep-rating-c2-v1",
    "rating": null,
    "ratedNights": 0,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "night": {
      "interruptions": {
        "count": 0
      },
      "nightRest": {
        "minutes": 300.5
      },
      "longestRestBlockMinutes": 300.5,
      "nightActivity": {
        "minutes": 299.5
      },
      "endAt": "2026-09-10T08:00+08:00",
      "startAt": "2026-09-09T22:00+08:00",
      "isCompleted": true,
      "wearingMinutes": 600.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.ratedNightsinteger是有服务端评级的夜数。
suppliedJudgment.lowRestDaysinteger|null否睡得差的夜数。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:日视图的开始和结束日期必须是同一天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "rest",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-10",
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "observation",
  "severity": "none",
  "summary": "昨夜,Pocky 休息了 5 小时 1 分钟,中间没有醒。",
  "generation": {
    "ruleId": "REST_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
rest-last-night
昨夜 · 还没有评级
observation昨夜,Pocky 休息了 5 小时 1 分钟,中间没有醒。Last night, Pocky rested for 5h 1m without waking.Anoche, Pocky descansó 5 h 1 min sin despertarse.
rest-day-good
昨夜 · 睡得好
normal昨夜,Pocky 休息了 5 小时 1 分钟,中间没有醒。整晚睡得不错。Last night, Pocky rested for 5h 1m without waking. It slept well.Anoche, Pocky descansó 5 h 1 min sin despertarse. Durmió bien.
rest-day-fair-factors
昨夜 · 一般,主要是夜醒
observation昨夜,Pocky 休息了 5 小时 1 分钟,中间没有醒。睡得一般,主要是夜里醒得比平时多、休息时间比平时短。Last night, Pocky rested for 5h 1m without waking. It slept fairly well; it woke up more often than usual and it rested less than usual.Anoche, Pocky descansó 5 h 1 min sin despertarse. Durmió regular; se despertó más veces de lo habitual y descansó menos de lo habitual.
rest-day-poor-streak
昨夜 · 较差且连续 2 晚
attention昨夜,Pocky 休息了 3 小时 30 分钟,中间醒了 5 次。睡得不太好,主要是休息时间比平时短,已经连续 2 晚。回看夜里的环境和作息有没有变化,也给它留些安静休息的时间。Last night, Pocky rested for 3h 30m, waking 5 times. It didn't sleep well; it rested less than usual, 2 nights in a row. Check whether the nighttime setting or routine has changed, and leave room for quiet rest.Anoche, Pocky descansó 3 h 30 min y se despertó 5 veces. No durmió bien; descansó menos de lo habitual, 2 noches seguidas. Revisa si cambió el entorno o la rutina por la noche y dale tiempo para descansar tranquilo.
rest-day-short-wear
昨夜 · 只戴了约 3 小时
observation昨夜,Pocky 休息了 5 小时 1 分钟,中间没有醒。这晚项圈只戴了约 3 小时,休息还没记全。Last night, Pocky rested for 5h 1m without waking. The collar was worn for only about 3 hours that night, so its rest isn't fully captured.Anoche, Pocky descansó 5 h 1 min sin despertarse. Esa noche el collar solo estuvo puesto alrededor de 3 horas, así que su descanso no quedó registrado del todo.
rest-zero-night
昨夜 · 一整晚没有休息
attention昨夜,Pocky 休息了 0 分钟。睡得不太好。回看夜里的环境和作息有没有变化,也给它留些安静休息的时间。Last night, Pocky rested for 0 min. It didn't sleep well. Check whether the nighttime setting or routine has changed, and leave room for quiet rest.Anoche, Pocky descansó 0 min. No durmió bien. Revisa si cambió el entorno o la rutina por la noche y dale tiempo para descansar tranquilo.
rest-today-daytime-only
今天 · 只有白天的休息记录
observation今天到 14:59,Pocky 白天休息了 1 小时 40 分钟。As of 14:59 today, Pocky has had 1h 40m of daytime rest.Hoy hasta las 14:59, Pocky ha descansado 1 h 40 min durante el día.

休息 · 周

接口简介

休息周视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "elapsedNights": 4,
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-07",
    "validNights": 4,
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "rest",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T15:00+08:00",
    "sourceSnapshot": {
      "snapshotState": "versioned",
      "snapshotId": "rs_f67957b4f955467d11a2a7c1c2f3dd3a",
      "asOf": 1788739200000,
      "computedAt": 1788998400000,
      "sourceCompleteness": "complete",
      "sourceWatermarks": {
        "posture": {
          "cursor": null,
          "observedThrough": 1788998400000,
          "completeThrough": 1788739200000
        },
        "wear": {
          "cursor": null,
          "observedThrough": 1788998400000,
          "completeThrough": 1788739200000
        },
        "step": {
          "cursor": null,
          "observedThrough": 1788998400000,
          "completeThrough": 1788739200000
        }
      },
      "aggregateVersion": "rest-detail-v2-c2"
    },
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "5a9810d698695623a1f5e37c75a29d9248cd591f5e5926e39d9aa1c96cb5c037",
    "comparison": {
      "changePercent": 4.0
    }
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "lowRestDays": 0,
    "ruleVersion": "sleep-rating-c2-v1",
    "rating": null,
    "ratedNights": 4,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "nightlyRestDurations": [
      {
        "nightDate": "2026-09-07",
        "deepRestMinutes": 300.5,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-08",
        "deepRestMinutes": 300.5,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-09",
        "deepRestMinutes": 300.5,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-10",
        "deepRestMinutes": 300.5,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-11",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-12",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-13",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      }
    ],
    "interruptions": {
      "averageCount": 0.0
    },
    "nightRest": {
      "averageMinutes": 300.5
    },
    "nightActivity": {
      "averageMinutes": 299.5
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "week"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null是周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null是周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.ratedNightsinteger是有服务端评级的夜数。
suppliedJudgment.lowRestDaysinteger|null否睡得差的夜数。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:周视图必须是从周一开始的连续 7 天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "rest",
  "viewWindow": "week",
  "period": {
    "startDate": "2026-09-07",
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "isCompleted": false,
    "elapsedNights": 4,
    "validNights": 4
  },
  "status": "normal",
  "severity": "none",
  "summary": "本周 Pocky 平均每晚休息 5 小时 1 分钟,比上周多 4%,夜里基本没醒,4 晚里没有一晚睡得不好。",
  "generation": {
    "ruleId": "REST_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
rest-week-normal
本周 · 没有睡得差的晚上
normal本周 Pocky 平均每晚休息 5 小时 1 分钟,比上周多 4%,夜里基本没醒,4 晚里没有一晚睡得不好。This week, none of Pocky's 4 nights was a poor one; it rested for 5h 1m a night on average, 4% more than last week and hardly woke at night.Esta semana, ninguna de las 4 noches de Pocky fue mala; descansó 5 h 1 min por noche en promedio, un 4% más que la semana pasada y casi no se despertó por la noche.
rest-week-poor-nights
本周 · 2 晚睡得差
attention本周 Pocky 平均每晚休息 5 小时 1 分钟,夜里基本没醒,有 2 晚睡得不太好。回看夜里的环境和作息有没有变化,也给它留些安静休息的时间。This week, Pocky rested for 5h 1m a night on average and hardly woke at night; 2 nights were poor. Check whether the nighttime setting or routine has changed, and leave room for quiet rest.Esta semana, Pocky descansó 5 h 1 min por noche en promedio y casi no se despertó por la noche; 2 noches fueron malas. Revisa si cambió el entorno o la rutina por la noche y dale tiempo para descansar tranquilo.
rest-week-daytime-only
本周 · 只有白天的休息记录
observation本周 Pocky 白天日均休息 1 小时 10 分钟。This week, Pocky had 1h 10m of daytime rest a day on average.Esta semana, Pocky tuvo 1 h 10 min de descanso diurno al día en promedio.

休息 · 月

接口简介

休息月视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "elapsedNights": 9,
    "endDate": "2026-09-30",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-01",
    "validNights": 6,
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "rest",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T07:59+08:00",
    "sourceSnapshot": {
      "snapshotState": "versioned",
      "snapshotId": "rs_441d8ca985b0651519aef7c88d697d46",
      "asOf": 1788480000000,
      "computedAt": 1788912000000,
      "sourceCompleteness": "complete",
      "sourceWatermarks": {
        "posture": {
          "cursor": null,
          "observedThrough": 1788912000000,
          "completeThrough": 1788480000000
        },
        "wear": {
          "cursor": null,
          "observedThrough": 1788912000000,
          "completeThrough": 1788480000000
        },
        "step": {
          "cursor": null,
          "observedThrough": 1788912000000,
          "completeThrough": 1788480000000
        }
      },
      "aggregateVersion": "rest-detail-v2-c2"
    },
    "observedThrough": "2026-09-09T08:00+08:00",
    "factVersion": "df4dad91bdf03010d2f53512542907d4759e898a81ca97e91614e8f43cdb3b4a"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "lowRestDays": null,
    "ruleVersion": "sleep-rating-c2-v1",
    "rating": null,
    "ratedNights": 0,
    "baselineSource": null,
    "direction": null
  },
  "metrics": {
    "nightlyRestDurations": [
      {
        "nightDate": "2026-09-01",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-02",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-03",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-04",
        "deepRestMinutes": 80.0,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-05",
        "deepRestMinutes": 80.0,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-06",
        "deepRestMinutes": 80.0,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-07",
        "deepRestMinutes": 80.0,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-08",
        "deepRestMinutes": 80.0,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-09",
        "deepRestMinutes": 80.0,
        "lightMovementMinutes": 0.0
      },
      {
        "nightDate": "2026-09-10",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-11",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-12",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-13",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-14",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-15",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-16",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-17",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-18",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-19",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-20",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-21",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-22",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-23",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-24",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-25",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-26",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-27",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-28",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-29",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      },
      {
        "nightDate": "2026-09-30",
        "deepRestMinutes": null,
        "lightMovementMinutes": null
      }
    ],
    "interruptions": {
      "averageCount": 0.0
    },
    "nightRest": {
      "averageMinutes": 80.0
    },
    "nightActivity": {
      "averageMinutes": 520.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "month"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null是周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null是周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.ratedNightsinteger是有服务端评级的夜数。
suppliedJudgment.lowRestDaysinteger|null否睡得差的夜数。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:月视图必须覆盖一个完整的自然月。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "rest",
  "viewWindow": "month",
  "period": {
    "startDate": "2026-09-01",
    "endDate": "2026-09-30",
    "timezone": "Asia/Shanghai",
    "isCompleted": false,
    "elapsedNights": 9,
    "validNights": 6
  },
  "status": "observation",
  "severity": "none",
  "summary": "本月 Pocky 平均每晚休息 1 小时 20 分钟,夜里基本没醒。9月4日那晚休息最长,有 1 小时 20 分钟。",
  "generation": {
    "ruleId": "REST_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
rest-month-pattern
本月 · 没有评级时说规律
observation本月 Pocky 平均每晚休息 1 小时 20 分钟,夜里基本没醒。9月4日那晚休息最长,有 1 小时 20 分钟。This month, Pocky rested for 1h 20m a night on average and hardly woke at night. Sep 4 night had the longest rest, 1h 20m.Este mes, Pocky descansó 1 h 20 min por noche en promedio y casi no se despertó por la noche. La noche del 4 de sept. tuvo el descanso más largo: 1 h 20 min.

心率 · 日

接口简介

心率日视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-09-08",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-08",
    "isCompleted": true
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "hr",
  "insightContext": {
    "mode": "selected_window",
    "comparison": {
      "usualUpper": 80.0,
      "usualLower": 64.0,
      "pageEvaluationBasis": "personal"
    },
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-08T08:00+08:00",
    "factVersion": "ee84aff0255fb9f96caf24d4bfd238fb17ce5b4a7f46bec69ccc739fa3f962fe"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 0,
    "judgedDays": 1,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": "normal",
    "baselineSource": "personal",
    "direction": 0
  },
  "metrics": {
    "allDayRestHrAverage": {
      "sampleCount": 8,
      "value": 78.0
    },
    "night": {
      "endAt": "2026-09-08T08:00+08:00",
      "startAt": "2026-09-07T22:00+08:00",
      "isCompleted": true
    },
    "nightRestHrAverage": {
      "sampleCount": 3,
      "value": 78.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:日视图的开始和结束日期必须是同一天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "hr",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-08",
    "endDate": "2026-09-08",
    "timezone": "Asia/Shanghai",
    "isCompleted": true
  },
  "status": "normal",
  "severity": "none",
  "summary": "9月8日,Pocky 的静息心率是 78 次/分,在它平时的范围内(64–80 次/分)。",
  "generation": {
    "ruleId": "HR_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
hr-day-normal
历史某天 · 在平时范围内
normal9月8日,Pocky 的静息心率是 78 次/分,在它平时的范围内(64–80 次/分)。On Sep 8, Pocky's resting heart rate was 78 bpm, within its usual range (64–80 bpm).El 8 de sept., la frecuencia cardíaca en reposo de Pocky fue de 78 lpm, dentro de su rango habitual (64–80 lpm).
hr-day-high-streak
历史某天 · 偏高且连续 3 天
attention9月8日,Pocky 的静息心率是 92 次/分,高于它平时的范围(64–80 次/分),已经连续 3 天。留些安静休息的时间,再看看接下来的精神、食欲和活动状态。On Sep 8, Pocky's resting heart rate was 92 bpm, above its usual range (64–80 bpm), 3 days in a row. Allow quiet rest and watch energy, appetite, and activity over the next few days.El 8 de sept., la frecuencia cardíaca en reposo de Pocky fue de 92 lpm, por encima de su rango habitual (64–80 lpm), 3 días seguidos. Dale tiempo para descansar tranquilo y observa su energía, su apetito y su actividad en los próximos días.
hr-day-low-not-worse
历史某天 · 偏低但不算变差
observation9月8日,Pocky 的静息心率是 58 次/分,低于它平时的范围(64–80 次/分)。精神和食欲正常的话,不用特别处理。On Sep 8, Pocky's resting heart rate was 58 bpm, below its usual range (64–80 bpm). If its energy and appetite are normal, there's nothing special to do.El 8 de sept., la frecuencia cardíaca en reposo de Pocky fue de 58 lpm, por debajo de su rango habitual (64–80 lpm). Si su energía y su apetito están normales, no hace falta hacer nada especial.
hr-day-before-personal
个体范围建立前 · 页头按品种评估
observation9月8日,Pocky 的静息心率是 78 次/分。页上的评估是按同品种范围;再积累约 8 天记录,就能按 Pocky 自己的平时范围来看。On Sep 8, Pocky's resting heart rate was 78 bpm. The rating above uses the range for its breed. About 8 more days of records and we can compare with Pocky's own usual range.El 8 de sept., la frecuencia cardíaca en reposo de Pocky fue de 78 lpm. La evaluación de arriba usa el rango de su raza. Con unos 8 días más de registros podremos compararlo con el rango habitual de Pocky.
hr-today-few-readings
今天 · 读数少
observation今天到 08:00,Pocky 的静息心率只读到 3 次,代表值 80 次/分,还看不出全天的情况。项圈松紧合适、一直戴着,读数会更完整。As of 08:00 today, only 3 readings of Pocky's resting heart rate came in (80 bpm), not enough to describe the whole day. A snug fit and wearing the collar all the time will give fuller readings.Hoy hasta las 08:00 solo llegaron 3 lecturas de la frecuencia cardíaca en reposo de Pocky (80 lpm); no alcanza para describir el día completo. Con el collar bien ajustado y puesto todo el tiempo, las lecturas serán más completas.
hr-today-ranged
今天 · 说平时范围、不下结论
observation今天到 14:59,Pocky 的静息心率是 78 次/分,它平时在 64–80 次/分。As of 14:59 today, Pocky's resting heart rate is 78 bpm; it's usually 64–80 bpm.Hoy hasta las 14:59, la frecuencia cardíaca en reposo de Pocky es de 78 lpm; normalmente está en 64–80 lpm.

心率 · 周

接口简介

心率周视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "elapsedNights": 4,
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-07",
    "validNights": 0,
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "hr",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "aa925ec23bdebca62f1f83b70bb713d5b4e067cccb94615589ebe60374a85f40",
    "comparison": {
      "changePercent": -3.4
    }
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 0,
    "judgedDays": 5,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": null,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "dailyAllDayRestHr": [
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      }
    ],
    "allDayRestHrAverage": {
      "sampleCount": 9,
      "value": 80.0
    },
    "dailyNightRestHr": [
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "nightRestHrAverage": null
      }
    ],
    "aggregationMethod": "daily_median_mean_v1",
    "nightRestHrAverage": {
      "sampleCount": 0,
      "value": null
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "week"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null是周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null是周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:周视图必须是从周一开始的连续 7 天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "hr",
  "viewWindow": "week",
  "period": {
    "startDate": "2026-09-07",
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "isCompleted": false,
    "elapsedNights": 4,
    "validNights": 0
  },
  "status": "normal",
  "severity": "none",
  "summary": "本周 Pocky 的静息心率平均 80 次/分,比上周低 3%,5 天都在它平时的范围内。",
  "generation": {
    "ruleId": "HR_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
hr-week-normal
已结束的一周 · 都在平时范围内
normal本周 Pocky 的静息心率平均 80 次/分,比上周低 3%,5 天都在它平时的范围内。This week, Pocky's resting heart rate stayed within its usual range on all 5 days, averaging 80 bpm, 3% lower than last week.Esta semana, la frecuencia cardíaca en reposo de Pocky se mantuvo dentro de su rango habitual los 5 días, con un promedio de 80 lpm, un 3% más baja que la semana pasada.
hr-week-unusual
已结束的一周 · 有 2 天偏高
attention本周有 2 天 Pocky 的静息心率高于它平时的范围,全期平均 80 次/分。留些安静休息的时间,再看看接下来的精神、食欲和活动状态。This week, Pocky's resting heart rate was above its usual range on 2 days; it averaged 80 bpm overall. Allow quiet rest and watch energy, appetite, and activity over the next few days.Esta semana, la frecuencia cardíaca en reposo de Pocky estuvo por encima de su rango habitual 2 días; promedió 80 lpm en total. Dale tiempo para descansar tranquilo y observa su energía, su apetito y su actividad en los próximos días.
hr-week-few-days
评级天数不够整周结论
observation本周 Pocky 的静息心率平均 80 次/分。This week, Pocky's resting heart rate averaged 80 bpm.Esta semana, la frecuencia cardíaca en reposo de Pocky promedió 80 lpm.

心率 · 月

接口简介

心率月视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "elapsedNights": 9,
    "endDate": "2026-09-30",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-01",
    "validNights": 0,
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "hr",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T07:59+08:00",
    "observedThrough": "2026-09-10T07:58:59+08:00",
    "factVersion": "1868af49b2f8e5721cddde70e5073e88b5be95c3bbfae539e36f8327a09aa672",
    "comparison": {
      "changePercent": 1.2
    }
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 0,
    "judgedDays": 12,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": null,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "dailyAllDayRestHr": [
      {
        "date": "2026-09-01",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-02",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-03",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-04",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-05",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-06",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "allDayRestHrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "allDayRestHrAverage": 95.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-14",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-15",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-16",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-17",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-18",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-19",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-20",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-21",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-22",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-23",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-24",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-25",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-26",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-27",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-28",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-29",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      },
      {
        "date": "2026-09-30",
        "sampleCount": 0,
        "allDayRestHrAverage": null
      }
    ],
    "allDayRestHrAverage": {
      "sampleCount": 18,
      "value": 80.0
    },
    "dailyNightRestHr": [
      {
        "date": "2026-09-01",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-02",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-03",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-04",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-05",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-06",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "nightRestHrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-14",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-15",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-16",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-17",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-18",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-19",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-20",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-21",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-22",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-23",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-24",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-25",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-26",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-27",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-28",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-29",
        "sampleCount": 0,
        "nightRestHrAverage": null
      },
      {
        "date": "2026-09-30",
        "sampleCount": 0,
        "nightRestHrAverage": null
      }
    ],
    "aggregationMethod": "daily_median_mean_v1",
    "nightRestHrAverage": {
      "sampleCount": 0,
      "value": null
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "month"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null是周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null是周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:月视图必须覆盖一个完整的自然月。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "hr",
  "viewWindow": "month",
  "period": {
    "startDate": "2026-09-01",
    "endDate": "2026-09-30",
    "timezone": "Asia/Shanghai",
    "isCompleted": false,
    "elapsedNights": 9,
    "validNights": 0
  },
  "status": "normal",
  "severity": "none",
  "summary": "本月 Pocky 的静息心率平均 80 次/分,比上个月高 1%,12 天都在它平时的范围内。",
  "generation": {
    "ruleId": "HR_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
hr-month-normal
本月 · 都在平时范围内
normal本月 Pocky 的静息心率平均 80 次/分,比上个月高 1%,12 天都在它平时的范围内。This month, Pocky's resting heart rate stayed within its usual range on all 12 days, averaging 80 bpm, 1% higher than last month.Este mes, la frecuencia cardíaca en reposo de Pocky se mantuvo dentro de su rango habitual los 12 días, con un promedio de 80 lpm, un 1% más alta que el mes pasado.

HRV · 日

接口简介

HRV日视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-10",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "hrv",
  "insightContext": {
    "mode": "today_so_far",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "eb3f85e5f8f1893de5d4a4009718ef6bdc3366cde9813472fd706c7e022f50ea"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": null,
    "judgedDays": 0,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": null,
    "baselineSource": null,
    "direction": null
  },
  "metrics": {
    "allDayRestRmssdAverage": {
      "sampleCount": 3,
      "value": 80.0
    },
    "night": {
      "endAt": "2026-09-10T08:00+08:00",
      "startAt": "2026-09-09T22:00+08:00",
      "isCompleted": true
    },
    "nightRestRmssdAverage": {
      "sampleCount": 3,
      "value": 80.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:日视图的开始和结束日期必须是同一天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "hrv",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-10",
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "observation",
  "severity": "none",
  "summary": "今天到 08:00,Pocky 的静息 HRV 只读到 3 次,代表值 80 毫秒,还看不出全天的情况。项圈松紧合适、一直戴着,读数会更完整。",
  "generation": {
    "ruleId": "HRV_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
hrv-today-few-readings
今天 · HRV 读数少
observation今天到 08:00,Pocky 的静息 HRV 只读到 3 次,代表值 80 毫秒,还看不出全天的情况。项圈松紧合适、一直戴着,读数会更完整。As of 08:00 today, only 3 readings of Pocky's resting HRV came in (80 ms), not enough to describe the whole day. A snug fit and wearing the collar all the time will give fuller readings.Hoy hasta las 08:00 solo llegaron 3 lecturas de la VFC en reposo de Pocky (80 ms); no alcanza para describir el día completo. Con el collar bien ajustado y puesto todo el tiempo, las lecturas serán más completas.

HRV · 周

接口简介

HRV周视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "elapsedNights": 4,
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-07",
    "validNights": 0,
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "hrv",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "5f4ab19262c54ddbf1db4aba60a12595f7b34e35d0da0c71595492ea311c6906"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": null,
    "judgedDays": 0,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": null,
    "baselineSource": null,
    "direction": null
  },
  "metrics": {
    "dailyNightRestRmssd": [
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      }
    ],
    "allDayRestRmssdAverage": {
      "sampleCount": 9,
      "value": 80.0
    },
    "dailyAllDayRestRmssd": [
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      }
    ],
    "nightRestRmssdAverage": {
      "sampleCount": 0,
      "value": null
    },
    "aggregationMethod": "daily_median_mean_v1"
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "week"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null是周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null是周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:周视图必须是从周一开始的连续 7 天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "hrv",
  "viewWindow": "week",
  "period": {
    "startDate": "2026-09-07",
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "isCompleted": false,
    "elapsedNights": 4,
    "validNights": 0
  },
  "status": "observation",
  "severity": "none",
  "summary": "本周 Pocky 的静息 HRV 平均 80 毫秒。",
  "generation": {
    "ruleId": "HRV_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
hrv-week-unrated
本周 · HRV 还没有评级
observation本周 Pocky 的静息 HRV 平均 80 毫秒。This week, Pocky's resting HRV averaged 80 ms.Esta semana, la VFC en reposo de Pocky promedió 80 ms.
hrv-week-low
已结束的一周 · HRV 有 3 天偏低
attention本周有 3 天 Pocky 的静息 HRV 低于它平时的范围,全期平均 80 毫秒。留些安静休息的时间,再看看接下来的精神、食欲和活动状态。This week, Pocky's resting HRV was below its usual range on 3 days; it averaged 80 ms overall. Allow quiet rest and watch energy, appetite, and activity over the next few days.Esta semana, la VFC en reposo de Pocky estuvo por debajo de su rango habitual 3 días; promedió 80 ms en total. Dale tiempo para descansar tranquilo y observa su energía, su apetito y su actividad en los próximos días.

HRV · 月

接口简介

HRV月视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "elapsedNights": 9,
    "endDate": "2026-09-30",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-01",
    "validNights": 0,
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "hrv",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T07:59+08:00",
    "observedThrough": "2026-09-10T07:58:59+08:00",
    "factVersion": "192efc53708a2c7a23eca06fb4642a7fed108ccc5f223348378b7c02bbb37b3f"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": null,
    "judgedDays": 0,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": null,
    "baselineSource": null,
    "direction": null
  },
  "metrics": {
    "dailyNightRestRmssd": [
      {
        "date": "2026-09-01",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-02",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-03",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-04",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-05",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-06",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "nightRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-14",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-15",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-16",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-17",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-18",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-19",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-20",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-21",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-22",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-23",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-24",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-25",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-26",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-27",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-28",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-29",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      },
      {
        "date": "2026-09-30",
        "sampleCount": 0,
        "nightRestRmssdAverage": null
      }
    ],
    "allDayRestRmssdAverage": {
      "sampleCount": 18,
      "value": 80.0
    },
    "dailyAllDayRestRmssd": [
      {
        "date": "2026-09-01",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-02",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-03",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-04",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-05",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-06",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "allDayRestRmssdAverage": 95.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-14",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-15",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-16",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-17",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-18",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-19",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-20",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-21",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-22",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-23",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-24",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-25",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-26",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-27",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-28",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-29",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      },
      {
        "date": "2026-09-30",
        "sampleCount": 0,
        "allDayRestRmssdAverage": null
      }
    ],
    "nightRestRmssdAverage": {
      "sampleCount": 0,
      "value": null
    },
    "aggregationMethod": "daily_median_mean_v1"
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "month"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null是周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null是周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:月视图必须覆盖一个完整的自然月。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "hrv",
  "viewWindow": "month",
  "period": {
    "startDate": "2026-09-01",
    "endDate": "2026-09-30",
    "timezone": "Asia/Shanghai",
    "isCompleted": false,
    "elapsedNights": 9,
    "validNights": 0
  },
  "status": "observation",
  "severity": "none",
  "summary": "本月 Pocky 的静息 HRV 平均 80 毫秒。",
  "generation": {
    "ruleId": "HRV_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

呼吸率 · 日

接口简介

呼吸率日视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-10",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "rr",
  "insightContext": {
    "mode": "today_so_far",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "a57b6eb1c160e83e70f0fb3a1fad200baeb43aba52fb520a106bdc2cf50a6c48"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": null,
    "judgedDays": 0,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": null,
    "baselineSource": null,
    "direction": null
  },
  "metrics": {
    "nightRestRrAverage": {
      "sampleCount": 3,
      "value": 80.0
    },
    "night": {
      "endAt": "2026-09-10T08:00+08:00",
      "startAt": "2026-09-09T22:00+08:00",
      "isCompleted": true
    },
    "allDayRestRrAverage": {
      "sampleCount": 3,
      "value": 80.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:日视图的开始和结束日期必须是同一天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "rr",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-10",
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "observation",
  "severity": "none",
  "summary": "今天到 08:00,Pocky 的静息呼吸率只读到 3 次,代表值 80 次/分,还看不出全天的情况。项圈松紧合适、一直戴着,读数会更完整。",
  "generation": {
    "ruleId": "RR_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
rr-today-few-readings
今天 · 呼吸率读数少
observation今天到 08:00,Pocky 的静息呼吸率只读到 3 次,代表值 80 次/分,还看不出全天的情况。项圈松紧合适、一直戴着,读数会更完整。As of 08:00 today, only 3 readings of Pocky's resting breathing rate came in (80 breaths/min), not enough to describe the whole day. A snug fit and wearing the collar all the time will give fuller readings.Hoy hasta las 08:00 solo llegaron 3 lecturas de la frecuencia respiratoria en reposo de Pocky (80 rpm); no alcanza para describir el día completo. Con el collar bien ajustado y puesto todo el tiempo, las lecturas serán más completas.

呼吸率 · 周

接口简介

呼吸率周视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "elapsedNights": 4,
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-07",
    "validNights": 0,
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "rr",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "95a2dabbe0397480ea7ed400d8254913a78443a59c1b3a5c4d05af7b25156b4a"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 0,
    "judgedDays": 4,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": null,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "nightRestRrAverage": {
      "sampleCount": 0,
      "value": null
    },
    "dailyNightRestRr": [
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "nightRestRrAverage": null
      }
    ],
    "dailyAllDayRestRr": [
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      }
    ],
    "aggregationMethod": "daily_median_mean_v1",
    "allDayRestRrAverage": {
      "sampleCount": 9,
      "value": 80.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "week"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null是周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null是周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:周视图必须是从周一开始的连续 7 天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "rr",
  "viewWindow": "week",
  "period": {
    "startDate": "2026-09-07",
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "isCompleted": false,
    "elapsedNights": 4,
    "validNights": 0
  },
  "status": "normal",
  "severity": "none",
  "summary": "本周 Pocky 的静息呼吸率平均 80 次/分,4 天都在它平时的范围内。",
  "generation": {
    "ruleId": "RR_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
rr-week-normal
已结束的一周 · 呼吸率都在平时范围内
normal本周 Pocky 的静息呼吸率平均 80 次/分,4 天都在它平时的范围内。This week, Pocky's resting breathing rate stayed within its usual range on all 4 days, averaging 80 breaths/min.Esta semana, la frecuencia respiratoria en reposo de Pocky se mantuvo dentro de su rango habitual los 4 días, con un promedio de 80 rpm.

呼吸率 · 月

接口简介

呼吸率月视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "elapsedNights": 9,
    "endDate": "2026-09-30",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-01",
    "validNights": 0,
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "rr",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T07:59+08:00",
    "observedThrough": "2026-09-10T07:58:59+08:00",
    "factVersion": "f4921adf8bda2d24b64bafedd1899f7bc40f877238bef284b0385ba72e350c28"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "unusualDays": 2,
    "judgedDays": 11,
    "ruleVersion": "vital-judgment-c1-v1",
    "rating": null,
    "baselineSource": "personal",
    "direction": null
  },
  "metrics": {
    "nightRestRrAverage": {
      "sampleCount": 0,
      "value": null
    },
    "dailyNightRestRr": [
      {
        "date": "2026-09-01",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-02",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-03",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-04",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-05",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-06",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "nightRestRrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-14",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-15",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-16",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-17",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-18",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-19",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-20",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-21",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-22",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-23",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-24",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-25",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-26",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-27",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-28",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-29",
        "sampleCount": 0,
        "nightRestRrAverage": null
      },
      {
        "date": "2026-09-30",
        "sampleCount": 0,
        "nightRestRrAverage": null
      }
    ],
    "dailyAllDayRestRr": [
      {
        "date": "2026-09-01",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-02",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-03",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-04",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-05",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-06",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-07",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-08",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-09",
        "sampleCount": 3,
        "allDayRestRrAverage": 80.0
      },
      {
        "date": "2026-09-10",
        "sampleCount": 3,
        "allDayRestRrAverage": 95.0
      },
      {
        "date": "2026-09-11",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-12",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-13",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-14",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-15",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-16",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-17",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-18",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-19",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-20",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-21",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-22",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-23",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-24",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-25",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-26",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-27",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-28",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-29",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      },
      {
        "date": "2026-09-30",
        "sampleCount": 0,
        "allDayRestRrAverage": null
      }
    ],
    "aggregationMethod": "daily_median_mean_v1",
    "allDayRestRrAverage": {
      "sampleCount": 18,
      "value": 80.0
    }
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "month"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null是周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null是周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject是服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:月视图必须覆盖一个完整的自然月。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:休息与体征缺少 suppliedJudgment。修正:始终带上服务端评级对象;还没有评级时 rating 为 null、天数为 0。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "rr",
  "viewWindow": "month",
  "period": {
    "startDate": "2026-09-01",
    "endDate": "2026-09-30",
    "timezone": "Asia/Shanghai",
    "isCompleted": false,
    "elapsedNights": 9,
    "validNights": 0
  },
  "status": "attention",
  "severity": "low",
  "summary": "本月有 2 天 Pocky 的静息呼吸率高于它平时的范围,全期平均 80 次/分。留些安静休息的时间,再看看接下来的精神、食欲和活动状态。",
  "generation": {
    "ruleId": "RR_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
rr-month-unusual
本月 · 呼吸率有天数偏高
attention本月有 2 天 Pocky 的静息呼吸率高于它平时的范围,全期平均 80 次/分。留些安静休息的时间,再看看接下来的精神、食欲和活动状态。This month, Pocky's resting breathing rate was above its usual range on 2 days; it averaged 80 breaths/min overall. Allow quiet rest and watch energy, appetite, and activity over the next few days.Este mes, la frecuencia respiratoria en reposo de Pocky estuvo por encima de su rango habitual 2 días; promedió 80 rpm en total. Dale tiempo para descansar tranquilo y observa su energía, su apetito y su actividad en los próximos días.

吠叫 · 日

接口简介

吠叫日视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-10",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "bark",
  "insightContext": {
    "mode": "today_so_far",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "3cc546ba128a40f5b36afb6ed720d574af8e45319e991096f9dab9d41abd3353"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": null,
  "metrics": {
    "measurementMode": "estimated",
    "longestBarkEventDurationSeconds": 6.0,
    "barkDurationSeconds": 6.0,
    "barkEventCount": 1
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "day"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject否服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:日视图的开始和结束日期必须是同一天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "bark",
  "viewWindow": "day",
  "period": {
    "startDate": "2026-09-10",
    "endDate": "2026-09-10",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "observation",
  "severity": "none",
  "summary": "今天到 08:00,Pocky 叫了约 6 秒(1 次)。",
  "generation": {
    "ruleId": "BARK_IN_PROGRESS_SUMMARY",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
bark-today
今天 · 叫声累计
observation今天到 08:00,Pocky 叫了约 6 秒(1 次)。As of 08:00 today, Pocky has barked for about 6 sec (1 episode).Hoy hasta las 08:00, Pocky ha ladrado durante alrededor de 6 s (1 episodio).
bark-today-ranged
今天 · 说平时上限、不下结论
observation今天到 08:00,Pocky 叫了约 6 秒(1 次),它平时一天不超过约 3 分钟。As of 08:00 today, Pocky has barked for about 6 sec (1 episode); it usually barks up to about 3 min a day.Hoy hasta las 08:00, Pocky ha ladrado durante alrededor de 6 s (1 episodio); normalmente ladra hasta alrededor de 3 min al día.
bark-day-frequent
历史某天 · 叫得明显多
attention9月8日,Pocky 叫了约 7 分钟(14 次),明显比它平时多(平时一天不超过约 3 分钟)。回看叫声多的时段,看看是否有访客、声音或作息变化。On Sep 8, Pocky barked for about 7 min (14 episodes), clearly more than usual (usually up to about 3 min a day). Look at when the barking happened and whether visitors, sounds, or routines changed.El 8 de sept., Pocky ladró durante alrededor de 7 min (14 episodios), claramente más de lo habitual (normalmente hasta alrededor de 3 min al día). Revisa en qué momentos ladró más y si hubo visitas, ruidos o cambios de rutina.
bark-day-calm
历史某天 · 平静
normal9月8日,Pocky 叫了约 1 分钟(3 次),在它平时的范围内(一天不超过约 3 分钟)。On Sep 8, Pocky barked for about 1 min (3 episodes), within its usual range (up to about 3 min a day).El 8 de sept., Pocky ladró durante alrededor de 1 min (3 episodios), dentro de su rango habitual (hasta alrededor de 3 min al día).

吠叫 · 周

接口简介

吠叫周视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-09-07",
    "isCompleted": false
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "bark",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-09-10T08:00+08:00",
    "factVersion": "7594f774699ef8ac214490eb9ce1744f3ccb41c3edabc1bf910f40a89d245b3c",
    "comparison": {
      "changePercent": 12.0
    }
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": {
    "ruleVersion": "bark-judgment-v1",
    "rating": null,
    "direction": null,
    "baselineSource": "personal",
    "judgedDays": 3,
    "unusualDays": 0
  },
  "metrics": {
    "averageDailyBarkEventCount": 1.0,
    "measurementMode": "estimated",
    "averageDailyBarkDurationSeconds": 6.0,
    "dailyBarkDurations": [
      {
        "date": "2026-09-07",
        "barkDurationSeconds": 6.0
      },
      {
        "date": "2026-09-08",
        "barkDurationSeconds": 6.0
      },
      {
        "date": "2026-09-09",
        "barkDurationSeconds": 6.0
      },
      {
        "date": "2026-09-10",
        "barkDurationSeconds": 6.0
      },
      {
        "date": "2026-09-11",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-09-12",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-09-13",
        "barkDurationSeconds": null
      }
    ],
    "barkEventCount": 4
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "week"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject否服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:周视图必须是从周一开始的连续 7 天。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "bark",
  "viewWindow": "week",
  "period": {
    "startDate": "2026-09-07",
    "endDate": "2026-09-13",
    "timezone": "Asia/Shanghai",
    "isCompleted": false
  },
  "status": "normal",
  "severity": "none",
  "summary": "本周 Pocky 日均叫约 6 秒(日均 1 次),比上周多 12%,3 天都在它平时的范围内。",
  "generation": {
    "ruleId": "BARK_SUPPLIED_JUDGMENT",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
bark-week-normal
本周 · 都在平时范围内,比上周多
normal本周 Pocky 日均叫约 6 秒(日均 1 次),比上周多 12%,3 天都在它平时的范围内。This week, Pocky's barking stayed within its usual range on all 3 days, averaging about 6 sec a day (1 episode a day), 12% more than last week.Esta semana, los ladridos de Pocky se mantuvieron dentro de su rango habitual los 3 días, con alrededor de 6 s al día en promedio (1 episodio al día), un 12% más que la semana pasada.
bark-week-unusual
本周 · 有 2 天叫得明显多
attention本周有 2 天 Pocky 叫得明显比平时多,日均约 6 秒(日均 1 次)。回看叫声多的时段,看看是否有访客、声音或作息变化。This week, Pocky barked clearly more than usual on 2 days, averaging about 6 sec a day (1 episode a day). Look at when the barking happened and whether visitors, sounds, or routines changed.Esta semana, Pocky ladró claramente más de lo habitual 2 días; promedió alrededor de 6 s al día (1 episodio al día). Revisa en qué momentos ladró más y si hubo visitas, ruidos o cambios de rutina.
bark-week-facts
本周 · 只陈述时长
observation本周 Pocky 日均叫约 6 秒(日均 1 次)。This week, Pocky barked for about 6 sec a day on average (1 episode a day).Esta semana, Pocky ladró durante alrededor de 6 s al día en promedio (1 episodio al día).

吠叫 · 月

接口简介

吠叫月视图的详情洞察:FeedAuto 组装页面同源事实与服务端评级,Gateway 按文案目录确定性生成一段正文。

请求示例 JSON

{
  "period": {
    "endDate": "2026-08-31",
    "timezone": "Asia/Shanghai",
    "startDate": "2026-08-01",
    "isCompleted": true
  },
  "petId": "7",
  "schemaVersion": "health-detail-v3",
  "metric": "bark",
  "insightContext": {
    "mode": "selected_window",
    "asOf": "2026-09-10T15:00+08:00",
    "observedThrough": "2026-08-31T08:00+08:00",
    "factVersion": "0da26f2aa223a231bf7ff3fd0649136d667df08ebdbc94ae598f7d07422064c4"
  },
  "petProfile": {
    "species": "dog",
    "name": "Pocky"
  },
  "suppliedJudgment": null,
  "metrics": {
    "averageDailyBarkEventCount": 1.0,
    "measurementMode": "estimated",
    "averageDailyBarkDurationSeconds": 45.0,
    "dailyBarkDurations": [
      {
        "date": "2026-08-01",
        "barkDurationSeconds": 30.0
      },
      {
        "date": "2026-08-02",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-03",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-04",
        "barkDurationSeconds": 33.0
      },
      {
        "date": "2026-08-05",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-06",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-07",
        "barkDurationSeconds": 36.0
      },
      {
        "date": "2026-08-08",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-09",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-10",
        "barkDurationSeconds": 39.0
      },
      {
        "date": "2026-08-11",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-12",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-13",
        "barkDurationSeconds": 42.0
      },
      {
        "date": "2026-08-14",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-15",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-16",
        "barkDurationSeconds": 45.0
      },
      {
        "date": "2026-08-17",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-18",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-19",
        "barkDurationSeconds": 48.0
      },
      {
        "date": "2026-08-20",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-21",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-22",
        "barkDurationSeconds": 51.0
      },
      {
        "date": "2026-08-23",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-24",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-25",
        "barkDurationSeconds": 54.0
      },
      {
        "date": "2026-08-26",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-27",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-28",
        "barkDurationSeconds": 57.0
      },
      {
        "date": "2026-08-29",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-30",
        "barkDurationSeconds": null
      },
      {
        "date": "2026-08-31",
        "barkDurationSeconds": 60.0
      }
    ],
    "barkEventCount": 11
  },
  "locale": "zh-CN",
  "userId": "1",
  "viewWindow": "month"
}

请求字段表

字段名数据类型是否必需详细说明
schemaVersionstring是固定 health-detail-v3。
userIdstring是调用方用户 ID(留档前哈希)。
petIdstring是宠物 ID。
metricenum是指标。
viewWindowenum是时间窗口:自然日 / 自然周(周一起)/ 自然月。
localeenum是正文语言。
petProfileobject是宠物信息:正文用名字。
petProfile.namestring是宠物名字。
petProfile.speciesenum是物种。
periodobject是页面正在看的窗口(宠物所在时区的本地日期)。
period.startDatestring(date)是开始日期。
period.endDatestring(date)是结束日期。
period.timezonestring是IANA 时区,例如 Asia/Shanghai。
period.isCompletedboolean是窗口是否已结束(含今天的窗口为 false)。
period.elapsedNightsinteger|null否周 / 月:已经过去的夜数(休息与体征必填)。
period.validNightsinteger|null否周 / 月:有合格记录的夜数(休息与体征必填)。
insightContextobject是C4 上下文:查看时刻、模式、页面比较。没有它的请求一律拒收。
insightContext.modeenum是today_so_far 今天到此刻 / last_night 08:00 后的昨夜(只用于休息)/ selected_window 选中的已有窗口。
insightContext.asOfstring(date-time)是查看时刻,带时区偏移的 ISO 8601。
insightContext.observedThroughstring(date-time)否最近一次上报的时刻;today_so_far 必填。
insightContext.factVersionstring是事实指纹(FeedAuto 生成),用于缓存与留档对账。
insightContext.baselineProgressobject否个体范围建立进度;只在日视图、个体范围建立前说一句。
insightContext.comparisonobject否页面同源的比较,只读:Gateway 只用来组织正文,不据此判断。
insightContext.comparison.usualLowernumber|null否个体平时范围下限(只在个体范围已建立时给;吠叫没有下限)。
insightContext.comparison.usualUppernumber|null否个体平时范围上限;吠叫只给上限(秒)。
insightContext.comparison.changePercentnumber|null否较上一周期变化,与页头 ▲% 同一个值。
insightContext.comparison.consecutiveUnusualDaysinteger|null否截至所选日的连续关注天数;≥2 才说「已经连续 N 天」。
insightContext.comparison.unusualLowDaysinteger|null否活动:关注天里偏少的天数。
insightContext.comparison.unusualHighDaysinteger|null否活动:关注天里偏多的天数。
insightContext.comparison.restRatingFactorsarray<enum>否休息评为一般 / 较差时的主要扣分项,最多说两项。
insightContext.comparison.pageEvaluationBasisenum|null否页头评估依据;品种 / 通用时,日视图先说明依据。
suppliedJudgmentobject否服务端评级(只认个体范围)。休息与体征必带,评级可以为 null;活动与吠叫只在服务端评过时带。
suppliedJudgment.ruleVersionenum是评级规则版本。
suppliedJudgment.ratingenum|null是评级;null 表示还没有评级。
suppliedJudgment.directioninteger|null是方向:-1 偏低 / 0 范围内 / 1 偏高。
suppliedJudgment.baselineSourceenum|null是评级依据。
suppliedJudgment.judgedDaysinteger是有服务端评级的天数;周 ≥3 / 月 ≥10 才给整期结论。
suppliedJudgment.unusualDaysinteger|null否关注天数(个体范围下 L2 且恶化方向)。
suppliedJudgment.deterioratingboolean否评级方向本身是否算变差;false 时只陈述、不给建议。
metricsobject是页面同源的事实。C2 起占位字段(全 unavailable 基线、全 null 佩戴、空小时点等)不再发送。

请求字段规则

  • 不符合:月视图必须覆盖一个完整的自然月。修正:按页面窗口的定义发送。
  • 不符合:缺少 insightContext,或模式与窗口不符。修正:按查看时刻填 mode / asOf;今天用 today_so_far,08:00 后的休息用 last_night。
  • 不符合:均值、天数与逐日事实对不上,或含未来日期。修正:均值只算已结束的日子;逐日数组按日历顺序,未来的日子留 null。

返回示例 JSON

{
  "insightId": "health_detail_example",
  "petId": "7",
  "metric": "bark",
  "viewWindow": "month",
  "period": {
    "startDate": "2026-08-01",
    "endDate": "2026-08-31",
    "timezone": "Asia/Shanghai",
    "isCompleted": true
  },
  "status": "observation",
  "severity": "none",
  "summary": "这个月 Pocky 日均叫约 45 秒(日均 1 次)。",
  "generation": {
    "ruleId": "BARK_FACT_OBSERVATION",
    "ruleVersion": "health-detail-2026-09-11-r10",
    "generatedAt": "2026-10-09T00:00:00Z",
    "aiPolished": false
  }
}

返回字段描述

字段名数据类型是否必需详细说明
insightIdstring是Gateway 生成的洞察 ID。
petIdstring是原样返回。
metricenum是原样返回。
viewWindowenum是原样返回。
periodobject是规范化后的窗口。
statusenum是attention / normal / observation / insufficient_data;observation 是中性陈述,不等于正常。
severityenum是关注时为 low,其余 none。
summarystring是一段正文:事实句 + 至多一句补充。
generationobject是ruleId / ruleVersion / generatedAt / aiPolished(恒为 false)。

场景正文(中 / 英 / 西)

场景状态zh-CNen-USes
bark-month-facts
上个月 · 只陈述时长
observation这个月 Pocky 日均叫约 45 秒(日均 1 次)。That month, Pocky barked for about 45 sec a day on average (1 episode a day).Ese mes, Pocky ladró durante alrededor de 45 s al día en promedio (1 episodio al día).

AI日记生成

/v1/pet-diaries/generate 使用 V2 请求结构。主服务传 user_id、可选 locale,以及完整 dailyDiarySnapshot;pet_id 从 dailyDiarySnapshot.petProfile.petId 派生,不再作为顶层字段传入。

POST /v1/pet-diaries/generate

根据当天事实快照生成宠物日记。默认响应只返回主服务展示、落库和配图选择需要的字段;include_debug=true 时才返回调试字段。

调用语义:同一 user_id、dailyDiarySnapshot.petProfile.petId 与日期的成功日记会直接返回已保存结果,不会重复调用模型;hasActiveP0=true 时保留可信正文,但推送候选文案和宠物一句话均为空。

AI日记生成请求字段

字段位置类型必填枚举/范围说明
AuthorizationHeaderstring是Bearer API Key需要允许访问 /v1/pet-diaries/generate 且允许模型 uah-diary。
X-Request-IDHeaderstring否1-128调用方链路追踪 ID。
request_idBodystring|null否1-128请求链路 ID。
user_idBodystring是1-128用户 ID。为兼容旧版调用方,未传时网关按 temporary 占位处理,并在用量日志中标记为缺 ID。
localeBodystring否zh-CN / en-US每次只生成一种语言;不传或传 null 时默认 en-US。
dailyDiarySnapshotBodyobject是DailyDiarySnapshotV2当天事实快照根对象。
dailyDiarySnapshot.petProfile.petIdBodystring是1-128宠物 ID;必须与 dailyDiarySnapshot.diaryTimeline.petId 一致。
dailyDiarySnapshot.petProfile.petNameBodystring是1-128宠物昵称。
dailyDiarySnapshot.petProfile.speciesBodystring是dog / cat宠物类型。
dailyDiarySnapshot.petProfile.breedBodystring|null否0-128品种名称。
dailyDiarySnapshot.petProfile.breedTags[]Bodystring[]否-品种标签。
dailyDiarySnapshot.petProfile.bodySizeBodystring|null否toy / small / medium / large / giant体型枚举,对齐品种基线 body_size_class。
dailyDiarySnapshot.petProfile.ageMonthsBodyinteger|null否>= 0宠物月龄。
dailyDiarySnapshot.petProfile.ageStageBodystring|null否puppy / adult / senior生命阶段;猫幼年也使用 puppy。
dailyDiarySnapshot.environmentContext.dateBodydate是YYYY-MM-DD日记日期;必须与 dailyDiarySnapshot.diaryTimeline.date 一致。
dailyDiarySnapshot.environmentContext.timezoneBodystring是1-64日记时区。
dailyDiarySnapshot.environmentContext.weekdayBodystring|null否-规范英文星期名;日期行的星期由 date 按 locale 渲染。
dailyDiarySnapshot.environmentContext.weatherBodystring|null否-天气文本。
dailyDiarySnapshot.environmentContext.temperatureBodyobject|null否currentC / minC / maxC 均为 number|null温度对象;不接受数值或字符串简写。
dailyDiarySnapshot.environmentContext.seasonBodystring|null否spring / summer / autumn / winter季节。
dailyDiarySnapshot.environmentContext.specialDayBodystring|null否0-128生日、节日、纪念日等重要日期。
dailyDiarySnapshot.previousNightSleep.totalMinutesBodyinteger是0-1440昨晚总睡眠分钟数;对象存在时必填。
dailyDiarySnapshot.previousNightSleep.wakeCountBodyinteger|null否>= 0昨晚醒动次数。
dailyDiarySnapshot.eveningRestStart.startedAtBodystring是HH:mm当晚开始安静的本地时刻;对象存在时必填。
dailyDiarySnapshot.dailyActivity.activeMinutesBodyinteger|null否>= 0当天累计活动分钟数。
dailyDiarySnapshot.dailyActivity.stepsBodyinteger|null否>= 0当天累计步数。
dailyDiarySnapshot.dailyActivity.outdoorMinutesBodyinteger|null否>= 0当天累计户外分钟数。
dailyDiarySnapshot.diaryTimeline.schemaVersionBodystring是1-32时间线 schema 版本。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[]Bodyarray否MainSceneSegment[]当天主场景分段。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].sceneTypeBodystring是home / away主场景类型;不接受 unknown。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].startTimeBodystring|null否0-64开始时间文本。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].endTimeBodystring|null否0-64结束时间文本。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].placeSummary.placeNameBodystring|null否0-128地点名称。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].placeSummary.placeTypeBodystring|null否0-64地点类型,如 home、park、clinic。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].outingActivityTypeBodystring|null否walk / other外出活动类型;仅 away 时可传。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].walkMetrics.durationMinBodyinteger|null否>= 0步行时长分钟数;仅 away + walk 时传。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].walkMetrics.distanceKmBodynumber|null否>= 0步行距离公里数。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].walkMetrics.stepsBodyinteger|null否>= 0步行步数。
dailyDiarySnapshot.diaryTimeline.mainSceneSegments[].companionNameBodystring|null否0-128陪同人姓名;仅高可信时传。
dailyDiarySnapshot.diaryTimeline.outingTimeline[]Bodyarray否OutingTimelineEvent[]外出过程事件列表,用于表达从出门、到达地点、离开地点到回家的顺序。
dailyDiarySnapshot.diaryTimeline.outingTimeline[].typeBodystring是depart / arrive_place / leave_place / return_home / enter_zone / leave_zone外出时间线事件类型;区域事件必须携带 place.zoneRole。
dailyDiarySnapshot.diaryTimeline.outingTimeline[].occurredTimeBodystring|null否0-64事件发生时间文本,建议传本地时间,如 14:05。
dailyDiarySnapshot.diaryTimeline.outingTimeline[].place.placeNameBodystring|null否0-128事件关联地点名称。
dailyDiarySnapshot.diaryTimeline.outingTimeline[].place.placeTypeBodystring|null否0-64事件关联地点类型。
dailyDiarySnapshot.diaryTimeline.healthTimeline[]Bodyarray否HealthTimelineEvent[]健康指标事实列表,只表达 HR / HRV / RR 的可信数值事实,不承载诊断、原因解释或展示文案。
dailyDiarySnapshot.diaryTimeline.healthTimeline[].typeBodystring是heart_rate / hrv / respiration_rate健康指标类型。
dailyDiarySnapshot.diaryTimeline.healthTimeline[].occurredTimeBodystring|null否0-64指标发生时间文本,建议传本地时间或时间段,如 20:10、night。
dailyDiarySnapshot.diaryTimeline.healthTimeline[].heartRateBpmBodynumber|null否> 0心率,单位 bpm;仅 type=heart_rate 时使用。
dailyDiarySnapshot.diaryTimeline.healthTimeline[].hrvMsBodynumber|null否> 0HRV,单位 ms;仅 type=hrv 时使用。
dailyDiarySnapshot.diaryTimeline.healthTimeline[].respirationRateRpmBodynumber|null否> 0呼吸率,单位 rpm;仅 type=respiration_rate 时使用。
dailyDiarySnapshot.diaryTimeline.healthTimeline[].baselineValueBodynumber|null否> 0对应指标的个体基线值,单位与当前指标一致。
dailyDiarySnapshot.diaryTimeline.healthTimeline[].baselineDiffPercentBodynumber|null否-当前值相对个体基线的变化百分比;正数表示高于基线,负数表示低于基线。
dailyDiarySnapshot.diaryTimeline.behaviorTimeline[]Bodyarray否BehaviorTimelineEvent[]行为时间线事件列表,用于表达叫声、进食、喝水、抓挠、转圈、甩头、舔舐等行为。
dailyDiarySnapshot.diaryTimeline.behaviorTimeline[].typeBodystring是bark / drink / eat / scratch / circle / head_shake / lick行为时间线事件类型。
dailyDiarySnapshot.diaryTimeline.behaviorTimeline[].occurredTimeBodystring|null否0-64行为发生时间文本,建议传本地时间或时间段,如 16:20、afternoon。
dailyDiarySnapshot.diaryTimeline.behaviorTimeline[].durationMinBodyinteger|null否>= 0行为持续分钟数。
dailyDiarySnapshot.imageHistory.recentImages[]Bodyarray否由近到远已实际展示给该宠物的配图历史;缺省等价于空数组。
dailyDiarySnapshot.imageHistory.recentImages[].sceneIdBodystring|null否1-128已展示配图所属的图库场景 ID;配图冷却按它计算。
dailyDiarySnapshot.imageHistory.recentImages[].imageIdBodystring|null否1-128图库图片 ID;只传 imageId 时由网关反查场景。与 sceneId 至少提供一个。
dailyDiarySnapshot.imageHistory.recentImages[].usedDateBodydate是YYYY-MM-DD该配图实际展示的本地日期。
template_idBodystring|null否1-128模板 ID,仅用于测试或追踪。
template_versionBodystring|null否1-64模板版本,仅用于测试或追踪。

dailyDiarySnapshot.imageHistory 与配图冷却

响应里的 image_scene_id 从当前物种的全部图库场景中选出(狗 54 个、猫 50 个):带 date_rule 的节日和季节场景只在该日期规则成立时参选;再按季节、天气、在家/外出、活动匹配打分;最后对冷却窗口(默认 14 天)内已用过的场景降权,实现轮换。

冷却历史来自三处并集:本次请求的 imageHistory.recentImages、网关已保存日记的历史配图、网关自身的每日选图记录。因此主服务即使暂时不回传历史,同一场景也不会连日重复。

{
  "imageHistory": {
    "recentImages": [
      { "sceneId": "outdoor_walk_autumn", "usedDate": "2026-06-28" },
      { "sceneId": "indoor_curl_sleep", "usedDate": "2026-06-26" }
    ]
  }
}

时间线片段示例

三个时间线都按时间顺序传入。外出和行为事件使用固定枚举;健康时间线只保留 HR / HRV / RR 指标事实。

{
  "outingTimeline": [
    {
      "type": "depart",
      "occurredTime": "14:05",
      "place": {
        "placeName": "Home",
        "placeType": "home"
      }
    },
    {
      "type": "arrive_place",
      "occurredTime": "14:22",
      "place": {
        "placeName": "Central Park",
        "placeType": "park"
      }
    },
    {
      "type": "leave_place",
      "occurredTime": "15:35",
      "place": {
        "placeName": "Central Park",
        "placeType": "park"
      }
    },
    {
      "type": "return_home",
      "occurredTime": "15:52",
      "place": {
        "placeName": "Home",
        "placeType": "home"
      }
    }
  ],
  "healthTimeline": [
    {
      "type": "heart_rate",
      "occurredTime": "20:10",
      "heartRateBpm": 110,
      "baselineValue": 73,
      "baselineDiffPercent": 50.7
    },
    {
      "type": "hrv",
      "occurredTime": "night",
      "hrvMs": 42,
      "baselineValue": 50,
      "baselineDiffPercent": -16
    },
    {
      "type": "respiration_rate",
      "occurredTime": "21:00",
      "respirationRateRpm": 28,
      "baselineValue": 22,
      "baselineDiffPercent": 27.3
    }
  ],
  "behaviorTimeline": [
    {
      "type": "bark",
      "occurredTime": "16:20",
      "durationMin": 4
    },
    {
      "type": "eat",
      "occurredTime": "18:10",
      "durationMin": 8
    }
  ]
}

请求示例

{
  "request_id": "req_diary_001",
  "user_id": "temporary",
  "locale": null,
  "dailyDiarySnapshot": {
    "petProfile": {
      "petId": "temporary",
      "petName": "Milo",
      "species": "dog",
      "breed": "Labrador",
      "breedTags": ["retriever"],
      "bodySize": "large",
      "ageStage": "adult",
      "ageMonths": 48
    },
    "environmentContext": {
      "date": "2026-07-01",
      "timezone": "Asia/Shanghai",
      "weekday": "Wednesday",
      "weather": "sunny",
      "temperature": {
        "currentC": 26
      },
      "season": "summer",
      "specialDay": "birthday"
    },
    "previousNightSleep": {
      "totalMinutes": 540,
      "wakeCount": 2
    },
    "eveningRestStart": {
      "startedAt": "21:30"
    },
    "dailyActivity": {
      "activeMinutes": 70,
      "steps": 5200,
      "outdoorMinutes": 60
    },
    "diaryTimeline": {
      "schemaVersion": "1.0",
      "mainSceneSegments": [
        {
          "sceneType": "away",
          "startTime": "14:05",
          "endTime": "15:52",
          "placeSummary": {
            "placeName": "Central Park",
            "placeType": "park"
          },
          "outingActivityType": "walk",
          "walkMetrics": {
            "durationMin": 107,
            "distanceKm": 1.3,
            "steps": 1900
          }
        }
      ],
      "outingTimeline": [
        {
          "type": "depart",
          "occurredTime": "14:05",
          "place": {
            "placeName": "Home",
            "placeType": "home"
          }
        },
        {
          "type": "arrive_place",
          "occurredTime": "14:22",
          "place": {
            "placeName": "Central Park",
            "placeType": "park"
          }
        },
        {
          "type": "return_home",
          "occurredTime": "15:52",
          "place": {
            "placeName": "Home",
            "placeType": "home"
          }
        }
      ],
      "healthTimeline": [
        {
          "type": "heart_rate",
          "occurredTime": "20:10",
          "heartRateBpm": 110,
          "baselineValue": 73,
          "baselineDiffPercent": 50.7
        }
      ],
      "behaviorTimeline": [
        {
          "type": "bark",
          "occurredTime": "16:20",
          "durationMin": 4
        }
      ]
    },
    "imageHistory": {
      "recentImages": [
        { "sceneId": "outdoor_walk_summer", "usedDate": "2026-06-30" },
        { "sceneId": "indoor_curl_sleep", "usedDate": "2026-06-28" }
      ]
    }
  },
  "template_id": "park_day",
  "template_version": "v2"
}

AI Diary generation response fields

diary_idstringyesdia_*Diary record ID.
request_idstringyes1-128Request trace ID.
datedateyesYYYY-MM-DDDiary date.
image_scene_idstring|nullnoscene ID or nullRecommended diary image scene ID.
localestringyeszh-CN / en-US实际生成和返回的唯一语言。
content.date_linestringconditional-Localized display date line.
content.paragraphs[]string[]conditional-Diary paragraphs in locale.
content.pet_one_linerstringconditional-Pet one-liner in locale.
content.push_title / content.push_bodystring|nullconditional-Recommended push copy in locale.
generation_statusstringyesGENERATED / GENERATED_PUSH_SUPPRESSED_BY_SAFETY / DATA_INSUFFICIENT / FAILED_GENERATION / FAILED_SAFE_CHECKGeneration status.
failure_reasonstring|nullnoreason code or nullFailure reason.

Response example

{
  "diary_id": "dia_xxx",
  "request_id": "req_diary_001",
  "date": "2026-07-01",
  "image_scene_id": "birthday_outdoor",
  "contents": {
    "zh-CN": {
      "date_line": "2026-07-01 Wednesday",
      "paragraphs": [
        "Milo had a birthday walk at Central Park today.",
        "Milo barked briefly around 16:20, like a small report about the day."
      ],
      "pet_one_liner": "I remember the park.",
      "push_title": "Milo had a birthday walk today",
      "push_body": "Milo spent a little over an hour at the park."
    },
    "en-US": {
      "date_line": "Wednesday, July 1, 2026",
      "paragraphs": [
        "Today was Milo's birthday. In the afternoon, Milo went to Central Park and walked for a little over an hour.",
        "Around 16:20, Milo barked briefly, almost like reporting the day's discoveries."
      ],
      "pet_one_liner": "Birthday grass. I remember.",
      "push_title": "Milo had a birthday walk today",
      "push_body": "Milo spent a little over an hour at the park and gave a small report afterward."
    }
  },
  "generation_status": "GENERATED",
  "failure_reason": null
}

GET /v1/pet-diaries

AI Diary list request fields

user_idQuerystringyes1-128Only this user's diaries. Older callers that omit it get the temporary placeholder, and the usage log marks the call as missing an ID.

AI Diary list response fields

items[].diary_idstringyesdia_*Diary record ID.
items[].localestringyeszh-CN / en-USDiary language.
items[].content.paragraphs[]string[]conditional-Diary paragraphs in items[].locale.

Response example

{
  "items": [
    {
      "diary_id": "dia_xxx",
      "contents": {
        "zh-CN": {
          "paragraphs": ["Milo spent a little over an hour at the park today."]
        },
        "en-US": {
          "paragraphs": ["Milo spent a little over an hour at the park today."]
        }
      }
    }
  ]
}

GET /v1/pet-diaries/{diary_id}

AI Diary detail request fields

diary_idPathstringyesdia_*Diary record ID.

AI Diary detail response fields

diary_idstringyesdia_*Diary record ID.
localestringyeszh-CN / en-USDiary language.
content.paragraphs[]string[]conditional-Diary paragraphs in locale.

Response example

{
  "diary_id": "dia_xxx",
  "contents": {
    "zh-CN": {
      "paragraphs": ["Milo spent a little over an hour at the park today."]
    },
    "en-US": {
      "paragraphs": ["Milo spent a little over an hour at the park today."]
    }
  }
}

POST /v1/pet-diaries/feedback

Submit feedback for an AI diary. Re-submitting a diary ID replaces its latest feedback.

Request example

{
  "diary_id": "dia_123456",
  "liked": true,
  "shared": false
}
diary_idstringrequiredAI diary ID; the diary must already exist.
likedbooleanone requiredWhether the user likes the diary.
sharedbooleanone requiredWhether the user shared the diary.

Provide liked, shared, or both. An omitted value does not overwrite an existing annotation.

Response example

{
  "result": {
    "code": 200,
    "message": "success",
    "request_id": "req_xxx"
  }
}

元数据与 Admin

GET /v1/app-metadata/diary-image-library-scenes

查询日记配图库场景目录。默认返回当前 V4.3;可传短写或完整版本号切换,例如 version=V4.2 或 version=feishu-v4.2-2026-07-03。/v1/pet-diary-images/generate 的 scene_ids 必须来自所选版本的这个接口。

请求参数

字段位置类型必填说明
profileQuerystring|null否可选 dog 或 cat;不传则返回两类。
versionQuerystring|null否提示词目录版本。可传完整版本号或短写 V3.0/V4.0/V4.1/V4.2/V4.3;不传使用当前默认 V4.3。

返回字段

version 为当前返回目录版本;available_versions 为可切换版本列表;counts 包含 dog/cat 场景数量;groups[] 按 profile 和 category 分组;groups[].scenes[] 包含 scene_id、title_zh、category、date_rule、translation_zh、prompt_preview。

GET /v1/app-metadata/diary-image-scenes

查询日记配图场景目录。

请求参数

字段位置类型必填说明
speciesQuerystring否按宠物物种过滤场景目录;支持 dog、cat,不传则返回全部。

元数据场景枚举取值

字段枚举值说明
speciesdog / cat请求过滤物种。
scenes[].speciesdog / cat该日记配图场景支持的宠物物种。
scenes[].categorycommon / federal_holiday / personal / species_day日记配图场景分类。
scenes[].recommended_poselying / sitting / walking / running推荐使用的身份姿态图。

返回字段

scenes[] 包含 scene_id、title_zh、title_en、category、species、season、weather、location、activity、recommended_pose、prompt_zh、prompt_en。

GET /v1/app-metadata/insight-fields

查询首页洞察字段目录。

返回字段

version 是目录版本;groups 是字段分组;fields 是字段定义列表。

GET /v1/app-metadata/insight-scenarios

查询 AI 洞察测试场景模板。

返回字段

templates[] 包含 template_id、title_zh、snapshot。

POST /v1/app-metadata/insight-scenarios/{template_id}/generate

按模板生成洞察测试快照。/v1/app-metadata/insight-random 生成随机洞察快照。

请求参数

字段位置类型必填说明
template_idPathstring是模板 ID。
seedBodyinteger|null否随机种子,便于复现。
dateBodydate|null否洞察随机接口不使用;日记随机接口可使用。

GET /v1/app-metadata/diary-scenarios

查询宠物日记测试场景模板。

POST /v1/app-metadata/diary-scenarios/{template_id}/generate 按模板生成日记快照;POST /v1/app-metadata/diary-random 生成随机日记快照。请求 Body 支持 seed 和 date。

GET /v1/admin/usage/summary

查询用量汇总。需要 admin Key。

请求参数

字段位置类型必填说明
start_dateQuerydate|null否开始日期。
end_dateQuerydate|null否结束日期,不能早于 start_date。
api_key_nameQuerystring|null否按 Key 名筛选。
business_typeQuerystring|null否按业务类型筛选。
endpointQuerystring|null否按接口路径筛选。
statusQuerystring|null否success 或 failed。
group_byQuerystring|null否business_type、model、endpoint、api_key。

Admin 请求/响应枚举取值

字段枚举值说明
statussuccess / failed请求筛选和用量明细返回状态。
group_bybusiness_type / model / endpoint / api_key汇总分组维度。可选值:business_type / model / endpoint / api_key。
business_typegeneral / app-avatar / animation / app-diary-image-library / app-health常见业务类型;实际值来自 API Key 配置和用量记录。

返回 JSON

{
  "total_requests": 12,
  "success_requests": 10,
  "failed_requests": 2,
  "total_input_tokens": 1800,
  "total_output_tokens": 900,
  "estimated_cost": 1.23,
  "unpriced_requests": 0,
  "by_business_type": [
    {
      "value": "app-avatar",
      "business_type": "app-avatar",
      "model": null,
      "model_alias": null,
      "endpoint": null,
      "api_key": null,
      "api_key_name": null,
      "requests": 4,
      "success_requests": 4,
      "failed_requests": 0,
      "total_input_tokens": 0,
      "total_output_tokens": 0,
      "estimated_cost": 0.8,
      "unpriced_requests": 0
    }
  ],
  "by_model": [],
  "by_endpoint": [],
  "by_api_key": []
}

返回字段

字段类型说明
total_requestsinteger总请求数。
success_requestsinteger成功请求数。
failed_requestsinteger失败请求数。
total_input_tokensinteger输入 token 总数。
total_output_tokensinteger输出 token 总数。
estimated_costnumber|null估算费用;为空表示无法完整定价。
unpriced_requestsinteger未定价请求数。
by_business_typearray按业务类型分组的用量汇总。
by_modelarray按模型分组的用量汇总。
by_endpointarray按接口路径分组的用量汇总。
by_api_keyarray按 API Key 分组的用量汇总。
*.requestsinteger该分组内的总请求数。
*.success_requestsinteger该分组内的成功请求数。
*.failed_requestsinteger该分组内的失败请求数。
*.estimated_costnumber|null该分组内的估算费用。
*.unpriced_requestsinteger该分组内无法定价的请求数。

GET /v1/admin/usage/logs

查询用量明细。需要 admin Key。

请求参数

支持 summary 的全部筛选参数,另有 page 默认 1、page_size 默认 20 且范围 1-100。

返回 JSON

{
  "page": 1,
  "page_size": 20,
  "total": 1,
  "items": [
    {
      "request_id": "req_xxx",
      "api_key_name": "app-avatar",
      "business_type": "app-avatar",
      "user_id": "temporary",
      "pet_id": "temporary",
      "endpoint": "/v1/pet-animation/generate",
      "provider": "openrouter",
      "model_alias": "uah-animation",
      "provider_model": "bytedance/seedance-2.0-fast",
      "provider_request_id": "provider_req_xxx",
      "billing_type": "video",
      "input_tokens": null,
      "output_tokens": null,
      "unit_count": 4,
      "unit_price": 0.2,
      "estimated_cost": 0.8,
      "currency": "CNY",
      "latency_ms": 1200,
      "http_status": 200,
      "status": "success",
      "error_code": null,
      "retry_count": 0,
      "is_stream": false,
      "prompt_version": "v1",
      "used_fallback": false,
      "created_at": "2026-07-02T10:00:00Z"
    }
  ]
}

返回字段

字段类型说明
pageinteger当前页码。
page_sizeinteger每页数量。
totalinteger总记录数。
items[].request_idstring请求 ID。
items[].api_key_namestring|nullAPI Key 名称。
items[].business_typestring|null业务类型。
items[].endpointstring接口路径。
items[].providerstring|null上游供应商。
items[].model_aliasstring|null网关模型别名。
items[].provider_modelstring|null上游模型名称。
items[].billing_typestring|null计费类型,如 token、image、video、request 等,实际值来自记录。
items[].input_tokensinteger|null本次请求输入 token 数。
items[].output_tokensinteger|null本次请求输出 token 数。
items[].unit_countinteger|null非 token 计费单位数量,例如图片张数、视频秒数或请求次数。
items[].unit_pricenumber|null单价;为空表示该条记录无法完整定价。
items[].estimated_costnumber|null估算费用。
items[].currencystring|null费用币种,例如 CNY。
items[].http_statusinteger|nullHTTP 状态码。
items[].statusstring|null请求结果状态,通常为 success 或 failed。
items[].error_codestring|null错误码;成功时为空。
items[].retry_countinteger重试次数。
items[].is_streamboolean是否为流式请求。
items[].used_fallbackbooleanWhether fallback model was used.
items[].prompt_versionstring|null本次请求使用的提示词版本。
items[].created_atdatetimeCreation timestamp.