clear-eval 2.0.2__tar.gz → 2.0.3__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 (124) hide show
  1. {clear_eval-2.0.2 → clear_eval-2.0.3}/PKG-INFO +1 -1
  2. {clear_eval-2.0.2 → clear_eval-2.0.3}/pyproject.toml +1 -1
  3. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/dashboard/agentic_workflow_dashboard.py +35 -8
  4. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/argument_definitions.py +9 -1
  5. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/clear_analysis/base_clear_runner.py +6 -0
  6. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/run_trajectory_evaluation_pipeline.py +30 -2
  7. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/trace_evaluation/base_evaluator.py +7 -0
  8. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/trace_evaluation/full_trajectory_evaluator.py +130 -215
  9. clear_eval-2.0.3/src/clear_eval/agentic/pipeline/full_traces_evaluation/trace_evaluation/full_trajectory_prompts.py +229 -0
  10. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/preprocess_traces/process_langfuse_traces.py +81 -6
  11. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/run_clear_agentic_eval.py +8 -2
  12. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/setup/default_agentic_config.yaml +13 -1
  13. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/utils.py +5 -1
  14. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval.egg-info/PKG-INFO +1 -1
  15. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval.egg-info/SOURCES.txt +1 -0
  16. {clear_eval-2.0.2 → clear_eval-2.0.3}/LICENSE +0 -0
  17. {clear_eval-2.0.2 → clear_eval-2.0.3}/README.md +0 -0
  18. {clear_eval-2.0.2 → clear_eval-2.0.3}/setup.cfg +0 -0
  19. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/__init__.py +0 -0
  20. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/dashboard/generate_static_dashboard.py +0 -0
  21. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/dashboard/launch_dashboard.py +0 -0
  22. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/dashboard/path_analysis.py +0 -0
  23. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/build_json_results.py +0 -0
  24. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/create_ui_input.py +0 -0
  25. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/clear_analysis/issues_clear_runner.py +0 -0
  26. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/clear_analysis/root_cause_clear_runner.py +0 -0
  27. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/clear_analysis/run_clear_analysis.py +0 -0
  28. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/trace_evaluation/rubric_evaluator.py +0 -0
  29. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/trace_evaluation/rubric_generator.py +0 -0
  30. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/full_traces_evaluation/trace_evaluation/task_success_evaluator.py +0 -0
  31. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/preprocess_traces/compact_trace_formatter.py +0 -0
  32. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/preprocess_traces/preprocess_traces.py +0 -0
  33. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/preprocess_traces/process_mlflow_traces.py +0 -0
  34. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/preprocess_traces/trace_utils.py +0 -0
  35. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/run_clear_step_analysis.py +0 -0
  36. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/setup/__init__.py +0 -0
  37. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/setup/config_example.json +0 -0
  38. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/setup/config_example.yaml +0 -0
  39. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/setup/rh_config_example.yaml +0 -0
  40. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/agentic/pipeline/setup/test_tools_config_example.yaml +0 -0
  41. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/analysis_runner.py +0 -0
  42. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/args.py +0 -0
  43. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/cli.py +0 -0
  44. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/dashboard/__init__.py +0 -0
  45. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/dashboard/show_analysis_dashboard.py +0 -0
  46. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/load_ui.py +0 -0
  47. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/logging_config.py +0 -0
  48. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/__init__.py +0 -0
  49. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/caching_utils.py +0 -0
  50. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/config_loader.py +0 -0
  51. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/constants.py +0 -0
  52. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/eval_utils.py +0 -0
  53. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/evaluation_criteria.py +0 -0
  54. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/external_judge.py +0 -0
  55. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/full_pipeline.py +0 -0
  56. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/inference_utils/__init__.py +0 -0
  57. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/inference_utils/endpoint_backends.py +0 -0
  58. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/inference_utils/langchain_chat_models.py +0 -0
  59. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/inference_utils/llm_client.py +0 -0
  60. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/propmts.py +0 -0
  61. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/setup/__init__.py +0 -0
  62. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/setup/default_config.yaml +0 -0
  63. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/threading_utils.py +0 -0
  64. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/use_cases/__init__.py +0 -0
  65. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/use_cases/eval_use_case.py +0 -0
  66. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/use_cases/external_judge_use_case.py +0 -0
  67. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/use_cases/tool_call_use_case.py +0 -0
  68. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/pipeline/use_cases/use_case_utils.py +0 -0
  69. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/__init__.py +0 -0
  70. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/pipeline_summary.json +0 -0
  71. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-006eee07eed4484592661b1bdba32a75.csv +0 -0
  72. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-0e0148ed21eeebc046f03f63e4418723.csv +0 -0
  73. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-0e1ef041647642c958a8aaa1892fdb88.csv +0 -0
  74. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-4ae9a4305b7a0319ec516ef4eef4ae17.csv +0 -0
  75. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-4eead8c00e900cc84f217a9a10724ecf.csv +0 -0
  76. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-50adf266e9c1522dae57a6290a61596f.csv +0 -0
  77. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-554015d661e4f69cfc629b6d46898421.csv +0 -0
  78. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-55a6003784e34390f47c5c929d8f4db0.csv +0 -0
  79. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-5818239708258c81fff3a4bb0b144802.csv +0 -0
  80. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-5e63ae3886b225ae89a07b7fa4aafe0d.csv +0 -0
  81. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-640f5750b635929a88547548f0cbb4da.csv +0 -0
  82. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-6b2d02f30d4f0d3f4ca7d8f1469913ae.csv +0 -0
  83. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-6c852575331f2e0a02a331d1ddaae59f.csv +0 -0
  84. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-8e68becd37326e6fec6a7d3d3b47dbbb.csv +0 -0
  85. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-b35ed52266fd023dd808950c6848f062.csv +0 -0
  86. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-bccc245d6d47cdf730fd5db3028b52a3.csv +0 -0
  87. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-d6010cdc5e36a50046fc10f33f0bc427.csv +0 -0
  88. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-edadad8b3a67a24a43d145ae07c0c12a.csv +0 -0
  89. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-f082801e1021022e0756e7d089f1558c.csv +0 -0
  90. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/traces_data/tr-f34a9851b31fafffe527c5b2d6262de8.csv +0 -0
  91. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_results/mlflow/my_experiment/unified_ui_results.zip +0 -0
  92. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/langfuse/434f3f96ac470e805428c4be45b4f2a3.json +0 -0
  93. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/langfuse/4c354cfb5b17f61af073df6796f2b236.json +0 -0
  94. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/langfuse/4deb34a4521fcedf92083d0a93fe11d4.json +0 -0
  95. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/langfuse/c685b7eb7826a87149bd2c42a50e47c5.json +0 -0
  96. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/langfuse/ebf1d6897941adb63bcc62aa7c50e8f8.json +0 -0
  97. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-006eee07eed4484592661b1bdba32a75.json +0 -0
  98. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-0e0148ed21eeebc046f03f63e4418723.json +0 -0
  99. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-0e1ef041647642c958a8aaa1892fdb88.json +0 -0
  100. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-4ae9a4305b7a0319ec516ef4eef4ae17.json +0 -0
  101. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-4eead8c00e900cc84f217a9a10724ecf.json +0 -0
  102. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-50adf266e9c1522dae57a6290a61596f.json +0 -0
  103. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-554015d661e4f69cfc629b6d46898421.json +0 -0
  104. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-55a6003784e34390f47c5c929d8f4db0.json +0 -0
  105. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-5818239708258c81fff3a4bb0b144802.json +0 -0
  106. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-5e63ae3886b225ae89a07b7fa4aafe0d.json +0 -0
  107. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-640f5750b635929a88547548f0cbb4da.json +0 -0
  108. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-6b2d02f30d4f0d3f4ca7d8f1469913ae.json +0 -0
  109. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-6c852575331f2e0a02a331d1ddaae59f.json +0 -0
  110. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-8e68becd37326e6fec6a7d3d3b47dbbb.json +0 -0
  111. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-b35ed52266fd023dd808950c6848f062.json +0 -0
  112. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-bccc245d6d47cdf730fd5db3028b52a3.json +0 -0
  113. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-d6010cdc5e36a50046fc10f33f0bc427.json +0 -0
  114. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-edadad8b3a67a24a43d145ae07c0c12a.json +0 -0
  115. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-f082801e1021022e0756e7d089f1558c.json +0 -0
  116. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/agentic/research_agent_traces/mlflow/tr-f34a9851b31fafffe527c5b2d6262de8.json +0 -0
  117. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/gsm8k/__init__.py +0 -0
  118. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/gsm8k/analysis_results_gsm8k_default.zip +0 -0
  119. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/gsm8k/gsm8k_default_predictions.csv +0 -0
  120. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval/sample_data/tool_calls/tool_calls_sample_data.csv +0 -0
  121. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval.egg-info/dependency_links.txt +0 -0
  122. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval.egg-info/entry_points.txt +0 -0
  123. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval.egg-info/requires.txt +0 -0
  124. {clear_eval-2.0.2 → clear_eval-2.0.3}/src/clear_eval.egg-info/top_level.txt +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: clear_eval
