From 317d9efb2bed7c88dcfa71d03b8630a1645cbb0d Mon Sep 17 00:00:00 2001 From: moe-berri Date: Tue, 6 Oct 2026 13:45:18 -0700 Subject: [PATCH] fix(tracing): keep copied provider identities consistent --- scripts/seed_tracing_fixtures.py | 3 ++- tests/unit/test_seed_tracing_fixtures.py | 17 ++++++++++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/scripts/seed_tracing_fixtures.py b/scripts/seed_tracing_fixtures.py index d4945fbe3bf..bcd904caec5 100644 --- a/scripts/seed_tracing_fixtures.py +++ b/scripts/seed_tracing_fixtures.py @@ -129,7 +129,7 @@ def rebased_response(value: str, namespace: str, pattern: re.Pattern[str]) -> st prefix, suffix = value.split("_", 1) return f"{prefix}_seed-{namespace}-{suffix}" return f"seed-{namespace}-{value}" - payload: Final = pattern.sub(lambda match: f"seed-{namespace}-{match.group()}", decoded) + payload: Final = pattern.sub(lambda match: rebased_response(match.group(), namespace, pattern), decoded) return "resp_" + base64.b64encode(payload.encode()).decode() @@ -438,6 +438,7 @@ WHERE t.TraceId IN {{trace_ids:Array(String)}} SELECT s.* REPLACE ( {clickhouse_call_id("s.request_id")} AS request_id, {clickhouse_call_id("s.response_id")} AS response_id, + {clickhouse_call_id("s.provider_request_id")} AS provider_request_id, {clickhouse_call_id("s.litellm_call_id")} AS litellm_call_id, {clickhouse_hash("s.trace_id", trace_salt, 32)} AS trace_id, {clickhouse_hash("s.session_id", trace_salt, 32)} AS session_id, diff --git a/tests/unit/test_seed_tracing_fixtures.py b/tests/unit/test_seed_tracing_fixtures.py index b031a544343..5dca24487f1 100644 --- a/tests/unit/test_seed_tracing_fixtures.py +++ b/tests/unit/test_seed_tracing_fixtures.py @@ -1,3 +1,4 @@ +import base64 import hashlib import json import re @@ -15,13 +16,13 @@ from pydantic import InstanceOf, TypeAdapter from litellm.rust_bridge.trace.generated.responses import TraceSQLResponse from litellm.rust_bridge.trace.storage import Tenant, span_rows from litellm.tracing.types import SpendLogRecord -from tests._master_key import MASTER_KEY from scripts.seed_tracing_fixtures import ( JSON, TRACE_FIXTURES, bulk_span_rows, fixture_capture, fixture_replays, + managed_response, postgres_row, rebase, rebase_spend, @@ -33,6 +34,7 @@ from scripts.seed_tracing_fixtures import ( spend_fixtures, timestamps, ) +from tests._master_key import MASTER_KEY CALL_KEYS: Final = TypeAdapter(tuple[str, ...]) DATETIMES: Final = TypeAdapter(tuple[datetime, datetime]) @@ -269,3 +271,16 @@ def test_replay_rebases_provider_request_evidence_with_the_spend_row() -> None: assert export == {"request_id": replayed["provider_request_id"]} assert replayed["provider_request_id"] != spend["provider_request_id"] assert replayed["provider_request_id"].startswith("req_") + + +@pytest.mark.parametrize("upstream", ("msg_response", "req_response", "chatcmpl-response")) +def test_replay_preserves_identity_between_managed_and_plain_response_ids(upstream: str) -> None: + payload: Final = f"model:example;response_id:{upstream}" + managed: Final = "resp_" + base64.b64encode(payload.encode()).decode() + spend: Final = {**dict(spend_fixtures())["deepagents_swarm"][0], "response_id": managed} + pattern: Final = response_pattern((spend,)) + replayed: Final = rebase_spend((spend,), 0, "managed-replay", pattern)[0] + plain: Final = rebase(upstream, 0, "managed-replay", pattern) + + assert plain != upstream + assert managed_response(replayed["response_id"]) == f"model:example;response_id:{plain}"