Fruit Pi (水果派)

全球水果价格收集与查询。管理水果池,自动采集榴莲/荔枝/樱桃等水果每日批发价,支持国内外报价,RMB/公斤换算。Fruit price tracker for global fruits, wholesale market data, agricultural commodity prices.

Audits

Pass

Install

openclaw skills install fruit-pi

🥧 Fruit Pi · 水果派

全球水果价格收集助手。管理您的水果池,定时收集价格,按 RMB/公斤 展示。

时区规则

读取 USER.md 中的 Timezone: 字段。若无配置则用 date +%Z 回退。

行为规则

触发即执行:用户说出任意触发词,按不同规则执行:

区分两种触发模式:

  • 🍎 价格模式水果派 / 水果价格 / 全球水果价格 / 果价 / fruit pi → 执行完整收集流程:读池→拉价格→搜补→展示
  • 📋 列表模式水果池 / 看看水果池只列出水果池中的水果,不搜索不收集

主动感知与初始化:首次触发或无水果池时,自动创建水果池文件并以默认水果启动跟踪。若水果池为空则主动提示添加水果。

文件索引

运行时(workspace/memory/

  • fruit-pool.json - 水果池(用户区,不上传)

脚本

  • skills/fruit-pi/fruit-pi.py - 核心收集器

核心流程

1. 水果池管理

水果池文件:workspace/memory/fruit-pool.json

水果池结构:

{
  "fruits": {
    "金枕头榴莲": {
      "en_name": "Monthong Durian",
      "sources": [
        {"name": "惠农网", "url": "https://...", "currency": "CNY"},
        {"name": "泰国市场", "url": "https://...", "currency": "THB"}
      ],
      "last_price": {"price_rmb": 89.5, "original_price": 450, "original_currency": "THB"},
      "last_updated": "2026-05-11"
    }
  },
  "seasonal_fruits": [
    {"name": "荔枝", "season": "5-7月", "en_name": "Lychee"},
    {"name": "樱桃", "season": "5-7月", "en_name": "Cherry"}
  ],
  "metadata": {
    "version": 1,
    "last_collected": null
  }
}

管理操作(通过自然语言):

  • 「把榴莲加入水果池」 → --add "榴莲" --en "Durian"
  • 「给榴莲加个新的价格来源」 → 询问URL后 --add-source
  • 「把荔枝移出水果池」 → --remove "荔枝"
  • 「看看水果池」 → --list

2. 价格收集流程

2a. 脚本自动收集

python3 skills/fruit-pi/fruit-pi.py

脚本依次尝试每个水果的配置来源URL:

  • 成功提取价格 → 输出结构化价格
  • 失败 → 输出 search_hints(建议在哪个平台搜索)

2b. 手动触发收集

python3 skills/fruit-pi/fruit-pi.py --collect "金枕头榴莲"

2c. 搜索补充(脚本无法获取时)

当脚本返回 status: "no_price" 或脚本无法运行时,使用 web_search 手动搜索价格。

价格新鲜度规则(按顺序执行):

  1. 先尝试当前配置的平台 —— 用脚本或用 fetch 从当前 sources 拉取价格
  2. 检查拉取结果的新鲜度
    • 若成功获取 48小时以内的价格 → 直接使用,更新 last_price + last_updated
    • 若获取失败,或获取到的价格标记已 超过48小时 → 按后面流程搜索新平台
  3. 搜索新平台:用 search_hints 或搜索策略搜索 → 成功则更新水果池(含 sources),失败则保持当前状态,不强行填数

搜索策略(按优先级):

  1. 国内水果:<水果名> 批发价 今日 <年>
  2. 泰国水果:<fruit_en> wholesale price Thailand <month> <year>
  3. 进口水果:<fruit_en> import price China <month> <year>
  4. 东南亚水果:<fruit_en> price <country> market <month> <year>

推荐平台(按地区):

地区平台
中国惠农网(www.cnhnb.com), 一亩田(www.ymt.com), 广州江南市场, 北京新发地
泰国Talad Thai, 泰国农业部, Tridge
越南越南海关, 边贸市场
全球FAO, Trading Economics, Selina Wamucii

2d. 价格提取与归化

从搜索结果提取价格后,统一处理:

  1. 单位归化:斤→×2=kg, 磅(lb)→×2.2046=kg
  2. 货币转换:外币→RMB(使用脚本汇率工具或按市场汇率,在回复中注明汇率来源)
  3. 保留原始价:同时显示外币原价 + 换算后 RMB/公斤

3. 输出格式

🥧 Fruit Pi · 水果派 · <日期>

━━━ 🍎 水果池 ━━━

<报价来源1>  ← 来源平台
  🥇 金枕头榴莲 · ¥89.5/kg
     泰国 ฿450/kg(≈¥89.5,汇率฿1=¥0.20)
  🥇 山竹 · ¥45.2/kg
     ...

<报价来源2>  ← 其他来源
  🥇 阿克苏苹果 · ¥12.8/kg
     ...

━━━ 🌟 当季推荐 ━━━

🔥 荔枝(5-7月) | 樱桃(5-7月) | 杨梅(5-6月)
不在水果池中,可回复"加入荔枝"开始跟踪

━━━ 📖 什么是水果池?━━━

水果池是你关注的水果清单。把想跟踪价格的水果加入池中,
我会每天收集最新价格。

用法:
  "把榴莲加入水果池" → 开始跟踪
  "看看水果池" → 查看当前池中水果
  "刷新水果池" → 手动更新一次价格

💬 回复"水果派"查看最新价格

4. 消息格式要求

  • 使用 ━━━ 分隔段落
  • 报价来源用小标题 ← 来源平台
  • 每个水果一行:🥇 名称 · RMB价格/kg + 外币原价
  • 价格来源标注清晰
  • 末尾附水果池用法提示

5. 用户交互

用户说动作
「水果派/水果价格/果价」完整收集:拉价格+搜索补采+展示
「水果池/看看水果池」只列出水果清单,不收集价格
「加入<水果名>」--add "<fruit>"
「移除<水果名>」--remove "<fruit>"
「看看水果池」--list
「刷新水果池」执行完整收集流程
「刷新<水果名>」--collect "<fruit>"
「<水果名>什么价」尝试收集该水果价格
「推荐水果」当季推荐

6. 工作流程(用户触发时)

第一步:检查水果池

python3 skills/fruit-pi/fruit-pi.py --status
  • fruit-pool.json → 自动创建
  • 池为空 → 提示添加水果

第二步:价格采集

python3 skills/fruit-pi/fruit-pi.py

收集结果分三类:

  • ✅ 有价格 → 直接使用
  • ❌ 无价格但有 search_hints → web_search 补采
  • ❌ 无价格无 hint → 按「搜索策略」手动搜索

第三步:搜索补采(针对获取不到或过期的数据) 对脚本获取失败、或获取到的价格已超48小时的水果,执行 web_search:

  1. 用 search_hints 或搜索策略生成查询
  2. 从搜索结果提取价格
  3. 单位归化 + 货币换算
  4. 成功 → 更新水果池的 last_price / sources
  5. 失败 → 保持当前状态,不强行填数

第四步:格式化输出 按「输出格式」组织所有水果价格。

7. 异常处理

  • URL失效爬不下 → 搜索新来源,提示用户添加
  • 汇率API超时 → 使用脚本内建默认汇率,标注为估算
  • 所有来源都无法获取 → 显示「暂无数据」,给出搜索建议

8. 输出约束

  • 严禁输出思考过程、中间步骤、调试信息
  • 不要输出脚本运行的JSON原始数据
  • 只推送最终整理后的内容
  • 价格统一用 ¥/kg 格式
  • 外币始终保留原价标注