eval-framework 0.10.0__tar.gz → 0.10.4__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.0 → eval_framework-0.10.4}/PKG-INFO +5 -7
  2. {eval_framework-0.10.0 → eval_framework-0.10.4}/README.md +0 -2
  3. eval_framework-0.10.4/pyproject.toml +162 -0
  4. eval_framework-0.10.0/pyproject.toml → eval_framework-0.10.4/pyproject.toml.orig +7 -7
  5. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/base.py +50 -48
  6. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/humaneval.py +31 -2
  7. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/humaneval_ellamind.py +43 -6
  8. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/eval_config.py +1 -3
  9. eval_framework-0.10.4/src/eval_framework/tasks/lazy.py +56 -0
  10. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/markdown_doc.py +0 -3
  11. eval_framework-0.10.4/src/eval_framework/tasks/registry.py +164 -0
  12. eval_framework-0.10.4/src/eval_framework/tasks/task.py +104 -0
  13. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/task_names.py +4 -0
  14. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/template_formatting/formatter.py +8 -6
  15. eval_framework-0.10.0/src/eval_framework/tasks/registry.py +0 -310
  16. {eval_framework-0.10.0 → eval_framework-0.10.4}/LICENSE +0 -0
  17. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/__init__.py +0 -0
  18. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/base_config.py +0 -0
  19. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/context/__init__.py +0 -0
  20. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/context/determined.py +0 -0
  21. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/context/eval.py +0 -0
  22. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/context/local.py +0 -0
  23. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/evaluation_generator.py +0 -0
  24. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/exceptions.py +0 -0
  25. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/external/drop_process_results.py +0 -0
  26. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/external/ifeval_impl/README.md +0 -0
  27. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/external/ifeval_impl/instructions.py +0 -0
  28. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/external/ifeval_impl/instructions_registry.py +0 -0
  29. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/external/ifeval_impl/instructions_util.py +0 -0
  30. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/external/ifeval_impl/utils.py +0 -0
  31. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/llm/__init__.py +0 -0
  32. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/llm/aleph_alpha.py +0 -0
  33. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/llm/base.py +0 -0
  34. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/llm/huggingface.py +0 -0
  35. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/llm/models.py +0 -0
  36. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/llm/openai.py +0 -0
  37. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/logger.py +0 -0
  38. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/main.py +0 -0
  39. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/__init__.py +0 -0
  40. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/aggregators/__init__.py +0 -0
  41. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/aggregators/aggregators.py +0 -0
  42. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/base.py +0 -0
  43. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/__init__.py +0 -0
  44. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/accuracy_completion.py +0 -0
  45. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/code_assertion.py +0 -0
  46. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/code_execution_pass_at_one.py +0 -0
  47. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/concordance_index.py +0 -0
  48. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/csv_format.py +0 -0
  49. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/drop_completion.py +0 -0
  50. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/exponential_similarity.py +0 -0
  51. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/f1.py +0 -0
  52. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/format_checker.py +0 -0
  53. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/grid_difference.py +0 -0
  54. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/ifeval.py +0 -0
  55. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/json_format.py +0 -0
  56. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/language_checker.py +0 -0
  57. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/length_control.py +0 -0
  58. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/math_minerva_completion.py +0 -0
  59. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/math_reasoning_completion.py +0 -0
  60. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/minerva_math_utils.py +0 -0
  61. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/multipl_e_assertion.py +0 -0
  62. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/placeholder_checker.py +0 -0
  63. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/repetition.py +0 -0
  64. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/rouge_1.py +0 -0
  65. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/rouge_2.py +0 -0
  66. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/rouge_geometric_mean.py +0 -0
  67. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/rouge_l.py +0 -0
  68. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/completion/text_counter.py +0 -0
  69. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/efficiency/__init__.py +0 -0
  70. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/efficiency/bytes_per_sequence_position.py +0 -0
  71. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/__init__.py +0 -0
  72. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/base.py +0 -0
  73. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/chatbot_style_grader.py +0 -0
  74. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/coherence_grader.py +0 -0
  75. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/comparison_grader.py +0 -0
  76. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/conciseness_grader.py +0 -0
  77. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/contains_names_grader.py +0 -0
  78. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/format_correctness_grader.py +0 -0
  79. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/instruction_grader.py +0 -0
  80. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/language.py +0 -0
  81. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/long_context_grader.py +0 -0
  82. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/models.py +0 -0
  83. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/refusal_grader.py +0 -0
  84. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/sql_quality_grader.py +0 -0
  85. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/graders/summary_world_knowledge_grader.py +0 -0
  86. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_chatbot_style.py +0 -0
  87. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_coherence.py +0 -0
  88. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_completion_accuracy.py +0 -0
  89. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_conciseness.py +0 -0
  90. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_contains_names.py +0 -0
  91. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_format_correctness.py +0 -0
  92. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_instruction.py +0 -0
  93. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_mtbench_pair.py +0 -0
  94. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_mtbench_single.py +0 -0
  95. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_refusal.py +0 -0
  96. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_sql.py +0 -0
  97. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/llm_judge_world_knowledge.py +0 -0
  98. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/llm/utils.py +0 -0
  99. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/loglikelihood/__init__.py +0 -0
  100. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/loglikelihood/accuracy_loglikelihood.py +0 -0
  101. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/loglikelihood/base.py +0 -0
  102. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/loglikelihood/bits_per_byte.py +0 -0
  103. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/loglikelihood/confidence_weighted_accuracy.py +0 -0
  104. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/loglikelihood/dcs.py +0 -0
  105. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/loglikelihood/probability_mass.py +0 -0
  106. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/metrics/loglikelihood/ternary.py +0 -0
  107. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/py.typed +0 -0
  108. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/response_generator.py +0 -0
  109. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/result_processors/__init__.py +0 -0
  110. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/result_processors/base.py +0 -0
  111. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/result_processors/hf_uploader.py +0 -0
  112. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/result_processors/result_processor.py +0 -0
  113. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/result_processors/wandb_uploader.py +0 -0
  114. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/run.py +0 -0
  115. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/run_direct.py +0 -0
  116. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/shared/types.py +0 -0
  117. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/suite.py +0 -0
  118. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/Dockerfile_codebench +0 -0
  119. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/__init__.py +0 -0
  120. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/__init__.py +0 -0
  121. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/arc.py +0 -0
  122. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/arc_de.py +0 -0
  123. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/arc_ellamind.py +0 -0
  124. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/bigcodebench.py +0 -0
  125. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/copa.py +0 -0
  126. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/csqa.py +0 -0
  127. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/csqa_ellamind.py +0 -0
  128. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/drop.py +0 -0
  129. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/global_mmlu.py +0 -0
  130. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/goldenswag.py +0 -0
  131. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/gpqa.py +0 -0
  132. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/gpqa_ellamind.py +0 -0
  133. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/gsm8k.py +0 -0
  134. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/gsm8k_ellamind.py +0 -0
  135. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/hellaswag.py +0 -0
  136. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/hellaswag_ellamind.py +0 -0
  137. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/hendrycks_math_ellamind.py +0 -0
  138. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/hle_ellamind.py +0 -0
  139. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/ifeval.py +0 -0
  140. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/math_reasoning.py +0 -0
  141. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/mbpp.py +0 -0
  142. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/mbpp_ellamind.py +0 -0
  143. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/medqa.py +0 -0
  144. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/mmlu.py +0 -0
  145. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/mmlu_pro.py +0 -0
  146. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/multipl_e.py +0 -0
  147. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/naturalqs_open.py +0 -0
  148. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/piqa.py +0 -0
  149. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/piqa_ellamind.py +0 -0
  150. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/sciq.py +0 -0
  151. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/simpleqa_ellamind.py +0 -0
  152. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/siqa_ellamind.py +0 -0
  153. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/social_iqa.py +0 -0
  154. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/squad.py +0 -0
  155. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/winogrande.py +0 -0
  156. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/benchmarks/winogrande_ellamind.py +0 -0
  157. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/dataset_revisions.py +0 -0
  158. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/frozen-hf-dataset-revisions.json +0 -0
  159. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/hf-dataset-revisions.json +0 -0
  160. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/task_loader.py +0 -0
  161. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/task_style.py +0 -0
  162. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/tasks/utils.py +0 -0
  163. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/utils/constants.py +0 -0
  164. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/utils/file_ops.py +0 -0
  165. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/utils/helpers.py +0 -0
  166. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/utils/logging.py +0 -0
  167. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/utils/packaging.py +0 -0
  168. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/eval_framework/utils/tqdm_handler.py +0 -0
  169. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/template_formatting/README.md +0 -0
  170. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/template_formatting/__init__.py +0 -0
  171. {eval_framework-0.10.0 → eval_framework-0.10.4}/src/template_formatting/mistral_formatter.py +0 -0
  172. {eval_framework-0.10.0 → eval_framework-0.10.4}/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.4
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.4"
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.0,<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.20260724,<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.4"
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
  ]
