diff --git a/tests/unit/proxy/test_tracing_endpoints.py b/tests/unit/proxy/test_tracing_endpoints.py index 24f67f77fde..413f79f8d7a 100644 --- a/tests/unit/proxy/test_tracing_endpoints.py +++ b/tests/unit/proxy/test_tracing_endpoints.py @@ -705,6 +705,19 @@ def test_sql_routes_need_the_lens_service_when_traces_come_from_spend_logs( assert "Lens service" in response.json()["detail"] +@pytest.mark.parametrize(("allowed_routes", "status_code"), ((["llm_api_routes"], 403), (None, 200))) +def test_spend_log_traces_need_the_same_route_access_as_the_logs_page( + client: TestClient, allowed_routes: list[str] | None, status_code: int +) -> None: + spend_logs: Final = TraceReceiver(storage=SpendLogTraceStorage(lambda: None)) + client.app.dependency_overrides[tracing_endpoints.provide_receiver] = lambda: spend_logs + client.app.dependency_overrides[user_api_key_auth] = lambda: UserAPIKeyAuth( + user_id="user", token="hashed-key", allowed_routes=allowed_routes + ) + response: Final = client.get("/v1/traces") + assert response.status_code == status_code, response.text + + def test_disabled_receiver_precedes_read_scope_rejection(client: TestClient) -> None: client.app.dependency_overrides[user_api_key_auth] = lambda: UserAPIKeyAuth( user_role=LitellmUserRoles.INTERNAL_USER diff --git a/tests/unit/tracing/test_spend_logs.py b/tests/unit/tracing/test_spend_logs.py index 8211630abc7..dbaa5c777b3 100644 --- a/tests/unit/tracing/test_spend_logs.py +++ b/tests/unit/tracing/test_spend_logs.py @@ -28,6 +28,7 @@ def row( error: str | None = None, spend: float = 0.01, agent_id: str | None = None, + request: Mapping[str, object] | None = None, ) -> SpendLogRow: metadata: Final = { "user_agent": user_agent, @@ -48,7 +49,7 @@ def row( request_tags=json.dumps(list(tags)), metadata=json.dumps(metadata), messages="{}", - proxy_server_request=json.dumps({"messages": messages, "tags": list(tags)}), + proxy_server_request=json.dumps(request or {"messages": messages, "tags": list(tags)}), response=json.dumps(response or {}), ) @@ -402,3 +403,11 @@ def test_request_agent_name_groups_calls_without_tags_or_registered_identity() - assert trace["summary"]["agent_names"] == ("Support agent",) assert trace["summary"]["llm_calls"] == 2 assert {span["agent"] for span in trace["spans"]} == {"Support agent"} + + +def test_responses_api_input_is_read_from_the_stored_request() -> None: + trace: Final = build_trace( + (row("r1", "00.000", "01.000", tags=("agent:triage",), request={"model": "gpt-5", "input": "refund me"}),) + ) + + assert trace["summary"]["input_preview"] == "refund me"