eval-framework 0.10.0__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 (173) hide show
  1. {eval_framework-0.10.0 → eval_framework-0.10.6}/PKG-INFO +5 -7
  2. {eval_framework-0.10.0 → eval_framework-0.10.6}/README.md +0 -2
  3. eval_framework-0.10.6/pyproject.toml +162 -0
  4. eval_framework-0.10.0/pyproject.toml → eval_framework-0.10.6/pyproject.toml.orig +9 -9
  5. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/evaluation_generator.py +1 -17
  6. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/aleph_alpha.py +19 -19
  7. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/huggingface.py +9 -9
  8. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/openai.py +14 -11
  9. eval_framework-0.10.6/src/eval_framework/metrics/efficiency/token_counters.py +38 -0
  10. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/response_generator.py +4 -4
  11. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/shared/types.py +19 -11
  12. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/base.py +93 -56
  13. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/humaneval.py +29 -0
  14. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/humaneval_ellamind.py +30 -1
  15. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/eval_config.py +1 -3
  16. eval_framework-0.10.6/src/eval_framework/tasks/lazy.py +56 -0
  17. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/markdown_doc.py +0 -3
  18. eval_framework-0.10.6/src/eval_framework/tasks/registry.py +164 -0
  19. eval_framework-0.10.6/src/eval_framework/tasks/task.py +104 -0
  20. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/task_names.py +4 -0
  21. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/template_formatting/formatter.py +8 -6
  22. eval_framework-0.10.0/src/eval_framework/tasks/registry.py +0 -310
  23. {eval_framework-0.10.0 → eval_framework-0.10.6}/LICENSE +0 -0
  24. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/__init__.py +0 -0
  25. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/base_config.py +0 -0
  26. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/context/__init__.py +0 -0
  27. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/context/determined.py +0 -0
  28. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/context/eval.py +0 -0
  29. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/context/local.py +0 -0
  30. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/exceptions.py +0 -0
  31. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/drop_process_results.py +0 -0
  32. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/README.md +0 -0
  33. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/instructions.py +0 -0
  34. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/instructions_registry.py +0 -0
  35. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/instructions_util.py +0 -0
  36. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/utils.py +0 -0
  37. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/__init__.py +0 -0
  38. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/base.py +0 -0
  39. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/models.py +0 -0
  40. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/logger.py +0 -0
  41. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/main.py +0 -0
  42. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/__init__.py +0 -0
  43. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/aggregators/__init__.py +0 -0
  44. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/aggregators/aggregators.py +0 -0
  45. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/base.py +0 -0
  46. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/__init__.py +0 -0
  47. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/accuracy_completion.py +0 -0
  48. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/code_assertion.py +0 -0
  49. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/code_execution_pass_at_one.py +0 -0
  50. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/concordance_index.py +0 -0
  51. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/csv_format.py +0 -0
  52. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/drop_completion.py +0 -0
  53. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/exponential_similarity.py +0 -0
  54. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/f1.py +0 -0
  55. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/format_checker.py +0 -0
  56. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/grid_difference.py +0 -0
  57. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/ifeval.py +0 -0
  58. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/json_format.py +0 -0
  59. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/language_checker.py +0 -0
  60. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/length_control.py +0 -0
  61. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/math_minerva_completion.py +0 -0
  62. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/math_reasoning_completion.py +0 -0
  63. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/minerva_math_utils.py +0 -0
  64. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/multipl_e_assertion.py +0 -0
  65. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/placeholder_checker.py +0 -0
  66. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/repetition.py +0 -0
  67. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_1.py +0 -0
  68. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_2.py +0 -0
  69. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_geometric_mean.py +0 -0
  70. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_l.py +0 -0
  71. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/text_counter.py +0 -0
  72. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/efficiency/__init__.py +0 -0
  73. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/efficiency/bytes_per_sequence_position.py +0 -0
  74. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/__init__.py +0 -0
  75. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/base.py +0 -0
  76. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/chatbot_style_grader.py +0 -0
  77. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/coherence_grader.py +0 -0
  78. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/comparison_grader.py +0 -0
  79. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/conciseness_grader.py +0 -0
  80. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/contains_names_grader.py +0 -0
  81. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/format_correctness_grader.py +0 -0
  82. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/instruction_grader.py +0 -0
  83. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/language.py +0 -0
  84. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/long_context_grader.py +0 -0
  85. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/models.py +0 -0
  86. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/refusal_grader.py +0 -0
  87. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/sql_quality_grader.py +0 -0
  88. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/summary_world_knowledge_grader.py +0 -0
  89. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_chatbot_style.py +0 -0
  90. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_coherence.py +0 -0
  91. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_completion_accuracy.py +0 -0
  92. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_conciseness.py +0 -0
  93. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_contains_names.py +0 -0
  94. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_format_correctness.py +0 -0
  95. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_instruction.py +0 -0
  96. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_mtbench_pair.py +0 -0
  97. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_mtbench_single.py +0 -0
  98. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_refusal.py +0 -0
  99. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_sql.py +0 -0
  100. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_world_knowledge.py +0 -0
  101. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/utils.py +0 -0
  102. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/__init__.py +0 -0
  103. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/accuracy_loglikelihood.py +0 -0
  104. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/base.py +0 -0
  105. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/bits_per_byte.py +0 -0
  106. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/confidence_weighted_accuracy.py +0 -0
  107. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/dcs.py +0 -0
  108. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/probability_mass.py +0 -0
  109. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/ternary.py +0 -0
  110. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/py.typed +0 -0
  111. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/__init__.py +0 -0
  112. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/base.py +0 -0
  113. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/hf_uploader.py +0 -0
  114. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/result_processor.py +0 -0
  115. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/wandb_uploader.py +0 -0
  116. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/run.py +0 -0
  117. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/run_direct.py +0 -0
  118. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/suite.py +0 -0
  119. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/Dockerfile_codebench +0 -0
  120. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/__init__.py +0 -0
  121. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/__init__.py +0 -0
  122. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/arc.py +0 -0
  123. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/arc_de.py +0 -0
  124. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/arc_ellamind.py +0 -0
  125. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/bigcodebench.py +0 -0
  126. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/copa.py +0 -0
  127. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/csqa.py +0 -0
  128. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/csqa_ellamind.py +0 -0
  129. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/drop.py +0 -0
  130. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/global_mmlu.py +0 -0
  131. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/goldenswag.py +0 -0
  132. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gpqa.py +0 -0
  133. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gpqa_ellamind.py +0 -0
  134. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gsm8k.py +0 -0
  135. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gsm8k_ellamind.py +0 -0
  136. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hellaswag.py +0 -0
  137. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hellaswag_ellamind.py +0 -0
  138. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hendrycks_math_ellamind.py +0 -0
  139. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hle_ellamind.py +0 -0
  140. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/ifeval.py +0 -0
  141. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/math_reasoning.py +0 -0
  142. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mbpp.py +0 -0
  143. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mbpp_ellamind.py +0 -0
  144. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/medqa.py +0 -0
  145. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mmlu.py +0 -0
  146. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mmlu_pro.py +0 -0
  147. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/multipl_e.py +0 -0
  148. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/naturalqs_open.py +0 -0
  149. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/piqa.py +0 -0
  150. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/piqa_ellamind.py +0 -0
  151. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/sciq.py +0 -0
  152. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/simpleqa_ellamind.py +0 -0
  153. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/siqa_ellamind.py +0 -0
  154. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/social_iqa.py +0 -0
  155. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/squad.py +0 -0
  156. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/winogrande.py +0 -0
  157. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/winogrande_ellamind.py +0 -0
  158. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/dataset_revisions.py +0 -0
  159. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/frozen-hf-dataset-revisions.json +0 -0
  160. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/hf-dataset-revisions.json +0 -0
  161. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/task_loader.py +0 -0
  162. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/task_style.py +0 -0
  163. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/utils.py +0 -0
  164. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/constants.py +0 -0
  165. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/file_ops.py +0 -0
  166. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/helpers.py +0 -0
  167. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/logging.py +0 -0
  168. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/packaging.py +0 -0
  169. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/tqdm_handler.py +0 -0
  170. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/template_formatting/README.md +0 -0
  171. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/template_formatting/__init__.py +0 -0
  172. {eval_framework-0.10.0 → eval_framework-0.10.6}/src/template_formatting/mistral_formatter.py +0 -0
  173. {eval_framework-0.10.0 → 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.0
3
+ Version: 0.10.6
4
4
  Summary: Evaluation Framework
5
5
  Author: Aleph Alpha Research
6
6
  License: Apache License
@@ -218,7 +218,7 @@ Requires-Dist: xmltodict>=1.0.4,<1.1
218
218
  Requires-Dist: pydantic>=2.13.4,<3
219
219
  Requires-Dist: datasets>=5.0.1,<6
220
220
  Requires-Dist: pycountry>=26.2.16,<27
221
- Requires-Dist: nltk>=3.10.2,<4
221
+ Requires-Dist: nltk>=3.10.3,<4
222
222
  Requires-Dist: python-dotenv>=1.2.2,<2
223
223
  Requires-Dist: lingua-language-detector>=2.2.0,<3
224
224
  Requires-Dist: google-crc32c>=1.8.0,<2
@@ -231,8 +231,8 @@ Requires-Dist: llm-sandbox[docker]==0.3.44
231
231
  Requires-Dist: jsonlines>=4,<5
232
232
  Requires-Dist: lxml>=6.1.1,<7
233
233
  Requires-Dist: python-iso639>=2026.7.23
234
- Requires-Dist: wandb>=0.28.1,<1
235
- Requires-Dist: boto3>=1.43.19,<2
234
+ Requires-Dist: wandb>=0.28.2,<1
235
+ Requires-Dist: boto3>=1.43.72,<2
236
236
  Requires-Dist: numpy>=2.5.2
237
237
  Requires-Dist: antlr4-python3-runtime==4.11.0
238
238
  Requires-Dist: scipy>=1.18.0,<2
@@ -241,7 +241,7 @@ Requires-Dist: eval-framework[determined,api,openai,transformers,accelerate,opti
241
241
  Requires-Dist: aleph-alpha-client>=11.5.1 ; extra == 'api'
242
242
  Requires-Dist: determined>=0.38.1,<0.39 ; extra == 'determined'
243
243
  Requires-Dist: tensorboard==2.21.0 ; extra == 'determined'
244
- Requires-Dist: openai>=2.53.0,<3 ; extra == 'openai'
244
+ Requires-Dist: openai>=3.1.0,<4 ; extra == 'openai'
245
245
  Requires-Dist: tiktoken>=0.13.0,<1 ; extra == 'openai'
246
246
  Requires-Dist: transformers>=4.45.2,<5 ; extra == 'openai'
247
247
  Requires-Dist: transformers>=4.45.2,<5 ; extra == 'optional'
@@ -315,8 +315,6 @@ There are optional extras available to unlock specific features of the library:
315
315
 
316
316
  As a short hand, the `all` extra installs all of the above.
317
317
 
318
- For local vLLM inference, see the sibling [`local-vllm-server/`](./local-vllm-server/README.md) package.
319
-
320
318
  We use `uv` to better resolve dependencies when downloading the extras. You can install uv with:
321
319
  ```bash
322
320
  curl -LsSf https://astral.sh/uv/install.sh | sh
@@ -53,8 +53,6 @@ There are optional extras available to unlock specific features of the library:
53
53
 
54
54
  As a short hand, the `all` extra installs all of the above.
55
55
 
56
- For local vLLM inference, see the sibling [`local-vllm-server/`](./local-vllm-server/README.md) package.
57
-
58
56
  We use `uv` to better resolve dependencies when downloading the extras. You can install uv with:
59
57
  ```bash
60
58
  curl -LsSf https://astral.sh/uv/install.sh | sh
@@ -0,0 +1,162 @@
1
+ [project]
2
+ name = "eval-framework"
3
+ version = "0.10.6"
4
+ description = "Evaluation Framework"
5
+ readme = "README.md"
6
+ requires-python = ">=3.12,<3.15"
7
+ classifiers = [
8
+ "Operating System :: OS Independent",
9
+ "License :: OSI Approved :: Apache Software License",
10
+ "Programming Language :: Python",
11
+ "Programming Language :: Python :: 3.12",
12
+ "Programming Language :: Python :: 3.13",
13
+ "Programming Language :: Python :: 3.14",
14
+ "Programming Language :: Python :: 3 :: Only",
15
+ "Topic :: Software Development :: Libraries",
16
+ "Typing :: Typed",
17
+ ]
18
+ dependencies = [
19
+ "pyyaml>=6.0.3,<7",
20
+ "xmltodict>=1.0.4,<1.1",
21
+ "pydantic>=2.13.4,<3",
22
+ "datasets>=5.0.1,<6",
23
+ "pycountry>=26.2.16,<27",
24
+ "nltk>=3.10.3,<4",
25
+ "python-dotenv>=1.2.2,<2",
26
+ "lingua-language-detector>=2.2.0,<3",
27
+ "google-crc32c>=1.8.0,<2",
28
+ "langdetect>=1.0.9,<2",
29
+ "jsonschema>=4.26.0,<5",
30
+ "mysql-connector-python>=26.7.0,<27",
31
+ "psycopg2-binary>=2.9.12,<3",
32
+ "sympy>=1.14.0,<2",
33
+ "llm-sandbox[docker]==0.3.44",
34
+ "jsonlines>=4,<5",
35
+ "lxml>=6.1.1,<7",
36
+ "python-iso639>=2026.7.23",
37
+ "wandb>=0.28.2,<1",
38
+ "boto3>=1.43.72,<2",
39
+ "numpy>=2.5.2",
40
+ "antlr4-python3-runtime==4.11.0",
41
+ "scipy>=1.18.0,<2",
42
+ ]
43
+
44
+ [project.license]
45
+ file = "LICENSE"
46
+
47
+ [[project.authors]]
48
+ name = "Aleph Alpha Research"
49
+
50
+ [project.optional-dependencies]
51
+ determined = [
52
+ "determined>=0.38.1,<0.39",
53
+ "tensorboard==2.21.0",
54
+ ]
55
+ api = ["aleph-alpha-client>=11.5.1"]
56
+ openai = [
57
+ "openai>=3.1.0,<4",
58
+ "tiktoken>=0.13.0,<1",
59
+ "transformers>=4.45.2,<5",
60
+ ]
61
+ transformers = [
62
+ "transformers>=4.45.2,<5",
63
+ "torch>=2.13.0,<3",
64
+ "accelerate>=1.14.0,<2",
65
+ ]
66
+ accelerate = ["accelerate"]
67
+ optional = [
68
+ "transformers>=4.45.2,<5",
69
+ "jinja2>=3.1.6,<4",
70
+ ]
71
+ all = ["eval_framework[determined,api,openai,transformers,accelerate,optional]"]
72
+
73
+ [project.urls]
74
+ repository = "https://github.com/Aleph-Alpha-Research/eval-framework"
75
+
76
+ [project.scripts]
77
+ eval_framework = "eval_framework.run:run"
78
+
79
+ [dependency-groups]
80
+ dev = [
81
+ "mypy>=2.3.1,<3",
82
+ "pytest>=9.1.1,<10",
83
+ "pytest-mock>=3.15.1",
84
+ "pytest-xdist>=3.8.0,<4",
85
+ "pytest-sugar>1.1,<2",
86
+ "types-pyyaml>=6.0.12.20260815,<7",
87
+ "types-python-dateutil>=2.9.0.20260807,<3",
88
+ "types-requests>=2.33.0.20260712,<3",
89
+ "plotly>=6.9.0,<7",
90
+ "ruff>=0.16.3",
91
+ "pip-licenses>=5.5.5",
92
+ ]
93
+ flash-attn = [
94
+ "flash-attn>=2.8.3.post1,<2.9",
95
+ "torch",
96
+ ]
97
+
98
+ [build-system]
99
+ requires = ["uv_build>=0.12.5,<0.12.6"]
100
+ build-backend = "uv_build"
101
+
102
+ [tool.uv]
103
+ override-dependencies = ["requests>=2.32,<3"]
104
+
105
+ [tool.uv.build-backend]
106
+ module-name = [
107
+ "eval_framework",
108
+ "template_formatting",
109
+ ]
110
+
111
+ [[tool.uv.extra-build-dependencies.flash-attn]]
112
+ requirement = "torch"
113
+ match-runtime = true
114
+
115
+ [tool.ruff]
116
+ line-length = 120
117
+
118
+ [tool.ruff.lint]
119
+ select = [
120
+ "E",
121
+ "F",
122
+ "UP",
123
+ "I",
124
+ ]
125
+
126
+ [tool.ruff.lint.isort]
127
+ known-third-party = ["wandb"]
128
+
129
+ [tool.ruff.lint.extend-per-file-ignores]
130
+ "__init__.py" = ["F401"]
131
+ "tests/tests_eval_framework/tasks/benchmarks/test_csqa_ellamind.py" = ["E501"]
132
+ "tests/tests_eval_framework/tasks/benchmarks/test_gpqa_ellamind.py" = ["E501"]
133
+ "tests/tests_eval_framework/tasks/benchmarks/test_gsm8k_ellamind.py" = ["E501"]
134
+ "tests/tests_eval_framework/tasks/benchmarks/test_hendrycks_math_ellamind.py" = ["E501"]
135
+ "tests/tests_eval_framework/tasks/benchmarks/test_hle_ellamind.py" = ["E501"]
136
+ "tests/tests_eval_framework/tasks/benchmarks/test_mbpp_ellamind.py" = ["E501"]
137
+ "tests/tests_eval_framework/tasks/benchmarks/test_piqa_ellamind.py" = ["E501"]
138
+ "tests/tests_eval_framework/tasks/benchmarks/test_siqa_ellamind.py" = ["E501"]
139
+ "tests/tests_eval_framework/tasks/benchmarks/test_winogrande_ellamind.py" = ["E501"]
140
+
141
+ [tool.mypy]
142
+ plugins = "pydantic.mypy"
143
+ disallow_untyped_defs = true
144
+ ignore_missing_imports = true
145
+ files = [
146
+ "src",
147
+ "utils",
148
+ ]
149
+
150
+ [tool.pytest.ini_options]
151
+ testpaths = ["./tests"]
152
+ minversion = 8.0
153
+ addopts = "-p 'no:legacypath' --doctest-modules -n auto"
154
+ markers = [
155
+ "gpu: needs a GPU runner, otherwise test can not be run",
156
+ "cpu_slow: runs for a long time (on CPU)",
157
+ "slow_download: smoke tests that download large datasets (>15s); excluded from CI, run manually with -m slow_download",
158
+ "external_api: needs external services for execution",
159
+ "formatter_hash: formatter consistency tests using hash comparisons",
160
+ ]
161
+ filterwarnings = ["ignore::DeprecationWarning:datasets.utils._dill:"]
162
+ env = ["WANDB_MODE = disabled"]
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "eval-framework"
3
- version = "0.10.0"
3
+ version = "0.10.6"
4
4
  description = "Evaluation Framework"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -25,7 +25,7 @@ dependencies = [
25
25
  "pydantic>=2.13.4,<3",
26
26
  "datasets>=5.0.1,<6",
27
27
  "pycountry>=26.2.16,<27",
28
- "nltk>=3.10.2,<4",
28
+ "nltk>=3.10.3,<4",
29
29
  "python-dotenv>=1.2.2,<2",
30
30
  "lingua-language-detector>=2.2.0,<3",
31
31
  "google-crc32c>=1.8.0,<2",
@@ -38,8 +38,8 @@ dependencies = [
38
38
  "jsonlines>=4,<5",
39
39
  "lxml>=6.1.1,<7",
40
40
  "python-iso639>=2026.7.23",
41
- "wandb>=0.28.1,<1",
42
- "boto3>=1.43.19,<2",
41
+ "wandb>=0.28.2,<1",
42
+ "boto3>=1.43.72,<2",
43
43
  "numpy>=2.5.2",
44
44
  # is a dependency of sympy, but not explicitly listed in the requirements.txt
45
45
  # https://github.com/sympy/sympy/blob/0204fa34e8f6f6f8ccb4de01209be9a2345c9d6e/doc/src/contributing/dependencies.md?plain=1#L125
@@ -55,7 +55,7 @@ determined = [
55
55
  ]
56
56
  api = ["aleph-alpha-client>=11.5.1"]
57
57
  openai = [
58
- "openai>=2.53.0,<3",
58
+ "openai>=3.1.0,<4",
59
59
  "tiktoken>=0.13.0,<1",
60
60
  "transformers>=4.45.2,<5",
61
61
  ]
@@ -84,16 +84,16 @@ 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",
96
- "ruff>=0.16.2",
96
+ "ruff>=0.16.3",
97
97
  "pip-licenses>=5.5.5",
98
98
  ]
99
99
  flash-attn = [
@@ -102,7 +102,7 @@ flash-attn = [
102
102
  ]
103
103
 
104
104
  [build-system]
105
- requires = ["uv_build>=0.11.32,<0.11.33"]
105
+ requires = ["uv_build>=0.12.5,<0.12.6"]
106
106
  build-backend = "uv_build"
107
107
 
108
108
  [tool.uv.build-backend]
@@ -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
  )