@@ -93,7 +93,7 @@ dev = [
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]
@@ -2,7 +2,6 @@ import logging
2
2
  import os
3
3
  import random
4
4
  import traceback
5
- from abc import ABC, abstractmethod
6
5
  from collections.abc import Iterable, Sequence
7
6
  from enum import Enum
8
7
  from pathlib import Path
@@ -10,11 +9,11 @@ from typing import TYPE_CHECKING, Any, Self, TypeVar
10
9
 
11
10
  import iso639
12
11
  from datasets import DatasetDict, DownloadConfig, load_dataset
13
- from pydantic import BaseModel, ConfigDict
14
12
 
15
13
  from eval_framework.shared.types import BaseMetricContext, Completion, Error, RawCompletion
16
14
  from eval_framework.tasks.dataset_revisions import pinned_revision
17
15
  from eval_framework.tasks.markdown_doc import markdown_doc as render_markdown_doc
16
+ from eval_framework.tasks.task import EvalFactory, ResponseType, Sample, Task
18
17
  from eval_framework.tasks.utils import classproperty, raise_errors
19
18
  from template_formatting.formatter import BaseFormatter, Message, Role
20
19
 
@@ -26,11 +25,6 @@ RANDOM_SEED = 42
26
25
  NO_SUBJECT = "no_subject"
