Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
25 commits
Select commit Hold shift + click to select a range
162b633
初始化
2248652135 May 28, 2026
7d71c5c
初始化项目
2248652135 May 29, 2026
2c7990d
新增出行人群选项
2248652135 May 31, 2026
2b1b436
Merge pull request #1 from 2248652135/feature/trip-planner-pro
2248652135 May 31, 2026
21c58c8
1.新增登录功能
2248652135 May 31, 2026
24d3168
优化登录功能:
2248652135 May 31, 2026
ee155c9
修复并发刷新雪崩问题
2248652135 Jun 1, 2026
603e41d
新增AI会话功能
2248652135 Jun 1, 2026
3ca6268
新增AI回复流式返回功能
2248652135 Jun 3, 2026
36da1c7
新增用户画像提取功能
2248652135 Jun 3, 2026
0ad81cc
修改前端聊天框发送信息后,信息还留存在对话框的bug
2248652135 Jun 3, 2026
e89dab1
修改提取用户画像bug:该bug曾导致把AI回复也提取到了画像中
2248652135 Jun 3, 2026
5bf8e40
修改协议:http->https
2248652135 Jun 3, 2026
485da45
登录或注册对密码使用RSA加密
2248652135 Jun 3, 2026
6586cb6
添加claude.md文件
2248652135 Jun 4, 2026
96d595c
1.用户画像加载添加缓存功能
2248652135 Jun 4, 2026
238a35c
修改用户画像加载逻辑:首次对话时才加载,加载后不再重复加载,作为用户消息加载
2248652135 Jun 5, 2026
51c0b1b
修改提取用户画像逻辑:交给子代理异步执行
2248652135 Jun 6, 2026
90905eb
优化旅游规划生成效率:新增多线程处理并行任务
2248652135 Jun 6, 2026
1189cee
1.新增登录信息绑定用户和设备
2248652135 Jun 8, 2026
4023dd6
登录鉴权兼容无cookie设备:采用请求头
2248652135 Jun 8, 2026
ba68cc4
Merge pull request #2 from 2248652135/feature/trip-planner-pro
2248652135 Jun 12, 2026
35181d9
更新README文件
2248652135 Jun 12, 2026
e254640
更新README
2248652135 Jun 12, 2026
e4d2a13
Merge pull request #3 from 2248652135/feature/trip-planner-pro
2248652135 Jun 12, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
65 changes: 65 additions & 0 deletions Co-creation-projects/2248652135-Trip-Planner-Pro/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,65 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
build/
develop-eggs/
dist/
downloads/
eggs/
.eggs/
lib/
lib64/
parts/
sdist/
var/
wheels/
*.egg-info/
.installed.cfg
*.egg

# Virtual environment
.venv/
venv/
env/
ENV/

# Node
node_modules/
frontend/dist/
frontend/dist-ssr/

# Environment variables
.env
.env.local
.env.*.local

# Logs
*.log
npm-debug.log*
yarn-debug.log*
yarn-error.log*
pnpm-debug.log*
lerna-debug.log*

# IDE
.vscode/
.idea/
*.swp
*.swo
*~
*.suo
*.ntvs*
*.njsproj
*.sln

# OS
.DS_Store
Thumbs.db

# Test artifacts
.pytest_cache/
.coverage
htmlcov/
114 changes: 114 additions & 0 deletions Co-creation-projects/2248652135-Trip-Planner-Pro/CLAUDE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
# CLAUDE.md

本文件为 Claude Code(claude.ai/code)在此仓库中工作时提供指导。

## 项目简介

AI 驱动的智能旅行规划助手,后端 FastAPI,前端 Vue 3 + Vite,通过多智能体 LLM 编排和高德地图 MCP 协议集成实现行程规划。

## 常用命令

### 后端
```bash
cd backend
python -m venv .venv && source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
cp .env.example .env # 填入 API 密钥
python run.py # 启动 uvicorn,端口 8000
```

### 前端
```bash
cd frontend
npm install
cp .env.example .env
npm run dev # Vite 开发服务器,端口 5173
npm run build # 生产构建(vue-tsc + vite)
```

### HTTPS(可选)
```bash
# 1. 生成自签名证书
cd backend && openssl req -x509 -newkey rsa:2048 -keyout certs/key.pem -out certs/cert.pem -days 365 -nodes -subj "//CN=localhost"
# 2. 在 backend/.env 中设置 SSL_ENABLED=true
# 3. 重启后端 (python run.py)
# 4. 前端代理目标和环境变量已指向 https://localhost:8000
```

## 架构说明

### 后端(`backend/`)

