From 76967d0245a3df3901129fdcd577472d5945dc10 Mon Sep 17 00:00:00 2001 From: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com> Date: Thu, 6 Aug 2026 11:34:30 -0600 Subject: [PATCH 1/3] Expose end-to-end latency metric on Evaluations Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com> --- openapi/ga/individual/platform.openapi.yaml | 10 ++++++ openapi/ga/openapi.yaml | 10 ++++++ openapi/openapi.yaml | 10 ++++++ plugins/nemo-evaluator/openapi/openapi.yaml | 20 ++++++----- .../nemo-platform/.nmpcontext/openapi.yaml | 10 ++++++ .../types/evaluations/evaluation_response.py | 8 +++++ .../nmp/intake/api/v2/experiments/schemas.py | 12 +++++++ .../intake/tests/test_end_to_end_latency.py | 36 +++++++++++++++++++ .../dataViews/ExperimentDataView/index.tsx | 11 ++++++ .../studio/src/mocks/intake/experiments.ts | 1 + 10 files changed, 120 insertions(+), 8 deletions(-) create mode 100644 services/intake/tests/test_end_to_end_latency.py diff --git a/openapi/ga/individual/platform.openapi.yaml b/openapi/ga/individual/platform.openapi.yaml index 8be64a3de8..483834edd6 100644 --- a/openapi/ga/individual/platform.openapi.yaml +++ b/openapi/ga/individual/platform.openapi.yaml @@ -11155,6 +11155,15 @@ components: - $ref: '#/components/schemas/EvaluatorAggregate' description: Average total tokens (input + output) per test case, aggregated across the evaluation. + end_to_end_latency_ms: + title: End To End Latency Ms + description: 'End-to-end latency in milliseconds assuming tasks run serially: + the sum of per-test-case latency, where a test case run more than once + contributes the average of its attempts. Equal to latency_ms.sum; null + when no session carries latency.' + readOnly: true + nullable: true + type: number experiment_group_id: type: string title: Experiment Group Id @@ -11169,6 +11178,7 @@ components: - workspace - experiment_ids - dataset_name + - end_to_end_latency_ms - experiment_group_id title: EvaluationResponse description: Evaluation as served by the API, including ClickHouse-hydrated diff --git a/openapi/ga/openapi.yaml b/openapi/ga/openapi.yaml index 8be64a3de8..483834edd6 100644 --- a/openapi/ga/openapi.yaml +++ b/openapi/ga/openapi.yaml @@ -11155,6 +11155,15 @@ components: - $ref: '#/components/schemas/EvaluatorAggregate' description: Average total tokens (input + output) per test case, aggregated across the evaluation. + end_to_end_latency_ms: + title: End To End Latency Ms + description: 'End-to-end latency in milliseconds assuming tasks run serially: + the sum of per-test-case latency, where a test case run more than once + contributes the average of its attempts. Equal to latency_ms.sum; null + when no session carries latency.' + readOnly: true + nullable: true + type: number experiment_group_id: type: string title: Experiment Group Id @@ -11169,6 +11178,7 @@ components: - workspace - experiment_ids - dataset_name + - end_to_end_latency_ms - experiment_group_id title: EvaluationResponse description: Evaluation as served by the API, including ClickHouse-hydrated diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index 8be64a3de8..483834edd6 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -11155,6 +11155,15 @@ components: - $ref: '#/components/schemas/EvaluatorAggregate' description: Average total tokens (input + output) per test case, aggregated across the evaluation. + end_to_end_latency_ms: + title: End To End Latency Ms + description: 'End-to-end latency in milliseconds assuming tasks run serially: + the sum of per-test-case latency, where a test case run more than once + contributes the average of its attempts. Equal to latency_ms.sum; null + when no session carries latency.' + readOnly: true + nullable: true + type: number experiment_group_id: type: string title: Experiment Group Id @@ -11169,6 +11178,7 @@ components: - workspace - experiment_ids - dataset_name + - end_to_end_latency_ms - experiment_group_id title: EvaluationResponse description: Evaluation as served by the API, including ClickHouse-hydrated diff --git a/plugins/nemo-evaluator/openapi/openapi.yaml b/plugins/nemo-evaluator/openapi/openapi.yaml index 68ffee6c31..5568c0998e 100644 --- a/plugins/nemo-evaluator/openapi/openapi.yaml +++ b/plugins/nemo-evaluator/openapi/openapi.yaml @@ -1659,11 +1659,13 @@ components: title: Fail Fast description: Stop the run on the first scoring failure when True. default: false - benchmark: - additionalProperties: true + labels: + additionalProperties: + type: string type: object - title: Benchmark - description: Benchmark metadata recorded with the run. + title: Labels + description: Caller-supplied tags recorded on the run's metadata (e.g. benchmark, + mode, backend). tasks: anyOf: - $ref: '#/components/schemas/TasksetRef' @@ -1823,11 +1825,13 @@ components: title: Fail Fast description: Stop the run on the first scoring failure when True. default: false - benchmark: - additionalProperties: true + labels: + additionalProperties: + type: string type: object - title: Benchmark - description: Benchmark metadata recorded with the run. + title: Labels + description: Caller-supplied tags recorded on the run's metadata (e.g. benchmark, + mode, backend). tasks: items: $ref: '#/components/schemas/AgentEvalTaskSpec' diff --git a/sdk/python/nemo-platform/.nmpcontext/openapi.yaml b/sdk/python/nemo-platform/.nmpcontext/openapi.yaml index 8be64a3de8..483834edd6 100644 --- a/sdk/python/nemo-platform/.nmpcontext/openapi.yaml +++ b/sdk/python/nemo-platform/.nmpcontext/openapi.yaml @@ -11155,6 +11155,15 @@ components: - $ref: '#/components/schemas/EvaluatorAggregate' description: Average total tokens (input + output) per test case, aggregated across the evaluation. + end_to_end_latency_ms: + title: End To End Latency Ms + description: 'End-to-end latency in milliseconds assuming tasks run serially: + the sum of per-test-case latency, where a test case run more than once + contributes the average of its attempts. Equal to latency_ms.sum; null + when no session carries latency.' + readOnly: true + nullable: true + type: number experiment_group_id: type: string title: Experiment Group Id @@ -11169,6 +11178,7 @@ components: - workspace - experiment_ids - dataset_name + - end_to_end_latency_ms - experiment_group_id title: EvaluationResponse description: Evaluation as served by the API, including ClickHouse-hydrated diff --git a/sdk/python/nemo-platform/src/nemo_platform/types/evaluations/evaluation_response.py b/sdk/python/nemo-platform/src/nemo_platform/types/evaluations/evaluation_response.py index 3764cccfac..d46e7d791c 100644 --- a/sdk/python/nemo-platform/src/nemo_platform/types/evaluations/evaluation_response.py +++ b/sdk/python/nemo-platform/src/nemo_platform/types/evaluations/evaluation_response.py @@ -32,6 +32,14 @@ class EvaluationResponse(BaseModel): dataset_name: str + end_to_end_latency_ms: Optional[float] = None + """ + End-to-end latency in milliseconds assuming tasks run serially: the sum of + per-test-case latency, where a test case run more than once contributes the + average of its attempts. Equal to latency_ms.sum; null when no session carries + latency. + """ + experiment_group_id: str """Deprecated single-experiment alias; the first of experiment_ids. diff --git a/services/intake/src/nmp/intake/api/v2/experiments/schemas.py b/services/intake/src/nmp/intake/api/v2/experiments/schemas.py index b1e6bd77ff..9af242e399 100644 --- a/services/intake/src/nmp/intake/api/v2/experiments/schemas.py +++ b/services/intake/src/nmp/intake/api/v2/experiments/schemas.py @@ -258,6 +258,18 @@ class EvaluationResponse(BaseModel): description="Average total tokens (input + output) per test case, aggregated across the evaluation.", ) + @computed_field( # type: ignore[prop-decorator] + json_schema_extra={"nullable": True}, + description=( + "End-to-end latency in milliseconds assuming tasks run serially: the sum of per-test-case " + "latency, where a test case run more than once contributes the average of its attempts. " + "Equal to latency_ms.sum; null when no session carries latency." + ), + ) + @property + def end_to_end_latency_ms(self) -> float | None: + return self.latency_ms.sum if self.latency_ms is not None else None + @computed_field( # type: ignore[prop-decorator] deprecated=True, description="Deprecated single-experiment alias; the first of experiment_ids. Use experiment_ids.", diff --git a/services/intake/tests/test_end_to_end_latency.py b/services/intake/tests/test_end_to_end_latency.py new file mode 100644 index 0000000000..6c7069ed66 --- /dev/null +++ b/services/intake/tests/test_end_to_end_latency.py @@ -0,0 +1,36 @@ +# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. +# SPDX-License-Identifier: Apache-2.0 + +"""``end_to_end_latency_ms`` computed field on EvaluationResponse. + +It names ``latency_ms.sum`` — the test-case-weighted latency sum (per-test-case latency, with a +test case's attempts averaged, summed across test cases), i.e. end-to-end latency assuming tasks +run serially. The rollup already computes ``latency_ms.sum`` with that semantics; the field only +surfaces it so consumers don't have to know the convention. +""" + +from nmp.intake.api.v2.experiments.schemas import EvaluationResponse, EvaluatorAggregate + + +def _response(latency: EvaluatorAggregate | None) -> EvaluationResponse: + return EvaluationResponse( + id="e", + name="e", + workspace="default", + experiment_ids=["grp"], + dataset_name="ds", + latency_ms=latency, + ) + + +def test_end_to_end_latency_equals_latency_sum() -> None: + resp = _response(EvaluatorAggregate(sum=1234.5, mean=411.5, count=3)) + assert resp.end_to_end_latency_ms == 1234.5 + # and it serializes under the field name + assert resp.model_dump()["end_to_end_latency_ms"] == 1234.5 + + +def test_end_to_end_latency_is_none_without_latency() -> None: + assert _response(None).end_to_end_latency_ms is None + # latency present but no summable value (no session carried latency) + assert _response(EvaluatorAggregate()).end_to_end_latency_ms is None diff --git a/web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx b/web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx index 58425a9d91..82872806eb 100644 --- a/web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx +++ b/web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx @@ -52,6 +52,7 @@ const STATIC_SORT_FIELD_MAP: Readonly> = { created_at: 'created_at', cost_usd: 'cost_usd.mean', latency_ms: 'latency_ms.mean', + end_to_end_latency_ms: 'latency_ms.sum', tokens: 'tokens.mean', test_case_count: 'test_case_count', }; @@ -64,6 +65,7 @@ const STATIC_SORT_FIELD_MAP: Readonly> = { const sortFieldToColumnId = (field: string): string | undefined => { if (field === 'name' || field === 'created_at' || field === 'test_case_count') return field; if (field.startsWith('cost_usd.')) return 'cost_usd'; + if (field === 'latency_ms.sum') return 'end_to_end_latency_ms'; if (field.startsWith('latency_ms.')) return 'latency_ms'; if (field.startsWith('tokens.')) return 'tokens'; const evaluatorMatch = field.match(/^evaluators\.(.+)\.[^.]+$/); @@ -95,6 +97,7 @@ const seedSortFromDefault = ( const getEvaluationFilterField = (id: string): string | undefined => { if (id === 'cost_usd') return 'cost_usd.mean'; if (id === 'latency_ms') return 'latency_ms.mean'; + if (id === 'end_to_end_latency_ms') return 'latency_ms.sum'; if (id === 'tokens') return 'tokens.mean'; const evaluatorMatch = id.match(/^evaluator-(.+)$/); if (evaluatorMatch) return `evaluators.${evaluatorMatch[1]}.mean`; @@ -434,6 +437,14 @@ export const ExperimentDataView: FC = ({ group, paretoV ); }, }), + accessor((original) => original.end_to_end_latency_ms, { + id: 'end_to_end_latency_ms', + header: 'End-to-end latency', + enableSorting: true, + meta: { title: false, filter: numberRangeFilter('End-to-end latency') }, + // Sum of per-task latency (a task's attempts averaged): total time to run the tasks serially. + cell: ({ row }) => {formatDurationMs(row.original.end_to_end_latency_ms)}, + }), accessor((original) => original.tokens?.mean, { id: 'tokens', header: 'Avg Tokens', diff --git a/web/packages/studio/src/mocks/intake/experiments.ts b/web/packages/studio/src/mocks/intake/experiments.ts index f688f49e3b..80b6a75607 100644 --- a/web/packages/studio/src/mocks/intake/experiments.ts +++ b/web/packages/studio/src/mocks/intake/experiments.ts @@ -31,6 +31,7 @@ const mockEvaluation = (name: string): EvaluationResponse => ({ experiment_ids: ['grp_my-group'], dataset_name: 'sample-dataset', experiment_group_id: 'grp_my-group', + end_to_end_latency_ms: null, }); export const mockEvaluationsPage = (): EvaluationResponsesPage => ({ From b8bec212104fc77abb75f8847e2917b23f15c631 Mon Sep 17 00:00:00 2001 From: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com> Date: Thu, 6 Aug 2026 17:32:23 -0600 Subject: [PATCH 2/3] test Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com> From ba60e4cb59c27f67c78b093fc48bdd0b5a278110 Mon Sep 17 00:00:00 2001 From: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com> Date: Fri, 7 Aug 2026 00:46:38 -0600 Subject: [PATCH 3/3] refactor(experiments): drop end_to_end_latency_ms, read latency_ms.sum directly The computed field was a pure alias for latency_ms.sum with no added computation, and the frontend already routes the End-to-end latency column's sort and filter to the latency_ms.sum rollup stat. Remove the response field (and its OpenAPI/SDK surface) and have the cell read latency_ms.sum directly; sorting and filtering are unchanged. Co-Authored-By: Claude Opus 4.8 (1M context) Signed-off-by: shanaiabuggy <59746633+shanaiabuggy@users.noreply.github.com> --- openapi/ga/individual/platform.openapi.yaml | 10 ------ openapi/ga/openapi.yaml | 10 ------ openapi/openapi.yaml | 10 ------ .../nemo-platform/.nmpcontext/openapi.yaml | 10 ------ .../types/evaluations/evaluation_response.py | 8 ----- .../nmp/intake/api/v2/experiments/schemas.py | 12 ------- .../intake/tests/test_end_to_end_latency.py | 36 ------------------- .../dataViews/ExperimentDataView/index.tsx | 5 ++- .../studio/src/mocks/intake/experiments.ts | 1 - 9 files changed, 2 insertions(+), 100 deletions(-) delete mode 100644 services/intake/tests/test_end_to_end_latency.py diff --git a/openapi/ga/individual/platform.openapi.yaml b/openapi/ga/individual/platform.openapi.yaml index b4fadb284d..5376947a7e 100644 --- a/openapi/ga/individual/platform.openapi.yaml +++ b/openapi/ga/individual/platform.openapi.yaml @@ -11101,15 +11101,6 @@ components: - $ref: '#/components/schemas/EvaluatorAggregate' description: Average total tokens (input + output) per test case, aggregated across the evaluation. - end_to_end_latency_ms: - title: End To End Latency Ms - description: 'End-to-end latency in milliseconds assuming tasks run serially: - the sum of per-test-case latency, where a test case run more than once - contributes the average of its attempts. Equal to latency_ms.sum; null - when no session carries latency.' - readOnly: true - nullable: true - type: number experiment_group_id: type: string title: Experiment Group Id @@ -11124,7 +11115,6 @@ components: - workspace - experiment_ids - dataset_name - - end_to_end_latency_ms - experiment_group_id title: EvaluationResponse description: Evaluation as served by the API, including ClickHouse-hydrated diff --git a/openapi/ga/openapi.yaml b/openapi/ga/openapi.yaml index b4fadb284d..5376947a7e 100644 --- a/openapi/ga/openapi.yaml +++ b/openapi/ga/openapi.yaml @@ -11101,15 +11101,6 @@ components: - $ref: '#/components/schemas/EvaluatorAggregate' description: Average total tokens (input + output) per test case, aggregated across the evaluation. - end_to_end_latency_ms: - title: End To End Latency Ms - description: 'End-to-end latency in milliseconds assuming tasks run serially: - the sum of per-test-case latency, where a test case run more than once - contributes the average of its attempts. Equal to latency_ms.sum; null - when no session carries latency.' - readOnly: true - nullable: true - type: number experiment_group_id: type: string title: Experiment Group Id @@ -11124,7 +11115,6 @@ components: - workspace - experiment_ids - dataset_name - - end_to_end_latency_ms - experiment_group_id title: EvaluationResponse description: Evaluation as served by the API, including ClickHouse-hydrated diff --git a/openapi/openapi.yaml b/openapi/openapi.yaml index b4fadb284d..5376947a7e 100644 --- a/openapi/openapi.yaml +++ b/openapi/openapi.yaml @@ -11101,15 +11101,6 @@ components: - $ref: '#/components/schemas/EvaluatorAggregate' description: Average total tokens (input + output) per test case, aggregated across the evaluation. - end_to_end_latency_ms: - title: End To End Latency Ms - description: 'End-to-end latency in milliseconds assuming tasks run serially: - the sum of per-test-case latency, where a test case run more than once - contributes the average of its attempts. Equal to latency_ms.sum; null - when no session carries latency.' - readOnly: true - nullable: true - type: number experiment_group_id: type: string title: Experiment Group Id @@ -11124,7 +11115,6 @@ components: - workspace - experiment_ids - dataset_name - - end_to_end_latency_ms - experiment_group_id title: EvaluationResponse description: Evaluation as served by the API, including ClickHouse-hydrated diff --git a/sdk/python/nemo-platform/.nmpcontext/openapi.yaml b/sdk/python/nemo-platform/.nmpcontext/openapi.yaml index b4fadb284d..5376947a7e 100644 --- a/sdk/python/nemo-platform/.nmpcontext/openapi.yaml +++ b/sdk/python/nemo-platform/.nmpcontext/openapi.yaml @@ -11101,15 +11101,6 @@ components: - $ref: '#/components/schemas/EvaluatorAggregate' description: Average total tokens (input + output) per test case, aggregated across the evaluation. - end_to_end_latency_ms: - title: End To End Latency Ms - description: 'End-to-end latency in milliseconds assuming tasks run serially: - the sum of per-test-case latency, where a test case run more than once - contributes the average of its attempts. Equal to latency_ms.sum; null - when no session carries latency.' - readOnly: true - nullable: true - type: number experiment_group_id: type: string title: Experiment Group Id @@ -11124,7 +11115,6 @@ components: - workspace - experiment_ids - dataset_name - - end_to_end_latency_ms - experiment_group_id title: EvaluationResponse description: Evaluation as served by the API, including ClickHouse-hydrated diff --git a/sdk/python/nemo-platform/src/nemo_platform/types/evaluations/evaluation_response.py b/sdk/python/nemo-platform/src/nemo_platform/types/evaluations/evaluation_response.py index d46e7d791c..3764cccfac 100644 --- a/sdk/python/nemo-platform/src/nemo_platform/types/evaluations/evaluation_response.py +++ b/sdk/python/nemo-platform/src/nemo_platform/types/evaluations/evaluation_response.py @@ -32,14 +32,6 @@ class EvaluationResponse(BaseModel): dataset_name: str - end_to_end_latency_ms: Optional[float] = None - """ - End-to-end latency in milliseconds assuming tasks run serially: the sum of - per-test-case latency, where a test case run more than once contributes the - average of its attempts. Equal to latency_ms.sum; null when no session carries - latency. - """ - experiment_group_id: str """Deprecated single-experiment alias; the first of experiment_ids. diff --git a/services/intake/src/nmp/intake/api/v2/experiments/schemas.py b/services/intake/src/nmp/intake/api/v2/experiments/schemas.py index 9af242e399..b1e6bd77ff 100644 --- a/services/intake/src/nmp/intake/api/v2/experiments/schemas.py +++ b/services/intake/src/nmp/intake/api/v2/experiments/schemas.py @@ -258,18 +258,6 @@ class EvaluationResponse(BaseModel): description="Average total tokens (input + output) per test case, aggregated across the evaluation.", ) - @computed_field( # type: ignore[prop-decorator] - json_schema_extra={"nullable": True}, - description=( - "End-to-end latency in milliseconds assuming tasks run serially: the sum of per-test-case " - "latency, where a test case run more than once contributes the average of its attempts. " - "Equal to latency_ms.sum; null when no session carries latency." - ), - ) - @property - def end_to_end_latency_ms(self) -> float | None: - return self.latency_ms.sum if self.latency_ms is not None else None - @computed_field( # type: ignore[prop-decorator] deprecated=True, description="Deprecated single-experiment alias; the first of experiment_ids. Use experiment_ids.", diff --git a/services/intake/tests/test_end_to_end_latency.py b/services/intake/tests/test_end_to_end_latency.py deleted file mode 100644 index 6c7069ed66..0000000000 --- a/services/intake/tests/test_end_to_end_latency.py +++ /dev/null @@ -1,36 +0,0 @@ -# SPDX-FileCopyrightText: Copyright (c) 2025-2026 NVIDIA CORPORATION & AFFILIATES. All rights reserved. -# SPDX-License-Identifier: Apache-2.0 - -"""``end_to_end_latency_ms`` computed field on EvaluationResponse. - -It names ``latency_ms.sum`` — the test-case-weighted latency sum (per-test-case latency, with a -test case's attempts averaged, summed across test cases), i.e. end-to-end latency assuming tasks -run serially. The rollup already computes ``latency_ms.sum`` with that semantics; the field only -surfaces it so consumers don't have to know the convention. -""" - -from nmp.intake.api.v2.experiments.schemas import EvaluationResponse, EvaluatorAggregate - - -def _response(latency: EvaluatorAggregate | None) -> EvaluationResponse: - return EvaluationResponse( - id="e", - name="e", - workspace="default", - experiment_ids=["grp"], - dataset_name="ds", - latency_ms=latency, - ) - - -def test_end_to_end_latency_equals_latency_sum() -> None: - resp = _response(EvaluatorAggregate(sum=1234.5, mean=411.5, count=3)) - assert resp.end_to_end_latency_ms == 1234.5 - # and it serializes under the field name - assert resp.model_dump()["end_to_end_latency_ms"] == 1234.5 - - -def test_end_to_end_latency_is_none_without_latency() -> None: - assert _response(None).end_to_end_latency_ms is None - # latency present but no summable value (no session carried latency) - assert _response(EvaluatorAggregate()).end_to_end_latency_ms is None diff --git a/web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx b/web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx index 82872806eb..4c65fdc7f7 100644 --- a/web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx +++ b/web/packages/studio/src/components/dataViews/ExperimentDataView/index.tsx @@ -437,13 +437,12 @@ export const ExperimentDataView: FC = ({ group, paretoV ); }, }), - accessor((original) => original.end_to_end_latency_ms, { + accessor((original) => original.latency_ms?.sum, { id: 'end_to_end_latency_ms', header: 'End-to-end latency', enableSorting: true, meta: { title: false, filter: numberRangeFilter('End-to-end latency') }, - // Sum of per-task latency (a task's attempts averaged): total time to run the tasks serially. - cell: ({ row }) => {formatDurationMs(row.original.end_to_end_latency_ms)}, + cell: ({ row }) => {formatDurationMs(row.original.latency_ms?.sum)}, }), accessor((original) => original.tokens?.mean, { id: 'tokens', diff --git a/web/packages/studio/src/mocks/intake/experiments.ts b/web/packages/studio/src/mocks/intake/experiments.ts index 80b6a75607..f688f49e3b 100644 --- a/web/packages/studio/src/mocks/intake/experiments.ts +++ b/web/packages/studio/src/mocks/intake/experiments.ts @@ -31,7 +31,6 @@ const mockEvaluation = (name: string): EvaluationResponse => ({ experiment_ids: ['grp_my-group'], dataset_name: 'sample-dataset', experiment_group_id: 'grp_my-group', - end_to_end_latency_ms: null, }); export const mockEvaluationsPage = (): EvaluationResponsesPage => ({