3
- Version: 2.0.2
3
+ Version: 2.0.3
4
4
  Summary: A python API sdk facilitating Error Analysis via LLM-as-a-Judge
5
5
  Author-email: Lilach Eden <lilache@il.ibm.com>, Asaf Yehudai <asaf.yehudai@ibm.com>
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "clear_eval"
7
- version = "2.0.2"
7
+ version = "2.0.3"
8
8
  description = "A python API sdk facilitating Error Analysis via LLM-as-a-Judge"
9
9
  readme = "README.md"
10
10
  authors = [{ name = "Lilach Eden", email = "lilache@il.ibm.com"},
@@ -2174,7 +2174,8 @@ def main_page():
2174
2174
  # Try to get dimensions from parsed_evaluation first (preferred structure)
2175
2175
  step_quality = parsed_eval.get("step_quality_dimensions", {})
2176
2176
  trajectory_dims = parsed_eval.get("trajectory_dimensions", {})
2177
-
2177
+ custom_dims = parsed_eval.get("dimensions", {})
2178
+
2178
2179
  # Collect step quality dimension scores
2179
2180
  for criterion, details in step_quality.items():
2180
2181
  score = details.get("score")
@@ -2183,7 +2184,7 @@ def main_page():
2183
2184
  all_dimension_scores[f"Step Quality: {criterion}"].append(float(score))
2184
2185
  except (ValueError, TypeError):
2185
2186
  print(f"⚠️ Warning: Could not convert score to float for {criterion}: {score}")
2186
-
2187
+
2187
2188
  # Collect trace dimension scores
2188
2189
  for criterion, details in trajectory_dims.items():
2189
2190
  score = details.get("score")
@@ -2192,9 +2193,19 @@ def main_page():
2192
2193
  all_dimension_scores[f"Trace: {criterion}"].append(float(score))
2193
2194
  except (ValueError, TypeError):
2194
2195
  print(f"⚠️ Warning: Could not convert score to float for {criterion}: {score}")
2195
-
2196
+
2197
+ # Collect custom flat dimension scores
2198
+ if custom_dims and not step_quality and not trajectory_dims:
2199
+ for criterion, details in custom_dims.items():
2200
+ score = details.get("score")
2201
+ if score is not None:
2202
+ try:
2203
+ all_dimension_scores[criterion].append(float(score))
2204
+ except (ValueError, TypeError):
2205
+ print(f"⚠️ Warning: Could not convert score to float for {criterion}: {score}")
2206
+
2196
2207
  # Fallback: if no dimensions found in parsed_evaluation, try dimension_scores directly
2197
- if not step_quality and not trajectory_dims and dimension_scores:
2208
+ if not step_quality and not trajectory_dims and not custom_dims and dimension_scores:
2198
2209
  for criterion, score in dimension_scores.items():
2199
2210
  if score is not None:
2200
2211
  try:
@@ -3083,7 +3094,8 @@ def main_page():
3083
3094
  # Separate step quality and trace dimensions
3084
3095
  step_quality = parsed_eval.get("step_quality_dimensions", {})
3085
3096
  trajectory_dims = parsed_eval.get("trajectory_dimensions", {})
3086
-
3097
+ custom_dims = parsed_eval.get("dimensions", {})
3098
+
3087
3099
  if step_quality:
3088
3100
  ui.html('<div style="font-weight: 600; color: #1E293B; margin: 12px 0 8px 0; font-size: 15px;">Step Quality Dimensions</div>')
3089
3101
  for criterion, details in step_quality.items():
@@ -3091,7 +3103,7 @@ def main_page():
3091
3103
  justification = details.get("justification", "No justification provided")
3092
3104
  score_color = score_to_hex(score)
3093
3105
  definition = get_dimension_definition(criterion)
3094
-
3106
+
3095
3107
  with ui.row().classes("w-full items-center gap-2 mb-2"):
3096
3108
  with ui.expansion(f"{criterion}: {score:.2f}", icon="check_circle").classes("flex-1").style(f"border-left: 4px solid {score_color};"):
3097
3109
  ui.html(f"""
@@ -3101,7 +3113,7 @@ def main_page():
3101
3113
  """)
3102
3114
  with ui.button(icon="info", on_click=lambda: None).props("flat dense round size=sm").classes("text-blue-500"):
3103
3115
  ui.tooltip(definition).classes("bg-slate-800 text-white text-sm max-w-md")
3104
-
3116
+
3105
3117
  if trajectory_dims:
3106
3118
  ui.html('<div style="font-weight: 600; color: #1E293B; margin: 20px 0 8px 0; font-size: 15px;">Trace-Level Dimensions</div>')
3107
3119
  for criterion, details in trajectory_dims.items():
@@ -3109,7 +3121,7 @@ def main_page():
3109
3121
  justification = details.get("justification", "No justification provided")
3110
3122
  score_color = score_to_hex(score)
3111
3123
  definition = get_dimension_definition(criterion)
3112
-
3124
+
3113
3125
  with ui.row().classes("w-full items-center gap-2 mb-2"):
3114
3126
  with ui.expansion(f"{criterion}: {score:.2f}", icon="check_circle").classes("flex-1").style(f"border-left: 4px solid {score_color};"):
3115
3127
  ui.html(f"""
@@ -3120,6 +3132,21 @@ def main_page():
3120
3132
  with ui.button(icon="info", on_click=lambda: None).props("flat dense round size=sm").classes("text-blue-500"):
3121
3133
  ui.tooltip(definition).classes("bg-slate-800 text-white text-sm max-w-md")
3122
3134
 
3135
+ if custom_dims and not step_quality and not trajectory_dims:
3136
+ ui.html('<div style="font-weight: 600; color: #1E293B; margin: 12px 0 8px 0; font-size: 15px;">Evaluation Dimensions</div>')
3137
+ for criterion, details in custom_dims.items():
3138
+ score = float(details.get("score", 0))
3139
+ justification = details.get("justification", "No justification provided")
3140
+ score_color = score_to_hex(score)
3141
+
3142
+ with ui.row().classes("w-full items-center gap-2 mb-2"):
3143
+ with ui.expansion(f"{criterion}: {score:.2f}", icon="check_circle").classes("flex-1").style(f"border-left: 4px solid {score_color};"):
3144
+ ui.html(f"""
3145
+ <div style="padding: 8px; background: #FAFAFA; border-radius: 6px; color: #475569; font-size: 13px; line-height: 1.5;">
3146
+ {justification}
3147
+ </div>
3148
+ """)
3149
+
3123
3150
  def render_rubric_evaluation(rubric_eval):
3124
3151
  """Render the rubric-based trace evaluation."""
3125
3152
  # Overall score card
@@ -10,7 +10,7 @@ reusable argument groups that can be composed based on each script's needs.
10
10
  """
11
11
 
12
12
  import argparse
13
- from clear_eval.args import str2bool
13
+ from clear_eval.args import str2bool, parse_dict
14
14
 
15
15
 
16
16
  def add_agentic_pipeline_args(parser: argparse.ArgumentParser) -> None:
@@ -132,6 +132,14 @@ def add_full_trajectory_args(parser: argparse.ArgumentParser) -> None:
132
132
  type=int,
133
133
  help="Model context window size (for full trajectory)"
134
134
  )
135
+ group.add_argument(
136
+ "--full-trace-evaluation-criteria",
137
+ type=parse_dict,
138
+ default=None,
139
+ help="JSON dict of evaluation criteria for full trace evaluation. "
140
+ "Replaces all default dimensions when set. "
141
+ "Example: '{\"Correctness\": \"Accurate results\", \"Efficiency\": \"No redundant steps\"}'"
142
+ )
135
143
  # Note: --max-files is defined in add_agentic_pipeline_args() (shared across pipelines)
136
144
  # Do not add it here to avoid conflicts
137
145
 
@@ -44,6 +44,7 @@ class BaseClearRunner(ABC):
44
44
  output_dir: Path,
45
45
  inference_config: InferenceConfig,
46
46
  overwrite: bool = False,
47
+ predefined_issues: list = None,
47
48
  ):
