bug: Recurring calendar events overlapping the start of a requested range are omitted

这个报错通常出现在 Open WebUI 日历功能中,当查询时间范围起点落在“跨天/跨周重复事件”(如 FREQ=WEEKLY )的中间时,该重复事件会被漏掉,而非重复事件正常返回。优先排查日历事件范围查询的 overlap 过滤逻辑,以及重复事件展开(recurrence expansion)与范

快速结论:这个报错通常出现在 Open WebUI 日历功能中,当查询时间范围起点落在“跨天/跨周重复事件”(如 FREQ=WEEKLY)的中间时,该重复事件会被漏掉,而非重复事件正常返回。优先排查日历事件范围查询的 overlap 过滤逻辑,以及重复事件展开(recurrence expansion)与范围起点之间的边界处理。

适用环境:Open WebUI 最新发布版 v0.11.4(8bd8b4fac5e059578ac0c74b3c18d11139f88b7d)与当前 dev 分支(176d31d1db2f8f803a6fda3013c4df5578be9fb4);安装方式为 Git Clone;操作系统为 macOS 26.6.2 ARM64;账号时区为 UTC。该问题通过 FastAPI 日历路由配合隔离的 SQLite 数据库和临时应用目录复现,不涉及浏览器、Ollama 或显卡环境。

最快修复方案:暂无确认的一步修复方案。Issue 中未给出官方合并的修复版本或配置开关,该问题已关联至 PR #31606,可在确认该 PR 是否已合入你所用版本后再决定升级或打补丁。

注意事项:该问题只影响重复事件(rrule 非空)在范围查询起点处的返回结果,重复事件本身的 start_at / end_at 时间戳没有变化;把查询起点改到事件实际开始时间(如 2026-09-28T23:00:00Z)会让重复事件和非重复事件都返回,这说明是范围过滤边界问题而非数据写入问题。未验证过其他 rrule 频率(如 DAILY)或非跨天重复事件是否同样受影响。

问题场景

用户在 Open WebUI 中启用 Calendar 功能,账号时区设为 UTC,通过日历 API 创建了一个跨天的重复事件,然后再按指定时间范围查询该日历的事件列表。

复现方式为直接调用真实的 FastAPI 日历路由(不经过浏览器):先用 POST /api/v1/calendars/create 创建日历,再用 POST /api/v1/calendars/events/create 创建事件。重复事件使用 rrule: "FREQ=WEEKLY",时间戳 1790636400000000000 到 1790643600000000000 对应 2026 年 9 月 28 日 23:00 UTC 至 9 月 29 日 01:00 UTC;同时创建一个除标题和 rrule: null 外完全相同的对照事件。

随后请求 GET /api/v1/calendars/events?start=2026-09-29T00:00:00Z&end=2026-09-30T00:00:00Z&calendar_ids=<calendar-id>,比较两个事件的返回情况。

报错原文

bug: Recurring calendar events overlapping the start of a requested range are omitted

Expected:
Recurring event:     Included
Non-recurring event: Included

Actual:
Recurring event:     Omitted
Non-recurring event: Included

把查询起点改为 2026-09-28T23:00:00Z 后,两个事件都会返回,且 start / end 时间戳保持不变。

原因分析

最可能的原因是:在日历事件范围查询路径中,重复事件的展开(recurrence expansion)与请求范围起点的 overlap 过滤逻辑不一致。非重复事件使用“事件结束时间晚于范围起点、事件开始时间早于范围终点”这类标准区间重叠判断,因此跨天事件只要在查询起点之后仍然活跃就会被返回;而重复事件在展开时,可能只把落在请求范围内的 occurrence 起点纳入候选,或者用 occurrence 的起点(而非整个 occurrence 的时间跨度)去判断是否与请求范围重叠,导致一个起始于范围之前、但持续到范围之内的 occurrence 被丢弃。

Issue 作者已确认这不是编辑后序 occurrence 导致的系列边界问题(#30970),也不是 Scheduled Tasks 的 COUNT 展开问题(#31600),更不是时区偏移问题(#27774,本问题在纯 UTC 下复现)。因此上面的机制属于基于现有证据的“可能原因”,Issue 本身未给出代码级根因结论。

环境排查

  • Open WebUI 版本:确认是 v0.11.4 还是当前 dev 分支的哪个 commit;Issue 在两者上均复现。
  • 安装方式:Git Clone。
  • 操作系统:macOS 26.6.2 ARM64。
  • 账号时区:必须为 UTC,因为该问题在纯 UTC 下即可复现,时区不是必要条件。
  • 数据库:使用隔离的 SQLite 数据库和临时应用目录进行集成测试,避免已有数据干扰复现。
  • 日历功能:确认 Calendar 已启用,且使用的日历 ID 与事件创建时返回的 ID 一致。
  • 该问题不涉及浏览器、Ollama、CUDA 或显卡,这些项无需排查。

解决步骤

  1. 先按 Issue 步骤确认现象:启用 Calendar,使用 UTC 时区账号,通过 POST /api/v1/calendars/create 创建日历。
  2. 用返回的日历 ID 通过 POST /api/v1/calendars/events/create 创建重复事件,rrule 设为 FREQ=WEEKLY,start_at 为 1790636400000000000,end_at 为 1790643600000000000。
  3. 再创建一个对照事件,除标题不同外其余相同,并将 rrule 设为 null。
  4. 请求 GET /api/v1/calendars/events?start=2026-09-29T00:00:00Z&end=2026-09-30T00:00:00Z&calendar_ids=<calendar-id>,确认重复事件被省略、非重复事件被返回。
  5. 将查询起点改为 2026-09-28T23:00:00Z 再次请求,确认两个事件都返回且时间戳未变,以此锁定问题是范围起点处的 overlap 过滤逻辑。
  6. 检查你所用版本是否已包含 PR #31606 的改动;如果尚未包含,可优先尝试升级到包含该修复的版本或应用该 PR 的补丁,而不是自行修改 rrule 或时间戳绕过。

验证方法

修复后重复上述查询:对于持续跨过请求范围的重复事件,当 GET /api/v1/calendars/events 的 start 落在事件中间时,该事件应与对照的非重复事件一样被返回,且返回的 start_at / end_at 与创建时一致。可以再单独确认一个与请求范围完全无重叠的重复事件仍被正确过滤掉,避免修复引入范围过宽的问题。

参考来源

open-webui/open-webui #31605

open-webui/open-webui PR #31606

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 26388

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注