eval-framework 0.8.4__tar.gz → 0.8.11__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 (158) hide show
  1. {eval_framework-0.8.4 → eval_framework-0.8.11}/PKG-INFO +5 -5
  2. {eval_framework-0.8.4 → eval_framework-0.8.11}/pyproject.toml +6 -6
  3. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/evaluation_generator.py +1 -2
  4. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/suite.py +2 -2
  5. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/eval_config.py +12 -7
  6. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/hf-dataset-revisions.json +0 -1
  7. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/registry.py +36 -38
  8. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/task_loader.py +7 -7
  9. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/task_names.py +0 -8
  10. eval_framework-0.8.4/src/eval_framework/tasks/benchmarks/triviaqa.py +0 -78
  11. eval_framework-0.8.4/src/eval_framework/utils/generate_task_docs.py +0 -153
  12. {eval_framework-0.8.4 → eval_framework-0.8.11}/LICENSE +0 -0
  13. {eval_framework-0.8.4 → eval_framework-0.8.11}/README.md +0 -0
  14. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/__init__.py +0 -0
  15. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/base_config.py +0 -0
  16. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/context/__init__.py +0 -0
  17. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/context/determined.py +0 -0
  18. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/context/eval.py +0 -0
  19. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/context/local.py +0 -0
  20. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/exceptions.py +0 -0
  21. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/external/drop_process_results.py +0 -0
  22. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/external/ifeval_impl/README.md +0 -0
  23. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/external/ifeval_impl/instructions.py +0 -0
  24. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/external/ifeval_impl/instructions_registry.py +0 -0
  25. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/external/ifeval_impl/instructions_util.py +0 -0
  26. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/external/ifeval_impl/utils.py +0 -0
  27. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/llm/__init__.py +0 -0
  28. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/llm/aleph_alpha.py +0 -0
  29. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/llm/base.py +0 -0
  30. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/llm/huggingface.py +0 -0
  31. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/llm/models.py +0 -0
  32. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/llm/openai.py +0 -0
  33. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/logger.py +0 -0
  34. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/main.py +0 -0
  35. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/__init__.py +0 -0
  36. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/aggregators/__init__.py +0 -0
  37. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/aggregators/aggregators.py +0 -0
  38. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/base.py +0 -0
  39. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/__init__.py +0 -0
  40. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/accuracy_completion.py +0 -0
  41. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/code_assertion.py +0 -0
  42. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/code_execution_pass_at_one.py +0 -0
  43. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/concordance_index.py +0 -0
  44. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/csv_format.py +0 -0
  45. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/drop_completion.py +0 -0
  46. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/exponential_similarity.py +0 -0
  47. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/f1.py +0 -0
  48. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/format_checker.py +0 -0
  49. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/grid_difference.py +0 -0
  50. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/ifeval.py +0 -0
  51. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/json_format.py +0 -0
  52. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/language_checker.py +0 -0
  53. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/length_control.py +0 -0
  54. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/math_minerva_completion.py +0 -0
  55. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/math_reasoning_completion.py +0 -0
  56. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/minerva_math_utils.py +0 -0
  57. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/multipl_e_assertion.py +0 -0
  58. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/placeholder_checker.py +0 -0
  59. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/repetition.py +0 -0
  60. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/rouge_1.py +0 -0
  61. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/rouge_2.py +0 -0
  62. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/rouge_geometric_mean.py +0 -0
  63. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/rouge_l.py +0 -0
  64. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/completion/text_counter.py +0 -0
  65. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/efficiency/__init__.py +0 -0
  66. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/efficiency/bytes_per_sequence_position.py +0 -0
  67. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/__init__.py +0 -0
  68. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/base.py +0 -0
  69. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/chatbot_style_grader.py +0 -0
  70. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/coherence_grader.py +0 -0
  71. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/comparison_grader.py +0 -0
  72. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/conciseness_grader.py +0 -0
  73. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/contains_names_grader.py +0 -0
  74. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/format_correctness_grader.py +0 -0
  75. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/instruction_grader.py +0 -0
  76. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/language.py +0 -0
  77. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/long_context_grader.py +0 -0
  78. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/models.py +0 -0
  79. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/refusal_grader.py +0 -0
  80. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/sql_quality_grader.py +0 -0
  81. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/graders/summary_world_knowledge_grader.py +0 -0
  82. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_chatbot_style.py +0 -0
  83. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_coherence.py +0 -0
  84. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_completion_accuracy.py +0 -0
  85. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_conciseness.py +0 -0
  86. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_contains_names.py +0 -0
  87. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_format_correctness.py +0 -0
  88. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_instruction.py +0 -0
  89. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_mtbench_pair.py +0 -0
  90. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_mtbench_single.py +0 -0
  91. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_refusal.py +0 -0
  92. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_sql.py +0 -0
  93. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/llm_judge_world_knowledge.py +0 -0
  94. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/llm/utils.py +0 -0
  95. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/loglikelihood/__init__.py +0 -0
  96. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/loglikelihood/accuracy_loglikelihood.py +0 -0
  97. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/loglikelihood/base.py +0 -0
  98. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/loglikelihood/bits_per_byte.py +0 -0
  99. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/loglikelihood/confidence_weighted_accuracy.py +0 -0
  100. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/loglikelihood/dcs.py +0 -0
  101. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/loglikelihood/probability_mass.py +0 -0
  102. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/metrics/loglikelihood/ternary.py +0 -0
  103. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/py.typed +0 -0
  104. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/response_generator.py +0 -0
  105. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/result_processors/__init__.py +0 -0
  106. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/result_processors/base.py +0 -0
  107. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/result_processors/hf_uploader.py +0 -0
  108. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/result_processors/result_processor.py +0 -0
  109. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/result_processors/wandb_uploader.py +0 -0
  110. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/run.py +0 -0
  111. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/run_direct.py +0 -0
  112. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/shared/types.py +0 -0
  113. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/Dockerfile_codebench +0 -0
  114. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/__init__.py +0 -0
  115. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/base.py +0 -0
  116. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/__init__.py +0 -0
  117. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/arc.py +0 -0
  118. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/arc_de.py +0 -0
  119. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/bigcodebench.py +0 -0
  120. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/copa.py +0 -0
  121. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/csqa.py +0 -0
  122. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/drop.py +0 -0
  123. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/global_mmlu.py +0 -0
  124. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/goldenswag.py +0 -0
  125. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/gpqa.py +0 -0
  126. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/gsm8k.py +0 -0
  127. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/hellaswag.py +0 -0
  128. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/humaneval.py +0 -0
  129. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/ifeval.py +0 -0
  130. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/math_reasoning.py +0 -0
  131. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/mbpp.py +0 -0
  132. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/medqa.py +0 -0
  133. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/mmlu.py +0 -0
  134. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/mmlu_pro.py +0 -0
  135. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/multipl_e.py +0 -0
  136. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/naturalqs_open.py +0 -0
  137. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/piqa.py +0 -0
  138. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/sciq.py +0 -0
  139. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/social_iqa.py +0 -0
  140. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/squad.py +0 -0
  141. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/benchmarks/winogrande.py +0 -0
  142. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/dataset_revisions.py +0 -0
  143. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/frozen-hf-dataset-revisions.json +0 -0
  144. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/markdown_doc.py +0 -0
  145. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/perturbation.py +0 -0
  146. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/task_style.py +0 -0
  147. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/tasks/utils.py +0 -0
  148. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/utils/constants.py +0 -0
  149. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/utils/file_ops.py +0 -0
  150. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/utils/helpers.py +0 -0
  151. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/utils/logging.py +0 -0
  152. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/utils/packaging.py +0 -0
  153. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/eval_framework/utils/tqdm_handler.py +0 -0
  154. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/template_formatting/README.md +0 -0
  155. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/template_formatting/__init__.py +0 -0
  156. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/template_formatting/formatter.py +0 -0
  157. {eval_framework-0.8.4 → eval_framework-0.8.11}/src/template_formatting/mistral_formatter.py +0 -0
  158. {eval_framework-0.8.4 → eval_framework-0.8.11}/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.8.4