48
49
  """
49
50
  Initialize CLEAR runner.
@@ -53,11 +54,13 @@ class BaseClearRunner(ABC):
53
54
  output_dir: Base directory for CLEAR analysis outputs
54
55
  inference_config: LLM inference configuration
55
56
  overwrite: Whether to overwrite existing CLEAR results
57
+ predefined_issues: Predefined issues list to skip issue discovery
56
58
  """
57
59
  self.eval_results_dir = Path(eval_results_dir)
58
60
  self.output_dir = Path(output_dir)
59
61
  self.inference_config = inference_config
60
62
  self.overwrite = overwrite
63
+ self.predefined_issues = predefined_issues
61
64
 
62
65
  @abstractmethod
63
66
  def get_source_name(self) -> str:
@@ -219,6 +222,9 @@ class BaseClearRunner(ABC):
219
222
  "endpoint_url": self.inference_config.endpoint_url,
220
223
  }
221
224
 
225
+ if self.predefined_issues:
226
+ analysis_kwargs["predefined_issues"] = self.predefined_issues
227
+
222
228
  run_clear_eval_aggregation(**analysis_kwargs)
223
229
  logger.info(f"Completed: {group_key}")
224
230
  return True
@@ -99,6 +99,9 @@ Arguments:
99
99
  --overwrite: Re-run even if results exist
