使用说明
旅行策划机构
一个制作就绪的对话式旅行社。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:
- 集
STRIPE_MODE=live,真的STRIPE_SECRET_KEY(sk_live_…),以及STRIPE_WEBHOOK_SECRET. - 点条纹挂钩
https://<your-host>/webhooks/stripe. - 锁
ALLOWED_ORIGINS到你真正的领域(从来没有*).
Config.validate() 如果缺少任何必需的密钥,则在启动时提高
选择模式。
文件
聊天端点接受PDF/DOCX/TXT附件(最大 MAX_UPLOAD_MB,
默认值25)。文本通过pypdf/python-docx在服务器端提取
作为一个明确标记的块插入到用户消息中(因此LLM会将其视为
作为数据而非指令)。
延伸阅读
docs/ARCHITECTURE.md--模块引用,请求 以及webhook生命周期、设计决策和扩展点。docs/PRODUCTION_READINESS.md--the 生产准备计划:为使此回购从 演示到生产就绪,按阶段组织。CONTRIBUTING.md--开发设置、测试运行、约定。
许可证
MIT。看 LICENSE 了解详情。