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.
- gooddata_eval/core/agentic/alert_skill.py +10 -0
- gooddata_eval/core/agentic/conversation.py +20 -0
- gooddata_eval/core/agentic/kda_skill.py +11 -0
- gooddata_eval/core/agentic/metric_skill.py +8 -2
- gooddata_eval/core/agentic/visualization.py +6 -6
- {gooddata_eval-1.74.1.dev4.dist-info → gooddata_eval-1.74.1.dev5.dist-info}/METADATA +2 -2
- {gooddata_eval-1.74.1.dev4.dist-info → gooddata_eval-1.74.1.dev5.dist-info}/RECORD +10 -10
- {gooddata_eval-1.74.1.dev4.dist-info → gooddata_eval-1.74.1.dev5.dist-info}/WHEEL +0 -0
- {gooddata_eval-1.74.1.dev4.dist-info → gooddata_eval-1.74.1.dev5.dist-info}/entry_points.txt +0 -0
- {gooddata_eval-1.74.1.dev4.dist-info → gooddata_eval-1.74.1.dev5.dist-info}/licenses/LICENSE.txt +0 -0
|
@@ -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:
|
|
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=
|
|
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:
|
|
63
|
-
total_steps:
|
|
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
|
|
190
|
-
total_steps = 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
|
|
204
|
-
total_steps +=
|
|
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.
|
|
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.
|
|
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=
|
|
21
|
-
gooddata_eval/core/agentic/conversation.py,sha256=
|
|
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=
|
|
25
|
-
gooddata_eval/core/agentic/metric_skill.py,sha256=
|
|
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=
|
|
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.
|
|
60
|
-
gooddata_eval-1.74.1.
|
|
61
|
-
gooddata_eval-1.74.1.
|
|
62
|
-
gooddata_eval-1.74.1.
|
|
63
|
-
gooddata_eval-1.74.1.
|
|
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,,
|
|
File without changes
|
{gooddata_eval-1.74.1.dev4.dist-info → gooddata_eval-1.74.1.dev5.dist-info}/entry_points.txt
RENAMED
|
File without changes
|
{gooddata_eval-1.74.1.dev4.dist-info → gooddata_eval-1.74.1.dev5.dist-info}/licenses/LICENSE.txt
RENAMED
|
File without changes
|