Skip to content

Commit c31c1ec

Browse files
authored
Merge pull request #1686 from gooddata/qa-28482-run-metadata-extra
feat(gooddata-eval): optional run_metadata_extra on agentic evaluators
2 parents f8f7256 + d599be3 commit c31c1ec

9 files changed

Lines changed: 66 additions & 3 deletions

File tree

packages/gooddata-eval/src/gooddata_eval/core/agentic/_langfuse.py

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ def observe(
305305
run_name=run_name,
306306
dataset_item_id=dataset_item_id,
307307
trace_id=trace_id,
308-
metadata=run_metadata or {"testing_framework": "tavern-e2e"},
308+
metadata=run_metadata or {},
309309
run_description="",
310310
)
311311
_log.debug(
@@ -383,14 +383,31 @@ def build_run_context(
383383
dataset_name: str,
384384
run_timestamp: str | None,
385385
model_version_override: str | None,
386+
run_metadata_extra: dict[str, Any] | None = None,
386387
) -> tuple[str, dict[str, Any]]:
387-
"""Return (run_name_base, run_metadata) with model version resolved from workspace API."""
388+
"""Return (run_name_base, run_metadata) with model version resolved from workspace API.
389+
390+
Args:
391+
host: GoodData host URL.
392+
token: API token used to resolve the workspace model version.
393+
workspace_id: Workspace whose active LLM provider is read when no override is given.
394+
dataset_name: Langfuse dataset name; used as the run-name prefix.
395+
run_timestamp: Shared run timestamp for the run name (falls back to the current time).
396+
model_version_override: Explicit model-version tag; when set it wins over the
397+
workspace lookup.
398+
run_metadata_extra: Optional extra key/values added to the dataset-run metadata
399+
(e.g. a testing-framework tag or a CI run id for scoping). Default None keeps
400+
behavior unchanged. The SDK-derived model_version is applied last and cannot
401+
be overwritten by this dict.
402+
"""
388403
model = get_model_version(host, token, workspace_id, model_version_override)
389404
ts = run_timestamp or datetime.now().strftime("%Y-%m-%d_%H-%M-%S")
390405
base = f"{dataset_name}_{ts}"
391406
if model:
392407
base = f"{base}_{model}"
393-
metadata: dict[str, Any] = {"testing_framework": "tavern-e2e"}
408+
# Caller supplies its own run tags (e.g. testing_framework); model_version is applied
409+
# last so the SDK-derived value cannot be overwritten by run_metadata_extra.
410+
metadata: dict[str, Any] = dict(run_metadata_extra) if run_metadata_extra else {}
394411
if model:
395412
metadata["model_version"] = model
396413
return base, metadata

packages/gooddata-eval/src/gooddata_eval/core/agentic/alert_skill.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -438,6 +438,7 @@ def evaluate_agentic_alert_skill(
438438
dataset_name: str = "alert_skill",
439439
run_timestamp: str | None = None,
440440
model_version_override: str | None = None,
441+
run_metadata_extra: dict | None = None,
441442
) -> None:
442443
"""Run alert-skill evaluation, log to Langfuse, and raise AlertSkillAssertionError on failure."""
443444
from datetime import datetime as _dt # noqa: PLC0415
@@ -475,6 +476,7 @@ def evaluate_agentic_alert_skill(
475476
dataset_name,
476477
run_timestamp,
477478
model_version_override,
479+
run_metadata_extra,
478480
)
479481
traces_by_conv = find_traces_per_conversation(
480482
langfuse,

packages/gooddata-eval/src/gooddata_eval/core/agentic/conversation.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -384,6 +384,7 @@ def evaluate_agentic_conversation(
384384
dataset_name: str = "conversation",
385385
run_timestamp: str | None = None,
386386
model_version_override: str | None = None,
387+
run_metadata_extra: dict | None = None,
387388
) -> None:
388389
"""Run conversation evaluation, log to Langfuse, and raise on failure."""
389390
from datetime import datetime as _dt # noqa: PLC0415
@@ -419,6 +420,7 @@ def evaluate_agentic_conversation(
419420
dataset_name or fixture.dataset_name,
420421
run_timestamp,
421422
model_version_override,
423+
run_metadata_extra,
422424
)
423425
traces_by_conv = find_traces_per_conversation(
424426
langfuse,

packages/gooddata-eval/src/gooddata_eval/core/agentic/general_question.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ def evaluate_agentic_general_question(
152152
dataset_name: str = "general_question",
153153
run_timestamp: str | None = None,
154154
model_version_override: str | None = None,
155+
run_metadata_extra: dict | None = None,
155156
) -> None:
156157
"""Run general-question evaluation, log to Langfuse, and raise on failure."""
157158
from datetime import datetime as _dt # noqa: PLC0415
@@ -188,6 +189,7 @@ def evaluate_agentic_general_question(
188189
dataset_name,
189190
run_timestamp,
190191
model_version_override,
192+
run_metadata_extra,
191193
)
192194
traces_by_conv = find_traces_per_conversation(
193195
langfuse,

packages/gooddata-eval/src/gooddata_eval/core/agentic/guardrail.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,6 +149,7 @@ def evaluate_agentic_guardrail(
149149
dataset_name: str = "guardrail",
150150
run_timestamp: str | None = None,
151151
model_version_override: str | None = None,
152+
run_metadata_extra: dict | None = None,
152153
) -> None:
153154
"""Run guardrail evaluation, log to Langfuse, and raise on failure."""
154155
from datetime import datetime as _dt # noqa: PLC0415
@@ -185,6 +186,7 @@ def evaluate_agentic_guardrail(
185186
dataset_name,
186187
run_timestamp,
187188
model_version_override,
189+
run_metadata_extra,
188190
)
189191
traces_by_conv = find_traces_per_conversation(
190192
langfuse,

packages/gooddata-eval/src/gooddata_eval/core/agentic/metric_skill.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ def evaluate_agentic_metric_skill(
244244
dataset_name: str = "metric_skill",
245245
run_timestamp: str | None = None,
246246
model_version_override: str | None = None,
247+
run_metadata_extra: dict | None = None,
247248
) -> None:
248249
"""Run metric-skill evaluation, log to Langfuse, and raise MetricSkillAssertionError on failure."""
249250
from datetime import datetime as _dt # noqa: PLC0415
@@ -281,6 +282,7 @@ def evaluate_agentic_metric_skill(
281282
dataset_name,
282283
run_timestamp,
283284
model_version_override,
285+
run_metadata_extra,
284286
)
285287
traces_by_conv = find_traces_per_conversation(
286288
langfuse,

packages/gooddata-eval/src/gooddata_eval/core/agentic/search_tool.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ def evaluate_agentic_search_tool(
143143
dataset_name: str = "search",
144144
run_timestamp: str | None = None,
145145
model_version_override: str | None = None,
146+
run_metadata_extra: dict | None = None,
146147
) -> None:
147148
"""Run search-tool evaluation, log to Langfuse, and raise SearchToolAssertionError on failure."""
148149
from datetime import datetime as _dt # noqa: PLC0415
@@ -179,6 +180,7 @@ def evaluate_agentic_search_tool(
179180
dataset_name,
180181
run_timestamp,
181182
model_version_override,
183+
run_metadata_extra,
182184
)
183185
traces_by_conv = find_traces_per_conversation(
184186
langfuse,

packages/gooddata-eval/src/gooddata_eval/core/agentic/visualization.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -263,6 +263,7 @@ def evaluate_agentic_visualization(
263263
dataset_name: str = "visualization",
264264
run_timestamp: str | None = None,
265265
model_version_override: str | None = None,
266+
run_metadata_extra: dict | None = None,
266267
record_output_path: str | None = None,
267268
) -> None:
268269
"""Run visualization evaluation, log to Langfuse, and raise VisualizationAssertionError on failure."""
@@ -302,6 +303,7 @@ def evaluate_agentic_visualization(
302303
dataset_name,
303304
run_timestamp,
304305
model_version_override,
306+
run_metadata_extra,
305307
)
306308
K = len(summary.run_results)
307309
traces_by_conv = find_traces_per_conversation(
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# (C) 2026 GoodData Corporation
2+
from gooddata_eval.core.agentic._langfuse import build_run_context
3+
4+
# model_version_override short-circuits get_model_version (no workspace API call).
5+
_COMMON = {
6+
"host": "h",
7+
"token": "t",
8+
"workspace_id": "w",
9+
"dataset_name": "ds",
10+
"run_timestamp": "2026-07-10_00-00-00",
11+
"model_version_override": "m",
12+
}
13+
14+
15+
def test_build_run_context_includes_caller_extra_keys():
16+
base, metadata = build_run_context(
17+
**_COMMON, run_metadata_extra={"testing_framework": "tavern-e2e", "github_run_id": "run-123"}
18+
)
19+
assert base == "ds_2026-07-10_00-00-00_m"
20+
assert metadata["testing_framework"] == "tavern-e2e"
21+
assert metadata["github_run_id"] == "run-123"
22+
assert metadata["model_version"] == "m"
23+
24+
25+
def test_build_run_context_extra_cannot_override_model_version():
26+
_, metadata = build_run_context(**_COMMON, run_metadata_extra={"model_version": "hack"})
27+
assert metadata["model_version"] == "m" # SDK-derived value wins
28+
29+
30+
def test_build_run_context_without_extra_has_only_model_version():
31+
_, metadata = build_run_context(**_COMMON)
32+
assert metadata == {"model_version": "m"}

0 commit comments

Comments
 (0)