eval-framework 0.10.4__tar.gz → 0.10.6__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 (172) hide show
  1. {eval_framework-0.10.4 → eval_framework-0.10.6}/PKG-INFO +1 -1
  2. {eval_framework-0.10.4 → eval_framework-0.10.6}/pyproject.toml +3 -3
  3. {eval_framework-0.10.4 → eval_framework-0.10.6}/pyproject.toml.orig +3 -3
  4. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/evaluation_generator.py +1 -17
  5. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/llm/aleph_alpha.py +19 -19
  6. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/llm/huggingface.py +9 -9
  7. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/llm/openai.py +14 -11
  8. eval_framework-0.10.6/src/eval_framework/metrics/efficiency/token_counters.py +38 -0
  9. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/response_generator.py +4 -4
  10. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/shared/types.py +19 -11
  11. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/base.py +43 -8
  12. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/humaneval.py +6 -6
  13. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/humaneval_ellamind.py +13 -21
  14. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/task_names.py +2 -2
  15. {eval_framework-0.10.4 → eval_framework-0.10.6}/LICENSE +0 -0
  16. {eval_framework-0.10.4 → eval_framework-0.10.6}/README.md +0 -0
  17. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/__init__.py +0 -0
  18. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/base_config.py +0 -0
  19. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/context/__init__.py +0 -0
  20. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/context/determined.py +0 -0
  21. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/context/eval.py +0 -0
  22. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/context/local.py +0 -0
  23. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/exceptions.py +0 -0
  24. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/external/drop_process_results.py +0 -0
  25. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/README.md +0 -0
  26. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/instructions.py +0 -0
  27. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/instructions_registry.py +0 -0
  28. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/instructions_util.py +0 -0
  29. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/utils.py +0 -0
  30. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/llm/__init__.py +0 -0
  31. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/llm/base.py +0 -0
  32. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/llm/models.py +0 -0
  33. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/logger.py +0 -0
  34. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/main.py +0 -0
  35. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/__init__.py +0 -0
  36. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/aggregators/__init__.py +0 -0
  37. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/aggregators/aggregators.py +0 -0
  38. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/base.py +0 -0
  39. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/__init__.py +0 -0
  40. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/accuracy_completion.py +0 -0
  41. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/code_assertion.py +0 -0
  42. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/code_execution_pass_at_one.py +0 -0
  43. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/concordance_index.py +0 -0
  44. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/csv_format.py +0 -0
  45. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/drop_completion.py +0 -0
  46. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/exponential_similarity.py +0 -0
  47. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/f1.py +0 -0
  48. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/format_checker.py +0 -0
  49. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/grid_difference.py +0 -0
  50. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/ifeval.py +0 -0
  51. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/json_format.py +0 -0
  52. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/language_checker.py +0 -0
  53. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/length_control.py +0 -0
  54. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/math_minerva_completion.py +0 -0
  55. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/math_reasoning_completion.py +0 -0
  56. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/minerva_math_utils.py +0 -0
  57. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/multipl_e_assertion.py +0 -0
  58. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/placeholder_checker.py +0 -0
  59. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/repetition.py +0 -0
  60. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_1.py +0 -0
  61. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_2.py +0 -0
  62. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_geometric_mean.py +0 -0
  63. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_l.py +0 -0
  64. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/text_counter.py +0 -0
  65. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/efficiency/__init__.py +0 -0
  66. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/efficiency/bytes_per_sequence_position.py +0 -0
  67. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/__init__.py +0 -0
  68. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/base.py +0 -0
  69. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/chatbot_style_grader.py +0 -0
  70. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/coherence_grader.py +0 -0
  71. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/comparison_grader.py +0 -0
  72. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/conciseness_grader.py +0 -0
  73. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/contains_names_grader.py +0 -0
  74. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/format_correctness_grader.py +0 -0
  75. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/instruction_grader.py +0 -0
  76. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/language.py +0 -0
  77. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/long_context_grader.py +0 -0
  78. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/models.py +0 -0
  79. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/refusal_grader.py +0 -0
  80. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/sql_quality_grader.py +0 -0
  81. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/summary_world_knowledge_grader.py +0 -0
  82. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_chatbot_style.py +0 -0
  83. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_coherence.py +0 -0
  84. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_completion_accuracy.py +0 -0
  85. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_conciseness.py +0 -0
  86. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_contains_names.py +0 -0
  87. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_format_correctness.py +0 -0
  88. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_instruction.py +0 -0
  89. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_mtbench_pair.py +0 -0
  90. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_mtbench_single.py +0 -0
  91. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_refusal.py +0 -0
  92. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_sql.py +0 -0
  93. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_world_knowledge.py +0 -0
  94. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/utils.py +0 -0
  95. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/__init__.py +0 -0
  96. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/accuracy_loglikelihood.py +0 -0
  97. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/base.py +0 -0
  98. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/bits_per_byte.py +0 -0
  99. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/confidence_weighted_accuracy.py +0 -0
  100. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/dcs.py +0 -0
  101. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/probability_mass.py +0 -0
  102. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/ternary.py +0 -0
  103. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/py.typed +0 -0
  104. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/result_processors/__init__.py +0 -0
  105. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/result_processors/base.py +0 -0
  106. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/result_processors/hf_uploader.py +0 -0
  107. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/result_processors/result_processor.py +0 -0
  108. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/result_processors/wandb_uploader.py +0 -0
  109. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/run.py +0 -0
  110. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/run_direct.py +0 -0
  111. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/suite.py +0 -0
  112. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/Dockerfile_codebench +0 -0
  113. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/__init__.py +0 -0
  114. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/__init__.py +0 -0
  115. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/arc.py +0 -0
  116. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/arc_de.py +0 -0
  117. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/arc_ellamind.py +0 -0
  118. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/bigcodebench.py +0 -0
  119. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/copa.py +0 -0
  120. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/csqa.py +0 -0
  121. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/csqa_ellamind.py +0 -0
  122. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/drop.py +0 -0
  123. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/global_mmlu.py +0 -0
  124. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/goldenswag.py +0 -0
  125. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gpqa.py +0 -0
  126. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gpqa_ellamind.py +0 -0
  127. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gsm8k.py +0 -0
  128. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gsm8k_ellamind.py +0 -0
  129. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hellaswag.py +0 -0
  130. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hellaswag_ellamind.py +0 -0
  131. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hendrycks_math_ellamind.py +0 -0
  132. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hle_ellamind.py +0 -0
  133. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/ifeval.py +0 -0
  134. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/math_reasoning.py +0 -0
  135. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mbpp.py +0 -0
  136. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mbpp_ellamind.py +0 -0
  137. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/medqa.py +0 -0
  138. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mmlu.py +0 -0
  139. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mmlu_pro.py +0 -0
  140. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/multipl_e.py +0 -0
  141. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/naturalqs_open.py +0 -0
  142. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/piqa.py +0 -0
  143. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/piqa_ellamind.py +0 -0
  144. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/sciq.py +0 -0
  145. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/simpleqa_ellamind.py +0 -0
  146. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/siqa_ellamind.py +0 -0
  147. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/social_iqa.py +0 -0
  148. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/squad.py +0 -0
  149. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/winogrande.py +0 -0
  150. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/winogrande_ellamind.py +0 -0
  151. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/dataset_revisions.py +0 -0
  152. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/eval_config.py +0 -0
  153. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/frozen-hf-dataset-revisions.json +0 -0
  154. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/hf-dataset-revisions.json +0 -0
  155. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/lazy.py +0 -0
  156. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/markdown_doc.py +0 -0
  157. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/registry.py +0 -0
  158. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/task.py +0 -0
  159. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/task_loader.py +0 -0
  160. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/task_style.py +0 -0
  161. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/tasks/utils.py +0 -0
  162. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/utils/constants.py +0 -0
  163. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/utils/file_ops.py +0 -0
  164. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/utils/helpers.py +0 -0
  165. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/utils/logging.py +0 -0
  166. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/utils/packaging.py +0 -0
  167. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/eval_framework/utils/tqdm_handler.py +0 -0
  168. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/template_formatting/README.md +0 -0
  169. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/template_formatting/__init__.py +0 -0
  170. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/template_formatting/formatter.py +0 -0
  171. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/template_formatting/mistral_formatter.py +0 -0
  172. {eval_framework-0.10.4 → eval_framework-0.10.6}/src/template_formatting/py.typed +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: eval-framework