100
100
  --max-workers: Number of parallel workers (default: 7)
101
101
  --max-files: Limit files to process (for testing)
102
+ --full-trace-evaluation-criteria: JSON dict of custom evaluation criteria
103
+ Replaces all default dimensions when set
104
+ --predefined-issues: Predefined issues list for CLEAR analysis
102
105
 
103
106
  Output Structure:
104
107
  output_dir/
@@ -273,6 +276,7 @@ def run_full_trajectory_evaluation(
273
276
  overwrite: bool,
274
277
  max_workers: int,
275
278
  max_files: Optional[int],
279
+ full_trace_evaluation_criteria: Optional[dict] = None,
276
280
  ) -> bool:
277
281
  """Run full trajectory evaluation."""
278
282
  logger.info("=" * 80)
@@ -288,6 +292,7 @@ def run_full_trajectory_evaluation(
288
292
  overwrite=overwrite,
289
293
  max_workers=max_workers,
290
294
  max_files=max_files,
295
+ full_trace_evaluation_criteria=full_trace_evaluation_criteria,
291
296
  )
292
297
  evaluator.run_pipeline()
293
298
  logger.info("Full trajectory evaluation completed successfully")
@@ -378,8 +383,19 @@ def run_clear_analysis(
378
383
  clear_types: List[str],
379
384
  inference_config: InferenceConfig,
380
385
  overwrite: bool,
386
+ predefined_issues: Optional[list] = None,
381
387
  ) -> bool:
