现有 AI 旅行规划是"凭空生成 → 用户挑"。 选驴反过来:"用户挑 → AI 组织"。
你已经刷了 5-10 篇小红书收藏,粘进来,小驴帮你整成一份能出发的行程。
| 别的 AI 旅行规划 | 选驴 TripPick |
|---|---|
| 从零生成标准化行程 | 只从你给的笔记里组织 |
| AI 替你决定去哪 | AI 只组织,决定权在你 |
| 通用旅游知识 | 真实种草内容 |
| 一个人闭环 | 一条链接异步协作 |
- 📝 多源粘贴 — 小红书文案 / 分享链接,一键清洗或抓取
- 🤖 AI 结构化 — 自动抽取 POI / 餐厅 / 住宿 / 预算 / 避雷
- ✅ 用户主导决策 — 想去 / 再看看 / 不去,一键勾选
- 🗺️ 国内地图原生 — 高德地图 + 中文标注 + GCJ-02 坐标修正
- 👥 轻量协作 — 一条分享链接,"驴友意见不合"自动标出
- 🎯 克制的行程密度 — 每半天 2 个地点,宁缺勿滥
- 🆘 Mock Fallback — API 挂了也能演示,评委体验保险
- 多篇输入 — 粘贴小红书笔记或链接
- 结构化提取 — LLM 抽取 POI / 餐厅 / 住宿
- 去重聚合 — 同类合并,标注"被 N 篇推荐"
- 冲突检测 — 距离 / 评价 / 时间过载 / 前置条件
- 候选决策 + 排程 — ✅/⏸/❌ 一键选择,自动按地理排 Day 1 / Day 2
- Next.js 14 (App Router) + TypeScript
- Tailwind CSS + Lucide Icons
- OpenRouter(
google/gemini-2.5-pro/deepseek/deepseek-chat) - 高德地图 + GCJ-02 坐标系
- Zustand + sessionStorage(无账号、URL 即凭证)
- Vercel Serverless + 一键部署
- 三层降级:实时 LLM → 缓存结果 → Mock Fallback
git clone https://github.com/zjgttz/trippick.git
cd trippick
npm install
cp .env.example .env.local # 填入 OPENROUTER_API_KEY
npm run dev # http://localhost:3000| 变量 | 必填 | 说明 |
|---|---|---|
OPENROUTER_API_KEY |
✅ | OpenRouter API Key |
OPENROUTER_MODEL |
默认 google/gemini-2.5-pro |
|
AMAP_KEY |
高德地图 Web Key(前端) | |
AMAP_SECRET |
高德地图 Web 安全密钥 |
- Fork 本仓库
- 在 vercel.com 导入项目
- 配置环境变量(见上)
- Deploy
约 2 分钟拿到 https://your-trip.vercel.app。
app/
page.tsx # 首页(Why 选驴 · 示例数据)
input/page.tsx # 粘贴输入 + 清洗 / 抓取
analyze/page.tsx # 结构化提取 + 冲突检测
itinerary/page.tsx # 行程 + 地图 + 协作
api/
analyze/ # LLM 抽取
enrich/ # 行程组织 + 排程
fetch-xhs/ # 小红书链接抓取
geocode/ # 高德地理编码
trip/ # 分享链接 / 协作状态
components/
POICard.tsx # 候选地点卡
ConflictBanner.tsx # 冲突提示
TripMap.tsx # 高德地图 + 点位
PreferencePanel.tsx # 偏好面板
lib/
prompts.ts # LLM 提示词(红线约束)
gcj02.ts # WGS-84 → GCJ-02 坐标转换
reorder-by-geo.ts # 按地理就近排程
public/
mock-result.json # Mock fallback 数据
构建过程中坚持的几条原则:
- AI 不替用户做决定 — 只组织,不创造
- 不推荐用户没勾选的地点 — 加 prompt 约束
- 宁缺勿滥 — 每半天 2 个,除非素材多到值得 3 个
- 不做账号系统 — URL 即凭证,轻量分享优先
- 桌面 ≠ 手机 — 移动端必须真机测一遍
近期:行程持久化 · 拖拽再编辑 · 多城市示例 中期:异步投票 · 角色化偏好 · 时间条可视化 · 行程 fork 长期:多内容源(大众点评/马蜂窝)· 海外地图 i18n · 创作者侧数据回流
Built with 🫏 in 48h.