3
+ Version: 0.8.11
4
4
  Summary: Evaluation Framework
5
5
  Author: Aleph Alpha Research
6
6
  License: Apache License
@@ -214,16 +214,16 @@ Classifier: Typing :: Typed
214
214
  Requires-Dist: pyyaml>=6.0.3,<7
215
215
  Requires-Dist: xmltodict>=1.0.4,<1.1
216
216
  Requires-Dist: pydantic>=2.13.4,<3
217
- Requires-Dist: datasets>=5.0.0,<6
217
+ Requires-Dist: datasets>=5.0.1,<6
218
218
  Requires-Dist: pycountry>=26.2.16,<27
219
- Requires-Dist: nltk>=3.10.0,<4
219
+ Requires-Dist: nltk>=3.10.1,<4
220
220
  Requires-Dist: python-dotenv>=1.2.2,<2
221
221
  Requires-Dist: lingua-language-detector>=2.2.0,<3
222
222
  Requires-Dist: google-crc32c>=1.8.0,<2
223
223
  Requires-Dist: langdetect>=1.0.9,<2
224
224
  Requires-Dist: spacy>=3.8.14,<4
225
225
  Requires-Dist: jsonschema>=4.26.0,<5
226
- Requires-Dist: mysql-connector-python>=9.7.0,<10
226
+ Requires-Dist: mysql-connector-python>=26.7.0,<27
227
227
  Requires-Dist: psycopg2-binary>=2.9.12,<3
228
228
  Requires-Dist: sympy>=1.14.0,<2
229
229
  Requires-Dist: llm-sandbox[docker]==0.3.39
