一个最小可运行的多 Agent 旅游攻略 CLI。内置本地工具与默认 3 个 Agent(研究员/规划师/审稿人),并提供“简化 2‑Agent 模式”(规划师/呈现官)。支持命令行交互、XML/Markdown 导出与详细日志输出。
- 创建与激活虚拟环境
python3 -m venv venv
source venv/bin/activate # macOS/Linux
# venv\Scripts\activate # Windows- 安装依赖
pip install -r requirements.txt- 配置 LLM Key(真实模型调用,使用项目 .env)
-
在项目根目录创建或编辑
.env:OPENAI_API_KEY=sk-xxxx # 可选全局模型(LiteLLM 格式:<provider>/<model>) CREWAI_MODEL=openai/gpt-4o-mini # 可选分角色模型(优先级高于 CREWAI_MODEL) # RESEARCHER_MODEL=openai/gpt-4o-mini # PLANNER_MODEL=openai/gpt-4o-mini # REVIEWER_MODEL=openai/gpt-4o-mini # PRESENTER_MODEL=openai/gpt-4o-mini # 可选:关闭遥测 CREWAI_TELEMETRY_OPT_OUT=1
-
程序与
restart.sh会自动加载.env,无需依赖~/.zshrc。
交互模式(推荐)
python main.py仅运行一次
python main.py --once --destination 东京 --days 3 --budget 适中 --preferences "美食, 博物馆"指定日志文件(默认 logs/travel.log)
python main.py --log-file logs/travel.log切换模型(覆盖环境变量 CREWAI_MODEL)
python main.py --model openai/gpt-4o-mini分角色切换模型(优先级高于 CREWAI_MODEL)
python main.py \
--researcher-model openai/gpt-4o-mini \
--planner-model openai/gpt-4o-mini \
--reviewer-model openai/gpt-4o-mini \
--presenter-model openai/gpt-4o-mini快速落地(不需要 DAG 或提案‑评审循环),使用 2‑Agent:
python main.py \
--once \
--simple \
--destination "东京" \
--days 3 \
--budget "适中" \
--preferences "美食, 博物馆" \
--output-md outputs/travel_plan.md \
--output-xml outputs/travel_plan.xml说明:
- 生成的 XML 结构见
docs/SCHEMA_NOTES.md,便于映射到你的外部 schema(如travel-plan-schema.xml)。 - 如需对接严格 XSD 校验,可在提供 XSD 后添加
lxml或xmlschema并在travel_xml.py中启用验证逻辑。
使用项目根目录的 restart.sh 统一设置并启动:
./restart.sh --destination 东京 --days 3 --budget 适中 --preferences "美食, 博物馆"说明:
- 脚本会尝试读取
~/.zshrc(以获取如OPENAI_API_KEY的密钥),并激活本地venv。 - 在脚本内可直接配置启动所需变量:
CREWAI_MODEL(默认openai/gpt-4o-mini)- 可选按角色覆盖:
RESEARCHER_MODEL、PLANNER_MODEL、REVIEWER_MODEL CREWAI_TELEMETRY_OPT_OUT=1(默认关闭遥测)TRAVEL_LOG_FILE(默认logs/travel.log)
- 所有传给
restart.sh的参数会透传给main.py。
--destination: 目的地(如:东京/大阪/巴黎)。--days: 行程天数(整数)。--budget: 预算偏好(如:节省/适中/宽松 或 金额区间)。--preferences: 偏好标签,逗号分隔(如:美食, 博物馆)。--log-file: 日志文件路径(默认logs/travel.log)。--once: 仅运行一次,不进入交互循环。--model: 覆盖默认模型(等价于环境变量CREWAI_MODEL)。--researcher-model: 覆盖研究员模型(等价于RESEARCHER_MODEL)。--planner-model: 覆盖规划师模型(等价于PLANNER_MODEL)。--reviewer-model: 覆盖审稿人模型(等价于REVIEWER_MODEL)。
OPENAI_API_KEY:真实模型调用所需(或按照 LiteLLM 对接的其他厂商变量)。CREWAI_MODEL:全局模型,示例:openai/gpt-4o-mini。RESEARCHER_MODEL、PLANNER_MODEL、REVIEWER_MODEL:按 Agent 细分的模型配置(优先级高于CREWAI_MODEL)。CREWAI_TELEMETRY_OPT_OUT=1:可选,关闭遥测。LOCAL_SEARCH_BASE_URL:本地搜索服务地址,默认http://localhost:10004/search(工具会以?q=...&format=json调用)。LOCAL_FETCH_BASE_URL:本地抓取服务地址,默认http://localhost:10005/fetch(工具会以?url=...&wait_time=3调用)。
建议把上述变量写入 ~/.zshrc,例如:
export OPENAI_API_KEY=sk-xxxx
export CREWAI_MODEL=openai/gpt-4o-mini
# 可选分角色:
# export RESEARCHER_MODEL=openai/gpt-4o-mini
# export PLANNER_MODEL=openai/gpt-4o-mini
# export REVIEWER_MODEL=openai/gpt-4o-mini保存后执行 source ~/.zshrc 使其生效。
- 终端会显示详细的执行与对话日志(
verbose=True)。 - 同步写入
logs/travel.log,便于回放与排查。
- 多 Agent 顺序流水线(真实 LLM 调用):
- 旅行研究员:
- 使用“本地搜索”工具(
LOCAL_SEARCH_BASE_URL,默认http://localhost:10004/search)获取实时信息(如天气/活动/闭馆提醒等)。 - 选取搜索结果中的链接,使用“网页抓取”工具(
LOCAL_FETCH_BASE_URL,默认http://localhost:10005/fetch)抓取网页并提炼关键信息。
- 使用“本地搜索”工具(
- 行程规划师:按天(上午/下午/晚上)输出可执行行程表,控制密度与预算。
- 审稿人:审查可行性与风险,给出改进版最终行程,可基于“修改请求”微调。
- 旅行研究员:
- 日志:
- 运行时
verbose=True打印详细对话与工具调用过程。 - 主程序启用了 stdout “tee”,会将终端输出同时写入到日志文件。
- 运行时
提示:.env 中的 CREWAI_TELEMETRY_OPT_OUT=1 可关闭遥测。
先用 curl 检查你的服务:
curl -s "http://localhost:10004/search?q=深圳今天天气&format=json" | head若返回 JSON,CLI 中研究员会自动调用“本地搜索”工具,并将结果要点出现在日志中(带有 [search:query] / [search:raw] 标记)。
先用 curl 检查抓取服务:
curl -s "http://localhost:10005/fetch?url=https://baidu.com&wait_time=3" | head若返回 HTML/文本或 JSON,CLI 中研究员会在需要时调用“网页抓取”工具(日志中带有 [fetch:url] / [fetch:error] 标记)。
.
├── main.py # CLI 入口(交互/一次性运行、tee 日志)
├── travel_agents.py # Agents/Tasks/Crew 定义 + 本地工具
├── simple_agents.py # 简化 2-Agent 流程(规划+呈现)
├── travel_xml.py # Markdown → XML 导出(可选)
├── requirements.txt # 依赖
└── README.md # 说明
- 日志看不到 Agent 细节?确认已在终端看到
⏳ 正在生成行程...(已开启详细日志),Crew/Agent/Task 默认为verbose=True。日志同时写入logs/travel.log。 - 想扩展功能?在
travel_agents.py中新增工具或 Agent,并在build_crew()中接入;也可替换为crewai-tools的网络工具(需配置 API Key)。