Skip to content

Commit f4ffd2f

Browse files
committed
fix(gooddata-eval): keep gate out of the positional signature and in the merged report
1 parent 334faff commit f4ffd2f

9 files changed

Lines changed: 51 additions & 7 deletions

File tree

packages/gooddata-eval/src/gooddata_eval/cli/main.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,7 @@ def on_langfuse_item_done(
482482
provider_name=resolved.provider_name or resolved.provider_id,
483483
provider_type=resolved.provider_type,
484484
workspace_id=config.workspace_id,
485+
gate=config.gate,
485486
)
486487
if agentic_report is not None:
487488
report.items.extend(agentic_report.items)

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -791,7 +791,6 @@ def evaluate_agentic_alert_skill(
791791
question: str,
792792
expected_output: dict,
793793
k: int = _DEFAULT_K,
794-
gate: EvalGate = DEFAULT_GATE,
795794
max_iterations: int = _DEFAULT_MAX_ITERATIONS,
796795
initial_conversation_id: str | None = None,
797796
agent_id: str | None = None,
@@ -803,6 +802,7 @@ def evaluate_agentic_alert_skill(
803802
run_metadata_extra: dict | None = None,
804803
reasoning_effort: ReasoningEffort | None = None,
805804
submit_trace_link: SubmitTraceLink = run_trace_link_inline,
805+
gate: EvalGate = DEFAULT_GATE,
806806
) -> AgenticEvalOutcome:
807807
"""Run alert-skill evaluation, log to Langfuse, and raise AlertSkillAssertionError on failure.
808808

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,6 @@ def evaluate_agentic_general_question(
221221
question: str,
222222
expected_output: str,
223223
k: int = _DEFAULT_K,
224-
gate: EvalGate = DEFAULT_GATE,
225224
initial_conversation_id: str | None = None,
226225
agent_id: str | None = None,
227226
langfuse: object | None = None,
@@ -233,6 +232,7 @@ def evaluate_agentic_general_question(
233232
reasoning_effort: ReasoningEffort | None = None,
234233
submit_trace_link: SubmitTraceLink = run_trace_link_inline,
235234
user_context: dict | None = None,
235+
gate: EvalGate = DEFAULT_GATE,
236236
) -> AgenticEvalOutcome:
237237
"""Run general-question evaluation, log to Langfuse, and raise GeneralQuestionAssertionError on failure.
238238

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,6 @@ def evaluate_agentic_guardrail(
194194
question: str,
195195
expected_output: str,
196196
k: int = _DEFAULT_K,
197-
gate: EvalGate = DEFAULT_GATE,
198197
initial_conversation_id: str | None = None,
199198
agent_id: str | None = None,
200199
langfuse: object | None = None,
@@ -205,6 +204,7 @@ def evaluate_agentic_guardrail(
205204
run_metadata_extra: dict | None = None,
206205
reasoning_effort: ReasoningEffort | None = None,
207206
submit_trace_link: SubmitTraceLink = run_trace_link_inline,
207+
gate: EvalGate = DEFAULT_GATE,
208208
) -> AgenticEvalOutcome:
209209
"""Run guardrail evaluation, log to Langfuse, and raise GuardrailAssertionError on failure.
210210

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -380,7 +380,6 @@ def evaluate_agentic_kda_skill(
380380
question: str,
381381
expected_output: dict,
382382
k: int = _DEFAULT_K,
383-
gate: EvalGate = DEFAULT_GATE,
384383
max_iterations: int = _DEFAULT_MAX_ITERATIONS,
385384
initial_conversation_id: str | None = None,
386385
agent_id: str | None = None,
@@ -392,6 +391,7 @@ def evaluate_agentic_kda_skill(
392391
run_metadata_extra: dict | None = None,
393392
reasoning_effort: ReasoningEffort | None = None,
394393
submit_trace_link: SubmitTraceLink = run_trace_link_inline,
394+
gate: EvalGate = DEFAULT_GATE,
395395
) -> AgenticEvalOutcome:
396396
"""Run KDA-skill evaluation, log to Langfuse, and raise KdaSkillAssertionError on failure.
397397

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -413,7 +413,6 @@ def evaluate_agentic_metric_skill(
413413
question: str,
414414
expected_output: dict | list,
415415
k: int = _DEFAULT_K,
416-
gate: EvalGate = DEFAULT_GATE,
417416
max_iterations: int = _DEFAULT_MAX_ITERATIONS,
418417
initial_conversation_id: str | None = None,
419418
agent_id: str | None = None,
@@ -425,6 +424,7 @@ def evaluate_agentic_metric_skill(
425424
run_metadata_extra: dict | None = None,
426425
reasoning_effort: ReasoningEffort | None = None,
427426
submit_trace_link: SubmitTraceLink = run_trace_link_inline,
427+
gate: EvalGate = DEFAULT_GATE,
428428
) -> AgenticEvalOutcome:
429429
"""Run metric-skill evaluation, log to Langfuse, and raise MetricSkillAssertionError on failure.
430430

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,6 @@ def evaluate_agentic_search_tool(
175175
question: str,
176176
expected_tool_call: dict,
177177
k: int = _DEFAULT_K,
178-
gate: EvalGate = DEFAULT_GATE,
179178
initial_conversation_id: str | None = None,
180179
agent_id: str | None = None,
181180
langfuse: object | None = None,
@@ -186,6 +185,7 @@ def evaluate_agentic_search_tool(
186185
run_metadata_extra: dict | None = None,
187186
reasoning_effort: ReasoningEffort | None = None,
188187
submit_trace_link: SubmitTraceLink = run_trace_link_inline,
188+
gate: EvalGate = DEFAULT_GATE,
189189
) -> AgenticEvalOutcome:
190190
"""Run search-tool evaluation, log to Langfuse, and raise SearchToolAssertionError on failure.
191191

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -322,7 +322,6 @@ def evaluate_agentic_visualization(
322322
question: str,
323323
expected_outputs: list[CreatedVisualization],
324324
k: int = _DEFAULT_K,
325-
gate: EvalGate = DEFAULT_GATE,
326325
max_iterations: int = _DEFAULT_MAX_ITERATIONS,
327326
initial_conversation_id: str | None = None,
328327
agent_id: str | None = None,
@@ -335,6 +334,7 @@ def evaluate_agentic_visualization(
335334
record_output_path: str | None = None,
336335
reasoning_effort: ReasoningEffort | None = None,
337336
submit_trace_link: SubmitTraceLink = run_trace_link_inline,
337+
gate: EvalGate = DEFAULT_GATE,
338338
) -> AgenticEvalOutcome:
339339
"""Run visualization evaluation, log to Langfuse, and raise VisualizationAssertionError on failure.
340340

packages/gooddata-eval/tests/test_agentic_gate.py

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
"""The K gate: which of pass@K / pass^K decides an item, and what reaches Langfuse."""
33

44
import contextlib
5+
import importlib
6+
import inspect
57
from unittest.mock import MagicMock, patch
68

79
import pytest
@@ -169,3 +171,44 @@ def test_a_hard_failure_fails_under_both_gates():
169171
for gate in ("any", "power"):
170172
with pytest.raises(GeneralQuestionAssertionError):
171173
_evaluate(gate, (False, False, False))
174+
175+
176+
# --------------------------------------------------------------------------- #
177+
# signature compatibility — `gate` must not shift an existing positional argument
178+
# --------------------------------------------------------------------------- #
179+
@pytest.mark.parametrize(
180+
"module_name",
181+
[
182+
"visualization",
183+
"metric_skill",
184+
"alert_skill",
185+
"kda_skill",
186+
"general_question",
187+
"guardrail",
188+
"search_tool",
189+
],
190+
)
191+
def test_gate_is_the_last_parameter_of_every_evaluator(module_name):
192+
"""Inserted anywhere earlier, a positional caller binds max_iterations or
193+
initial_conversation_id to `gate`, which then reaches normalize_gate and raises."""
194+
module = importlib.import_module(f"gooddata_eval.core.agentic.{module_name}")
195+
fn = next(v for k, v in vars(module).items() if k.startswith("evaluate_agentic_"))
196+
names = [p.name for p in inspect.signature(fn).parameters.values()]
197+
198+
assert names[-1] == "gate"
199+
assert names[5] == "k"
200+
assert names[6] in ("max_iterations", "initial_conversation_id")
201+
202+
203+
def test_a_positional_seventh_argument_still_binds_where_it_used_to():
204+
"""The regression the parameter order protects: 7 positional args, no keywords."""
205+
with _judged(True):
206+
evaluate_agentic_general_question(
207+
"https://example.com", # host
208+
"tok", # token
209+
"ws", # workspace_id
210+
"Q", # question
211+
"rubric", # expected_output
212+
1, # k
213+
"conv-0", # initial_conversation_id -- NOT gate
214+
)

0 commit comments

Comments
 (0)