本文件为 Claude Code(claude.ai/code)在此仓库中工作时提供指导。
AI 驱动的智能旅行规划助手,后端 FastAPI,前端 Vue 3 + Vite,通过多智能体 LLM 编排和高德地图 MCP 协议集成实现行程规划。
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
cd frontend
npm install
cp .env.example .env
npm run dev # Vite 开发服务器,端口 5173
npm run build # 生产构建(vue-tsc + vite)
# 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 — 历史行程 CRUDmap — POI 搜索、天气、路线规划poi — POI 详情和图片关键设计模式:
get_*() 函数(如 get_trip_planner_agent()、get_amap_service()、get_llm()),惰性初始化并缓存全局实例。无依赖注入框架。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 以提高性能)。Authorization 请求头。cryptography 库解密。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
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 — 可选 HTTPSCORS_ORIGINS — 逗号分隔的允许来源JWT_SECRET — 首次运行自动生成(如未设置)前端 .env:
VITE_API_BASE_URL — 后端地址(默认 https://localhost:8000)VITE_AMAP_WEB_KEY/VITE_AMAP_WEB_JS_KEY — 高德 JS API 密钥D:\learn-agent\hello-agents-1.0.2 安装(run.py 中通过 sys.path.append 引入)。提供 SimpleAgent、HelloAgentsLLM 和 Tool 基类。uvx 子进程运行。提供:maps_text_search、maps_weather、maps_direction_*、maps_geo、maps_search_detail。