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.
Files changed (163) hide show
  1. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/AGENTS.md +1 -1
  2. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/PKG-INFO +4 -3
  3. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/README.md +2 -1
  4. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/pyproject.toml +2 -2
  5. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/cli/agentic_runner.py +54 -0
  6. gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/_clarification.py +511 -0
  7. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_conversation_context.py +16 -0
  8. gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/_editor_takeaways.py +274 -0
  9. gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/_outcome.py +123 -0
  10. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/alert_skill.py +59 -26
  11. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/anomaly_detection.py +56 -31
  12. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/conversation.py +298 -31
  13. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/dashboard_skill.py +386 -28
  14. gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/dashboard_summary.py +581 -0
  15. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/document_skill.py +622 -43
  16. gooddata_eval-1.80.0/src/gooddata_eval/core/agentic/forecasting.py +641 -0
  17. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/general_question.py +57 -18
  18. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/guardrail.py +31 -14
  19. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/kda_skill.py +37 -19
  20. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/metric_skill.py +34 -25
  21. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/search_tool.py +66 -22
  22. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/visualization.py +30 -20
  23. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/what_if.py +57 -32
  24. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/chat/render.py +2 -2
  25. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/chat/sse_client.py +30 -4
  26. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/dataset/from_insights.py +9 -2
  27. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_llm_judge.py +1 -0
  28. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/interaction.py +2 -0
  29. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/models.py +10 -0
  30. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/takeaway/evaluate.py +2 -9
  31. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/takeaway/http_client.py +22 -3
  32. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/timing.py +12 -1
  33. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_alert_skill.py +61 -6
  34. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_anomaly_detection.py +10 -2
  35. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_conversation.py +1009 -1
  36. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_dashboard_skill.py +451 -1
  37. gooddata_eval-1.80.0/tests/test_agentic_dashboard_summary.py +368 -0
  38. gooddata_eval-1.80.0/tests/test_agentic_document_editor_takeaways.py +385 -0
  39. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_document_skill.py +987 -3
  40. gooddata_eval-1.80.0/tests/test_agentic_forecasting.py +528 -0
  41. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_general_question.py +72 -0
  42. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_kda_skill.py +2 -0
  43. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_metric_skill.py +37 -0
  44. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_runner.py +112 -7
  45. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_search_tool.py +56 -0
  46. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_what_if.py +12 -2
  47. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_chat_render.py +33 -0
  48. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_from_insights.py +50 -0
  49. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_sse_client.py +46 -0
  50. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_takeaway_client.py +15 -0
  51. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_timing.py +8 -0
  52. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_trace_linker.py +2 -0
  53. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/.gitignore +0 -0
  54. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/CLAUDE.md +0 -0
  55. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/LICENSE.txt +0 -0
  56. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/Makefile +0 -0
  57. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/scripts/calibrate_takeaway_judge.py +0 -0
  58. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/scripts/verify_guardrail_refusal_criteria.py +0 -0
  59. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/__init__.py +0 -0
  60. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/_version.py +0 -0
  61. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/cli/__init__.py +0 -0
  62. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/cli/main.py +0 -0
  63. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/__init__.py +0 -0
  64. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/_output.py +0 -0
  65. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/_retry.py +0 -0
  66. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/__init__.py +0 -0
  67. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_catalog.py +0 -0
  68. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_failed_runs.py +0 -0
  69. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_gate.py +0 -0
  70. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_langfuse.py +0 -0
  71. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/_trace_linker.py +0 -0
  72. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/agentic/report_skill.py +0 -0
  73. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/chat/__init__.py +0 -0
  74. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/config.py +0 -0
  75. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/connection.py +0 -0
  76. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/dataset/__init__.py +0 -0
  77. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/dataset/langfuse_source.py +0 -0
  78. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/dataset/local.py +0 -0
  79. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/__init__.py +0 -0
  80. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_deep_subset.py +0 -0
  81. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_guardrail_criteria.py +0 -0
  82. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_maql.py +0 -0
  83. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_rubric.py +0 -0
  84. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/_text_utils.py +0 -0
  85. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/alert_skill.py +0 -0
  86. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/base.py +0 -0
  87. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/general_question.py +0 -0
  88. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/guardrail.py +0 -0
  89. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/metric_skill.py +0 -0
  90. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/search_tool.py +0 -0
  91. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/summary.py +0 -0
  92. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/takeaway.py +0 -0
  93. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/evaluators/visualization.py +0 -0
  94. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/granularity.py +0 -0
  95. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/__init__.py +0 -0
  96. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/_env.py +0 -0
  97. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/client.py +0 -0
  98. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/experiment.py +0 -0
  99. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/item_scope.py +0 -0
  100. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/observations.py +0 -0
  101. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/otlp.py +0 -0
  102. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/langfuse/sink.py +0 -0
  103. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/number_format.py +0 -0
  104. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/__init__.py +0 -0
  105. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/console.py +0 -0
  106. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/html_report.py +0 -0
  107. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/json_report.py +0 -0
  108. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/reporting/report_template.html +0 -0
  109. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/runner.py +0 -0
  110. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/scoring.py +0 -0
  111. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/summary/__init__.py +0 -0
  112. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/summary/http_client.py +0 -0
  113. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/takeaway/__init__.py +0 -0
  114. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/src/gooddata_eval/core/workspace.py +0 -0
  115. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/__init__.py +0 -0
  116. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/_fake_langfuse.py +0 -0
  117. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/conftest.py +0 -0
  118. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/fixtures/sample_dataset/metric_skill_create.json +0 -0
  119. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/fixtures/sample_dataset/visualization_revenue.json +0 -0
  120. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/fixtures/sse_visualization_stream.txt +0 -0
  121. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/fixtures/takeaway_calibration.json +0 -0
  122. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_gate.py +0 -0
  123. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_guardrail.py +0 -0
  124. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_join_trace.py +0 -0
  125. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_langfuse_trace.py +0 -0
  126. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_observe_experiment.py +0 -0
  127. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_run_context.py +0 -0
  128. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_agentic_visualization.py +0 -0
  129. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_alert_skill_evaluator.py +0 -0
  130. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_cli.py +0 -0
  131. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_connection.py +0 -0
  132. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_deep_subset.py +0 -0
  133. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_fake_langfuse.py +0 -0
  134. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_guardrail_criteria.py +0 -0
  135. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_html_report.py +0 -0
  136. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_interaction.py +0 -0
  137. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_client.py +0 -0
  138. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_e2e_fake_server.py +0 -0
  139. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_env.py +0 -0
  140. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_experiment.py +0 -0
  141. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_item_scope.py +0 -0
  142. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_observations.py +0 -0
  143. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_otlp.py +0 -0
  144. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_sink.py +0 -0
  145. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_langfuse_source.py +0 -0
  146. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_llm_judge.py +0 -0
  147. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_local_loader.py +0 -0
  148. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_maql_normalize.py +0 -0
  149. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_metric_skill_evaluator.py +0 -0
  150. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_models.py +0 -0
  151. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_number_format.py +0 -0
  152. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_reporting.py +0 -0
  153. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_runner.py +0 -0
  154. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_scoring.py +0 -0
  155. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_search_tool_evaluator.py +0 -0
  156. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_summary_client.py +0 -0
  157. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_summary_evaluator.py +0 -0
  158. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_takeaway_evaluate.py +0 -0
  159. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_takeaway_evaluator.py +0 -0
  160. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_text_evaluators.py +0 -0
  161. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_visualization_evaluator.py +0 -0
  162. {gooddata_eval-1.79.1.dev1 → gooddata_eval-1.80.0}/tests/test_workspace.py +0 -0
  163. {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.79.1.dev1
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.79.1.dev1
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`, and a
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`, and a
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.79.1.dev1"
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.79.1.dev1",
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()