382
- """Run CLEAR analysis on evaluation results."""
388
+ """
389
+ Run CLEAR analysis on evaluation results.
390
+
391
+ Args:
392
+ eval_results_dir: Directory containing evaluation result files
393
+ clear_output_dir: Output directory for CLEAR analysis
394
+ clear_types: List of CLEAR analysis types to run
395
+ inference_config: LLM inference configuration
396
+ overwrite: Whether to overwrite existing results
397
+ predefined_issues: If set, skip issue discovery and use these issues directly
398
+ """
383
399
  if not clear_types:
384
400
  logger.info("Skipping CLEAR analysis (none requested)")
385
401
  return True
@@ -400,6 +416,7 @@ def run_clear_analysis(
400
416
  output_dir=clear_output_dir,
401
417
  inference_config=inference_config,
402
418
  overwrite=overwrite,
419
+ predefined_issues=predefined_issues,
403
420
  )
404
421
  runner.run_analysis()
405
422
  logger.info("Root cause CLEAR analysis completed successfully")
@@ -416,6 +433,7 @@ def run_clear_analysis(
416
433
  output_dir=clear_output_dir,
417
434
  inference_config=inference_config,
418
435
  overwrite=overwrite,
436
+ predefined_issues=predefined_issues,
419
437
  )
420
438
  runner.run_analysis()
421
439
  logger.info("Issues CLEAR analysis completed successfully")
