fix(events): honor empty event type filters in DB store (#7352)

* fix(events): treat empty event type list as an empty filter

* test(events): cover empty event-type filters across stores
This commit is contained in:
NanPan 2026-10-23 22:34:23 +08:00 committed by GitHub
parent 195bf358ca
commit 1700ac2c82
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 50 additions and 1 deletions

View File

@ -424,7 +424,7 @@ class DbRunEventStore(RunEventStore):
stmt = select(RunEventRow).where(RunEventRow.thread_id == thread_id, RunEventRow.run_id == run_id)
if resolved_user_id is not None:
stmt = stmt.where(RunEventRow.user_id == resolved_user_id)
if event_types:
if event_types is not None:
stmt = stmt.where(RunEventRow.event_type.in_(event_types))
if task_id is not None:
# Filter on metadata["task_id"] in SQL (before LIMIT) so cursor

View File

@ -0,0 +1,49 @@
"""Regression tests for explicit empty event-type filters across backends."""
import pytest
from deerflow.persistence.engine import close_engine, get_session_factory, init_engine
from deerflow.runtime.events.store.db import DbRunEventStore
from deerflow.runtime.events.store.jsonl import JsonlRunEventStore
from deerflow.runtime.events.store.memory import MemoryRunEventStore
@pytest.mark.anyio
@pytest.mark.parametrize("backend", ["memory", "jsonl", "db"])
async def test_empty_event_types_is_an_empty_filter_across_backends(tmp_path, backend):
if backend == "db":
await init_engine(
"sqlite",
url=f"sqlite+aiosqlite:///{tmp_path / 'run-events.db'}",
sqlite_dir=str(tmp_path),
)
event_store = DbRunEventStore(get_session_factory())
elif backend == "jsonl":
event_store = JsonlRunEventStore(base_dir=tmp_path / "jsonl")
else:
event_store = MemoryRunEventStore()
try:
await event_store.put(
thread_id="t1",
run_id="r1",
event_type="llm_end",
category="trace",
)
await event_store.put(
thread_id="t1",
run_id="r1",
event_type="tool_start",
category="trace",
)
unfiltered = await event_store.list_events("t1", "r1", event_types=None)
assert [event["event_type"] for event in unfiltered] == ["llm_end", "tool_start"]
filtered = await event_store.list_events("t1", "r1", event_types=["llm_end"])
assert [event["event_type"] for event in filtered] == ["llm_end"]
assert await event_store.list_events("t1", "r1", event_types=[]) == []
finally:
if backend == "db":
await close_engine()