**FastAPI 应用** 在 `app/api/main.py` 中创建,配置了 CORS,注册了 6 组路由(前缀 `/api`):
- `auth` — JWT Cookie 认证(HS256 access/refresh token),RSA 加密密码传输
- `trip` — 多智能体系统生成旅行计划
- `chat` — AI 旅游对话,SSE 流式输出
- `history` — 历史行程 CRUD
- `map` — POI 搜索、天气、路线规划
- `poi` — POI 详情和图片

**关键设计模式:**
- **模块级单例**:每个服务暴露 `get_*()` 函数(如 `get_trip_planner_agent()`、`get_amap_service()`、`get_llm()`),惰性初始化并缓存全局实例。无依赖注入框架。
- **MCP 子进程**:`amap-mcp-server` 以子进程(`uvx`)方式运行。`agents/mcp_tool.py` 中的 `MCPTool` 通过 JSON-RPC 协议在 stdin/stdout 上通信,每次批量调用都启动新进程。每次调用序列在同一子进程内发送 `initialize` + `tools/call`(或 `tools/list`)。
- **多智能体流水线**(`agents/trip_planner_agent.py`):4 个顺序步骤——景点搜索 → 天气 → 酒店 → 规划 Agent,每个都是 `SimpleAgent`,共享一个 `MCPTool`。最后一步通过 HTTP 方式直接调用高德 API 获取真实路线数据(绕过 MCP 以提高性能)。
- **认证**:双 JWT(access 30 分钟 + refresh 7 天),均通过 HttpOnly Cookie 传递。Refresh Token 存储在 Redis(jti → user_id 映射),刷新时轮换。不使用 `Authorization` 请求头。
- **密码加密**:前端使用 Web Crypto API 进行 RSA-OAEP 加密,后端使用 `cryptography` 库解密。
- **数据库**:原生 SQLite(`sqlite3` 模块),WAL 模式,无 ORM。表:users、auth_tokens、trip_history、chat_sessions、chat_messages。

### 前端(`frontend/`)

**Vue 3 + TypeScript + Vite + Ant Design Vue 4**,共 5 个视图:
- `Home.vue` — 旅行表单(城市、日期、偏好)
- `Result.vue` — 行程展示(地图、PDF/图片导出)
- `Login.vue` — 登录/注册(RSA 加密密码)
- `History.vue` — 历史行程列表
- `Chat.vue` — AI 旅游对话(SSE 流式聊天)

**API 层**:`services/api.ts` — Axios 客户端,`withCredentials: true`,401 自动刷新 Token(含重试锁)。使用原始 `fetch()` 的视图统一从环境变量 `VITE_API_BASE_URL` 读取后端地址。

### 数据流:旅行计划生成

```
请求 → POST /api/trip/plan
→ MultiAgentTripPlanner.plan_trip()
→ attraction_agent.run() [MCP: maps_text_search]
→ weather_agent.run() [MCP: maps_weather]
→ hotel_agent.run() [MCP: maps_text_search]
→ planner_agent.run() [仅 LLM,无工具]
→ _enrich_with_real_routes() [HTTP 高德 API: 路线规划]
→ TripPlanResponse
```

### AI 聊天 SSE 流

```
POST /api/chat/sessions/{id}/messages
→ 保存用户消息到数据库
→ 加载用户画像上下文 → 注入系统提示词
→ chat_stream() → 产出 SSE 事件 (type: token/error/done)
→ 保存 AI 回复到数据库
→ 异步从消息中提取用户画像
```

前端使用 `ReadableStream.getReader()` 读取流,解析 SSE 的 `data:` 行。

## 配置说明

后端 `.env`:
- `LLM_MODEL_ID`、`LLM_API_KEY`、`LLM_BASE_URL` — LLM 提供商
- `AMAP_API_KEY` — 高德地图 API 密钥(必填)
- `REDIS_HOST`/`PORT`/`PASSWORD`/`DB` — Redis,用于 Refresh Token 持久化
- `SSL_ENABLED`/`SSL_CERTFILE`/`SSL_KEYFILE` — 可选 HTTPS
- `CORS_ORIGINS` — 逗号分隔的允许来源
- `JWT_SECRET` — 首次运行自动生成(如未设置)

前端 `.env`:
- `VITE_API_BASE_URL` — 后端地址(默认 `https://localhost:8000`)
- `VITE_AMAP_WEB_KEY`/`VITE_AMAP_WEB_JS_KEY` — 高德 JS API 密钥

## 重要依赖

