gooddata-eval 1.74.1.dev4__py3-none-any.whl → 1.74.1.dev5__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -477,6 +477,8 @@ class AlertRunResult:
477
477
  alert_id: str | None
478
478
  eval: AlertEvaluation
479
479
  actual_alert_arguments: dict
480
+ total_turns: int = 0
481
+ total_steps: int = 0
480
482
  reasoning_steps: list[str] = field(default_factory=list)
481
483
  response_id: str | None = None
482
484
  tool_call_events: list[ToolCallEvent] = field(default_factory=list)
@@ -676,9 +678,13 @@ def run_agentic_alert_skill(
676
678
  # Roles follow GPT-4o's perspective: "assistant"=agent text, "user"=sim-user reply.
677
679
  conversation_history: list = []
678
680
  current_question = question
681
+ turns = 0
682
+ steps = 0
679
683
 
680
684
  for _iteration in range(max_iterations):
681
685
  chat_result = client.send_message(conv_id, current_question)
686
+ turns += 1
687
+ steps += chat_result.reasoning_step_count
682
688
  reasoning_steps.extend(chat_result.reasoning_steps or [])
683
689
  response_id = chat_result.response_id or response_id
684
690
  turn_offset, tool_index_offset, reasoning_index_offset = shift_and_index_events(
@@ -728,6 +734,8 @@ def run_agentic_alert_skill(
728
734
  alert_id=alert_id,
729
735
  eval=ev,
730
736
  actual_alert_arguments=actual_args,
737
+ total_turns=turns,
738
+ total_steps=steps,
731
739
  reasoning_steps=reasoning_steps,
732
740
  response_id=response_id,
733
741
  tool_call_events=all_tool_call_events,
@@ -851,6 +859,8 @@ def evaluate_agentic_alert_skill(
851
859
  with ctx.observe(pt, run_idx, conversation_id=run.conversation_id, output=strict_checks) as tid:
852
860
  for score_name, value in strict_checks.items():
853
861
  ctx.score(tid, name=score_name, value=float(value), data_type="BOOLEAN")
862
+ ctx.score(tid, name="turns", value=run.total_turns, data_type="NUMERIC")
863
+ ctx.score(tid, name="steps", value=run.total_steps, data_type="NUMERIC")
854
864
  log_gate_scores(ctx, tid, gate=gate, pass_at_k=summary.pass_at_k, pass_power_k=summary.pass_power_k)
855
865
  ctx.quality(
856
866
  tid,
@@ -336,6 +336,7 @@ class ConversationResult:
336
336
  full_skill_coverage: bool
337
337
  conversation_success: bool
338
338
  total_clarification_turns: int
339
+ total_steps: int = 0
339
340
  reasoning_steps: list[str] = field(default_factory=list)
340
341
  response_id: str | None = None
341
342
  tool_call_events: list[ToolCallEvent] = field(default_factory=list)
@@ -365,6 +366,7 @@ def run_agentic_conversation(
365
366
  turn_results: list[TurnResult] = []
366
367
  turn_outputs: dict[str, dict] = {}
367
368
  total_clarification_turns = 0
369
+ total_steps = 0
368
370
  conversation_id: str = ""
369
371
  owns_conversation = False
370
372
  # Metrics created during this conversation, deleted after it completes so they do
@@ -434,6 +436,7 @@ def run_agentic_conversation(
434
436
  for _iter in range(max_clarification_turns + 1):
435
437
  chat_result = client.send_message(conversation_id, current_message)
436
438
  final_result = chat_result
439
+ total_steps += chat_result.reasoning_step_count
437
440
  turn_offset, tool_index_offset, reasoning_index_offset = shift_and_index_events(
438
441
  chat_result,
439
442
  turn_offset=turn_offset,
@@ -522,6 +525,7 @@ def run_agentic_conversation(
522
525
  full_skill_coverage=full_skill_coverage,
523
526
  conversation_success=conversation_success,
524
527
  total_clarification_turns=total_clarification_turns,
528
+ total_steps=total_steps,
525
529
  reasoning_steps=reasoning_steps,
526
530
  response_id=response_id,
527
531
  tool_call_events=conversation_tool_call_events,
@@ -611,6 +615,22 @@ def evaluate_agentic_conversation(
611
615
  value=float(result.full_skill_coverage),
612
616
  data_type="BOOLEAN",
613
617
  )
618
+ # One turn per fixture turn, plus every simulated-user round the agent triggered.
619
+ # The clarification count alone hides how much of the conversation the fixture
620
+ # asked for, so the comparison needs the total.
621
+ ctx.score(
622
+ tid,
623
+ name="turns",
624
+ value=len(result.turn_results) + result.total_clarification_turns,
625
+ data_type="NUMERIC",
626
+ )
627
+ ctx.score(tid, name="steps", value=result.total_steps, data_type="NUMERIC")
628
+ ctx.score(
629
+ tid,
630
+ name="clarification_turns",
631
+ value=result.total_clarification_turns,
632
+ data_type="NUMERIC",
633
+ )
614
634
  for tr in result.turn_results:
615
635
  ctx.score(
616
636
  tid,
@@ -185,6 +185,8 @@ class KdaRunResult:
185
185
  # Wall-clock time of the turn that called create (None if create never happened) --
186
186
  # not any earlier disambiguation turn. See run_agentic_kda_skill's _run_once.
187
187
  turn_wall_clock_sec: float | None = None
188
+ total_turns: int = 0
189
+ total_steps: int = 0
188
190
  reasoning_steps: list[str] = field(default_factory=list)
189
191
  response_id: str | None = None
190
192
  tool_call_events: list[ToolCallEvent] = field(default_factory=list)
@@ -276,6 +278,9 @@ def run_agentic_kda_skill(
276
278
  all_tool_call_events.extend(result.tool_call_events or [])
277
279
  all_reasoning_step_events.extend(result.reasoning_step_events or [])
278
280
 
281
+ turns = 0
282
+ steps = 0
283
+
279
284
  for iteration in range(max_iterations):
280
285
  try:
281
286
  chat_result = client.send_message(conv_id, current_question)
@@ -291,6 +296,8 @@ def run_agentic_kda_skill(
291
296
  turn_wall_clock_sec = partial.turn_wall_clock_sec
292
297
  turn_completed = False
293
298
  break
299
+ turns += 1
300
+ steps += chat_result.reasoning_step_count
294
301
  reasoning_steps.extend(chat_result.reasoning_steps or [])
295
302
  response_id = chat_result.response_id or response_id
296
303
  _accumulate(chat_result)
@@ -330,6 +337,8 @@ def run_agentic_kda_skill(
330
337
  actual_create_args=create_args,
331
338
  actual_execute_result=execute_result,
332
339
  turn_wall_clock_sec=turn_wall_clock_sec,
340
+ total_turns=turns,
341
+ total_steps=steps,
333
342
  reasoning_steps=reasoning_steps,
334
343
  response_id=response_id,
335
344
  tool_call_events=all_tool_call_events,
@@ -442,6 +451,8 @@ def evaluate_agentic_kda_skill(
442
451
  for score_name, value in strict_checks.items():
443
452
  ctx.score(tid, name=score_name, value=float(value), data_type="BOOLEAN")
444
453
  ctx.score(tid, name="kda_disambiguated", value=float(ev.disambiguated), data_type="BOOLEAN")
454
+ ctx.score(tid, name="turns", value=run.total_turns, data_type="NUMERIC")
455
+ ctx.score(tid, name="steps", value=run.total_steps, data_type="NUMERIC")
445
456
  if turn_wall_clock_sec is not None:
446
457
  # combo_report.py reads this score directly -- no trace re-resolution needed.
447
458
  ctx.score(
@@ -162,7 +162,8 @@ class MetricRunResult:
162
162
  metric_created: bool
163
163
  actual_maql: str
164
164
  maql_correct: bool
165
- total_turns: float
165
+ total_turns: int
166
+ total_steps: int = 0
166
167
  reasoning_steps: list[str] = field(default_factory=list)
167
168
  response_id: str | None = None
168
169
  tool_call_events: list[ToolCallEvent] = field(default_factory=list)
@@ -253,6 +254,7 @@ def _execute_single_metric_run(
253
254
  metric_result: dict | None = None
254
255
  created_metric_ids: list[str] = []
255
256
  turns = 0
257
+ steps = 0
256
258
  current_question = question
257
259
  reasoning_steps: list[str] = []
258
260
  response_id: str | None = None
@@ -280,6 +282,7 @@ def _execute_single_metric_run(
280
282
  )
281
283
  all_tool_call_events.extend(chat_result.tool_call_events or [])
282
284
  all_reasoning_step_events.extend(chat_result.reasoning_step_events or [])
285
+ steps += chat_result.reasoning_step_count
283
286
  for metric_id in _extract_created_metric_ids(chat_result.tool_call_events or []):
284
287
  if metric_id not in created_metric_ids:
285
288
  created_metric_ids.append(metric_id)
@@ -330,7 +333,8 @@ def _execute_single_metric_run(
330
333
  metric_created=metric_created,
331
334
  actual_maql=actual_maql,
332
335
  maql_correct=maql_correct,
333
- total_turns=float(turns),
336
+ total_turns=turns,
337
+ total_steps=steps,
334
338
  reasoning_steps=reasoning_steps,
335
339
  response_id=response_id,
336
340
  tool_call_events=all_tool_call_events,
@@ -466,6 +470,8 @@ def evaluate_agentic_metric_skill(
466
470
  ) as tid:
467
471
  ctx.score(tid, name="metric_created", value=float(run.metric_created), data_type="BOOLEAN")
468
472
  ctx.score(tid, name="maql_correct", value=float(run.maql_correct), data_type="BOOLEAN")
473
+ ctx.score(tid, name="turns", value=run.total_turns, data_type="NUMERIC")
474
+ ctx.score(tid, name="steps", value=run.total_steps, data_type="NUMERIC")
469
475
  log_gate_scores(ctx, tid, gate=gate, pass_at_k=summary.pass_at_k, pass_power_k=summary.pass_power_k)
470
476
  ctx.quality(
471
477
  tid,
@@ -59,8 +59,8 @@ class RunResult:
59
59
  actual_output: CreatedVisualization | None
60
60
  eval_result: EvaluationResult
61
61
  best_expected: CreatedVisualization
62
- total_turns: float
63
- total_steps: float
62
+ total_turns: int
63
+ total_steps: int
64
64
  reasoning_steps: list[str] = field(default_factory=list)
65
65
  response_id: str | None = None
66
66
  tool_call_events: list[ToolCallEvent] = field(default_factory=list)
@@ -186,8 +186,8 @@ def _execute_single_run(
186
186
  max_iterations: int = _DEFAULT_MAX_ITERATIONS,
187
187
  ) -> RunResult:
188
188
  """Drive one full multi-turn conversation and evaluate the result."""
189
- total_turns = 0.0
190
- total_steps = 0.0
189
+ total_turns = 0
190
+ total_steps = 0
191
191
  all_tool_call_events: list[ToolCallEvent] = []
192
192
  all_reasoning_step_events: list[ReasoningStepEvent] = []
193
193
  reasoning_steps: list[str] = []
@@ -200,8 +200,8 @@ def _execute_single_run(
200
200
  current_result = client.send_message(conversation_id, question)
201
201
 
202
202
  for iteration in range(max_iterations):
203
- total_turns += 1.0
204
- total_steps += float(current_result.reasoning_step_count)
203
+ total_turns += 1
204
+ total_steps += current_result.reasoning_step_count
205
205
  turn_offset, tool_index_offset, reasoning_index_offset = shift_and_index_events(
206
206
  current_result,
207
207
  turn_offset=turn_offset,
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.5
2
2
  Name: gooddata-eval
3
- Version: 1.74.1.dev4
3
+ Version: 1.74.1.dev5
4
4
  Summary: Evaluate the GoodData AI agent against your own questions and models.
5
5
  Project-URL: Source, https://github.com/gooddata/gooddata-python-sdk
6
6
  Author-email: GoodData <support@gooddata.com>
@@ -17,7 +17,7 @@ Classifier: Topic :: Scientific/Engineering
17
17
  Classifier: Topic :: Software Development
18
18
  Classifier: Typing :: Typed
19
19
  Requires-Python: >=3.10
20
- Requires-Dist: gooddata-sdk~=1.74.1.dev4
20
+ Requires-Dist: gooddata-sdk~=1.74.1.dev5
21
21
  Requires-Dist: httpx<1.0,>=0.27
22
22
  Requires-Dist: orjson<4.0.0,>=3.9.15
23
23
  Requires-Dist: pydantic<3.0,>=2.6
@@ -17,14 +17,14 @@ gooddata_eval/core/agentic/_catalog.py,sha256=bzDGtiXVHdtJSSMCzV8qYp4p_BxmO7f7Gi
17
17
  gooddata_eval/core/agentic/_gate.py,sha256=irI4eWOCfmsbKd6l-HdpoAlnWkq2wjo4b5crGU_Er1o,2631
18
18
  gooddata_eval/core/agentic/_langfuse.py,sha256=7V1PFQbWpRnFz0a3wklcI-ROYjGC1wGQv2QCfQqpdws,22604
19
19
  gooddata_eval/core/agentic/_trace_linker.py,sha256=iXMTxIXUsF5WNSen7v_K8JJ2j1_37lh-2VAGqQxxmkI,13538
20
- gooddata_eval/core/agentic/alert_skill.py,sha256=AhETD0k2pnEjrHI6G35v3nHkz-qLU28mKczAgkqsfqE,41312
21
- gooddata_eval/core/agentic/conversation.py,sha256=JUbRZaU6G-MIMfOE1T22LSosRE8Bw3dv-GoxU6V8WXc,29137
20
+ gooddata_eval/core/agentic/alert_skill.py,sha256=NxTQREQmcjfGcAgGLWRzEXlBH1GK5Ay1OHfxsyfLXr4,41747
21
+ gooddata_eval/core/agentic/conversation.py,sha256=Kasie-7Cg7DHNgRvgtaYDWUCGjRSIMpuGIexfkKsWGQ,30079
22
22
  gooddata_eval/core/agentic/general_question.py,sha256=Jp3FaS4Tvmfo0dx9iceiZ3Fr1QzJKDl7fVZZDetS22I,14684
23
23
  gooddata_eval/core/agentic/guardrail.py,sha256=9TAZk6rudrm5hAUtr4s2pIvkGJitkLfwv6mpdjsr5l0,13056
24
- gooddata_eval/core/agentic/kda_skill.py,sha256=uPbeYtYHDs1ebt6jwqNo06xOls8-VriAc16gBdgYbrE,22309
25
- gooddata_eval/core/agentic/metric_skill.py,sha256=R1trDIxqfqbrR836orsYXtUT9l4CtYtOtPOgrQI0gY0,22736
24
+ gooddata_eval/core/agentic/kda_skill.py,sha256=P_pR0iC12b_hIwnLzBmH0IBEjsO_CxZrlfkmu10cVWE,22721
25
+ gooddata_eval/core/agentic/metric_skill.py,sha256=Y6KNCIMyGCh2pBX9O_J3kDvXP5RbOHo2hZdES3WUdBk,23037
26
26
  gooddata_eval/core/agentic/search_tool.py,sha256=qZDYpYFLf4-TbpEgVCgAYEUruR9_FG1AYLTKwS8Klbk,11038
27
- gooddata_eval/core/agentic/visualization.py,sha256=P-2srl3kIi2z7ktxoaLEwOiSFnnfuFI9KISbvtfzc_w,21527
27
+ gooddata_eval/core/agentic/visualization.py,sha256=rBco49wdUhfV5xqe3FnxiNL7jr7WrVKM2aaQE6t6i30,21510
28
28
  gooddata_eval/core/chat/__init__.py,sha256=U54lANKm34yjqm7dZL9KkGouPbwAaQWC9wiAmb5B5g4,32
29
29
  gooddata_eval/core/chat/render.py,sha256=CqsKN8__DlaiJj_bmcPZ1poc5LfUqtz7EzKRDbks4gU,2082
30
30
  gooddata_eval/core/chat/sse_client.py,sha256=RqeQA45mCo5MLvRhhyqTQsB9kpU0eUcmaxN9zidA9qo,19417
@@ -56,8 +56,8 @@ gooddata_eval/core/reporting/console.py,sha256=gwewYDusdWX2J9YB1jCUkZcaJjkZ0E1hA
56
56
  gooddata_eval/core/reporting/json_report.py,sha256=q3Jirc_Zhvzg5lkG_kM6JdnViNLe6CXX9WpMKuoM6EM,5228
57
57
  gooddata_eval/core/summary/__init__.py,sha256=U54lANKm34yjqm7dZL9KkGouPbwAaQWC9wiAmb5B5g4,32
58
58
  gooddata_eval/core/summary/http_client.py,sha256=dPArJ6zoCu1W9xmYXFA1WMDNsSOkhn3gaCpYgCUp3gk,2174
59
- gooddata_eval-1.74.1.dev4.dist-info/METADATA,sha256=f31QYSz8ri62wCcSq0wdROHIIYQmDESIzkeHIL46KNE,24240
60
- gooddata_eval-1.74.1.dev4.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
61
- gooddata_eval-1.74.1.dev4.dist-info/entry_points.txt,sha256=28nFp5Viknx4haPYgzK9QHlwPFfC6rPF6RmjC2ht8EI,56
62
- gooddata_eval-1.74.1.dev4.dist-info/licenses/LICENSE.txt,sha256=LVfVlC9maU3K9lgMwdZnClQQsOIbOekdcdVKr9qzJtk,256836
63
- gooddata_eval-1.74.1.dev4.dist-info/RECORD,,
59
+ gooddata_eval-1.74.1.dev5.dist-info/METADATA,sha256=ZUFZ0MjJv4pHuMs-q7OWOAwM_jjHg73g5b4PZhBTDH4,24240
60
+ gooddata_eval-1.74.1.dev5.dist-info/WHEEL,sha256=zOwg4jB6zX2kU910N-cMawjivD6tO8NEWvE12je1bVk,87
61
+ gooddata_eval-1.74.1.dev5.dist-info/entry_points.txt,sha256=28nFp5Viknx4haPYgzK9QHlwPFfC6rPF6RmjC2ht8EI,56
62
+ gooddata_eval-1.74.1.dev5.dist-info/licenses/LICENSE.txt,sha256=LVfVlC9maU3K9lgMwdZnClQQsOIbOekdcdVKr9qzJtk,256836
63
+ gooddata_eval-1.74.1.dev5.dist-info/RECORD,,