From 83f7481e2a14345b5644345b0a7b14c9fc6c934f Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Wed, 18 Mar 2026 20:44:23 +0000 Subject: [PATCH] fix(ci): deduplicate and sort langfuse batch events after aggregation The Langfuse SDK may send the same event (e.g., trace-create) in multiple flush cycles, causing duplicates when we aggregate from all mock calls. After filtering by trace_id, deduplicate by keeping only the first event of each type, then sort to ensure trace-create is at index 0 and generation-create at index 1. Co-authored-by: Ishaan Jaff --- .../test_langfuse_e2e_test.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/tests/logging_callback_tests/test_langfuse_e2e_test.py b/tests/logging_callback_tests/test_langfuse_e2e_test.py index f7affaec295..9087f2fbc74 100644 --- a/tests/logging_callback_tests/test_langfuse_e2e_test.py +++ b/tests/logging_callback_tests/test_langfuse_e2e_test.py @@ -60,6 +60,22 @@ def assert_langfuse_request_matches_expected( ) ] + # When aggregating from multiple flush cycles, deduplicate by keeping + # only one trace-create and one generation-create per trace_id. + seen_types: dict = {} + deduped_batch: list = [] + for item in actual_request_body["batch"]: + item_type = item["type"] + if item_type not in seen_types: + seen_types[item_type] = True + deduped_batch.append(item) + actual_request_body["batch"] = deduped_batch + + # Ensure canonical order: trace-create first, generation-create second + actual_request_body["batch"].sort( + key=lambda x: 0 if x["type"] == "trace-create" else 1 + ) + print( "actual_request_body after filtering", json.dumps(actual_request_body, indent=4) )