gooddata-eval 1.79.1.dev1__tar.gz → 1.80.0__tar.gz
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-1.79.1.dev1 → gooddata_eval-1.80.0}/AGENTS.md +1 -1
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/PKG-INFO +4 -3
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/README.md +2 -1
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/pyproject.toml +2 -2
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/cli/agentic_runner.py +54 -0
- gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/_clarification.py +511 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_conversation_context.py +16 -0
- gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/_editor_takeaways.py +274 -0
- gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/_outcome.py +123 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/alert_skill.py +59 -26
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/anomaly_detection.py +56 -31
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/conversation.py +298 -31
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/dashboard_skill.py +386 -28
- gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/dashboard_summary.py +581 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/document_skill.py +622 -43
- gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/forecasting.py +641 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/general_question.py +57 -18
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/guardrail.py +31 -14
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/kda_skill.py +37 -19
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/metric_skill.py +34 -25
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/search_tool.py +66 -22
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/visualization.py +30 -20
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/what_if.py +57 -32
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/chat/render.py +2 -2
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/chat/sse_client.py +30 -4
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/dataset/from_insights.py +9 -2
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_llm_judge.py +1 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/interaction.py +2 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/models.py +10 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/takeaway/evaluate.py +2 -9
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/takeaway/http_client.py +22 -3
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/timing.py +12 -1
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_alert_skill.py +61 -6
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_anomaly_detection.py +10 -2
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_conversation.py +1009 -1
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_dashboard_skill.py +451 -1
- gooddata_eval-1.80.0/tests/test_agentic_dashboard_summary.py +368 -0
- gooddata_eval-1.80.0/tests/test_agentic_document_editor_takeaways.py +385 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_document_skill.py +987 -3
- gooddata_eval-1.80.0/tests/test_agentic_forecasting.py +528 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_general_question.py +72 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_kda_skill.py +2 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_metric_skill.py +37 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_runner.py +112 -7
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_search_tool.py +56 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_what_if.py +12 -2
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_chat_render.py +33 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_from_insights.py +50 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_sse_client.py +46 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_takeaway_client.py +15 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_timing.py +8 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_trace_linker.py +2 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/.gitignore +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/CLAUDE.md +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/LICENSE.txt +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/Makefile +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/scripts/calibrate_takeaway_judge.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/scripts/verify_guardrail_refusal_criteria.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/_version.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/cli/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/cli/main.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/_output.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/_retry.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_catalog.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_failed_runs.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_gate.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_langfuse.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_trace_linker.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/report_skill.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/chat/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/config.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/connection.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/dataset/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/dataset/langfuse_source.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/dataset/local.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_deep_subset.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_guardrail_criteria.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_maql.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_rubric.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_text_utils.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/alert_skill.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/base.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/general_question.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/guardrail.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/metric_skill.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/search_tool.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/summary.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/takeaway.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/visualization.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/granularity.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/_env.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/client.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/experiment.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/item_scope.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/observations.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/otlp.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/sink.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/number_format.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/console.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/html_report.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/json_report.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/report_template.html +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/runner.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/scoring.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/summary/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/summary/http_client.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/takeaway/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/workspace.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/__init__.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/_fake_langfuse.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/conftest.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/fixtures/sample_dataset/metric_skill_create.json +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/fixtures/sample_dataset/visualization_revenue.json +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/fixtures/sse_visualization_stream.txt +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/fixtures/takeaway_calibration.json +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_gate.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_guardrail.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_join_trace.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_langfuse_trace.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_observe_experiment.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_run_context.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_visualization.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_alert_skill_evaluator.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_cli.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_connection.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_deep_subset.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_fake_langfuse.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_guardrail_criteria.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_html_report.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_interaction.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_client.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_e2e_fake_server.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_env.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_experiment.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_item_scope.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_observations.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_otlp.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_sink.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_source.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_llm_judge.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_local_loader.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_maql_normalize.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_metric_skill_evaluator.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_models.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_number_format.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_reporting.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_runner.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_scoring.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_search_tool_evaluator.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_summary_client.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_summary_evaluator.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_takeaway_evaluate.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_takeaway_evaluator.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_text_evaluators.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_visualization_evaluator.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_workspace.py +0 -0
- {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tox.ini +0 -0
|
@@ -27,7 +27,7 @@ experiment. The newest and most actively developed package in the repo.
|
|
|
27
27
|
| `core/agentic/` | multi-turn agentic evaluation per capability, **plus** all Langfuse trace polling and linking (`_langfuse.py`, `_trace_linker.py`) |
|
|
28
28
|
| `core/chat/` | SSE client for the agent's streaming chat endpoint |
|
|
29
29
|
| `core/summary/` | HTTP client for the dedicated dashboard-summary endpoint — a single-shot chat backend, not reporting |
|
|
30
|
-
| `core/takeaway/` | HTTP client for the AI Publisher takeaway endpoint — a single-shot backend like `core/summary/`, keeping the whole response on `ChatResult.raw_response` — plus `evaluate_document_takeaway`, the K-run, gate and Langfuse entry point the Tavern shim calls |
|
|
30
|
+
| `core/takeaway/` | HTTP client for the AI Publisher takeaway endpoint — a single-shot backend like `core/summary/`, keeping the whole response on `ChatResult.raw_response` — plus `evaluate_document_takeaway`, the K-run, gate and Langfuse entry point the Tavern shim calls. Also used by the agentic document skill to write the takeaways the copilot leaves to the editor, before the narrative is graded |
|
|
31
31
|
| `core/dataset/` | dataset format, loading, and `from_insights.py` — dataset generation from a workspace's real insights |
|
|
32
32
|
| `core/evaluators/` | single-shot evaluators and their registry |
|
|
33
33
|
| `core/langfuse/` | the whole Langfuse v4 client: `_env` (base URL + credentials), `otlp` (OTLP/JSON encoding), `experiment` (root-span construction, score targets), `item_scope` (an item's experiment scope sent to gen-ai as baggage, and which conversations joined), `observations` (trace reads), `client` (httpx calls), `sink` (single-shot results as experiments) |
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.5
|
|
2
2
|
Name: gooddata-eval
|
|
3
|
-
Version: 1.
|
|
3
|
+
Version: 1.80.0
|
|
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.
|
|
20
|
+
Requires-Dist: gooddata-sdk~=1.80.0
|
|
21
21
|
Requires-Dist: httpx<1.0,>=0.27
|
|
22
22
|
Requires-Dist: jsonpatch<2.0,>=1.33
|
|
23
23
|
Requires-Dist: orjson<4.0.0,>=3.9.15
|
|
@@ -306,7 +306,8 @@ Each item additionally carries a per-phase breakdown:
|
|
|
306
306
|
```
|
|
307
307
|
|
|
308
308
|
Every item reports `runs_ungraded` beside `runs_passed`: runs the agent answered but the LLM judge returned
|
|
309
|
-
nothing readable for. Agentic items also list them as `unscored_runs` / `judge_errors` in their `detail
|
|
309
|
+
nothing readable for. Agentic items also list them as `unscored_runs` / `judge_errors` in their `detail` (a document item whose takeaway-endpoint request failed
|
|
310
|
+
lists that failure under `request_errors` instead), and a
|
|
310
311
|
`dashboard_summary` item carries `ungraded_criteria`. Such a run — or, for `dashboard_summary`, such a
|
|
311
312
|
criterion — is excluded from pass@K and from the quality score rather than counted as a failure: scoring it 0
|
|
312
313
|
would be indistinguishable from the judge genuinely failing the answer, which is the confusion
|
|
@@ -277,7 +277,8 @@ Each item additionally carries a per-phase breakdown:
|
|
|
277
277
|
```
|
|
278
278
|
|
|
279
279
|
Every item reports `runs_ungraded` beside `runs_passed`: runs the agent answered but the LLM judge returned
|
|
280
|
-
nothing readable for. Agentic items also list them as `unscored_runs` / `judge_errors` in their `detail
|
|
280
|
+
nothing readable for. Agentic items also list them as `unscored_runs` / `judge_errors` in their `detail` (a document item whose takeaway-endpoint request failed
|
|
281
|
+
lists that failure under `request_errors` instead), and a
|
|
281
282
|
`dashboard_summary` item carries `ungraded_criteria`. Such a run — or, for `dashboard_summary`, such a
|
|
282
283
|
criterion — is excluded from pass@K and from the quality score rather than counted as a failure: scoring it 0
|
|
283
284
|
would be indistinguishable from the judge genuinely failing the answer, which is the confusion
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# (C) 2026 GoodData Corporation
|
|
2
2
|
[project]
|
|
3
3
|
name = "gooddata-eval"
|
|
4
|
-
version = "1.
|
|
4
|
+
version = "1.80.0"
|
|
5
5
|
description = "Evaluate the GoodData AI agent against your own questions and models."
|
|
6
6
|
readme = "README.md"
|
|
7
7
|
license = "MIT"
|
|
@@ -11,7 +11,7 @@ authors = [
|
|
|
11
11
|
keywords = ["gooddata", "ai", "evaluation", "llm", "analytics", "cli"]
|
|
12
12
|
requires-python = ">=3.10"
|
|
13
13
|
dependencies = [
|
|
14
|
-
"gooddata-sdk~=1.
|
|
14
|
+
"gooddata-sdk~=1.80.0",
|
|
15
15
|
"httpx>=0.27,<1.0",
|
|
16
16
|
"jsonpatch>=1.33,<2.0",
|
|
17
17
|
"orjson>=3.9.15,<4.0.0",
|
|
@@ -16,7 +16,9 @@ from gooddata_eval.core.agentic.alert_skill import evaluate_agentic_alert_skill
|
|
|
16
16
|
from gooddata_eval.core.agentic.anomaly_detection import evaluate_agentic_anomaly_detection
|
|
17
17
|
from gooddata_eval.core.agentic.conversation import ConversationFixture, evaluate_agentic_conversation
|
|
18
18
|
from gooddata_eval.core.agentic.dashboard_skill import evaluate_agentic_dashboard_skill
|
|
19
|
+
from gooddata_eval.core.agentic.dashboard_summary import evaluate_agentic_dashboard_summary
|
|
19
20
|
from gooddata_eval.core.agentic.document_skill import evaluate_agentic_document_skill
|
|
21
|
+
from gooddata_eval.core.agentic.forecasting import evaluate_agentic_forecasting
|
|
20
22
|
from gooddata_eval.core.agentic.general_question import evaluate_agentic_general_question
|
|
21
23
|
from gooddata_eval.core.agentic.guardrail import evaluate_agentic_guardrail
|
|
22
24
|
from gooddata_eval.core.agentic.kda_skill import evaluate_agentic_kda_skill
|
|
@@ -56,6 +58,8 @@ AGENTIC_TEST_KINDS = frozenset(
|
|
|
56
58
|
"agentic_guardrail",
|
|
57
59
|
"agentic_conversation",
|
|
58
60
|
"agentic_kda_skill",
|
|
61
|
+
"agentic_forecasting",
|
|
62
|
+
"agentic_dashboard_summary",
|
|
59
63
|
"agentic_anomaly_detection",
|
|
60
64
|
"agentic_what_if",
|
|
61
65
|
}
|
|
@@ -303,6 +307,41 @@ def _dispatch_agentic(
|
|
|
303
307
|
user_context=item.user_context,
|
|
304
308
|
**lf_kw,
|
|
305
309
|
)
|
|
310
|
+
elif kind == "agentic_forecasting":
|
|
311
|
+
return evaluate_agentic_forecasting(
|
|
312
|
+
host=host,
|
|
313
|
+
token=token,
|
|
314
|
+
workspace_id=workspace_id,
|
|
315
|
+
question=item.question,
|
|
316
|
+
expected_output=eo if isinstance(eo, dict) else {},
|
|
317
|
+
k=k,
|
|
318
|
+
gate=gate,
|
|
319
|
+
agent_id=agent_id,
|
|
320
|
+
user_context=item.user_context,
|
|
321
|
+
**lf_kw,
|
|
322
|
+
)
|
|
323
|
+
elif kind == "agentic_dashboard_summary":
|
|
324
|
+
summary_input = item.summary_input
|
|
325
|
+
if summary_input is None:
|
|
326
|
+
raise ValueError(f"agentic_dashboard_summary item '{item.id}' is missing required 'summary_input'.")
|
|
327
|
+
return evaluate_agentic_dashboard_summary(
|
|
328
|
+
host=host,
|
|
329
|
+
token=token,
|
|
330
|
+
workspace_id=workspace_id,
|
|
331
|
+
dashboard_id=summary_input.dashboard_id,
|
|
332
|
+
expected_output=eo,
|
|
333
|
+
# The fixture's own wording is the prompt under test -- a localized fixture is
|
|
334
|
+
# only meaningful if its own phrasing is what reaches the agent.
|
|
335
|
+
question=item.question,
|
|
336
|
+
# Each widget costs an execution, so a fixture asserting on a handful of charts
|
|
337
|
+
# can name them instead of paying for the whole dashboard. Same field and meaning
|
|
338
|
+
# the headless /summary endpoint gives it; None summarizes everything.
|
|
339
|
+
only_visualizations=summary_input.visualizations,
|
|
340
|
+
k=k,
|
|
341
|
+
gate=gate,
|
|
342
|
+
agent_id=agent_id,
|
|
343
|
+
**lf_kw,
|
|
344
|
+
)
|
|
306
345
|
elif kind == "agentic_what_if":
|
|
307
346
|
return evaluate_agentic_what_if(
|
|
308
347
|
host=host,
|
|
@@ -404,6 +443,18 @@ def _apply_timings(item_report: ItemReport, timings: Any) -> None:
|
|
|
404
443
|
item_report.simulated_user_latency_s = timings.simulated_user_s
|
|
405
444
|
|
|
406
445
|
|
|
446
|
+
def _apply_best_run_latency(item_report: ItemReport, source: Any) -> None:
|
|
447
|
+
"""Copy the rank-selected run's own wall time, mirroring the single-shot path's
|
|
448
|
+
``ItemReport.best_run_latency_s`` (see ``core/runner.py``'s ``_run_one_item``).
|
|
449
|
+
|
|
450
|
+
Kinds not yet wired to measure it pass None and keep the field at its own None
|
|
451
|
+
default rather than reporting an invented number.
|
|
452
|
+
"""
|
|
453
|
+
best_run_latency_s = getattr(source, "best_run_latency_s", None)
|
|
454
|
+
if best_run_latency_s is not None:
|
|
455
|
+
item_report.best_run_latency_s = best_run_latency_s
|
|
456
|
+
|
|
457
|
+
|
|
407
458
|
def run_agentic_items(
|
|
408
459
|
items: list[DatasetItem],
|
|
409
460
|
host: str,
|
|
@@ -501,6 +552,7 @@ def run_agentic_items(
|
|
|
501
552
|
item_report.response_id = response_id
|
|
502
553
|
item_report.best_detail = detail or {}
|
|
503
554
|
_apply_timings(item_report, getattr(outcome, "timings", None))
|
|
555
|
+
_apply_best_run_latency(item_report, outcome)
|
|
504
556
|
_apply_run_counts(item_report, outcome)
|
|
505
557
|
_apply_failed_runs(item_report, outcome)
|
|
506
558
|
_apply_run_latencies(item_report, outcome)
|
|
@@ -512,6 +564,7 @@ def run_agentic_items(
|
|
|
512
564
|
item_report.response_id = getattr(exc, "response_id", None)
|
|
513
565
|
item_report.best_detail = getattr(exc, "detail", None) or {}
|
|
514
566
|
_apply_timings(item_report, getattr(exc, "timings", None))
|
|
567
|
+
_apply_best_run_latency(item_report, exc)
|
|
515
568
|
_apply_run_counts(item_report, exc)
|
|
516
569
|
_apply_failed_runs(item_report, exc)
|
|
517
570
|
_apply_run_latencies(item_report, exc)
|
|
@@ -555,6 +608,7 @@ def run_agentic_items(
|
|
|
555
608
|
# runs and then raised would otherwise show up in the per-response table and not in
|
|
556
609
|
# the per-conversation one.
|
|
557
610
|
traces.discard()
|
|
611
|
+
_apply_best_run_latency(item_report, exc)
|
|
558
612
|
finally:
|
|
559
613
|
item_report.latency_s = time.perf_counter() - t0
|
|
560
614
|
item_report.trace_latencies_s = traces.stop()
|