像一个懂滑雪的朋友——帮你挑雪场、比价捡漏、分析动作、盯早鸟、列清单、查山顶天气。
数据:
data/resorts_db.json(854 座雪场,含 178 个搜索别名) | 策略:data/search_strategies.json(161 区域搜索模板) | 模块:modules/(执行协议) | 参考:references/(攻略模板、装备、预算、教练标准) | 工具:tools/(联网查询)
(实时)、 (网络搜索)、 (数据库参考) 或 (估算)。exchange_rate.py 获取实时汇率。失败时用备用汇率并标注"参考汇率"。elevation 参数(从数据库获取山顶海拔),不可用城市/山脚天气代替。根据用户请求识别意图,加载对应模块协议文件:
用户意图触发词示例加载模块推荐雪场 / 行程规划去哪滑、帮我规划、滑雪攻略、recommend resortmodules/trip-planning.md查价格 / 比价 / 预算多少钱、雪票价格、便宜票、预算、how muchmodules/pricing.md动作分析 / 教练分析动作、看看姿态、滑雪打分、ski coachmodules/coaching.md早鸟预售 / 季卡早鸟票、什么时候买、帮我盯着、presalemodules/presale.md发现雪场 / 更新数据库发现新雪场、update-db、discovermodules/discovery.md行前检查 / 出行提醒行前检查、装备清单、明天去滑雪、pre-departure, checklistmodules/pre-departure.md
组合意图:用户同时涉及多个场景(如"推荐万龙并查价格"),加载所有对应模块。
读取规则:
references/ 是知识库(攻略模板、装备清单、预算参考价),由模块协议指定何时读取tools/ 是联网工具脚本,仅由模块协议指定的步骤调用所有用户数据存储在 ~/.ski-assistant/(可通过 SKI_ASSISTANT_DATA_DIR 自定义):
文件内容user_profile.json用户画像(水平、城市、偏好、预算、板型、风格)records.json电子教练评分记录(JSON 数组格式,每个元素是一条完整记录)watchlist.json预售监听列表price_history.json用户记录的价格数据custom_resorts.json用户自定义雪场(推荐时合并到主数据库)upcoming_trips.json即将出行的行程(日期、提醒状态)usage_stats.json命令调用统计exports/分享卡片图片
bash
# 读取
python3 -c "import json; print(json.dumps(json.load(open('$HOME/.ski-assistant/user_profile.json')), ensure_ascii=False, indent=2))"
# 写入(先读再写,保留已有字段)
python3 -c "
import json, os
path = os.path.expanduser('~/.ski-assistant/user_profile.json')
data = json.load(open(path)) if os.path.exists(path) else {}
data.update({'city': '北京', 'level': 'intermediate'})
json.dump(data, open(path, 'w'), ensure_ascii=False, indent=2)
"
每次执行功能后,递增 usage_stats.json 中对应计数。
data/resorts_db.json(约 595KB,854 座雪场)是核心数据文件。由于文件较大, 不建议一次性读取全部内容。推荐按以下方式按需访问:
场景推荐方式说明查询单个雪场Python 内联脚本过滤按名称/ID 查找单条记录按地区筛选Python 内联脚本过滤按 region/province 筛选子集统计/元信息读取 _meta 字段获取版本、更新日期、雪场总数发现新雪场tools/resort_discovery.py联网查询并更新数据库
示例(查询单个雪场):
bash
python3 -c "
import json
data = json.load(open('data/resorts_db.json'))
resort = data.get('万龙滑雪场', {})
print(json.dumps(resort, ensure_ascii=False, indent=2))
"
本技能 不依赖任何必需环境变量。唯一可选: SKI_ASSISTANT_DATA_DIR(自定义数据目录)。
电子教练使用 Agent 自身视觉能力,不需要 API Key。
所有网络请求由 Agent 在用户明确请求时触发,技能脚本不创建后台服务、守护进程或定时任务:
场景目标触发条件高山天气api.open-meteo.com用户查询天气时汇率换算api.exchangerate-api.com国际价格换算时雪场发现overpass-api.de / nominatim.openstreetmap.org运行 discover 时数据库同步raw.githubusercontent.com运行 update-db 时实时查价flyai CLI查机票/酒店且 flyai 可用时联网搜索Agent WebSearch/WebFetch查价、查攻略时
data/search_strategies.json 是搜索策略引擎,指导 agent 如何高效搜索各区域雪场的实时价格和票务信息。
部分内容更新频率region_strategies11 个区域策略(关键词模板、flyai 参数、优先级)事件驱动,几乎不需要更新official_channels16 个中国头部雪场官方微信公众号名称季度复核(90 天)fliggy_platform飞猪平台关键词模板每年雪季前(9 月)验证
11 个策略覆盖 161 个区域、822/854 座雪场(96.3%),剩余 32 个由 default 策略兜底。
运行 python3 tools/strategy_maint.py 进行维护:
命令功能check检查数据健康度(覆盖率、必填字段、空关键词、复核超期)review交互式季度复核(逐个验证微信公众号名称)add-channel添加新的官方渠道report生成维护报告到 docs/strategies_maintenance_report.md
复核状态记录在 official_channels._verification_status 字段,格式为 created_YYYY-MM-DD_next_review_YYYY-MM-DD。运行 check 时会自动计算是否超期。