@@ -517,6 +535,8 @@ def run_trajectory_evaluation_pipeline(
517
535
  overwrite: bool = False,
518
536
  max_workers: int = 10,
519
537
  max_files: Optional[int] = None,
538
+ predefined_issues: Optional[list] = None,
539
+ full_trace_evaluation_criteria: Optional[dict] = None,
520
540
  ) -> tuple[List[str], List[str]]:
521
541
  """
522
542
  Run trajectory evaluation pipeline on CSV trajectory data.
@@ -536,6 +556,8 @@ def run_trajectory_evaluation_pipeline(
536
556
  overwrite: Re-run even if results exist
537
557
  max_workers: Number of parallel workers
538
558
  max_files: Limit files to process
559
+ predefined_issues: Predefined issues list to skip issue discovery in CLEAR analysis
560
+ full_trace_evaluation_criteria: Custom flat evaluation criteria dict for full trajectory eval
539
561
 
540
562
  Returns:
541
563
  Tuple of (completed_evals, failed_evals)
@@ -634,7 +656,10 @@ def run_trajectory_evaluation_pipeline(
634
656
  failed_evals.append(EVAL_TYPE_TASK_SUCCESS)
635
657
 
636
658
  if EVAL_TYPE_FULL_TRAJECTORY in eval_types:
637
- if run_full_trajectory_evaluation(**eval_kwargs):
659
+ if run_full_trajectory_evaluation(
660
+ **eval_kwargs,
661
+ full_trace_evaluation_criteria=full_trace_evaluation_criteria,
662
+ ):
638
663
  completed_evals.append(EVAL_TYPE_FULL_TRAJECTORY)
639
664
  else:
640
665
  failed_evals.append(EVAL_TYPE_FULL_TRAJECTORY)
@@ -662,6 +687,7 @@ def run_trajectory_evaluation_pipeline(
662
687
  clear_types=clear_types,
663
688
  inference_config=inference_config,
664
689
  overwrite=overwrite,
690
+ predefined_issues=predefined_issues,
665
691
  )
666
692
 
667
693
  # Print summary
@@ -744,6 +770,8 @@ def main():
744
770
  overwrite=config.get('overwrite'),
745
771
  max_workers=config.get('max_workers'),
746
772
  max_files=config.get('max_files'),
773
+ predefined_issues=config.get('predefined_issues'),
774
+ full_trace_evaluation_criteria=config.get('full_trace_evaluation_criteria'),
747
775
  )
748
776
 
749
777
  if failed_evals:
@@ -73,6 +73,9 @@ class TrajectoryEvaluator(ABC):
73
73
  - Parallel execution
74
74
  - Error handling and logging
75
75
 
76
+ Supports optional full_trace_evaluation_criteria for custom evaluation
77
+ dimensions (used by FullTrajectoryEvaluator).
78
+
76
79
  Subclasses implement evaluation-specific logic via abstract methods:
77
80
  - prepare_evaluation_data: Load/prepare evaluation-specific data
78
81
  - prepare_context: Build context dict for prompt
@@ -92,6 +95,7 @@ class TrajectoryEvaluator(ABC):
92
95
  overwrite: bool = False,
93
96
  max_workers: int = 7,
94
97
  max_files: int | None = None,
98
+ full_trace_evaluation_criteria: dict | None = None,
95
99
  ):
96
100
  """
97
101
  Initialize evaluator with common configuration.
@@ -104,6 +108,8 @@ class TrajectoryEvaluator(ABC):
104
108
  overwrite: Whether to overwrite existing evaluation results
105
109
  max_workers: Number of parallel workers
106
110
  max_files: Maximum number of files to process (for testing)
111
+ full_trace_evaluation_criteria: Custom flat evaluation criteria dict
112
+ that replaces all default dimensions when set
107
113
  """
108
114
  self.inference_config = inference_config
109
115
  self.traj_input_dir = Path(traj_input_dir)
@@ -112,6 +118,7 @@ class TrajectoryEvaluator(ABC):
112
118
  self.overwrite = overwrite
113
119
  self.max_workers = max_workers
114
120
  self.max_files = max_files
121
+ self.full_trace_evaluation_criteria = full_trace_evaluation_criteria
115
122
 
116
123
  # Create results directory: output_dir/evaluation_type[/model_subdir]
117
124
  eval_type = self.get_evaluation_type().replace(" ", "_").replace("/", "_")