27
26
 
28
27
 
29
- class ResponseType(Enum):
30
- COMPLETION = "completion"
31
- LOGLIKELIHOODS = "loglikelihoods"
32
-
33
-
34
28
  class TaskStyle(Enum):
35
29
  MULTIPLE_CHOICE = "multiple_choice"
36
30
  CLOZE = "cloze"
@@ -71,51 +65,11 @@ for language in iso639.ALL_LANGUAGES:
71
65
  Language: type[Enum] = Language.add_members(languages) # type: ignore[no-redef]
72
66
 
73
67
 
74
- class Sample(BaseModel):
75
- model_config = ConfigDict(extra="forbid")
76
- id: int
77
- subject: str
78
- messages: list[Message]
79
- ground_truth: str | list[str] | None
80
- possible_completions: list[str] | None
81
- context: BaseMetricContext | list[BaseMetricContext] | None = None
82
-
83
-
84
68
  SubjectType = TypeVar("SubjectType")
85
69
 
86
70
  logger = logging.getLogger(__name__)
87
71
 
88
72
 
89
- class Task(ABC):
90
- """The contract a caller relies on to run an evaluation"""
91
-
92
- @abstractmethod
93
- def iterate_samples(self, num_samples: int | None = None) -> Iterable[Sample]: ...
94
-
95
- @abstractmethod
96
- def generate_completions(
97
- self,
98
- llm: "BaseLLM",
99
- samples: list[Sample],
100
- stop_sequences: list[str] | None = None,
101
- max_tokens: int | None = None,
102
- fail_on_error: bool = True,
103
- ) -> list[Completion]:
104
- """Run ``llm`` over ``samples`` and return their completions."""
105
-
106
- @abstractmethod
107
- def get_metadata(self) -> dict[str, str | list[str]]:
108
- """Descriptive metadata about the eval for result reporting."""
109
-
110
- @abstractmethod
111
- def get_response_type(self) -> ResponseType: ...
112
-
113
- @abstractmethod
114
- def display_name(self) -> str:
115
- """Human-readable display name. Is allowed to have special characters and whitespaces."""
116
- ...
117
-
118
-
119
73
  class BaseTask[SubjectType](Task):