- **hello-agents==1.0.2** — 自定义框架,从 `D:\learn-agent\hello-agents-1.0.2` 安装(`run.py` 中通过 `sys.path.append` 引入)。提供 `SimpleAgent`、`HelloAgentsLLM` 和 `Tool` 基类。
- **amap-mcp-server** — 高德地图 MCP 服务器,通过 `uvx` 子进程运行。提供:`maps_text_search`、`maps_weather`、`maps_direction_*`、`maps_geo`、`maps_search_detail`。
- **ant-design-vue 4** — UI 组件库。
- **html2canvas + jspdf** — 导出行程为 PDF/图片。
50 changes: 50 additions & 0 deletions Co-creation-projects/2248652135-Trip-Planner-Pro/PROJECT.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# Trip Planner Pro — HelloAgents智能旅行助手

## 项目信息

- **项目名称**: Trip Planner Pro — HelloAgents智能旅行助手
- **作者**: @shengyuantong
- **项目类型**: 生活服务

## 项目简介

AI 驱动的智能旅行规划助手,后端 FastAPI + 前端 Vue 3,通过多智能体 LLM 编排和高德地图 MCP 协议集成,实现个性化的旅行计划生成。系统支持多智能体协作自动搜索景点、查询天气、推荐酒店并生成完整行程,同时提供 AI 旅游对话和行程管理功能。

## 核心功能

- [x] **AI 智能生成旅行计划** — 用户输入城市、日期、偏好等基本信息,系统自动调用多智能体流水线(景点搜索 → 天气查询 → 酒店推荐 → 行程规划 Agent)生成详尽的 PDF/图片可导出行程
- [x] **流式 AI 旅游对话** — 基于 SSE 的流式聊天,具备用户画像自动提取、跨会话上下文记忆,提供智能旅行问答
- [x] **用户认证系统** — 双 JWT(HttpOnly Cookie)+ Redis Refresh Token 持久化 + RSA 加密密码传输,支持无 Cookie 设备兼容
- [x] **高德地图深度集成** — 通过 MCP 协议接入高德地图服务,支持 POI 搜索、天气查询、多种交通方式路线规划(公共交通 / 自驾 / 步行 / 混合)
- [x] **出行人群定制** — 支持 7 种出行人群(独自旅行、情侣夫妻、朋友结伴、家庭亲子、公司团建、老年旅行、研学旅行)个性化行程定制
- [x] **历史行程管理** — 历史行程 CRUD、PDF / 图片导出

## 技术亮点

- **多智能体流水线架构** — 4 个顺序/并行步骤(景点搜索 → 天气 → 酒店 → 规划),采用 `ThreadPoolExecutor` 并行执行无依赖任务,显著提升生成效率
- **MCP 协议集成** — 通过 JSON-RPC 子进程方式接入高德地图 MCP 服务,每次批量调用独立启动子进程,实现 Agent 自动工具调用
- **用户画像系统** — 异步提取用户意图和偏好,跨会话持久化缓存,首次对话时按需加载,作为上下文注入提示词
- **双 JWT 认证** — Access Token(30 分钟)+ Refresh Token(7 天),均通过 HttpOnly Cookie 传递,Refresh Token 存储在 Redis 中支持轮换和撤销
- **RSA 加密密码传输** — 前端使用 Web Crypto API 进行 RSA-OAEP 加密,后端使用 `cryptography` 库解密,保障密码安全
- **SSE 流式输出** — AI 对话采用 Server-Sent Events 实时推送 Token,前端使用 `ReadableStream.getReader()` 解析流数据
- **HTTPS 支持** — 内建自签名证书生成脚本,支持全站 HTTPS 访问
- **无 ORM 数据库** — 使用原生 SQLite + WAL 模式,无 ORM 依赖,轻量高效

## 演示效果

(待补充截图或 GIF)

## 自检清单

- [x] 代码能够正常运行
- [x] README 文档完整
- [x] requirements.txt 完整
- [x] 有清晰的使用示例
- [x] 代码有适当的注释

## 其他说明

- **项目结构**:前后端分离,`backend/` 为 FastAPI 后端,`frontend/` 为 Vue 3 + Vite 前端
- **框架依赖**:基于自定义 `hello-agents==1.0.2` 框架(提供 `SimpleAgent`、`HelloAgentsLLM` 和 `Tool` 基类)
- **6 组 API 路由**:`auth`(认证)、`trip`(旅行规划)、`chat`(AI 对话)、`history`(历史行程)、`map`(地图服务)、`poi`(POI 详情)
- **模块级单例模式**:每个服务暴露 `get_*()` 函数惰性初始化并缓存全局实例,无依赖注入框架
Loading