对 diet-tracking-analysis/SKILL.md 进行了针对 OpenClaw skill 运行时的兼容性分析。该 skill 本质上是一个完整的应用被包装成 SKILL.md 格式,其假设的能力远超 OpenClaw skill 系统所提供的范围。
OpenClaw 的 skill 系统是轻量级 prompt 注入——引擎扫描 SKILL.md 文件、解析 frontmatter、将内容注入到 LLM 的 system prompt 中。模型随后使用 agent 已有的工具(exec、read、write 等)来执行指令。Skill 不是独立的运行时。
该 skill 是一个全功能饮食追踪与营养分析系统,核心功能包括:
- 食物记录 — 用户描述或拍照上报每餐食物,skill 估算热量和宏量营养素(蛋白质/碳水/脂肪),保存到 JSON 文件
- 每日目标管理 — 根据用户体重和目标热量计算每餐宏量分配,支持多种饮食模式(balanced、keto、low_carb 等)
- 检查点评估 — 在每餐后按累计百分比评估是否偏离目标,给出实时调整建议
- 漏餐处理 — 自动检测并假设漏餐的标准摄入量,不中断流程
- 餐型自动检测 — 根据时区和时间窗口自动判断早/午/晚餐
- 中国地区特化 — 蔬菜/水果摄入追踪(≥300g 蔬菜/天、200–350g 水果/天)
- 食油估算 — 根据照片中的油光程度估算烹饪用油
- 每周安全检查 — 检测周均热量是否低于 BMR
- 饮食模式检测 — 分析 3 天数据判断实际饮食是否更适合另一种模式
- 用户偏好学习 — 静默记录用户喜好/过敏/饮食习惯到
health-preferences.md - 多消息合并 — 将连续消息识别为同一餐的不同部分
所有营养计算都通过 python3 {baseDir}/scripts/nutrition-calc.py 的约 10 个子命令完成(target、save、load、analyze、evaluate、check-missing、produce-check、detect-meal、weekly-low-cal-check、detect-diet-pattern)。
OpenClaw 有 maxSkillFileBytes 和 maxSkillsPromptChars 限制。仓库内典型的 .agents/skills 文件为 60–110 行,此 SKILL.md 超过 700 行。此外还引用了多个伴随文件(response-schemas.md、missing-meal-rules.md、ui-spec.md、SKILL-ROUTING.md)。总 prompt 预算消耗过大,可能导致内容被截断或整个 skill 被跳过。
所有计算逻辑都委托给 python3 {baseDir}/scripts/nutrition-calc.py:
- Python 不一定可用 — 移动端、Docker、EC2 等部署环境未必安装 Python
- 沙箱限制 — 在沙箱模式下,
exec可能被限制甚至不可用 - 无安装机制 — skill 系统只做目录扫描 + frontmatter 解析 + prompt 注入,不执行 setup 脚本
OpenClaw 内部的 skill 使用 <placeholder> 风格占位符,不用 {template} 变量。虽然 {baseDir} 在文档中作为约定提到过,但引擎不会自动替换。模型必须从 prompt 中的 <location> 标签推断真实路径——在不同部署环境下容易出错。
skill 假设存在并持续读写多个文件:
| 文件 | 用途 |
|---|---|
data/meals/YYYY-MM-DD.json |
每日餐食记录 |
health-preferences.md |
用户偏好(静默学习) |
health-profile.md |
健康档案(体重、BMR、餐数、饮食模式) |
timezone.json |
时区配置 |
locale.json |
地区配置 |
OpenClaw 的 skill 系统没有持久化数据目录概念。agent workspace 是临时性的,不保证这些文件跨会话存活。
skill 要求从「inbound message metadata」中提取 UTC 时间戳传给 --timestamp 参数。在 OpenClaw 中,时间戳通过 buildInboundUserContextPrefix 注入到用户消息上下文中(格式化为可读文本),而非结构化 API。模型需要从自然语言上下文中解析时间戳再传入 shell 命令,容易出错。
- skill 读
timezone.json获取tz_offset→ OpenClaw 用agents.defaults.userTimezone配置项 - skill 读
locale.json判断中国地区 → OpenClaw 没有等效的 locale 文件
这些配置文件不会自动存在,需要用户手动创建。
skill 要求「在回复前收集所有连续用户消息」。OpenClaw 的消息处理是逐条触发 auto-reply 的:每条用户消息独立触发 agent 回复流程,没有暂存多条消息等待合并的机制。
食物照片识别依赖:
- LLM 具备视觉能力(vision model)
- 消息渠道支持图片转发(不是所有 channel 都支持)
- 图片内容能传递到 agent context
若模型不支持 vision 或渠道不转发图片,此核心功能直接失效。
skill 引用 SKILL-ROUTING.md 处理多 skill 冲突(P0/P1/P2 优先级)。OpenClaw 没有内置的 skill 间路由/优先级机制——skill 选择完全由模型根据 prompt 中的 skill catalog 自行判断。
weekly-low-cal-check 描述为「每周一运行」,暗示通过 notification-composer 系统触发。OpenClaw 没有 cron / 定时任务机制,只能依赖用户手动询问。
version: 1.1.0
metadata:
openclaw:
emoji: "fork_and_knife"OpenClaw 内部 skill 只用 name + description。version 会被忽略,metadata.openclaw.emoji 不是已知的 gating 字段(引擎识别的是 os、install、primaryEnv、skillKey 等)。
detect-diet-pattern 需要至少 3 天连续数据,周热量检查需要 7 天数据。在 OpenClaw 的典型部署中(尤其是非本地模式),data/meals/ 目录的数据可能无法跨天保留。
| # | 建议 | 说明 |
|---|---|---|
| 1 | 迁移计算逻辑到 OpenClaw plugin | 将 nutrition-calc.py 重写为 TypeScript 插件,通过 api.registerTool(...) 注册工具,使计算能力原生可用 |
| 2 | 使用 plugin agentDir 持久化 | 将餐食数据存储在 agent 目录下(~/.openclaw/agents/<id>/),跨会话持久化 |
| 3 | 精简 SKILL.md 至 ≤100 行 | 只保留 LLM 面向的指令;实现细节移入 plugin 代码 |
| 4 | 用 OpenClaw config 替代自定义配置文件 | 使用 agents.defaults.userTimezone、渠道 locale 检测等现有机制 |
| 5 | 放弃批消息合并 | 重新设计为纠正式流程(立即记录,允许后续修正) |
| 6 | 声明 vision 模型依赖 | 在 frontmatter metadata 中标注需要 vision 模型,并提供纯文字回退方案 |
分析基于 OpenClaw skill 运行时,截至 2026-03-25。 对应英文版 Issue:https://github.com/NanoRhino/weight-loss-skill/issues/131
具体精简建议:如何将 700+ 行压缩到 ~100 行
上面的分析列出了问题,这条评论给出可操作的精简方案。
前提假设:
health-profile.md、timezone.json、locale.json、data/meals/等已在 agent 目录下初始化)一、可以直接删除的段落(~250 行)
saveSKILL-ROUTING.md的引用detect-meal脚本已内部处理时区转换,SKILL.md 只需一句「用detect-meal返回的local_date」--help,LLM 不需要在 system prompt 里背诵每个参数的含义二、应该移入 Python 脚本的逻辑(~120 行)
这些内容目前写在 SKILL.md 里让 LLM 阅读理解,但实际上是确定性计算规则,LLM 照搬执行不如脚本自己处理。
detect-meal子命令detect-meal,用返回值」evaluate子命令estimate-oil参数或直接写入营养估算逻辑produce-check子命令produce-check」evaluate --assumeddetect-diet-pattern脚本内部判断insufficient_data,LLM 不需要预检核心原则: 如果一个规则可以用
if/else写成代码,就不该让 LLM 在 prompt 里「记住」它。LLM 擅长的是自然语言理解和生成,不是查表和算术。三、精简后保留的内容(~100 行目标)
四、精简前后对比
--help)response-schemas.md等)五、脚本侧需要配合的改动
精简 SKILL.md 的前提是脚本承担更多判断逻辑:
detect-meal:已有时间窗口逻辑 ✅ 无需改动evaluate:已有 checkpoint 百分比和--assumed✅ 无需改动save:建议增加--oil-level参数(none/light/moderate/heavy),脚本内部按等级计算油量并加入热量,LLM 不再需要记克数规则produce-check:已有阈值逻辑 ✅ 无需改动detect-diet-pattern:建议脚本内部判断数据充足性,数据不足时返回insufficient_data而非让 LLM 预检「是否满 3 天」--help输出完整参数文档,作为 SKILL.md 中详细 CLI 参考的替代这样 SKILL.md 只负责告诉 LLM 做什么(流程)和怎么说(回复格式),而怎么算全部交给脚本。