120
74
  NAME: str
121
75
  DATASET_PATH: str
@@ -292,7 +246,6 @@ class BaseTask[SubjectType](Task):
292
246
 
293
247
  return render_markdown_doc(
294
248
  name=self.NAME,
295
- module=type(self).__module__,
296
249
  dataset_path=dataset_path,
297
250
  sample_split=getattr(self, "SAMPLE_SPLIT", None),
298
251
  fewshot_split=getattr(self, "FEWSHOT_SPLIT", None),
@@ -547,3 +500,52 @@ def resolve_overwrite_subjects[SubjectType](
547
500
  )
548
501
 
549
502
  return chosen_subjects
503
+
504
+
505
+ class Eager(EvalFactory):
506
+ """Wraps an already-imported task class."""
507
+
508
+ def __init__(self, task: type[BaseTask]) -> None:
509
+ self._task = task
510
+
511
+ def id(self) -> str:
512
+ return self._task.__name__
513
+
514
+ def create(
515
+ self,
516
+ num_fewshot: int,
517
+ custom_subjects: list[str] | None,
518
+ custom_hf_revision: str | None,
519
+ user_prompt_suffix: str | None = None,
520
+ seed: int | None = None,
521
+ ) -> BaseTask:
522
+ return self._task.with_overwrite(
523
+ num_fewshot=num_fewshot,
524
+ custom_subjects=custom_subjects,
525
+ custom_hf_revision=custom_hf_revision,
526
+ user_prompt_suffix=user_prompt_suffix,
527
+ seed=seed,
528
+ )
529
+
530
+ def response_type(self) -> ResponseType:
531
+ """The eval's response type"""
532
+ return self._task.get_response_type()
533
+
534
+ def metrics(self) -> list[type["BaseMetric"]]:
535
+ """The eval's metrics"""
536
+ return self._task.get_metrics()
537
+
538
+ def subjects(self) -> list[Any]:
539
+ """The eval's subjects"""
540
+ return self._task.SUBJECTS
541
+
542
+ def display_name(self) -> str:
543
+ """The eval's human-readable display name (the task's ``NAME``)."""
544
+ return self._task.NAME
545
+
546
+ def markdown_doc(self, formatters: Sequence[BaseFormatter]) -> str:
547
+ try:
548
+ task = self.create(num_fewshot=1, custom_subjects=None, custom_hf_revision=None, seed=RANDOM_SEED)
549
+ except (TypeError, ValueError, AssertionError):
550
+ task = self.create(num_fewshot=0, custom_subjects=None, custom_hf_revision=None, seed=RANDOM_SEED)
551
+ return task.markdown_doc(formatters)
@@ -104,6 +104,25 @@ class HumanEvalBPB(HumanEval):
104
104
  return [gt] if gt else None
105
105
 
106
106
 
107
+ class HumanEvalBPB_V2(HumanEvalBPB):
108
+ """
109
+ HumanEvalBPB variant that wraps the prompt and canonical solution in markdown code fences
110
+ instead of prefixing the solution with a leading space, so the loglikelihood boundary
111
+ starts on a new line.
112
+ """
113
+
114
+ NAME = "Human Eval BPB V2"
115
+
116
+ def _get_ground_truth(self, item: dict[str, Any]) -> str | None:
117
+ return item["canonical_solution"]
118
+
119
+ def _get_instruction_text(self, item: dict[str, Any]) -> str:
120
+ return "```python\n" + item["prompt"].rstrip() + "\n"
121
+
122
+ def _get_fewshot_target_text(self, item: dict[str, Any]) -> str:
123
+ return item["canonical_solution"].rstrip() + "\n```"
124
+
125
+
107
126
  class HumanEval_OLMES(HumanEval):
108
127
  """HumanEval OLMES variant replicating codex_humaneval:3shot::olmo3:n32:v2 from oe_eval.
109
128
 
@@ -122,10 +141,10 @@ class HumanEval_OLMES(HumanEval):
122
141
  self.max_tokens = 1024
123
142
 
124
143
  def _get_instruction_text(self, item: dict[str, Any]) -> str:
125
- return "```python\n" + item["prompt"]
144
+ return "```python\n" + item["prompt"].rstrip()
126
145
 
127
146
  def _get_fewshot_target_text(self, item: dict[str, Any]) -> str:
128
- return item["canonical_solution"] + "```"
147
+ return "\n" + item["canonical_solution"] + "```"
129
148
 
130
149
 
131
150
  class HumanEvalInstruct(HumanEval):
@@ -147,3 +166,13 @@ class HumanEvalInstruct(HumanEval):
147
166
 
148
167
  def _get_cue_text(self, item: dict[str, Any]) -> str:
149
168
  return self.CUE_PREFIX + item["prompt"].lstrip()
169
+
170
+
171
+ class HumanEval_NL(HumanEval_OLMES):
172
+ NAME = "Human Eval Newline OLMES"
173
+
174
+ def _get_instruction_text(self, item: dict[str, Any]) -> str:
175
+ return "```python\n" + item["prompt"].rstrip() + "\n"
176
+
177
+ def _get_fewshot_target_text(self, item: dict[str, Any]) -> str:
178
+ return item["canonical_solution"].lstrip("\n") + "```"
@@ -5,8 +5,8 @@ https://huggingface.co/datasets/ellamind/humaneval-multilingual
5
5
 
6
6
  from typing import Any
7
7
 
8
- from eval_framework.tasks.base import BaseTask, Language
9
- from eval_framework.tasks.benchmarks.humaneval import HumanEval_OLMES
8
+ from eval_framework.tasks.base import BaseTask, Language, Sample
9
+ from eval_framework.tasks.benchmarks.humaneval import HumanEval_NL, HumanEval_OLMES
10
10
  from eval_framework.tasks.dataset_revisions import HF_REVISIONS_LOCKFILE
11
11
  from eval_framework.tasks.task_style import BPBStyle
12
12
 
@@ -29,10 +29,6 @@ class HumanEvalDE_OLMES(HumanEval_OLMES):
29
29
  SUBJECTS = ["deu"]
30
30
  LANGUAGE = Language.DEU
31
31
 
32
- def _get_instruction_text(self, item: dict[str, Any]) -> str:
33
- # Ensure that the code completion starts on a new line.
34
- return "```python\n" + item["prompt"].rstrip() + "\n"
35
-
36
32
 
37
33
  class HumanEvalDE_BPB_OLMES(BaseTask[str]):
38
34
  """German HumanEval - BPB format (loglikelihood of the canonical solution).
@@ -63,3 +59,44 @@ class HumanEvalDE_BPB_OLMES(BaseTask[str]):
63
59
 
64
60
  def _get_correct_index(self, item: dict[str, Any]) -> int:
65
61
  return 0
62
+
63
+ def _create_samples(self, item: dict[str, Any], index: int, subject: str) -> list[Sample]:
64
+ """Creates one or more samples from a single dataset item. Default implementation returns single sample."""
65
+ messages = self._get_messages(item)
66
+ messages[-1].content = messages[-1].content.rstrip("\n")
67
+ return [
68
+ Sample(
69
+ id=index,
70
+ subject=str(subject),
71
+ messages=messages,
72
+ ground_truth=self._get_ground_truth(item),
73
+ possible_completions=self._get_possible_completions(item),
74
+ context=self._get_context(item),
75
+ )
76
+ ]
77
+
78
+
79
+ class HumanEvalDE_BPB_OLMES_V2(HumanEvalDE_BPB_OLMES):
80
+ """HumanEvalDE_BPB_OLMES variant that wraps the prompt and canonical solution in markdown code
81
+ fences, mirroring the HumanEvalDE_OLMES completion prompt exactly.
82
+ """
83
+
84
+ NAME = "HumanEvalDE_BPB_OLMES V2"
85
+
86
+ def _get_instruction_text(self, item: dict[str, Any]) -> str:
87
+ # Ensure that the code completion starts on a new line.
88
+ return "```python\n" + item["prompt"].rstrip()
89
+
90
+ def _get_fewshot_target_text(self, item: dict[str, Any]) -> str:
91
+ return "\n" + item["canonical_solution"].rstrip() + "\n```"
92
+
93
+
94
+ class HumanEvalDE_NL(HumanEval_NL):
95
+ NAME = "HumanEvalDE_NL"
96
+ REVISION_LOCKFILE = HF_REVISIONS_LOCKFILE
97
+
98
+ DATASET_PATH = "ellamind/humaneval-multilingual"
99
+ SAMPLE_SPLIT = "test"
100
+ FEWSHOT_SPLIT = "test"
101
+ SUBJECTS = ["deu"]
102
+ LANGUAGE = Language.DEU
@@ -135,9 +135,7 @@ class EvalConfig(BaseConfig):
135
135
 
136
136
  @field_serializer("judge_model_args")
137
137
  def serialize_judge_model_args(self, value: dict[str, Any]) -> dict[str, Any]:
138
- value.pop("api_key", None)
139
- value.pop("base_url", None)
140
- return value
138
+ return {k: v for k, v in value.items() if k not in ("api_key", "base_url")}
141
139
 
142
140
  def model_json_dump(self) -> str:
143
141
  model_dump = self.model_dump(mode="json")
@@ -0,0 +1,56 @@
1
+ from collections.abc import Callable, Sequence
2
+ from typing import TYPE_CHECKING, Any
3
+
4
+ from eval_framework.tasks.task import EvalFactory, ResponseType, Task
5
+ from template_formatting.formatter import BaseFormatter
6
+
7
+ if TYPE_CHECKING:
8
+ from eval_framework.metrics.base import BaseMetric
9
+
10
+
11
+ class Lazy(EvalFactory):
12
+ """An ``EvalFactory`` that defers producing the real factory until first use.
13
+
14
+ Holds an ``id`` and a ``load`` thunk returning the wrapped ``EvalFactory``; every
15
+ other call is delegated to that factory, which is built (and memoized) on first
16
+ access. This keeps ``Lazy`` independent of any concrete task type — the thunk owns
17
+ whatever loading (e.g. importing a module) the wrapped factory requires.
18
+ """
19
+
20
+ def __init__(self, id: str, load: Callable[[], EvalFactory]) -> None:
21
+ self._id = id
22
+ self._load = load
23
+ self._factory: EvalFactory | None = None
24
+
25
+ def _loaded_factory(self) -> EvalFactory:
26
+ if self._factory is None:
27
+ self._factory = self._load()
28
+ return self._factory
29
+
30
+ def id(self) -> str:
31
+ return self._id
32
+
33
+ def create(
34
+ self,
35
+ num_fewshot: int,
36
+ custom_subjects: list[str] | None,
37
+ custom_hf_revision: str | None,
38
+ user_prompt_suffix: str | None = None,
39
+ seed: int | None = None,
40
+ ) -> Task:
41
+ return self._loaded_factory().create(num_fewshot, custom_subjects, custom_hf_revision, user_prompt_suffix, seed)
42
+
43
+ def response_type(self) -> ResponseType:
44
+ return self._loaded_factory().response_type()
45
+
46
+ def metrics(self) -> list[type["BaseMetric"]]:
47
+ return self._loaded_factory().metrics()
48
+
49
+ def subjects(self) -> list[Any]:
50
+ return self._loaded_factory().subjects()
51
+
52
+ def display_name(self) -> str:
53
+ return self._loaded_factory().display_name()
54
+
55
+ def markdown_doc(self, formatters: Sequence[BaseFormatter]) -> str:
56
+ return self._loaded_factory().markdown_doc(formatters)
@@ -8,7 +8,6 @@ from template_formatting.formatter import BaseFormatter, Message
8
8
  def markdown_doc(
9
9
  *,
10
10
  name: str,
11
- module: str,
12
11
  dataset_path: str | None,
13
12
  sample_split: str | None,
14
13
  fewshot_split: str | None,
@@ -44,8 +43,6 @@ def markdown_doc(
44
43
  buf.write(f"LANGUAGE = {language!r}".strip() + "\n")
45
44
  buf.write("````\n\n")
46
45
 
47
- buf.write(f"- Module: `{module}`\n\n")
48
-
49
46
  if http_path:
50
47
  buf.write(f"- Link to dataset: [{http_path}]({http_path})\n")
51
48
  else: