行程生成器
一个多代理LangGraph系统,具有两个基于人工智能的旅行规划解决方案:
- 行程生成器 --将景点列表转换为专业格式的每日PDF行程,包括地图、图像、官方门票链接和成本估算
- 传输优化器 --对话式路线规划器,比较交通方式,研究实际成本和支付方式,并生成PDF摘要
______________________________________________________________________
架构——行程生成器
User Input
│
▼
Coordinate Finder Agent ← Google Places (Serper)
│
▼
Day Organizer Agent ← classify → configure → finalize → approval loop
│
▼
Attraction Researcher ← parallel (1 agent/day)
Agents
│
▼
PDF Builder ← ReportLab, route map, costs架构——传输优化器
User (chat)
│
▼
Route Collector Agent ← Google Places (Serper)
│
▼
Transport Researcher ← Google Maps Directions API
Agent
│
▼
Cost Calculator Agent ← Web search (Serper)
│
▼
PDF Builder______________________________________________________________________
功能--行程生成器
- 智能分类:隔离/偏好/灵活/专属日
- K表示地理集群,可选择每天的最小/最大值
- 路线优化:每天内最近的邻居,可配置的起点/终点
- 交互式审批流(CLI中断)
- 平行吸引力研究(每天一名代理人)
- 图像搜索,过滤30+水印域+URL验证
- 仅限官方门票链接(11个以上经销商域名被屏蔽)
- 重复吸引力检测(多日发生)
- 复合景点(单独研究的子地点)
- 仅限免费的偏好检测
- 多语言输出(pt-br、en、es、fr)
- 带目录、路线图、图像、可点击链接、成本汇总的PDF
- 可选电子邮件投递(SMTP/Gmail)
功能--传输优化器
- 通过自然聊天定义对话路线
- 多模式比较:步行、交通、驾驶(谷歌地图方向API)
- 智能偏好规则(例如,“如果不到20分钟,请始终步行”)
- 通过源链接进行真实定价研究
- 付款方式利弊分析
- 长会话会话会话摘要(80k令牌阈值)
- PDF:路线表、成本、价格解释、付款方式
______________________________________________________________________
快速开始
# 1. Clone and install dependencies
git clone
cd itinerary-generator
pip install -r requirements.txt
# 2. Configure environment
cp .env.example .env
# Edit .env with your API keys (see Configuration below)
# 3. Run the CLI
python main.py______________________________________________________________________
配置
创建一个 .env 文件包含以下内容:
# OpenRouter API (required) - https://openrouter.ai/keys
OPENROUTER_API_KEY=sk-or-...
# Model Configuration — per-agent or global fallback
# Browse models at: https://openrouter.ai/models
COORDINATE_FINDER_MODEL=anthropic/claude-sonnet-4-20250514
DAY_ORGANIZER_MODEL=anthropic/claude-sonnet-4-20250514
ATTRACTION_RESEARCHER_MODEL=anthropic/claude-sonnet-4-20250514
MODEL_NAME=anthropic/claude-sonnet-4-20250514
# Serper API (required — Google Places + Google Search) - https://serper.dev
SERPER_API_KEY=...
# Tavily API (required — web search + image retrieval) - https://tavily.com
TAVILY_API_KEY=tvly-...
# Google Maps API (required for Transport Optimizer)
GOOGLE_MAPS_API_KEY=...
# Email delivery (optional)
SMTP_HOST=smtp.gmail.com
SMTP_PORT=587
SMTP_USER=your-email@gmail.com
SMTP_PASS=your-app-password
# Observability (optional)
LANGSMITH_TRACING=false
LANGSMITH_API_KEY=lsv2_pt_...
LANGSMITH_PROJECT=itinerary-generator______________________________________________________________________
日程安排——三步工作流程
Day Organizer在请求用户批准之前运行一个结构化的3步流程:
- classify_attributions (必填)--将每个景点分为独立、偏好、灵活或专属,并在适用的情况下指定固定日期
- 配置路由优化 (可选)--设置路线订购每天的起点和终点
- 配置_日期_约束 (可选)——设置K-means聚类每天的最小和最大吸引力计数
- finalize_day_organization (必填)--对灵活的景点执行K-means聚类,并在每天内应用最近邻排序
- 请求_临时_批准 --显示结果并等待用户批准或修订
______________________________________________________________________
用户首选项类型
| 类型 | 示例 | 行为 |
|---|---|---|
| 孤立的 | “迪士尼乐园需要一整天” | 专属日,不添加其他景点 |
| 偏好 | “埃菲尔铁塔第一天” | 固定日期,可以与他人分享 |
| 独家 | “第3天仅适用于X和Y” | 固定设置,不接受灵活添加 |
| 灵活的 | 仅列出景点 | K表示地理分组 |
______________________________________________________________________
项目结构
itinerary-generator/
├── main.py
├── requirements.txt
├── .env.example
├── src/
│ ├── itinerary_generator/
│ │ ├── graph.py
│ │ ├── state.py
│ │ ├── agent_definition.py
│ │ ├── tools.py
│ │ ├── prompts.py
│ │ └── other_nodes.py
│ ├── transport_optimizer/
│ │ ├── graph.py
│ │ ├── state.py
│ │ ├── agent_definition.py
│ │ ├── tools.py
│ │ └── prompts.py
│ ├── processor/
│ │ └── pdf_processor.py # ReportLab PDF generation
│ ├── middleware/
│ │ ├── structured_output_validator.py
│ │ ├── summarization_middleware.py
│ │ └── handoff_tool_validator.py
│ ├── mcp_client/
│ │ └── tavily_client.py
│ └── utils/
└── .results/______________________________________________________________________
工具参考
行程生成器
| 代理 | 工具 | 目的 |
|---|---|---|
| 坐标查找器 | search_place_address | 谷歌地点搜索+商店坐标 |
| 坐标查找器 | return_invalid_input_error | 处理无效输入 |
| 日组织者 | classify_attractions | 对所有景点进行分类(步骤1) |
| 日组织者 | configure_route_optimization | 设置每天的开始/结束点(可选) |
| 日组织者 | configure_day_constraints | 设置每天的最小/最大值(可选) |
| 日组织者 | finalize_day_organization | 执行K-means+最近邻排序(步骤3) |
| 日组织者 | request_itinerary_approval | 暂停以供用户查看 |
| 日组织者 | update_itinerary_organization | 应用用户更改 |
| 吸引力研究员 | search_attraction_info | 在网上搜索详细信息、工作时间、费用 |
| 吸引力研究员 | search_attraction_images | 使用水印过滤的图像搜索(Tavily) |
| 吸引力研究员 | search_ticket_link | 仅限官方门票网址 |
传输优化器
| 代理 | 工具 | 目的 |
|---|---|---|
| 路线收集器 | search_place_coordinates | 查找并验证位置坐标 |
| 路线收集器 | register_route_pair | 店铺来源→目的地配对 |
| 路线收集器 | confirm_route_pairs | 最终确定路线清单并移交 |
| 交通研究员 | get_transport_options | 谷歌地图方向API |
| 交通研究员 | register_user_preference | 每条路线的存储模式选择 |
| 交通研究员 | finish_transport_research | 交给成本计算器 |
| 成本计算器 | search_transport_information | 通过网络搜索进行研究定价 |
| 成本计算器 | route_reasoning | 分析简单路线与复合路线 |
| 成本计算器 | register_route_cost | 每条路线的存储成本及说明 |
| 成本计算器 | register_payment_methods | 商店支付选项的优缺点 |
| 成本计算器 | finish_interaction | 触发PDF生成 |
______________________________________________________________________
API要求
| 服务 | 目的 | 注意事项 |
|---|---|---|
| OpenRouter | LLM访问(Claude、GPT-4、Gemini等) | 按令牌付费 |
| Serper | 谷歌地点+谷歌搜索 | 开始2500次搜索 |
| Tavily | 网络搜索+图像检索 | 每月1000次搜索 |
| 谷歌地图 | 路线API(交通优化程序) | 按请求付费 |
______________________________________________________________________
技术栈
- LangChain 1.0/LangGraph --代理编排和工作流管理
- 开放路由 --多提供商LLM访问(Claude、GPT-4、Gemini等)
- 瑟珀 --谷歌地点和谷歌搜索
- 塔维利 --网络搜索与图像检索
- 谷歌地图方向API --运输方式比较
- scikit-learn/k-means约束 --具有可选大小约束的地理聚类
- 报告实验室 --PDF生成
- GeoPandas/Matplotlib --路线图可视化
______________________________________________________________________
许可证
MIT许可证-免费使用和修改
