旅行规划代理

一个生产就绪的对话式旅行代理,利用LLM规划行程并通过集成的MCP服务器预订航班、酒店、汽车等实时库存。

  • by Fieldy76
  • Python
  • 本地部署
  • 9 星标
  • 更新于
在 GitHub 查看 Fieldy76/Agentic-Travel-Planner

使用说明

旅行策划机构

一个制作就绪的对话式旅行社。LLM计划旅行和书籍 通过一个小型的进程内MCP服务器进行真实库存,该服务器为 航班、酒店、汽车、天气和付款。

  • 真实API 搜索:Amadeus自助服务(航班+酒店), 使用地理编码打开Meteo(天气,任何城市)。
  • 真实预订 通过托管/联盟模式:代理生成真实的预订 Aviasales(航班)、Hotellook(酒店)、RentalCars(汽车)的网址。用户 在合作伙伴的安全页面上完成付款+票务。图案与 皮划艇/天空扫描仪/Hopper。通过Travelpayments进行联盟归因。
  • Stripe 支付页面 您收取的任何费用(礼宾/服务费)。 会话是幂等的,并与Webhook绑定;任何卡数据都不会触及您的 服务器。本地开发的模拟模式。
  • 多供应商法学硕士:OpenAI、Anthropic、谷歌。异步贯穿始终。
  • 外部MCP服务器 (可选):设置 GOOGLE_MAPS_API_KEY 和那个 @modelcontextprotocol/server-google-maps 节点子流程在以下时间启动 应用程序启动,添加 maps_geocode, maps_directions, maps_distance_matrix, maps_places_search,等等到LLM的工具 皮带——与正在处理的航班/酒店/汽车工具并排放置。
  • 每会话内存 带有滑动窗盖;会话被隔离 X-Session-Id.
  • 生产级网层:流式NDJSON聊天,文件上传大小 以及MIME魔术字节验证、CORS分配列表、每个请求超时。
  • 聊天界面:自动链接原始URL并自动打开合作伙伴预订页面 (Aviasales/Hotellook/RentalCars/Stripe Checkout)在一个新的选项卡中,因此 用户直接去结账。每次对话 X-Session-Id 保留服务器 内存与可见聊天线程对齐。
  • 可观测性 (可选):Langfuse跟踪每个代理回合+LLM呼叫, 在记录之前对PII进行编辑。
  • 测试套件 覆盖率≥70%(pytest asyncio+respx+freezegun)。

快速开始

python -m venv venv && source venv/bin/activate
pip install -r requirements.txt
cp .env.example .env
# Fill in at least one LLM key.

uvicorn web_server:app --reload --port 5000
# open http://localhost:5000

STRIPE_MODE=mock 在 .env 允许您在没有Stripe凭据的情况下端到端运行。

CLI替代方案:

python -m travel_agent.cli

建筑

                ┌──────────────┐
   user chat ──▶│ FastAPI app  │── streams NDJSON ──▶ browser/CLI
                │ web_server   │
                └──────┬───────┘
                       │ per-session
                       ▼
                ┌──────────────┐    ┌──────────────────────┐
                │ Orchestrator │◀──▶│ LLM (OpenAI / etc.)   │
                └──────┬───────┘    └──────────────────────┘
                       │ tool calls
                       ▼
                ┌──────────────┐
                │ MCPServer    │   register & call tools (sync/async)
                └──────┬───────┘
                       │
   ┌────────────┬──────┴──────┬──────────────┬──────────────┐
   ▼            ▼             ▼              ▼              ▼
flights      hotels         cars          weather       payments
(Amadeus)   (Amadeus)   (RentalCars     (Open-Meteo)  (Stripe
            Search v3)   deeplink)                    Checkout)

完整架构——模块参考、请求和webhook生命周期、设计 决策和扩展点——在 docs/ARCHITECTURE.md.

预订流程(重要)

工具 退货 谁完成预订
book_flight Aviasales URL+intent_reference 用户,在Aviasales上
search_hotels 酒店提供+Hotellook URL 用户,在Hotellook上
rent_car 价格估算+租车URL 租车用户
create_payment_session Stripe Checkout URL 用户,在Stripe.com上(用于 你的 仅服务费)

系统提示 travel_agent/agent/prompts/system.md 指示LLM 突出显示预订网址,永远不要声称它收取了卡费。

测试

pip install -r requirements-dev.txt
pytest --cov=travel_agent --cov-report=term-missing

CI在每次推送+PR上运行,但在70%的覆盖率以下失败。

部署

docker build -t travel-agent .
docker run --rm -p 5000:5000 --env-file .env travel-agent
curl http://localhost:5000/healthz   # liveness
curl http://localhost:5000/readyz    # readiness

对于Stripe in prod:

  1. 集 STRIPE_MODE=live,真的 STRIPE_SECRET_KEY (sk_live_…),以及 STRIPE_WEBHOOK_SECRET.
  2. 点条纹挂钩 https://<your-host>/webhooks/stripe.
  3. 锁 ALLOWED_ORIGINS 到你真正的领域(从来没有 *).

Config.validate() 如果缺少任何必需的密钥,则在启动时提高 选择模式。

文件

聊天端点接受PDF/DOCX/TXT附件(最大 MAX_UPLOAD_MB, 默认值25)。文本通过pypdf/python-docx在服务器端提取 作为一个明确标记的块插入到用户消息中(因此LLM会将其视为 作为数据而非指令)。

延伸阅读

许可证

MIT。看 LICENSE 了解详情。