@@ -240,7 +240,7 @@ Requires-Dist: eval-framework[determined,api,openai,transformers,accelerate,opti
240
240
  Requires-Dist: aleph-alpha-client>=11.5.1 ; extra == 'api'
241
241
  Requires-Dist: determined>=0.38.1,<0.39 ; extra == 'determined'
242
242
  Requires-Dist: tensorboard==2.21.0 ; extra == 'determined'
243
- Requires-Dist: openai>=2.48.0,<3 ; extra == 'openai'
243
+ Requires-Dist: openai>=2.52.0,<3 ; extra == 'openai'
244
244
  Requires-Dist: tiktoken>=0.13.0,<1 ; extra == 'openai'
245
245
  Requires-Dist: transformers>=4.45.2,<5 ; extra == 'openai'
246
246
  Requires-Dist: transformers>=4.45.2,<5 ; extra == 'optional'
@@ -1,6 +1,6 @@
1
1
  [project]
2
2
  name = "eval-framework"
3
- version = "0.8.4"
3
+ version = "0.8.11"
4
4
  description = "Evaluation Framework"
5
5
  readme = "README.md"
6
6
  license = { file = "LICENSE" }
@@ -21,16 +21,16 @@ dependencies = [
21
21
  "pyyaml>=6.0.3,<7",
22
22
  "xmltodict>=1.0.4,<1.1",
23
23
  "pydantic>=2.13.4,<3",
24
- "datasets>=5.0.0,<6",
24
+ "datasets>=5.0.1,<6",
25
25
  "pycountry>=26.2.16,<27",
26
- "nltk>=3.10.0,<4",
26
+ "nltk>=3.10.1,<4",
27
27
  "python-dotenv>=1.2.2,<2",
28
28
  "lingua-language-detector>=2.2.0,<3",
29
29
  "google-crc32c>=1.8.0,<2",
30
30
  "langdetect>=1.0.9,<2", # required by the original ifeval implementation
31
31
  "spacy>=3.8.14,<4",
32
32
  "jsonschema>=4.26.0,<5",
33
- "mysql-connector-python>=9.7.0,<10", # required for sql-related tasks
33
+ "mysql-connector-python>=26.7.0,<27", # required for sql-related tasks
34
34
  "psycopg2-binary>=2.9.12,<3", # required for sql-related tasks
35
35
  "sympy>=1.14.0,<2",
36
36
  "llm-sandbox[docker]==0.3.39",
@@ -54,7 +54,7 @@ determined = [
54
54
  ]
55
55
  api = ["aleph-alpha-client>=11.5.1"]
56
56
  openai = [
57
- "openai>=2.48.0,<3",
57
+ "openai>=2.52.0,<3",
58
58
  "tiktoken>=0.13.0,<1",
59
59
  "transformers>=4.45.2,<5",
60
60
  ]
@@ -92,7 +92,7 @@ dev = [
92
92
  "types-python-dateutil>=2.9.0.20260716,<3",
93
93
  "types-requests>=2.33.0.20260712,<3",
94
94
  "plotly>=6.9.0,<7",
95
- "ruff>=0.16.0",
95
+ "ruff>=0.16.1",
96
96
  "pip-licenses>=5.5.5",
97
97
  ]
98
98
  flash-attn = [
@@ -68,8 +68,7 @@ class EvaluationGenerator:
68
68
  metric: BaseMetric
69
69
  if issubclass(metric_class, BaseLLMJudgeMetric):
70
70
  if llm_judge is None:
71
- assert self.config.llm_judge_class is not None, "The llm_judge_class must be defined in the config."
72
- llm_judge = self.config.llm_judge_class(**self.config.judge_model_args)
71
+ llm_judge = self.config.llm_judge()
73
72
  metric = metric_class(
74
73
  llm_judge=llm_judge,
75
74
  randomize_order=self.config.randomize_judge_order,
@@ -18,7 +18,7 @@ from eval_framework.context.local import _load_model
18
18
  from eval_framework.result_processors.result_processor import generate_output_dir
19
19
  from eval_framework.run import _run_single_task
20
20
  from eval_framework.tasks.eval_config import EvalConfig
21
- from eval_framework.tasks.registry import is_registered
21
+ from eval_framework.tasks.registry import registry
22
22
 
23
23
  logger = logging.getLogger(__name__)
24
24
 
@@ -108,7 +108,7 @@ class TaskSuite(BaseModel):
108
108
  if isinstance(self.tasks, str):
109
109
  if self.name is None:
110
110
  self.name = self.tasks
111
- if not is_registered(self.tasks):
111
+ if self.tasks not in registry():
112
112
  raise ValueError(f"Task '{self.tasks}' is not registered.")
113
113
  elif not self.tasks:
114
114
  raise ValueError(f"TaskSuite '{self.name}': 'tasks' must not be empty.")
@@ -3,14 +3,13 @@ import json
3
3
  from pathlib import Path
4
4
  from typing import Annotated, Any
5
5
 
6
- from pydantic import AfterValidator, BeforeValidator, Field, field_serializer, field_validator, model_validator
6
+ from pydantic import BeforeValidator, Field, field_serializer, field_validator, model_validator
7
7
 
8
8
  from eval_framework.base_config import BaseConfig
9
9
  from eval_framework.llm.base import BaseLLM
10
10
  from eval_framework.metrics.llm.base import BaseLLMJudgeMetric
11
- from eval_framework.tasks.base import BaseTask
12
11
  from eval_framework.tasks.perturbation import PerturbationConfig
13
- from eval_framework.tasks.registry import get_task, registry, validate_task_name
12
+ from eval_framework.tasks.registry import registry
14
13
  from eval_framework.utils.constants import ROOT_DIR
15
14
 
16
15
  # Keys that don't impact actual evaluation results and should be excluded from config dumps for hashing purposes.
@@ -44,7 +43,7 @@ class EvalConfig(BaseConfig):
44
43
  num_samples: Annotated[int | None, Field(ge=1)] = 10 # Allows None or int
45
44
  max_tokens: int | None = None
46
45
  perturbation_config: PerturbationConfig | None = None
47
- task_name: Annotated[str, AfterValidator(validate_task_name)]
46
+ task_name: str
48
47
  task_subjects: list[str] | None = None
49
48
  hf_revision: str | None = None
50
49
  user_prompt_suffix: str | None = None
@@ -66,9 +65,9 @@ class EvalConfig(BaseConfig):
66
65
  fail_on_error: Annotated[bool, BeforeValidator(lambda v: False if v is None else v)] = False
67
66
  # Adding a new member? Remember to update KEYS_UNRELATED_TO_RESULTS if it doesn't impact eval results.
68
67
 
69
- @property
70
- def task_class(self) -> type[BaseTask]:
71
- return get_task(self.task_name)
68
+ def llm_judge(self) -> BaseLLM:
69
+ assert self.llm_judge_class is not None, "The llm_judge_class must be defined in the config."
70
+ return self.llm_judge_class(**self.judge_model_args)
72
71
 
73
72
  @field_serializer("output_dir")
74
73
  def serialize_output_dir(self, value: Path) -> str:
@@ -136,6 +135,12 @@ class EvalConfig(BaseConfig):
136
135
  return value.__name__
137
136
  return None
138
137
 
138
+ @field_serializer("judge_model_args")
139
+ def serialize_judge_model_args(self, value: dict[str, Any]) -> dict[str, Any]:
140
+ value.pop("api_key", None)
141
+ value.pop("base_url", None)
142
+ return value
143
+
139
144
  def model_json_dump(self) -> str:
140
145
  model_dump = self.model_dump(mode="json")
141
146
  return json.dumps(model_dump, sort_keys=True)
@@ -23,7 +23,6 @@
23
23
  "google-research-datasets/nq_open": "5dd9790a83002ad084ddeb7c420dc716852c6f28",
24
24
  "google/IFEval": "966cd89545d6b6acfd7638bc708b98261ca58e84",
25
25
  "jzhang86/de_ifeval": "4f52d847003b3c83cc282e9d296853a24b34b19a",
26
- "mandarjoshi/trivia_qa": "0f7faf33a3908546c6fd5b73a660e0f8ff173c2f",
27
26
  "math-ai/aime25": "563bb8404243c5f09de6ec262f2db674fe5bce9b",
28
27
  "math-ai/aime26": "79037aebdb6580008fb960d17cb21fd3099083e3",
29
28
  "nuprl/MultiPL-E": "28441b6024e71d4a1c1c0f6bf171c935cd5a43f2",
@@ -2,11 +2,12 @@ import contextlib
2
2
  import importlib
3
3
  import re
4
4
  from abc import ABC, abstractmethod
5
- from collections.abc import Generator, Iterator
5
+ from collections.abc import Generator, Iterator, Sequence
6
6
  from typing import TYPE_CHECKING, Any
7
7
 
8
8
  from eval_framework.tasks.base import BaseTask, ResponseType
9
9
  from eval_framework.tasks.perturbation import PerturbationConfig, create_perturbation_class
10
+ from template_formatting.formatter import BaseFormatter
10
11
 
11
12
  if TYPE_CHECKING:
12
13
  from eval_framework.metrics.base import BaseMetric
@@ -55,10 +56,6 @@ class EvalFactory(ABC):
55
56
  def display_name(self) -> str:
56
57
  """Human-readable display name. Is allowed to have special characters and whitespaces."""
57
58
 
58
- @abstractmethod
59
- def dataset_path(self) -> str | None:
60
- """Identifier of the eval's data source (e.g. a HuggingFace repo id), or None if it has none."""
61
-
62
59
  @abstractmethod
63
60
  def create(
64
61
  self,
@@ -78,6 +75,14 @@ class EvalFactory(ABC):
78
75
  user_prompt_suffix: str | None = None,
79
76
  ) -> BaseTask: ...
80
77
 
78
+ def markdown_doc(self, formatters: Sequence[BaseFormatter]) -> str:
79
+ """Render the eval's documentation as markdown."""
80
+ try:
81
+ task = self.create(num_fewshot=1, custom_subjects=None, custom_hf_revision=None)
82
+ except (TypeError, ValueError, AssertionError):
83
+ task = self.create(num_fewshot=0, custom_subjects=None, custom_hf_revision=None)
84
+ return task.markdown_doc(formatters)
85
+
81
86
 
82
87
  class _Lazy(EvalFactory):
83
88
  """
@@ -147,9 +152,6 @@ class _Lazy(EvalFactory):
147
152
  """The eval's human-readable display name (the task's ``NAME``)."""
148
153
  return self.task_class().NAME
149
154
 
150
- def dataset_path(self) -> str | None:
151
- return getattr(self.task_class(), "DATASET_PATH", None)
152
-
153
155
 
154
156
  class _Eager(EvalFactory):
155
157
  """Wraps an already-imported task class."""
@@ -206,9 +208,6 @@ class _Eager(EvalFactory):
206
208
  """The eval's human-readable display name (the task's ``NAME``)."""
207
209
  return self.task_class().NAME
208
210
 
209
- def dataset_path(self) -> str | None:
210
- return getattr(self.task_class(), "DATASET_PATH", None)
211
-
212
211
 
213
212
  class Registry:
214
213
  """A registry for tasks with support for lazy loading.
@@ -226,6 +225,10 @@ class Registry:
226
225
  for name, _ in self._registry.values():
227
226
  yield name
228
227
 
228
+ def task_names(self) -> list[str]:
229
+ """The names of all registered tasks."""
230
+ return list(self)
231
+
229
232
  def items(self) -> Iterator[tuple[str, EvalFactory]]:
230
233
  """Iterate over `(task name, EvalFactory)` pairs in the registry."""
231
234
  yield from self._registry.values()
@@ -252,10 +255,6 @@ class Registry:
252
255
 
253
256
  return factory
254
257
 
255
- def add(self, task: type[BaseTask]) -> None:
256
- task_key = self._task_key(task.NAME)
257
- self._registry[task_key] = (task.NAME, _Eager(task))
258
-
259
258
  def __setitem__(self, name: str, factory: EvalFactory) -> None:
260
259
  task_key = self._task_key(name)
261
260
  if task_key in self._registry:
@@ -263,6 +262,24 @@ class Registry:
263
262
 
264
263
  self._registry[task_key] = (name, factory)
265
264
 
265
+ def register(self, task: type[BaseTask]) -> str:
266
+ """The class name is used as the task name."""
267
+ if not issubclass(task, BaseTask):
268
+ raise ValueError(f"Can only register subclasses of BaseTask, got {task}")
269
+ name = task.__name__
270
+ self[name] = _Eager(task)
271
+ return name
272
+
273
+ def register_lazy(self, class_path: str, /) -> None:
274
+ """Register a task by its dotted class path, without importing its module."""
275
+ if "." not in class_path:
276
+ raise ValueError(
277
+ f"Invalid class path `{class_path}`. This needs to be a global path like "
278
+ "`eval_framework.tasks.benchmarks.mmlu.MMLU`): "
279
+ )
280
+ base_module, class_name = class_path.rsplit(".", maxsplit=1)
281
+ self[class_name] = _Lazy(class_name=class_name, module=base_module)
282
+
266
283
 
267
284
  _REGISTRY = Registry()
268
285
 
@@ -295,7 +312,7 @@ def is_registered(name: str, /) -> bool:
295
312
 
296
313
  def validate_task_name(name: str) -> str:
297
314
  """Pydantic-style validator for task names."""
298
- if not is_registered(name):
315
+ if name not in registry():
299
316
  raise ValueError(f"Task not registered: {name}")
300
317
  return name
301
318
 
@@ -310,28 +327,9 @@ def get_task(name: str, /) -> type[BaseTask]:
310
327
 
311
328
  def register_task(task: type[BaseTask]) -> str:
312
329
  """The class name is used as the task name."""
313
- if not issubclass(task, BaseTask):
314
- raise ValueError(f"Can only register subclasses of BaseTask, got {task}")
315
- name = task.__name__
316
- _REGISTRY[name] = _Eager(task)
317
- return name
330
+ return registry().register(task)
318
331
 
319
332
 
320
333
  def register_lazy_task(class_path: str, /) -> None:
321
- """Register a task without importing it.
322
-
323
- Lazily register a task without importing the module.
324
-
325
- Args:
326
- class_path: The full path to the task class. For example,
327
- `eval_framework.tasks.benchmarks.mmlu.MMLU`.
328
- extras: Any extra dependencies of `eval_framework` that need to be installed for this task.
329
- """
330
- if "." not in class_path:
331
- raise ValueError(
332
- f"Invalid class path `{class_path}`. This needs to be a global path like "
333
- "`eval_framework.tasks.benchmarks.mmlu.MMLU`): "
334
- )
335
-
336
- base_module, class_name = class_path.rsplit(".", maxsplit=1)
337
- _REGISTRY[class_name] = _Lazy(class_name=class_name, module=base_module)
334
+ """Register a task by its dotted class path, without importing its module."""
335
+ registry().register_lazy(class_path)
@@ -8,7 +8,8 @@ from types import ModuleType
8
8
  from typing import Any
9
9
 
10
10
  from eval_framework.tasks.base import BaseTask
11
- from eval_framework.tasks.registry import is_registered, register_task
11
+ from eval_framework.tasks.registry import Registry
12
+ from eval_framework.tasks.registry import registry as global_registry
12
13
 
13
14
  logger = logging.getLogger(__name__)
14
15
 
@@ -46,14 +47,13 @@ def import_file(f: str | os.PathLike, /) -> Any:
46
47
  return user_module
47
48
 
48
49
 
49
- def load_extra_tasks(module_paths: Sequence[str | os.PathLike]) -> None:
50
+ def load_extra_tasks(module_paths: Sequence[str | os.PathLike], registry: Registry | None = None) -> None:
50
51
  """Dynamically load and register user-defined tasks from a list of files or directories.
51
52
 
52
- Each .py file found will be imported, and any BaseTask subclass will be registered
53
- in the TaskName enum for use by name.
54
- Provides clear error messages for missing/invalid files or import errors.
53
+ Each .py file found is imported, and any BaseTask subclass is registered
55
54
  """
56
55
  assert not (isinstance(module_paths, str)), "module_paths must be a sequence of strings / os.PathLike objects"
56
+ registry = registry if registry is not None else global_registry()
57
57
  for file_path in find_all_python_files(*module_paths):
58
58
  user_module = import_file(file_path)
59
59
 
@@ -63,7 +63,7 @@ def load_extra_tasks(module_paths: Sequence[str | os.PathLike]) -> None:
63
63
  if not hasattr(obj, "NAME"):
64
64
  logger.info(f"[User Task Loader] Skipping {obj.__module__} - no NAME attribute present.")
65
65
  else:
66
- if is_registered(obj.NAME):
66
+ if obj.NAME in registry:
67
67
  # two classes with the same NAME attribute
68
68
  logger.info(obj.__module__)
69
69
 
@@ -77,5 +77,5 @@ def load_extra_tasks(module_paths: Sequence[str | os.PathLike]) -> None:
77
77
  else:
78
78
  # if there is no duplicate name conflict then register the new task
79
79
  class_obj = getattr(user_module, name)
80
- register_task(class_obj)
80
+ registry.register(class_obj)
81
81
  logger.info(f"[User Task Loader] Registered task: {class_obj.NAME}")
@@ -71,8 +71,6 @@ def register_all_tasks() -> None:
71
71
  register_lazy_task("eval_framework.tasks.benchmarks.squad.SQuAD_OLMES")
72
72
  register_lazy_task("eval_framework.tasks.benchmarks.squad.SQuAD2_MA")
73
73
  register_lazy_task("eval_framework.tasks.benchmarks.squad.SQuAD2_MA_NO_SYSPROMPT")
74
- register_lazy_task("eval_framework.tasks.benchmarks.triviaqa.TRIVIAQA")
75
- register_lazy_task("eval_framework.tasks.benchmarks.triviaqa.TriviaQA_MA")
76
74
  register_lazy_task("eval_framework.tasks.benchmarks.winogrande.WINOGRANDECloze")
77
75
  register_lazy_task("eval_framework.tasks.benchmarks.csqa.CommonsenseQAMC_OLMES")
78
76
  register_lazy_task("eval_framework.tasks.benchmarks.drop.DropCompletion_OLMES")
@@ -81,9 +79,3 @@ def register_all_tasks() -> None:
81
79
  register_lazy_task("eval_framework.tasks.benchmarks.naturalqs_open.NaturalQsOpenMC_OLMES")
82
80
  register_lazy_task("eval_framework.tasks.benchmarks.social_iqa.SocialIQAMC_OLMES")
83
81
  register_lazy_task("eval_framework.tasks.benchmarks.medqa.MedQAMC_OLMES")
84
- try:
85
- # Importing the companion registers the additional tasks from the module.
86
- # This is mostly for convenience for internal use-cases
87
- import eval_framework_companion # noqa
88
- except ImportError:
89
- pass
@@ -1,78 +0,0 @@
1
- import random
2
- from typing import Any
3
-
4
- from eval_framework.metrics.completion.accuracy_completion import AccuracyCompletion
5
- from eval_framework.metrics.completion.f1 import F1, F1SquadNormalized
6
- from eval_framework.tasks.base import BaseTask, Language, ResponseType, Sample
7
- from eval_framework.tasks.dataset_revisions import HF_REVISIONS_LOCKFILE
8
-
9
-
10
- class TRIVIAQA(BaseTask[str]):
11
- """Trivia QA dataset: https://huggingface.co/datasets/mandarjoshi/trivia_qa"""
12
-
13
- REVISION_LOCKFILE = HF_REVISIONS_LOCKFILE
14
-
15
- NAME = "TriviaQA"
16
- DATASET_PATH = "mandarjoshi/trivia_qa"
17
- SAMPLE_SPLIT = "validation"
18
- FEWSHOT_SPLIT = "train"
19
- RESPONSE_TYPE = ResponseType.COMPLETION
20
- METRICS = [AccuracyCompletion, F1]
21
- SUBJECTS = ["rc.wikipedia.nocontext"]
22
- PERTURBATION_UNMODIFIABLE_WORDS = ["Question", "Answer"]
23
- LANGUAGE = Language.ENG
24
-
25
- def __init__(self, num_fewshot: int = 0) -> None:
26
- super().__init__(num_fewshot)
27
- self.stop_sequences = ["\n"]
28
- self.max_tokens = 400 # the max length of the ground truth is 282 characters while the average is ~16
29
- self.rnd_choice_shuffle = random.Random()
30
-
31
- def _get_instruction_text(self, item: dict[str, Any]) -> str:
32
- prompt = f"Question: {item['question'].strip()}\nAnswer:"
33
- return prompt
34
-
35
- def _get_fewshot_target_text(self, item: dict[str, Any]) -> str:
36
- target = self._get_ground_truth(item)[0]
37
- assert target is not None
38
- assert isinstance(target, str)
39
- return f" {target}"
40
-
41
- def _get_ground_truth(self, item: dict[str, Any]) -> list[str]:
42
- return item["answer"]["aliases"]
43
-
44
- def post_process_generated_completion(self, completion_text: str, sample: Sample | None = None) -> str:
45
- return completion_text.strip().rstrip(".")
46
-
47
-
48
- class TriviaQA_MA(TRIVIAQA):
49
- """TriviaQA with the exact system prompt used in MA training"""
50
-
51
- REVISION_LOCKFILE = HF_REVISIONS_LOCKFILE
52
-
53
- NAME = "TriviaQA_MA"
54
- SUBJECTS = ["rc.wikipedia"]
55
- UNANSWERABLE_STR = "unanswerable"
56
-
57
- METRICS = [AccuracyCompletion, F1, F1SquadNormalized]
58
- PERTURBATION_UNMODIFIABLE_WORDS = ["Question", "Answer", "Context", "unanswerable"]
59
-
60
- def __init__(self, num_fewshot: int = 0) -> None:
61
- super().__init__(num_fewshot)
62
- self.stop_sequences = []
63
- self.max_tokens = 27_000
64
-
65
- def _get_context_text(self, item: dict[str, Any]) -> str:
66
- return "\n\n".join(item["entity_pages"]["wiki_context"])
67
-
68
- def _get_system_prompt_text(self, item: dict[str, Any]) -> str | None:
69
- return (
70
- "You are a helpful assistant and will answer the user's questions carefully, "
71
- "logically, accurately and well-reasoned.\n"
72
- "Use the given context to answer the question faithfully. Answer only if the "
73
- f"answer is present in the given context, otherwise respond with '{self.UNANSWERABLE_STR}' "
74
- "if the answer is not present in the context."
75
- )
76
-
77
- def _get_instruction_text(self, item: dict[str, Any]) -> str:
78
- return f"Context:\n{self._get_context_text(item)}\n\nQuestion:\n{item['question'].strip()}\n"
@@ -1,153 +0,0 @@
1
- import argparse
2
- import os
3
- from pathlib import Path
4
-
5
- import tqdm
6
-
7
- from eval_framework.tasks.registry import registered_task_names, registry
8
- from eval_framework.tasks.task_loader import load_extra_tasks
9
- from template_formatting.formatter import BaseFormatter, ConcatFormatter, Llama3Formatter
10
-
11
- DEFAULT_OUTPUT_DOCS_DIRECTORY = Path("docs/tasks")
12
-
13
- EXCLUDED_TASKS: list[str] = []
14
-
15
- # Base URL for the main repository to ensure links work even in external/companion repos
16
- REPO_URL = "https://github.com/Aleph-Alpha-Research/eval-framework/blob/main"
17
-
18
-
19
- def parse_args(cli_args: list[str] | None = None) -> argparse.Namespace:
20
- """Parse command line arguments for the script."""
21
-
22
- parser = argparse.ArgumentParser()
23
- parser.add_argument(
24
- "--add-prompt-examples",
25
- action="store_true",
26
- default=False,
27
- required=False,
28
- help="Unused. Only there for backwards compatibility",
29
- )
30
- parser.add_argument(
31
- "--exclude-tasks",
32
- nargs="*",
33
- type=str,
34
- default=[],
35
- required=False,
36
- help="List of task names to exclude from documentation generation.",
37
- )
38
- parser.add_argument(
39
- "--extra-task-modules",
40
- nargs="*",
41
- type=str,
42
- default=[],
43
- required=False,
44
- help="List of files and folders containing additional task definitions.",
45
- )
46
- parser.add_argument(
47
- "--formatter",
48
- nargs="*",
49
- type=str,
50
- required=False,
51
- default=["ConcatFormatter", "Llama3Formatter"],
52
- help="Specify which formatter to use for formatting the task samples. "
53
- "If not explicitly specified, default formatters will be used.",
54
- )
55
- parser.add_argument(
56
- "--only-tasks",
57
- nargs="*",
58
- type=str,
59
- default=[],
60
- required=False,
61
- help="List of task names to generate documentation for. If empty, all tasks will be processed.",
62
- )
63
- return parser.parse_args(args=cli_args)
64
-
65
-
66
- def generate_docs_for_task(output_docs_directory: Path, task_name: str, formatters: list[BaseFormatter]) -> None:
67
- """Generate documentation for a specific task."""
68
- task_class = registry()[task_name].task_class()
69
-
70
- try:
71
- task = task_class(num_fewshot=1)
72
- except (TypeError, ValueError, AssertionError):
73
- task = task_class(num_fewshot=0)
74
-
75
- (output_docs_directory / f"{task_name}.md").write_text(task.markdown_doc(formatters), encoding="utf-8")
76
-
77
-
78
- def generate_readme_list(output_docs_directory: Path, total_tasks: int) -> None:
79
- """Generate a README file listing all tasks with total count."""
80
-
81
- with open(f"{output_docs_directory}/README.md", "w") as f:
82
- f.write(
83
- "# Task documentation\n\n"
84
- "This directory contains the generated documentation for all benchmark tasks available in the package.\n\n"
85
- f"**Total number of tasks: {total_tasks}**\n\n"
86
- "The documentation can be generated or updated with "
87
- "`uv run -m eval_framework.utils.generate_task_docs`.\n\n"
88
- "NOTE: This is an automatically generated file. Any manual modifications will not be preserved when "
89
- "the file is updated.\n\n"
90
- )
91
-
92
- f.write("## List of tasks\n\n")
93
- # sort files alphabetically and ignore README.md
94
- for file in sorted(os.listdir(output_docs_directory)):
95
- if file.endswith(".md") and file != "README.md":
96
- task_name = file[:-3]
97
- f.write(f"- [{task_name}]({task_name}.md)\n")
98
-
99
-
100
- def generate_all_docs(args: argparse.Namespace, output_docs_directory: Path) -> None:
101
- # Load extra tasks if specified
102
- if args.extra_task_modules:
103
- print(f"Loading extra tasks from: {args.extra_task_modules}")
104
- load_extra_tasks(args.extra_task_modules)
105
-
106
- # List the tasks to process
107
- filtered_tasks = []
108
- for task_name in registered_task_names():
109
- if args.only_tasks and task_name not in args.only_tasks:
110
- continue
111
- if task_name in args.exclude_tasks or task_name in EXCLUDED_TASKS:
112
- continue
113
- filtered_tasks.append(task_name)
114
- filtered_tasks.sort()
115
-
116
- print(f"Found {len(filtered_tasks)} tasks to process: {', '.join([task_name for task_name in filtered_tasks])}")
117
-
118
- # List the formatters to use
119
- supported_formatters = {f.__class__.__name__: f for f in [ConcatFormatter(), Llama3Formatter()]}
120
- formatters = []
121
- for f in args.formatter:
122
- if f in supported_formatters:
123
- formatters.append(supported_formatters[f])
124
- else:
125
- raise ValueError(f"Unsupported formatter: {f}")
126
-
127
- # Create the output directory if it does not exist
128
- os.makedirs(output_docs_directory, exist_ok=True)
129
-
130
- for task_name in tqdm.tqdm(filtered_tasks, desc="Generating documentation for tasks"):
131
- try:
132
- generate_docs_for_task(
133
- output_docs_directory=output_docs_directory,
134
- task_name=task_name,
135
- formatters=formatters,
136
- )
137
-
138
- except Exception as e:
139
- print("---")
140
- print(f"failed generating documentation for task {task_name}: {e}")
141
- file_path = f"{output_docs_directory}/{task_name}.md"
142
- if os.path.exists(file_path):
143
- os.remove(file_path)
144
- print("---")
145
-
146
- # Pass the total number of processed tasks to the README generator
147
- generate_readme_list(output_docs_directory=output_docs_directory, total_tasks=len(filtered_tasks))
148
-
149
-
150
- if __name__ == "__main__":
151
- print("Generating task documentation...")
152
- args = parse_args()
153
- generate_all_docs(args, output_docs_directory=DEFAULT_OUTPUT_DOCS_DIRECTORY)
File without changes