3
- Version: 0.10.4
3
+ Version: 0.10.6
4
4
  Summary: Evaluation Framework
5
5
  Author: Aleph Alpha Research
6
6
  License: Apache License
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "eval-framework"
3
- version = "0.10.4"
3
+ version = "0.10.6"
4
4
  description = "Evaluation Framework"
5
5
  readme = "README.md"
6
6
  requires-python = ">=3.12,<3.15"
@@ -78,12 +78,12 @@ eval_framework = "eval_framework.run:run"
78
78
 
79
79
  [dependency-groups]
80
80
  dev = [
81
- "mypy>=2.3.0,<3",
81
+ "mypy>=2.3.1,<3",
82
82
  "pytest>=9.1.1,<10",
83
83
  "pytest-mock>=3.15.1",
84
84
  "pytest-xdist>=3.8.0,<4",
85
85
  "pytest-sugar>1.1,<2",
86
- "types-pyyaml>=6.0.12.20260724,<7",
86
+ "types-pyyaml>=6.0.12.20260815,<7",
87
87
  "types-python-dateutil>=2.9.0.20260807,<3",
88
88
  "types-requests>=2.33.0.20260712,<3",
89
89
  "plotly>=6.9.0,<7",
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "eval-framework"
3
- version = "0.10.4"
3
+ version = "0.10.6"
4
4
  description = "Evaluation Framework"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -84,12 +84,12 @@ eval_framework = "eval_framework.run:run"
84
84
 
85
85
  [dependency-groups]
86
86
  dev = [
87
- "mypy>=2.3.0,<3",
87
+ "mypy>=2.3.1,<3",
88
88
  "pytest>=9.1.1,<10",
89
89
  "pytest-mock>=3.15.1",
90
90
  "pytest-xdist>=3.8.0,<4",
91
91
  "pytest-sugar>1.1,<2",
92
- "types-pyyaml>=6.0.12.20260724,<7",
92
+ "types-pyyaml>=6.0.12.20260815,<7",
93
93
  "types-python-dateutil>=2.9.0.20260807,<3",
94
94
  "types-requests>=2.33.0.20260712,<3",
95
95
  "plotly>=6.9.0,<7",
@@ -7,16 +7,9 @@ import wandb
7
7
  from tqdm import tqdm
8
8
 
9
9
  from eval_framework.metrics.base import BaseMetric
10
- from eval_framework.metrics.efficiency.bytes_per_sequence_position import (
11
- BytesCompletion,
12
- BytesLoglikelihood,
13
- SequencePositionsCompletion,
14
- SequencePositionsLoglikelihood,
15
- )
16
10
  from eval_framework.metrics.llm.base import BaseLLMJudgeMetric
17
11
  from eval_framework.result_processors.base import Result, ResultProcessor
18
12
  from eval_framework.shared.types import Completion, Loglikelihood
19
- from eval_framework.tasks.base import ResponseType
20
13
  from eval_framework.tasks.eval_config import EvalConfig
21
14
  from eval_framework.tasks.registry import registry
22
15
  from eval_framework.utils.constants import RED, RESET
@@ -37,16 +30,7 @@ class EvaluationGenerator:
37
30
  self.save_intermediate_results = config.save_intermediate_results
38
31
 
39
32
  eval_ = registry()[config.task_name]
40
- response_type = eval_.response_type()
41
- task_metrics = eval_.metrics()
42
-
43
- if response_type == ResponseType.COMPLETION:
44
- self.metrics = task_metrics + [BytesCompletion, SequencePositionsCompletion]
45
- elif response_type == ResponseType.LOGLIKELIHOODS:
46
- self.metrics = task_metrics + [BytesLoglikelihood, SequencePositionsLoglikelihood]
47
- else:
48
- raise NotImplementedError
49
-
33
+ self.metrics = eval_.metrics()
50
34
  self.task_name = eval_.display_name()
51
35
 
52
36
  def _run_metric_calculators(self, responses: list[Completion | Loglikelihood]) -> list[Result]:
@@ -165,33 +165,33 @@ class AlephAlphaAPIModel(BaseLLM):
165
165
  if isinstance(response, Error):
166
166
  return RawCompletion(
167
167
  prompt=prompt,
168
- prompt_sequence_positions=None,
168
+ prompt_num_tokens=None,
169
169
  completion="",
170
- completion_sequence_positions=0,
170
+ completion_num_tokens=0,
171
171
  raw_completion_error=response,
172
172
  )
173
173
 
174
174
  assert len(response.completions) == 1
175
175
  completion = response.completions[0].completion or ""
176
- prompt_sequence_positions: int | None = None
177
- completion_sequence_positions: int | None = None
176
+ prompt_num_tokens: int | None = None
177
+ completion_num_tokens: int | None = None
178
178
 
179
179
  # Support workaround in api-worker-transformer's scaling generator to return the correct number of tokens.
180
180
  # These are part of the completion string; those in CompletionResponse are invalid in this case.
181
181
  m = re.match(r"\uf8c9(\d+),(\d+)\uf8c9(.*)", completion, re.DOTALL)
182
182
  if m is not None:
183
183
  num_input_tokens, num_completion_tokens, completion = m.groups()
184
- prompt_sequence_positions = int(num_input_tokens)
185
- completion_sequence_positions = int(num_completion_tokens)
184
+ prompt_num_tokens = int(num_input_tokens)
185
+ completion_num_tokens = int(num_completion_tokens)
186
186
  else:
187
- prompt_sequence_positions = response.num_tokens_prompt_total if response else None
188
- completion_sequence_positions = response.num_tokens_generated if response else None
187
+ prompt_num_tokens = response.num_tokens_prompt_total if response else None
188
+ completion_num_tokens = response.num_tokens_generated if response else None
189
189
 
190
190
  return RawCompletion(
191
191
  prompt=prompt,
192
- prompt_sequence_positions=prompt_sequence_positions,
192
+ prompt_num_tokens=prompt_num_tokens,
193
193
  completion=completion,
194
- completion_sequence_positions=completion_sequence_positions,
194
+ completion_num_tokens=completion_num_tokens,
195
195
  )
196
196
 
197
197
  def generate_from_messages(
@@ -254,8 +254,8 @@ class AlephAlphaAPIModel(BaseLLM):
254
254
  results: list[RawLoglikelihood] = []
255
255
  for sample_idx, (sample, prompt) in enumerate(zip(samples, prompts, strict=True)):
256
256
  choices_log_probs: dict[str, float] = {}
257
- choices_sequence_positions: dict[str, int] = {}
258
- prompt_sequence_positions: int | None = 0
257
+ choices_num_tokens: dict[str, int] = {}
258
+ prompt_num_tokens: int | None = 0
259
259
  number_of_initial_choices_tokens: int | None = None
260
260
  error: Error | None = None
261
261
 
@@ -267,9 +267,9 @@ class AlephAlphaAPIModel(BaseLLM):
267
267
 
268
268
  if isinstance(response, Error):
269
269
  error = response
270
- prompt_sequence_positions = None
270
+ prompt_num_tokens = None
271
271
  choices_log_probs = {}
272
- choices_sequence_positions = {}
272
+ choices_num_tokens = {}
273
273
  else:
274
274
  try:
275
275
  logprob, choice_token_count = self._extract_choice_logprob_from_completion(
@@ -278,7 +278,7 @@ class AlephAlphaAPIModel(BaseLLM):
278
278
  response=response,
279
279
  )
280
280
  choices_log_probs[choice] = logprob
281
- choices_sequence_positions[choice] = choice_token_count
281
+ choices_num_tokens[choice] = choice_token_count
282
282
  if number_of_initial_choices_tokens is None:
283
283
  number_of_initial_choices_tokens = choice_token_count
284
284
 
@@ -294,16 +294,16 @@ class AlephAlphaAPIModel(BaseLLM):
294
294
  message=str(exc),
295
295
  traceback=traceback.format_exc(),
296
296
  )
297
- prompt_sequence_positions = None
297
+ prompt_num_tokens = None
298
298
  choices_log_probs = {}
299
- choices_sequence_positions = {}
299
+ choices_num_tokens = {}
300
300
 
301
301
  results.append(
302
302
  RawLoglikelihood(
303
303
  prompt=prompt,
304
- prompt_sequence_positions=prompt_sequence_positions,
304
+ prompt_num_tokens=prompt_num_tokens,
305
305
  loglikelihoods=choices_log_probs,
306
- loglikelihoods_sequence_positions=choices_sequence_positions,
306
+ loglikelihoods_num_tokens=choices_num_tokens,
307
307
  raw_loglikelihood_error=error,
308
308
  )
309
309
  )
@@ -196,9 +196,9 @@ class BaseHFLLM(BaseLLM):
196
196
  raw_completions.append(
197
197
  RawCompletion(
198
198
  prompt=prompt,
199
- prompt_sequence_positions=prompt_token_count,
199
+ prompt_num_tokens=prompt_token_count,
200
200
  completion="",
201
- completion_sequence_positions=0,
201
+ completion_num_tokens=0,
202
202
  raw_completion_error=Error(
203
203
  error_class=PromptTooLongException.__name__,
204
204
  message="Prompt exceeded context size.",
@@ -225,12 +225,12 @@ class BaseHFLLM(BaseLLM):
225
225
  raw_completions.append(
226
226
  RawCompletion(
227
227
  prompt=prompt,
228
- prompt_sequence_positions=prompt_token_count,
228
+ prompt_num_tokens=prompt_token_count,
229
229
  concat_compression=ConcatCompression.calculate(
230
230
  single_messages, count_tokens=self.count_tokens, completion=completion
231
231
  ),
232
232
  completion=completion,
233
- completion_sequence_positions=completion_token_count,
233
+ completion_num_tokens=completion_token_count,
234
234
  )
235
235
  )
236
236
  return raw_completions
@@ -251,7 +251,7 @@ class BaseHFLLM(BaseLLM):
251
251
  # format
252
252
  prompt = self._formatter.format(sample.messages, output_mode="string")
253
253
  choices_log_probs: dict[str, float] = {}
254
- choices_log_probs_sequence_positions: dict[str, float] = {}
254
+ choices_log_probs_num_tokens: dict[str, float] = {}
255
255
  error: Error | None = None
256
256
 
257
257
  for choice in sample.possible_completions or []:
@@ -266,7 +266,7 @@ class BaseHFLLM(BaseLLM):
266
266
  if raise_errors():
267
267
  raise PromptTooLongException("Prompt exceeded context size.")
268
268
  choices_log_probs = {}
269
- choices_log_probs_sequence_positions = {}
269
+ choices_log_probs_num_tokens = {}
270
270
  error = Error(
271
271
  error_class=PromptTooLongException.__name__,
272
272
  message="Prompt and choice exceeded context size.",
@@ -278,17 +278,17 @@ class BaseHFLLM(BaseLLM):
278
278
  sum_log_probs = self._model_log_probs(prompt_and_choice, num_choice_tokens)
279
279
 
280
280
  choices_log_probs.update({choice: sum_log_probs})
281
- choices_log_probs_sequence_positions.update({choice: num_choice_tokens})
281
+ choices_log_probs_num_tokens.update({choice: num_choice_tokens})
282
282
 
283
283
  results.append(
284
284
  RawLoglikelihood(
285
285
  prompt=prompt,
286
- prompt_sequence_positions=len(self.tokenizer.encode(prompt, add_special_tokens=False)),
286
+ prompt_num_tokens=len(self.tokenizer.encode(prompt, add_special_tokens=False)),
287
287
  concat_compression=ConcatCompression.calculate(
288
288
  sample.messages, count_tokens=self.count_tokens, choices=sample.possible_completions
289
289
  ),
290
290
  loglikelihoods=choices_log_probs,
291
- loglikelihoods_sequence_positions=choices_log_probs_sequence_positions,
291
+ loglikelihoods_num_tokens=choices_log_probs_num_tokens,
292
292
  raw_loglikelihood_error=error,
293
293
  )
294
294
  )
@@ -186,7 +186,7 @@ class OpenAIModel(BaseLLM):
186
186
  completion_tokens = getattr(usage, "completion_tokens", None) if usage is not None else None
187
187
  return RawCompletion(
188
188
  prompt=prompt,
189
- prompt_sequence_positions=(
189
+ prompt_num_tokens=(
190
190
  prompt_tokens
191
191
  if prompt_tokens is not None
192
192
  else (self._count_tokens(prompt) if self._encoder is not None else None)
@@ -201,7 +201,7 @@ class OpenAIModel(BaseLLM):
201
201
  else None
202
202
  ),
203
203
  completion=completion,
204
- completion_sequence_positions=(
204
+ completion_num_tokens=(
205
205
  completion_tokens
206
206
  if completion_tokens is not None
207
207
  else (self._count_tokens(completion) if self._encoder is not None else None)
@@ -223,10 +223,12 @@ class OpenAIModel(BaseLLM):
223
223
  prompt = "\n".join([f"{m.get('role', '')}: {m.get('content', '')}" for m in chat_messages])
224
224
  prompt_tokens = getattr(chat_response.usage, "prompt_tokens", None)
225
225
  completion_tokens = getattr(chat_response.usage, "completion_tokens", None)
226
+ completion_details = getattr(chat_response.usage, "completion_tokens_details", None)
227
+ reasoning_tokens = getattr(completion_details, "reasoning_tokens", None)
226
228
  completion = chat_response.choices[0].message.content or ""
227
229
  return RawCompletion(
228
230
  prompt=prompt,
229
- prompt_sequence_positions=prompt_tokens,
231
+ prompt_num_tokens=prompt_tokens,
230
232
  concat_compression=(
231
233
  ConcatCompression.calculate(
232
234
  single_messages,
@@ -237,11 +239,12 @@ class OpenAIModel(BaseLLM):
237
239
  else None
238
240
  ),
239
241
  completion=completion,
240
- completion_sequence_positions=(
242
+ completion_num_tokens=(
241
243
  completion_tokens
242
244
  if completion_tokens is not None
243
245
  else (self._count_tokens(completion) if self._encoder is not None else None)
244
246
  ),
247
+ reasoning_num_tokens=reasoning_tokens,
245
248
  )
246
249
 
247
250
  with concurrent.futures.ThreadPoolExecutor() as executor:
@@ -276,8 +279,8 @@ class OpenAIModel(BaseLLM):
276
279
  for sample in samples:
277
280
  prompt = self._formatter.format(sample.messages, output_mode="string") if sample.messages else ""
278
281
  choices_log_probs: dict[str, float] = {}
279
- choices_sequence_positions: dict[str, int] = {}
280
- prompt_sequence_positions: int | None = self._count_tokens(prompt)
282
+ choices_num_tokens: dict[str, int] = {}
283
+ prompt_num_tokens: int | None = self._count_tokens(prompt)
281
284
  error: Error | None = None
282
285
 
283
286
  for choice in sample.possible_completions or []:
@@ -317,20 +320,20 @@ class OpenAIModel(BaseLLM):
317
320
 
318
321
  # Sum logprobs for the completion portion
319
322
  choices_log_probs[choice] = sum(all_logprobs[len(prompt_tokens) :])
320
- choices_sequence_positions[choice] = len(completion_tokens)
323
+ choices_num_tokens[choice] = len(completion_tokens)
321
324
 
322
325
  except Exception as e:
323
326
  error = Error(error_class=e.__class__.__name__, message=str(e), traceback=traceback.format_exc())
324
- prompt_sequence_positions = None
327
+ prompt_num_tokens = None
325
328
  choices_log_probs = {}
326
- choices_sequence_positions = {}
329
+ choices_num_tokens = {}
327
330
 
328
331
  results.append(
329
332
  RawLoglikelihood(
330
333
  prompt=prompt,
331
- prompt_sequence_positions=prompt_sequence_positions,
334
+ prompt_num_tokens=prompt_num_tokens,
332
335
  loglikelihoods=choices_log_probs,
333
- loglikelihoods_sequence_positions=choices_sequence_positions,
336
+ loglikelihoods_num_tokens=choices_num_tokens,
334
337
  raw_loglikelihood_error=error,
335
338
  )
336
339
  )
@@ -0,0 +1,38 @@
1
+ from eval_framework.metrics.base import BaseMetric, MetricResult
2
+ from eval_framework.shared.types import Completion
3
+
4
+
5
+ class TokenCounts(BaseMetric[Completion]):
6
+ """Number of tokens the model generated for the completion, and how many of
7
+ those were spent on reasoning (thinking).
8
+
9
+ Reads the token counts backends already attach to the response, so no extra
10
+ tokenisation is performed. Each value independently falls back to None when
11
+ the backend did not report that particular count or when the sample errored.
12
+ Reasoning counts are only exposed by some backends (e.g. OpenAI reasoning
13
+ models via `usage.completion_tokens_details.reasoning_tokens`, or vLLM
14
+ started with `--reasoning-parser`); non-reasoning models and backends that
15
+ do not surface a per-response count return None for that key.
16
+ """
17
+
18
+ NAME = "TokenCounts"
19
+ KEYS = ["Completion", "Reasoning"]
20
+
21
+ def calculate(self, response: Completion) -> list[MetricResult]:
22
+ if response.error:
23
+ values: dict[str, float | None] = {"Completion": None, "Reasoning": None}
24
+ else:
25
+ values = {
26
+ "Completion": response.raw_completion_num_tokens,
27
+ "Reasoning": response.raw_completion_reasoning_num_tokens,
28
+ }
29
+
30
+ return [
31
+ MetricResult(
32
+ metric_name=f"{self.NAME}/{key}",
33
+ value=value,
34
+ higher_is_better=False,
35
+ error=response.error,
36
+ )
37
+ for key, value in values.items()
38
+ ]
@@ -110,9 +110,9 @@ class ResponseGenerator:
110
110
  raw_loglikelihoods = [
111
111
  RawLoglikelihood(
112
112
  prompt="",
113
- prompt_sequence_positions=0,
113
+ prompt_num_tokens=0,
114
114
  loglikelihoods={},
115
- loglikelihoods_sequence_positions={},
115
+ loglikelihoods_num_tokens={},
116
116
  raw_loglikelihood_error=Error(
117
117
  error_class=e.__class__.__name__,
118
118
  message=str(e),
@@ -132,10 +132,10 @@ class ResponseGenerator:
132
132
  subject=sample.subject,
133
133
  ground_truth=sample.ground_truth,
134
134
  prompt=raw_loglikelihood.prompt,
135
- prompt_sequence_positions=raw_loglikelihood.prompt_sequence_positions,
135
+ prompt_num_tokens=raw_loglikelihood.prompt_num_tokens,
136
136
  concat_compression=raw_loglikelihood.concat_compression,
137
137
  loglikelihoods=raw_loglikelihood.loglikelihoods,
138
- loglikelihoods_sequence_positions=raw_loglikelihood.loglikelihoods_sequence_positions,
138
+ loglikelihoods_num_tokens=raw_loglikelihood.loglikelihoods_num_tokens,
139
139
  error=raw_loglikelihood.raw_loglikelihood_error,
140
140
  )
141
141
  )
@@ -78,21 +78,25 @@ class PromptTooLongException(Exception):
78
78
  class BaseCompletion(BaseModel):
79
79
  model_config = ConfigDict(extra="forbid")
80
80
  prompt: Annotated[str, "prompt as passed to the llm"]
81
- prompt_sequence_positions: Annotated[
81
+ prompt_num_tokens: Annotated[
82
82
  int | None,
83
- "number of sequence positions that the prompt occupies in the llm architecture (e.g. token count) "
84
- "or None if the info is not available",
83
+ "number of tokens in the prompt, or None if the backend did not report it",
85
84
  ]
86
85
  completion: Annotated[str, "completion as generated by the llm"]
87
86
  concat_compression: Annotated[ConcatCompression | None, "Compression info for the concat formatter."] = None
88
87
 
89
88
 
90
89
  class RawCompletion(BaseCompletion):
91
- completion_sequence_positions: Annotated[
90
+ completion_num_tokens: Annotated[
92
91
  int | None,
93
- "number of sequence positions that the completion occupies in the llm architecture "
94
- "(e.g. token count) or None if the info is not available",
92
+ "number of tokens the model generated for the completion, or None if the backend did not report it",
95
93
  ]
94
+ reasoning_num_tokens: Annotated[
95
+ int | None,
96
+ "portion of completion_num_tokens that the model spent on reasoning (thinking), "
97
+ "or None if the backend did not report it. Non-reasoning models and backends that "
98
+ "do not surface a reasoning-token count leave this None.",
99
+ ] = None
96
100
  raw_completion_error: Error | None = None
97
101
 
98
102
 
@@ -102,11 +106,15 @@ class Completion(BaseCompletion):
102
106
  ground_truth: str | None | list[str]
103
107
  messages: list[Message] | None # needed for LLM as a judge
104
108
  raw_completion: Annotated[str, "raw completion as generated by the llm"]
105
- raw_completion_sequence_positions: Annotated[
109
+ raw_completion_num_tokens: Annotated[
106
110
  int | None,
107
- "number of sequence positions that the completion occupies in the llm architecture or None "
108
- "if the info is not available",
111
+ "number of tokens the model generated for the raw completion, or None if the backend did not report it",
109
112
  ]
113
+ raw_completion_reasoning_num_tokens: Annotated[
114
+ int | None,
115
+ "portion of raw_completion_num_tokens that the model spent on reasoning, or None if the "
116
+ "backend did not report it",
117
+ ] = None
110
118
  context: list[BaseMetricContext] | BaseMetricContext | None = None
111
119
  error: Error | None = None
112
120
 
@@ -183,9 +191,9 @@ class Completion(BaseCompletion):
183
191
  class BaseLoglikelihood(BaseModel):
184
192
  model_config = ConfigDict(extra="forbid")
185
193
  prompt: str
186
- prompt_sequence_positions: int | None
194
+ prompt_num_tokens: int | None
187
195
  loglikelihoods: dict[str, float]
188
- loglikelihoods_sequence_positions: dict[str, int] # Is empty if the model does not provide sequence positions
196
+ loglikelihoods_num_tokens: dict[str, int] # Is empty if the model does not report per-choice token counts
189
197
  concat_compression: Annotated[ConcatCompression | None, "Compression info for the concat formatter"] = None
190
198
 
191
199
 
@@ -2,6 +2,7 @@ import logging
2
2
  import os
3
3
  import random
4
4
  import traceback
5
+ import typing
5
6
  from collections.abc import Iterable, Sequence
6
7
  from enum import Enum
7
8
  from pathlib import Path
@@ -10,6 +11,13 @@ from typing import TYPE_CHECKING, Any, Self, TypeVar
10
11
  import iso639
11
12
  from datasets import DatasetDict, DownloadConfig, load_dataset
12
13
 
14
+ from eval_framework.metrics.efficiency.bytes_per_sequence_position import (
15
+ BytesCompletion,
16
+ BytesLoglikelihood,
17
+ SequencePositionsCompletion,
18
+ SequencePositionsLoglikelihood,
19
+ )
20
+ from eval_framework.metrics.efficiency.token_counters import TokenCounts
13
21
  from eval_framework.shared.types import BaseMetricContext, Completion, Error, RawCompletion
14
22
  from eval_framework.tasks.dataset_revisions import pinned_revision
15
23
  from eval_framework.tasks.markdown_doc import markdown_doc as render_markdown_doc
@@ -340,7 +348,7 @@ class BaseTask[SubjectType](Task):
340
348
  "sample_split": self.SAMPLE_SPLIT,
341
349
  "fewshot_split": self.FEWSHOT_SPLIT,
342
350
  "response_type": self.get_response_type().value,
343
- "metrics": [m.NAME for m in self.get_metrics()],
351
+ "metrics": [m.NAME for m in self._get_task_specific_metrics()],
344
352
  "subjects": [str(s) for s in self.SUBJECTS],
345
353
  }
346
354
  if hasattr(self, "TASK_STYLER"):
@@ -377,9 +385,9 @@ class BaseTask[SubjectType](Task):
377
385
  raw_completions = [
378
386
  RawCompletion(
379
387
  prompt="",
380
- prompt_sequence_positions=0,
388
+ prompt_num_tokens=0,
381
389
  completion="",
382
- completion_sequence_positions=0,
390
+ completion_num_tokens=0,
383
391
  raw_completion_error=Error(
384
392
  error_class=e.__class__.__name__, message=str(e), traceback=traceback.format_exc()
385
393
  ),
@@ -414,12 +422,13 @@ class BaseTask[SubjectType](Task):
414
422
  subject=sample.subject,
415
423
  ground_truth=sample.ground_truth,
416
424
  prompt=raw_completion.prompt,
417
- prompt_sequence_positions=raw_completion.prompt_sequence_positions,
425
+ prompt_num_tokens=raw_completion.prompt_num_tokens,
418
426
  concat_compression=raw_completion.concat_compression,
419
427
  messages=messages,
420
428
  completion=completion,
421
429
  raw_completion=raw_completion.completion,
422
- raw_completion_sequence_positions=raw_completion.completion_sequence_positions,
430
+ raw_completion_num_tokens=raw_completion.completion_num_tokens,
431
+ raw_completion_reasoning_num_tokens=raw_completion.reasoning_num_tokens,
423
432
  context=sample.context,
424
433
  error=raw_completion.raw_completion_error or error,
425
434
  )
@@ -433,12 +442,38 @@ class BaseTask[SubjectType](Task):
433
442
  return cls.TASK_STYLER.response_type
434
443
  return cls.RESPONSE_TYPE
435
444
 
445
+ @classmethod
446
+ def _get_task_specific_metrics(cls) -> list[type["BaseMetric"]]:
447
+ if hasattr(cls, "TASK_STYLER"):
448
+ task_metrics = cls.TASK_STYLER.metrics
449
+ else:
450
+ task_metrics = cls.METRICS
451
+ return task_metrics
452
+
453
+ @classmethod
454
+ def _get_response_type_specific_metrics(cls) -> list[type["BaseMetric"]]:
455
+ metrics: list[type[BaseMetric]]
456
+ match cls.get_response_type():
457
+ case ResponseType.COMPLETION:
458
+ metrics = [
459
+ BytesCompletion,
460
+ SequencePositionsCompletion,
461
+ TokenCounts,
462
+ ]
463
+ case ResponseType.LOGLIKELIHOODS:
464
+ metrics = [BytesLoglikelihood, SequencePositionsLoglikelihood]
465
+ case _:
466
+ typing.assert_never(cls.get_response_type())
467
+
468
+ return metrics
469
+
436
470
  @classmethod
437
471
  def get_metrics(cls) -> list[type["BaseMetric"]]:
438
472
  """Return the metrics of the task (or the styler if it exists)."""
439
- if hasattr(cls, "TASK_STYLER"):
440
- return cls.TASK_STYLER.metrics
441
- return cls.METRICS
473
+ task_metrics = cls._get_task_specific_metrics()
474
+ response_type_metrics = cls._get_response_type_specific_metrics()
475
+
476
+ return task_metrics + response_type_metrics
442
477
 
443
478
  @classproperty
444
479
  def RESPONSE_TYPE(cls) -> ResponseType:
@@ -114,7 +114,7 @@ class HumanEvalBPB_V2(HumanEvalBPB):
114
114
  NAME = "Human Eval BPB V2"
115
115
 
116
116
  def _get_ground_truth(self, item: dict[str, Any]) -> str | None:
117
- return item["canonical_solution"]
117
+ return item["canonical_solution"].rstrip() + "\n```"
118
118
 
119
119
  def _get_instruction_text(self, item: dict[str, Any]) -> str:
120
120
  return "```python\n" + item["prompt"].rstrip() + "\n"
@@ -141,10 +141,10 @@ class HumanEval_OLMES(HumanEval):
141
141
  self.max_tokens = 1024
142
142
 
143
143
  def _get_instruction_text(self, item: dict[str, Any]) -> str:
144
- return "```python\n" + item["prompt"].rstrip()
144
+ return "```python\n" + item["prompt"]
145
145
 
146
146
  def _get_fewshot_target_text(self, item: dict[str, Any]) -> str:
147
- return "\n" + item["canonical_solution"] + "```"
147
+ return item["canonical_solution"] + "```"
148
148
 
149
149
 
150
150
  class HumanEvalInstruct(HumanEval):
@@ -168,11 +168,11 @@ class HumanEvalInstruct(HumanEval):
168
168
  return self.CUE_PREFIX + item["prompt"].lstrip()
169
169
 
170
170
 
171
- class HumanEval_NL(HumanEval_OLMES):
172
- NAME = "Human Eval Newline OLMES"
171
+ class HumanEval_OLMES_V2(HumanEval_OLMES):
172
+ NAME = "Human Eval Olmes v2"
173
173
 
174
174
  def _get_instruction_text(self, item: dict[str, Any]) -> str:
175
175
  return "```python\n" + item["prompt"].rstrip() + "\n"
176
176
 
177
177
  def _get_fewshot_target_text(self, item: dict[str, Any]) -> str:
178
- return item["canonical_solution"].lstrip("\n") + "```"
178
+ return item["canonical_solution"].rstrip() + "\n```"