VTRIP·大交通方案推荐
在本 Skill 目录执行一次查询,脚本生成方案页并返回回答素材:
node scripts/transport-recommend.js --query "明天北京到上海,上午出发" --output-dir "$PWD/outputs"
正常查询直接执行,凭据由脚本读取,不要阅读 scripts/。只有配置失败或用户要求排查时,才读取配置指引。
何时使用
- 「北京到上海怎么走」「明天去成都,飞机高铁都行」
- 城际大交通方案对比、推荐理由、价格/耗时概览
- 不要用于纯机票列表深挖、纯火车票列表、景点攻略(用旅游知识检索)、整包行程规划
交付形态(固定,勿混用)
| 位置 | 内容 | 工具 |
|---|---|---|
| 对话正文 | 根据 materials + answerGuide 写的综合推荐 |
直接输出 markdown |
| 对话底部 | 方案页(内置浏览器 + 文件卡片) | 必须 present_files → presentFiles.files |
方案页只通过 present_files 出现在对话底部。 不调用 present_files,用户看不到方案页;禁止只用文字或正文链接代替。
成功时 stdout 被 WORKBUDDY_VISUAL_JSON_START / END 包裹,内含:query、counts、htmlFile、htmlUrl、previewHint、presentFiles、materials、markdown、answerGuide 等。
解析该 JSON 后,只做两步,然后立刻结束:
- 根据
materials+answerGuide写完对话回答(见下)。正文末尾写「完整方案与跳转见下方结果页」。不要把htmlUrl/htmlFile写成可点 markdown 链接。 - 必须
present_files({ files: presentFiles.files }),原样传入(有本地预览时为[htmlUrl, htmlFile],否则为[htmlFile])。有htmlUrl时第一项按内置浏览器页签打开,第二项作为对话底部方案文件卡片。这是本轮最后一个工具调用;调用后零文字。
previewHint 为 browser-tab 时,宿主必须按内置浏览器页签打开第一项;不要当 static-html 静态预览。
回答结构(按方案数量)
方案 ≤ 3 条:逐条介绍
- 开篇 1-2 句:城市/日期、返回条数、机/火分布。
- 逐条:交通类型、价格、耗时、出发/到达、推荐理由;单段方案有
shortUrl时标题写成可点链接。 - 组合交通:方案标题不挂链接,按
segments逐段给shortUrl(一段一个),禁止把某一段链接当整个方案链接。 - 结尾 1-2 条可操作建议(只能由已返回字段推导)。
- 附录:附上
markdown清单。
方案 > 3 条:表格对比 + 重点推荐(禁止逐条流水账)
- 开篇同上。
- 对比表格:方案 / 交通 / 价格 / 耗时 / 出发→到达 / 亮点;表格内不放长链接。
- 重点推荐 2-3 条(最低价、最快、出发时间最贴合各 1);单段用
shortUrl,组合交通逐段给链;其余一句话带过。 - 跳转说明 + 结尾建议;不再附整段 markdown 清单。
链接与事实边界
- 对话名称链接只用
materials.shortUrl/segments.shortUrl;没有则标「暂无跳转」。不要把完整长链接写进对话。 - 禁止编造航班号、车次、票价、时刻;禁止自行拼接跳转地址。
数据与权限边界
- 只调用本 Skill 的
transport/generate,渠道固定ai_trip。脚本从环境变量或.env读取VTRIP_OPEN_API_KEY,放入X-Api-Key;不回显完整密钥。运行时配置读 Skill 根目录config.json,不存在则读config.example.json。 - 查询失败就反馈错误,不编造结果,不用历史文件伪装本次成功。401/403 提示「Key 无效或未授权当前业务场景,请核对开放平台是否选择了配置中的业务场景」。进一步排查才读错误处理或接口约定。
- 无凭据时返回
status: requires_api_key,退出码 1,不生成 HTML。保留申请链接和返回的channelName。读取配置指引,向用户完整展示三种配置方式(不要展示自检命令或脚本路径)。引导申请时必须说明:视旅开放平台共有 3 个业务场景(AI定制、AI商旅、VTRIPCLaw);本 Skill 的业务场景是返回的channelName;申请 API Key 时须确认已选择该场景。配置完成后由 Agent 内部验证并重试原问题。