[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-74388":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":17,"stars7d":18,"stars30d":19,"stars90d":16,"forks30d":16,"starsTrendScore":20,"compositeScore":21,"rankGlobal":10,"rankLanguage":10,"license":10,"archived":22,"fork":22,"defaultBranch":23,"hasWiki":24,"hasPages":22,"topics":25,"createdAt":10,"pushedAt":10,"updatedAt":26,"readmeContent":27,"aiSummary":28,"trendingCount":16,"starSnapshotCount":16,"syncStatus":29,"lastSyncTime":30,"discoverSource":31},74388,"TripStar","1sdv\u002FTripStar","1sdv","旅途星辰 (TripStar)是一个创新的 AI 文旅智能体应用，旨在解决用户在规划旅行时面临的各种问题，为提供一站式旅游攻略而生。","https:\u002F\u002Fmodelscope.cn\u002Fstudios\u002Flcclxy\u002FJourney-to-the-China",null,"JavaScript",1842,214,7,4,0,16,39,84,48,20,false,"main",true,[],"2026-06-12 02:03:25","\u003Cdiv align=\"center\" style=\"display: flex; justify-content: center; align-items: center; gap: 2px;\">\n  \u003Cimg width=\"400\" alt=\"brand\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F50c490da-9042-4661-bf8f-f7fd8084a506\" \u002F>\n\u003C\u002Fdiv>\n\u003Cp align=\"center\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Flicense-GPL--2.0-orange\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fversion-v2.1.0-green\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FDocker-Build-blue?logo=docker\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fpython-3.10+-blue.svg\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002Fvue-3.x-brightgreen.svg\">\n  \u003Cimg src=\"https:\u002F\u002Fimg.shields.io\u002Fbadge\u002FFastAPI-0.100+-teal.svg\">\n\u003C\u002Fp>\n\n\u003Cdiv align=\"center\">\n\n[🇨🇳 中文](README.md) | [🇺🇸 English](README_en.md) | [🇯🇵 日本語](README_ja.md)\n\n\n# 旅途星辰 - AI 旅行智能体\n**基于 HelloAgents 框架打造的多智能体协作文旅规划平台**\n\u003C\u002Fdiv>\n\n\n\n> [!IMPORTANT]\n> \n> 可直接体验项目，完整体验项目功能可自行本地部署，**受风控影响在线体验没有接入小红书**：[旅途星辰 (TripStar) - AI 旅行智能体](https:\u002F\u002Fmodelscope.cn\u002Fstudios\u002Flcclxy\u002FJourney-to-the-China)\n> \n> 其中包括：旅行计划、景点地图概览、预算明细、每日行程：行程描述、交通方式、住宿推荐、景点安排（地址、游览时长、景点描述、预约提醒）、餐饮安排、天气信息、知识图谱可视化、沉浸式伴游 AI 问答......\n\n## 项目简介\n\n**旅途星辰 (TripStar)** 是一个创新的 AI 文旅智能体应用，基于 HelloAgents 框架打造的多智能体协作文旅规划平台，旨在解决用户在规划旅行时面临的\"信息过载\"和\"决策疲劳\"问题。\n\n有别于传统的旅游攻略网站，本项目采用了基于 **大语言模型 (LLM)** 和 **多智能体 (Multi-Agent)** 协作架构的创新模式。它能像一位经验丰富的人类旅行管家一样，全面考虑用户的个性化需求（偏好设置：交通方式、住宿风格、旅行兴趣、特殊需求等），自动搜索旅行信息、查询当地天气、精选酒店并规划最优景点路线，以**快速完成旅游攻略**。\n\n### 核心亮点\n\n* **小红书深度集成**: 景点推荐与攻略数据直接来源于小红书真实用户游记，通过 LLM 智能提纯，获取最真实的避坑指南与打卡建议。景点图片也通过小红书实时搜索获取，确保展示的是网友最新实拍的真实风景照。\n* **景点预约提醒**: 智能识别小红书游记中提及的需要提前预约的景点（如故宫、陕西历史博物馆等），在行程卡片中醒目标注预约提示与预约渠道信息，防止白跑一趟。\n* **多语言与国际化支持**: 深度集成 Vue I18n，同时在 LLM 提示词层及知识图谱底层实现语言自适应适配。系统界面及 AI 问答全程支持多语言（中\u002F英\u002F日）无缝切换，连同生成的旅行规划数据会自动翻译为目标语言，为全球旅行者打造无障碍的行程规划体验。\n* **双地图引擎高定互动展现**: 深度集成并支持 **Google Maps** 与 **高德地图 (AMap)** 双引擎的无缝切换与自动回退。国外使用 Google Maps，国内回退高德。动态绘制\"起点-景点-终点\"的真实经纬度打卡路线，提供高级定制底图配色，一眼预览景点位置方便安排行程。\n* **精准预算明细面板**: 智能汇总门票、餐饮、住宿与交通等多维度花销账单，提供直观的财务面板报表，让出行预算尽在掌握。\n* **多智能体协作协同**: 采用分工明确的多个 Agent（如天气预报员、酒店推荐专家），通过工作流 (Workflow) 协同完成复杂的旅行规划任务。\n* **知识图谱可视化**: 将生成的行程数据实时转换为节点关系图，直观展示\"城市-天数-行程节点-预算\"的空间结构。\n* **沉浸式伴游 AI 问答**: 在生成报告后，提供悬浮式 AI 问答窗口（左下角），AI 拥有完整行程的上下文记忆，用户可随时针对行程细节（如票价、适宜性）进行追问。\n* **多城市行程规划**: 支持在一次旅行中规划多个城市，动态添加城市并设置停留天数，系统自动计算总行程天数。城际移动日智能标注交通建议，预算面板独立统计城际交通费用，天气面板按城市分别展示，知识图谱以多城市拓扑呈现完整路线。\n* **奢华暗黑玻璃拟物风**: 全新设计的暗黑系玻璃拟物化 (Dark Luxury Glassmorphism) 界面，提供极具沉浸感的高级视觉体验。\n---\n> 举个例子要去中国——西安玩耍，只需要填写地点、日期、偏好设置，即可等待行程规划的结果，一眼预览如何安排旅游景点\n\u003Cimg width=\"1606\" height=\"740\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F699fa242-b959-460d-9442-90be0b19db22\" \u002F>\n\n\n\n## 系统架构\n\n本项目采用标准的前后端分离架构，分为前端 Vue 交互层、后端 FastAPI 服务层和 LLM\u002FAgents 的智能推理层。\n\n```mermaid\nsequenceDiagram\n    autonumber\n    \n    participant Client as Frontend (User)\n    participant Route as api\u002Froutes\u002Ftrip.py\n    participant Planner as trip_planner_agent.py\n    participant XHS as xhs_service.py\n    participant Maps as map_dispatcher.py\n    participant LLM as llm_service.py\n    participant POI as api\u002Froutes\u002Fpoi.py\n    participant KG as knowledge_graph_service.py\n\n    Client->>Route: POST \u002Fapi\u002Ftrip\u002Fplan (城市,天数,偏好)\n    Route-->>Client: 返回 task_id & ws_url\n    Route->>Planner: 启动异步任务 _run_trip_planning(request)\n    Client->>Route: WebSocket 订阅 \u002Fws\u002F{task_id}\n    Note right of Route: 通过 WebSocket 实时推送任务 processing\u002Fprogress 状态\n    \n    rect rgb(240, 248, 255)\n        Note over Planner, LLM: 并发阶段 (asyncio.gather 优化) \n        \n        par [1\u002F3] 景点搜索：小红书原生接口提纯\n            Planner->>XHS: search_xhs_attractions(city, keywords, lang)\n            XHS->>XHS: XhsNativeClient 原生签名直连 \u002F SSR 备用爬取\n            XHS->>LLM: 抛入游记杂文，Prompt 要求提纯出景点JSON数组\n            LLM-->>XHS: [{\"name\": \"故宫\", \"duration\": 120, ...}]\n            \n            loop 为每个提纯出的景点补齐坐标\n                XHS->>Maps: geocode_unified(name, city)\n                Note right of Maps: Google 地理编码优先，失败降级高德 REST\n                Maps-->>XHS: 经纬度 {longitude, latitude}\n            end\n            XHS-->>Planner: 拼接整理好的小红书景点候选文本\n            \n        and [2\u002F3] 天气搜索：智能体调用 Tool\n            Planner->>Planner: weather_agent.run()\n            Planner->>Maps: 代理调用 Google\u002FAMap MCP Weather Tool\n            Maps-->>Planner: 返回未来天气数据\n            Note right of Planner: Google API若失败，自动回退请求高德天气REST接口\n            \n        and [3\u002F3] 酒店搜索：智能体调用 Tool\n            Planner->>Planner: hotel_agent.run()\n            Planner->>Maps: 代理调用 Google\u002FAMap MCP POI Text Search\n            Maps-->>Planner: 返回酒店列表\n        end\n    end\n    \n    rect rgb(255, 240, 245)\n        Note over Planner, LLM: 串行聚合阶段：最终规划融合\n        Planner->>LLM: 拼接景点、天气、酒店上下文进入终极 Planner Prompt\n        LLM-->>Planner: 【高危操作】返回包含行程、预算等复杂嵌套的 JSON 字符串\n        \n        Planner->>Planner: _parse_response() 容错解析\n        Note right of Planner: 1. 清理杂乱字符\u003Cbr>2. 修复未转义引号\u003Cbr>3. 截断修复(补齐括号)\u003Cbr>4. 暴力提取\u003Cbr>5. 若均失败再求助 LLM 修补\n    end\n\n    Planner->>KG: build_knowledge_graph(trip_plan, lang)\n    Note right of KG: 提取城市、日程、景点、预算、建议的节点与关联边，并按多语言翻译标签\n    KG-->>Planner: graph_data (nodes, edges, categories)\n\n    Planner-->>Route: 返回完整 TripPlanResponse 结构\n    Route->>Route: _update_task_state(status=\"completed\")持久化至磁盘\n    Route-->>Client: WebSocket 推送成功结果 (含 plan JSON 及 graph 拓扑)\n    \n    rect rgb(240, 255, 240)\n        Note over Client, XHS: 异步前端懒加载：景点图片搜图\n        Client->>POI: GET \u002Fapi\u002Fpoi\u002Fphoto?name=xxx\n        POI->>XHS: get_photo_from_xhs(keyword)\n        XHS->>XHS: 原生搜索 \"xxx 风景\" 获取首个有效笔记的第一张图 URL\n        XHS-->>POI: photo_url\n        POI-->>Client: 图片加载成功\n    end\n```\n\n---\n\n## 核心功能与工作流\n\n### 1. 异步轮询任务系统 (解决网关超时)\n\n针对 LLM 生成超长文本易导致 504 Gateway Timeout 的痛点，重构了后端的任务调度机制。\n\n* **`POST \u002Fapi\u002Ftrip\u002Fplan`**: 立即返回 `task_id`，将长达数分钟的推理任务推入后台 `asyncio.create_task`。\n* **`GET \u002Fapi\u002Ftrip\u002Fstatus\u002F{task_id}`**: 前端每 3 秒发起一次轻量请求，实时获取当前处理进度（如\"🔍 正在搜索景点...\"），直至状态变为 `completed`。\n\n### 2. 多智能体架构 (Agentic Workflow)\n\n主控 Agent 接收到用户自然语言指令后，基于 React 模式拆解任务：\n\n1. **小红书景点提取**: 搜索城市旅游攻略帖，通过 SSR 页面抓取获取帖子正文内容，再由 LLM 从长文游记中提纯出景点名称、真实评价、游玩时长以及是否需要提前预约等结构化信息，最后通过高德 POI 搜索接口补齐精准经纬度坐标。\n2. **天气与酒店**: 天气管家查询目标日期的气候状况；酒店专员根据预算寻找合适落脚点。\n3. **路线编排**: 主控 Agent 收集三方数据，进行统筹优化，计算两两景点间的距离和最优游玩顺序，避免行程折返跑。\n4. **景点搜图 (前端驱动)**: 行程生成完毕后，前端根据每个景点名称独立调用 `\u002Fapi\u002Fpoi\u002Fphoto` 接口，后端以景点名搜索小红书最新发布的帖子，通过 SSR 抓取帖子首张图片直链，确保展示的是真实的风景实拍照。\n5. **结果聚合**: 最终输出包含预算明细、逐日行程、预约提醒、防坑指南等详细参数的结构化 JSON。\n\n### 3. 数据驱动的动态组件渲染\n\n前端不再是写死的静态展示，而是通过响应式变量读取 JSON 数据：\n\n* **高德地图 JS API 2.0 组件**: 动态读取 POI 经纬度，绘制连线与标记。\n* **ECharts 知识图谱组件**: 将树状的旅行层级转化为关系网络（图数据库雏形）。\n\n---\n\n## 快速部署与运行指北\n\n### 环境准备\n\n* Python 3.10+\n* Node.js 18+\n* 大模型 API Key（推荐使用兼容 OpenAI 格式的服务商，如豆包）\n* 高德地图两种key： Web服务 、 Web端(JS API) (其**安全密钥 JSCode**配置在index.html中)（[高德api](https:\u002F\u002Flbs.amap.com\u002F)）\n* [Google Maps API Key](https:\u002F\u002Fdevelopers.google.com\u002Fmaps\u002Fapis-by-platform)（若要使用 Google 地图引擎，必须在 Google Cloud 控制台中开通：**Geocoding API, Places API (New), Directions API, Maps JavaScript API, Weather API**，需要绑卡）\n* 小红书Cookie（[小红书](https:\u002F\u002Fwww.xiaohongshu.com\u002F) 网页端登录后从浏览器开发者工具复制）\n* 安装 `uv` 包管理器\n\n### Docker \u002F Compose 配置约定\n\n推荐通过 docker-compose 一键启动项目（包含前端和后端环境），在运行之前，确保填补 `.env` 文件相关的环境变量：\n\n* 容器启动时不再读取项目目录里的 `backend\u002F.env`，请确保将配置以环境变量的形式传入。\n* `docker-compose.yaml` 中显式配置了必要的运行时代理和 API keys，支持传入 `GOOGLE_MAPS_API_KEY` 与 `GOOGLE_MAPS_PROXY` 等变量。\n* 前端构建期变量 `VITE_AMAP_WEB_JS_KEY` 会通过 `build.args` 自动注入前端。\n\n\n```\n\n本地开发仍可按下面步骤分别配置和启动 `backend\u002F.env` 和 `frontend\u002F.env`。\n\n### 本地开发\n\n#### 1. 后端启动\n\n```bash\n# 进入后端主目录\ncd backend\n\n# 安装小红书签名引擎的 Node.js 依赖\nnpm install\n\n# 使用 uv 创建虚拟环境并安装依赖\nuv venv .venv\n\n# 激活虚拟环境\nsource .venv\u002Fbin\u002Factivate  # Windows: .venv\\Scripts\\activate\n\n# 安装项目依赖包\nuv pip install -r requirements.txt\n\n# 复制配置文件并填入相应的 API KEY\ncp .env.example .env\n# [必填] LLM_API_KEY, LLM_BASE_URL, LLM_MODEL_ID（选择有结构化输出能力的模型）\n# [必填] VITE_AMAP_WEB_KEY (高德地图 web服务 类型的key)\n# [必填] XHS_COOKIE（小红书网页端登录后的Cookie）\n# [选填] GOOGLE_MAPS_API_KEY, GOOGLE_MAPS_PROXY（如果需要支持 Google 地图引擎）\n\n# 启动 FastAPI (推荐通过 uvicorn)\nuvicorn app.api.main:app --host 0.0.0.0 --port 8000 --reload\n```\n\nAPI 启动后，您可以访问 `http:\u002F\u002Flocalhost:8000\u002Fdocs` 查看互动文档。\n\n#### 2. 前端启动\n\n```bash\n# 进入前端主目录\ncd frontend\n\n# 使用 npm (或 pnpm\u002Fyarn) 安装依赖\nnpm install\n\n# 复制配置文件并填入相应的 Key\ncp .env.example .env\n# [必填] VITE_AMAP_WEB_KEY 与后端保持一致\n# [必填] VITE_AMAP_WEB_JS_KEY 必须是 Web端(JS API) 类型的key\n# 另外，由于 JS API 2.0 政策要求，**还需要在 index.html 注入你的安全密钥(securityJsCode)**\n\n# 启动 Vite 开发服务器\nnpm run dev\n```\n\n\n\n---\n\n## 目录结构与关键代码导读\n\n```text\nTripStar\u002F\n├── backend\u002F                       # Python FastAPI 后端\n│   ├── app\u002F\n│   │   ├── api\u002Froutes\u002F            # 核心路由 (trip.py, poi.py, chat.py)\n│   │   ├── agents\u002F                # 多智能体定义与编排 (trip_planner_agent.py 并发核心)\n│   │   ├── services\u002F              # 业务逻辑封装\n│   │   │   ├── xhs_service.py     # 小红书搜索\u002FSSR抓取\u002FLLM提纯\u002F搜图\n│   │   │   ├── llm_service.py     # LLM 客户端封装\n│   │   │   └── knowledge_graph_service.py  # 知识图谱构建\n│   │   └── models\u002F                # Pydantic 类型定义 (schemas.py)\n│   └── .env                       # 本地开发环境变量载体（Docker 部署时不打进镜像）\n│\n├── frontend\u002F                      # Vue 3 互动前端\n│   ├── src\u002F\n│   │   ├── views\u002F                 # 主路由视图 (Home.vue 表单输入; Result.vue 路书展示)\n│   │   ├── components\u002F            # 独立复用的 UI \u002F 背景组件\n│   │   └── services\u002F              # Axios 异步轮询及配置重试逻辑 (api.ts)\n│   ├── index.html                 # 入口挂载及高德地图 SecurityKey 预设\n│   ├── .env                       # 本地前端开发环境变量（Docker 构建时忽略）\n│   └── package.json\n│\n├── Dockerfile                     # 通用生产发布容器脚本\n├── docker-compose.yaml            # 一键容器编排\n└── README.md\n```\n\n> 下面是部分运行结果，丰富的功能探索中...\n\n\u003Cimg width=\"1600\" height=\"799\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F20221707-c115-4da7-aa49-80eec772bc33\" \u002F>\n\u003Cimg width=\"1598\" height=\"801\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F1b4b745e-98f1-4868-a6dd-d32909077713\" \u002F>\n\u003Cimg width=\"1649\" height=\"805\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Ffe775f15-7a1e-467e-a1c4-f97361e13d95\" \u002F>\n\u003Cimg width=\"1599\" height=\"823\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002Fa262a33d-4dbc-4f5a-b392-9b2d0ab66a31\" \u002F>\n\u003Cimg width=\"1599\" height=\"741\" alt=\"image\" src=\"https:\u002F\u002Fgithub.com\u002Fuser-attachments\u002Fassets\u002F2c236df0-6ad2-44a0-8976-93d84ea14b1f\" \u002F>\n\n\n\n\n## 后续优化方向\n- [x] ~~接入小红书，获得高质量计划~~\n- [x] ~~景点图片改为从小红书获取~~\n- [x] ~~景点提前预约提示~~\n- [x] ~~接入 Google Maps，实现国内外双引擎自动降级回退~~\n- [x] ~~模型返回语言国际化适配及底层知识图谱多语言支持~~\n- [x] ~~可查看历史计划支持，通过任务和后端持久化解决~~\n- [x] ~~支持代理配置 (HTTP\u002FSOCKS5) 以确保国内可用 Google 服务~~\n- [x] ~~修改导出图片的外观，增加地图，提高可读性~~\n- [x] ~~支持多城市旅行~~\n- [ ] 添加小红书链接以及美食推荐增强\n- [ ] 前端优化\n\n## Star History\n\n\u003Ca href=\"https:\u002F\u002Fwww.star-history.com\u002F?repos=1sdv%2FTripStar&type=date&logscale=&legend=top-left\">\n \u003Cpicture>\n   \u003Csource media=\"(prefers-color-scheme: dark)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fimage?repos=1sdv\u002FTripStar&type=date&theme=dark&legend=top-left\" \u002F>\n   \u003Csource media=\"(prefers-color-scheme: light)\" srcset=\"https:\u002F\u002Fapi.star-history.com\u002Fimage?repos=1sdv\u002FTripStar&type=date&legend=top-left\" \u002F>\n   \u003Cimg alt=\"Star History Chart\" src=\"https:\u002F\u002Fapi.star-history.com\u002Fimage?repos=1sdv\u002FTripStar&type=date&legend=top-left\" \u002F>\n \u003C\u002Fpicture>\n\u003C\u002Fa>\n\n## 🙏 致谢\n感谢 [linuxdo](https:\u002F\u002Flinux.do\u002F) 社区的交流、分享与反馈，让 TripStar 的迭代更高效。\n","旅途星辰 (TripStar) 是一个创新的 AI 文旅智能体应用，旨在解决用户在规划旅行时面临的“信息过载”和“决策疲劳”问题。该应用基于 HelloAgents 框架构建，利用大语言模型 (LLM) 和多智能体 (Multi-Agent) 协作架构，能够根据用户的个性化需求（如交通方式、住宿风格等），自动搜索并整合旅行信息，包括景点推荐、天气查询、酒店预订及行程规划等，以快速生成旅游攻略。其核心功能包括小红书深度集成、景点预约提醒、多语言支持、双地图引擎互动展现、精准预算明细面板以及沉浸式伴游 AI 问答等。适用于需要高效规划旅行路线和个人化定制服务的各种场景，无论是国内还是国际旅行者都能从中受益。",2,"2026-06-11 03:50:02","high_star"]