# 0.1.3 时间窗口修复 ## 语义与迁移 所有时间均为中国当地时间,边界包含。乘车 date 为窗口锚点。到达比较实际 arrivalDate + arrivalTime,不能只比较 HH:mm 字符串,否则会把不同日期的凌晨混为同一时间。 出发字段仍为 HH:mm;同时指定下限大于上限时,窗口终点为次日,一次工具调用最多查询两天。不能仅在同一天结果上应用 `time >= after || time <= before`,因为这样会混入当天凌晨并遗漏次日凌晨。各日期响应分别解析出真实 departureDate 和 arrivalDate,合并后按 departureDate、departureTime 和 trainCode 排序,最后统一截取 maxResults。次日请求失败时整个查询报错,避免隐式不完整结果。 到达字段支持 HH:mm 和 YYYY-MM-DDTHH:mm。HH:mm 的日期默认是乘车 date,仅两个纯 HH:mm 的反向窗口自动将上限移到次日。明确日期不做隐式循环。只指定到达窗口不会扩展查询乘车日期。 | 输入 | 含义(date = 2026-10-07) | | --- | --- | | departureAfter 23:00,departureBefore 02:00 | 10/7 23:00 至 10/8 02:00,查询两天 | | arrivalAfter 23:00,arrivalBefore 02:00 | 到达须在 10/7 23:00 至 10/8 02:00,只查 10/7 出发 | | arrivalBefore 02:00 | 到达须不晚于 10/7 02:00 | | arrivalBefore 2026-10-08T02:00 | 到达须不晚于 10/8 02:00,包含更早日期 | | arrivalAfter 2026-10-08T00:00,arrivalBefore 2026-10-08T02:00 | 仅 10/8 凌晨 0–2 点到达 | 旧版用 HH:mm 按每辆车的到达日时钟筛选。需要“次日凌晨”的调用应迁移为带次日日期的边界;否则 00:00–02:00 现在明确表示乘车当天凌晨。 ## 验证 synthetic fixture 使用用户提供的 G9271 23:16–次日 00:29 示例,另包含窗口前后、两端边界及次日凌晨列车,不代表实时运行图。回归测试覆盖同钟点不同日期、跨月/年、闰日、混合明确日期/时钟边界、单边窗口、相等边界、非法时刻及倒序明确日期;Client/真实 ToolRuntime/脚本 AgentLoop 验证一次工具调用的两天查询和真实输出日期。 额外公网测试按限速访问两个真实查询日期,校验请求日期及返回边界;即使深夜没有车也不会伪造结果。模型日期推断仍由宿主模型负责,脚本 AgentLoop 不代表真实云端模型的自然语言理解验收。 ## 中转窗口(0.1.4 起) 0.1.3 中转工具不支持时间窗口。0.1.4 为中转增加相同日期锚点规则:`departureAfter/Before` 只比较首程出发,`arrivalAfter/Before` 只比较末程实际到达,中间一程的到达或出发不受这两个窗口限制。`trainTypes` 和有票条件仍要求两程均满足。 首程跨午夜出发会分别查询两天,每天的分页游标从 0 开始,`maxTransferPages` 为每个日期的上限;默认合计最多 6 页。只指定末程到达日期不扩展首程乘车日。次日上游失败时整个查询报错,避免返回不完整窗口。 结果在已读取页面中按总历时选取、去重及排序,不按出发时间排序;`maxResults` 同时限制保留的候选数量。达到结果数后继续扫描剩余允许页面,因此某些查询耗时会增加。`truncated` 为 `true` 时表示舍弃了超出数量上限的方案或仍有未读取页面,不保证全局最优。 例如首程 10/7 16:00 出发、第二程 10/8 02:50 出发并在 21:50 到达的方案,可用 `departureAfter: "16:00"`、`departureBefore: "16:00"` 和 `arrivalAfter/Before: "2026-10-08T21:50"` 同时选中。传入 `arrivalBefore: "22:00"` 则指 10/7 22:00,不能把次日到达误判为当天。