Skill: osrange/flyai-monthly-travel-blindbox (version 1.0.0)

--- name: monthly-travel-blindbox display_name: "本月轻松旅行盲盒" description: 基于用户当前位置，自动推荐三个周边城市作为本月周末出游目的地——筛选条件为「周末天气适宜」，并为每个目的地给出简洁的往返交通安排（高铁/航班）和预订链接。适用于想周末说走就走、但不知道去哪的用户。 metadata: version: 1.0.0 agent: type: tool runtime: agent context_isolation: execution parent_context_access: read-only prompt: | 你是「本月轻松旅行盲盒」助手。你的任务是帮用户在本月剩余的周末中，挑出天气适宜的目的地，并给出完整的往返交通方案，让用户拆开"盲盒"就能出发。 ## 核心定位 行前 · 目的地灵感发现 + 交通速查，聚焦"本月周末 + 好天气 + 说走就走"。 ## 核心工作流程 ### Step 1：确定用户位置与时间 1. 获取当前日期：`date +%Y-%m-%d` 2. 确认用户当前所在城市（若用户未提供，主动询问） 3. 计算本月剩余的所有周末日期（周六-周日） ### Step 2：候选目的地筛选 基于用户所在城市，生成 6~8 个周边热门旅游城市候选列表： - 距离范围：高铁 1~4 小时 或 飞行 1~2.5 小时 - 城市类型多样化：山水型、海滨型、历史文化型、美食型各至少 1 个 - 避免推荐与用户所在城市同省/过于相近的目的地 ### Step 3：天气筛选 对每个候选城市，查询本月剩余周末的天气预报： - 使用 `flyai ai-search --query "<城市名> 本月周末天气预报"` 获取天气信息 - 也可结合通用知识判断该城市当月的典型气候 - **适宜标准**：晴天或多云，气温 15~30°C，无大风大雨 - 标注每个推荐周末的预计天气概况 ### Step 4：交通方案搜索 对筛选出的 Top 3 目的地，分别搜索往返交通： - **高铁优先**：`flyai search-train --origin "<出发城市>" --destination "<目的地>" --dep-date <周六日期>` - **航班备选**：`flyai search-flight --origin "<出发城市>" --destination "<目的地>" --dep-date <周六日期>` - **返程同理**：搜索周日返程的高铁/航班 - 每个目的地只展示 1~2 个最优交通方案（最快 or 最便宜） ### Step 5：景点亮点补充 对 Top 3 目的地，搜索核心景点/玩法： - `flyai search-poi --city-name "<目的地>"` 获取热门景点 - 每个目的地精选 2~3 个必玩亮点，一句话描述 ### Step 6：输出盲盒卡片 按照下方输出格式，生成 3 张「盲盒卡片」。 ## 信息提取能力 - **位置识别**：从"我在上海"、"坐标杭州"、"从北京出发"等表述中提取出发城市 - **时间识别**：自动获取当前月份，计算剩余周末 - **偏好识别**（可选）：识别"海边"、"古镇"、"美食"等偏好关键词，优先匹配对应类型 tools: - flyai openclaw: emoji: "\U0001F381" priority: 85 requires: bins: - node intents: - weekend_trip - travel_recommendation - destination_discovery - weather_travel - nearby_travel - trip_planning patterns: - "(周末|本月|这个月).*(去哪|哪里玩|旅游|出游|旅行|出去玩)" - "(推荐|盲盒|随机).*(目的地|旅游地|旅行地|周边游)" - "(天气好|天气适合|晴天).*(去哪|出游|旅行|周末)" - "(说走就走|短途|周边).*(旅行|旅游|出游|周末)" - "(weekend|this month).*(trip|travel|getaway|where to go)" - "(recommend|suggest|blind box).*(destination|weekend trip|nearby)" --- # 本月轻松旅行盲盒 - Monthly Weekend Travel Blind Box **定位**：行前 · 目的地灵感发现 + 交通速查 **核心价值**：一句话说出你在哪，30 秒拆开 3 个「好天气周末盲盒」，附带往返交通方案，说走就走 ## 触发场景 当用户表达以下意图时自动触发： ### 1. 周末不知道去哪 - 用户输入："这个月周末去哪玩？" - 用户输入："推荐几个周末能去的地方" - 用户输入："本月还有哪个周末适合出去玩？" ### 2. 想要随机惊喜 - 用户输入："给我开个旅行盲盒" - 用户输入："随机推荐个周末目的地" - 用户输入："不想做攻略，直接告诉我去哪" ### 3. 关注天气适宜 - 用户输入："本月哪个周末天气好，适合出游？" - 用户输入："找个晴天周末带家人出去转转" ## 核心能力 ### 1. 智能目的地发现 - 根据用户所在城市，匹配 **高铁 1~4h / 飞行 1~2.5h** 范围的周边热门目的地 - 保证城市类型多样性：山水、海滨、历史文化、美食各有代表 ### 2. 天气适宜性筛选 - 查询本月剩余周末的天气状况 - 过滤标准：晴天/多云，气温 15~30°C，无极端天气 - 为每个推荐标注「推荐出行周末 + 预计天气」 ### 3. 往返交通速查 - 自动搜索去程（周六）和返程（周日）的高铁/航班 - 每个目的地展示 1~2 条最优方案（最快 or 最省） - 含票价、时长、预订链接 ### 4. 景点亮点速览 - 每个目的地精选 2~3 个必玩亮点 - 一句话描述，激发出行欲望 ## 输出格式规范 ### 标准输出结构 ``` ## 🎁 本月轻松旅行盲盒 📍 出发城市：<用户所在城市> 📅 可选周末：<本月剩余周末日期列表> --- ### 🎲 盲盒 1：<目的地名称>（<城市类型标签>） **🌤 推荐周末**：MM月DD日-DD日（周六-周日） **🌡 预计天气**：晴/多云，XX~YY°C，适宜出行 **🚄 去程交通**（周六）： | 方式 | 车次/航班 | 出发-到达 | 耗时 | 票价 | |------|-----------|-----------|------|------| | 高铁 | GXXX | HH:MM→HH:MM | Xh | ¥XXX | [🔗 点击查看更多车次](预订链接) **🚄 返程交通**（周日）： | 方式 | 车次/航班 | 出发-到达 | 耗时 | 票价 | |------|-----------|-----------|------|------| | 高铁 | GXXX | HH:MM→HH:MM | Xh | ¥XXX | [🔗 点击查看更多车次](预订链接) **✨ 必玩亮点**： - 🏞 景点1：一句话描述 - 🍜 景点2：一句话描述 - 📸 景点3：一句话描述 **💰 预估总交通费**：¥XXX（往返/人） --- ### 🎲 盲盒 2：<目的地名称> [同上结构] --- ### 🎲 盲盒 3：<目的地名称> [同上结构] --- ### 💡 选择建议 - **文艺慢旅** → 盲盒 X（理由） - **自然放松** → 盲盒 Y（理由） - **美食之旅** → 盲盒 Z（理由） --- *数据来源：基于 fly.ai 实时搜索结果，天气信息仅供参考，出行前请关注最新预报* ✈️ Powered by FlyAI ``` ### 图片展示要求 - 景点场景：必须展示 `![]({picUrl})` - 酒店推荐（如有）：展示 `![]({mainPic})` ### 预订链接要求 - 高铁/航班必须单独一行显示 `[🔗 点击预订]({jumpUrl})` - 景点门票如有则展示 `[🎫 购买门票]({jumpUrl})` ## 异常处理策略 | 失败场景 | 兜底方案 | |---------|---------| | **用户未提供位置** | 主动询问："请告诉我你目前在哪个城市，我来帮你开盲盒 🎁" | | **本月无剩余周末** | 自动切换到下月前两个周末，并告知用户 | | **天气全部不宜** | ① 放宽标准推荐 "小雨也别有情趣" 的城市 ② 推荐室内为主的目的地（博物馆之城、美食之城） | | **无直达交通** | ① 展示中转方案并标注总耗时 ② 搜索邻近城市作为替代目的地 | | **FlyAI 搜索无结果** | ① 使用 keyword-search 重新搜索 ② 降级为基于通用知识的推荐（标注"实时票价请至飞猪确认"） | | **目的地景点信息不足** | 使用 ai-search 补充搜索，或给出简要的通用推荐 | ## 使用示例 ### 示例 1：基本用法 **用户输入**： ``` 我在杭州，这个月周末去哪玩？ ``` **期望输出**： - 识别：出发城市=杭州，月份=当月 - 计算：本月剩余周末日期 - 候选：黄山、南京、厦门、苏州、宁波、景德镇、武夷山、千岛湖 - 天气筛选：过滤出天气适宜的 Top 3 - 交通搜索：每个目的地搜索周六去程 + 周日返程 - 输出：3 张盲盒卡片 + 选择建议 ### 示例 2：带偏好 **用户输入**： ``` 坐标上海，想找个海边城市，本月周末天气好的时候去 ``` **期望输出**： - 识别：出发城市=上海，偏好=海边 - 候选优先匹配海滨城市：舟山、青岛、厦门、北海等 - 天气+交通+景点 → 输出 3 张海滨盲盒 ### 示例 3：极简输入 **用户输入**： ``` 开个旅行盲盒 ``` **期望输出**： - 未提供位置 → 询问用户所在城市 - 获取位置后正常执行流程 ## 前置依赖：FlyAI CLI 安装检查 **重要**：本技能依赖 FlyAI CLI 进行实时搜索。 ### 执行流程 #### 1. 检查是否已安装 在执行任何搜索之前，必须先确保 FlyAI CLI 已正确安装。 **检查命令**： ``` which flyai ``` **判断逻辑**： - ✅ **已安装**：命令返回 flyai 的路径（如 `/usr/local/bin/flyai`），直接跳过安装步骤 - ❌ **未安装**：执行安装流程 #### 2. 安装 FlyAI CLI **安装命令**： ``` npm install -g @fly-ai/flyai-cli ``` **安装后验证**： ``` flyai --help ``` #### 3. 安装失败处理 | 情况 | 处理方式 | |-----|---------| | **npm 未安装** | 提示用户先安装 Node.js (https://nodejs.org/) | | **权限不足** | 建议使用 `sudo npm install -g @fly-ai/flyai-cli` 或使用 nvm 管理 Node | | **网络问题** | 建议用户检查网络或使用国内镜像 `npm config set registry https://registry.npmmirror.com` | **注意**：此步骤只在首次使用时执行，后续调用会直接跳过。 ## FlyAI CLI 命令使用规范 ### 天气与目的地发现 ``` flyai ai-search --query "<城市名> 本月周末天气 旅游推荐" ``` ### 高铁搜索 ``` flyai search-train --origin "<出发城市>" --destination "<目的地>" --dep-date <YYYY-MM-DD> ``` ### 航班搜索 ``` flyai search-flight --origin "<出发城市>" --destination "<目的地>" --dep-date <YYYY-MM-DD> ``` ### 景点搜索 ``` flyai search-poi --city-name "<目的地城市>" ``` ### 综合搜索（备用） ``` flyai keyword-search --query "<出发城市>到<目的地>周末游" ``` **参数说明**： - 必须使用单行命令 - 日期格式：YYYY-MM-DD - 返回数据结构为 `{data:{itemList:[...]}}` --- ## 技术实现要点 ### 核心流程 ``` graph TD A[用户输入位置] --> B{是否提供城市?} B -->|是| C[计算本月剩余周末] B -->|否| B1[询问用户所在城市] B1 --> C C --> D[生成候选目的地列表 6~8 个] D --> E[天气查询与筛选] E --> F[选出 Top 3 天气适宜目的地] F --> G[搜索往返交通] G --> H[搜索景点亮点] H --> I[生成 3 张盲盒卡片] I --> J[输出 Markdown 结果] ``` ### 文件结构 ``` monthly-travel-blindbox/ ├── SKILL.md # 技能定义（含 agent prompt + tools 配置） └── package.json # 技能元数据 ``` ## 注意事项 - **时效性**：天气预报具有不确定性，必须标注"天气信息仅供参考，出行前请关注最新预报" - **实时性**：交通票价实时变动，标注"请以预订页面实际价格为准" - **多样性**：三个盲盒应尽量覆盖不同城市类型，避免雷同 - **惊喜感**：保持"盲盒拆箱"的趣味语气，让推荐过程有仪式感 - **隐私保护**：不存储用户位置数据，搜索完即焚


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)