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.
- {eval_framework-0.10.0 → eval_framework-0.10.6}/PKG-INFO +5 -7
- {eval_framework-0.10.0 → eval_framework-0.10.6}/README.md +0 -2
- eval_framework-0.10.6/pyproject.toml +162 -0
- eval_framework-0.10.0/pyproject.toml → eval_framework-0.10.6/pyproject.toml.orig +9 -9
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/evaluation_generator.py +1 -17
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/aleph_alpha.py +19 -19
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/huggingface.py +9 -9
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/openai.py +14 -11
- eval_framework-0.10.6/src/eval_framework/metrics/efficiency/token_counters.py +38 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/response_generator.py +4 -4
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/shared/types.py +19 -11
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/base.py +93 -56
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/humaneval.py +29 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/humaneval_ellamind.py +30 -1
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/eval_config.py +1 -3
- eval_framework-0.10.6/src/eval_framework/tasks/lazy.py +56 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/markdown_doc.py +0 -3
- eval_framework-0.10.6/src/eval_framework/tasks/registry.py +164 -0
- eval_framework-0.10.6/src/eval_framework/tasks/task.py +104 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/task_names.py +4 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/template_formatting/formatter.py +8 -6
- eval_framework-0.10.0/src/eval_framework/tasks/registry.py +0 -310
- {eval_framework-0.10.0 → eval_framework-0.10.6}/LICENSE +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/base_config.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/context/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/context/determined.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/context/eval.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/context/local.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/exceptions.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/drop_process_results.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/README.md +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/instructions.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/instructions_registry.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/instructions_util.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/external/ifeval_impl/utils.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/base.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/llm/models.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/logger.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/main.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/aggregators/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/aggregators/aggregators.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/base.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/accuracy_completion.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/code_assertion.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/code_execution_pass_at_one.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/concordance_index.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/csv_format.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/drop_completion.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/exponential_similarity.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/f1.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/format_checker.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/grid_difference.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/ifeval.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/json_format.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/language_checker.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/length_control.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/math_minerva_completion.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/math_reasoning_completion.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/minerva_math_utils.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/multipl_e_assertion.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/placeholder_checker.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/repetition.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_1.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_2.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_geometric_mean.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/rouge_l.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/completion/text_counter.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/efficiency/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/efficiency/bytes_per_sequence_position.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/base.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/chatbot_style_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/coherence_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/comparison_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/conciseness_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/contains_names_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/format_correctness_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/instruction_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/language.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/long_context_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/models.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/refusal_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/sql_quality_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/graders/summary_world_knowledge_grader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_chatbot_style.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_coherence.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_completion_accuracy.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_conciseness.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_contains_names.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_format_correctness.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_instruction.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_mtbench_pair.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_mtbench_single.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_refusal.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_sql.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/llm_judge_world_knowledge.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/llm/utils.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/accuracy_loglikelihood.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/base.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/bits_per_byte.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/confidence_weighted_accuracy.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/dcs.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/probability_mass.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/metrics/loglikelihood/ternary.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/py.typed +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/base.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/hf_uploader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/result_processor.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/result_processors/wandb_uploader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/run.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/run_direct.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/suite.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/Dockerfile_codebench +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/arc.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/arc_de.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/arc_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/bigcodebench.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/copa.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/csqa.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/csqa_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/drop.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/global_mmlu.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/goldenswag.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gpqa.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gpqa_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gsm8k.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/gsm8k_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hellaswag.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hellaswag_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hendrycks_math_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/hle_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/ifeval.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/math_reasoning.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mbpp.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mbpp_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/medqa.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mmlu.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/mmlu_pro.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/multipl_e.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/naturalqs_open.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/piqa.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/piqa_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/sciq.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/simpleqa_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/siqa_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/social_iqa.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/squad.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/winogrande.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/benchmarks/winogrande_ellamind.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/dataset_revisions.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/frozen-hf-dataset-revisions.json +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/hf-dataset-revisions.json +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/task_loader.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/task_style.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/tasks/utils.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/constants.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/file_ops.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/helpers.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/logging.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/packaging.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/eval_framework/utils/tqdm_handler.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/template_formatting/README.md +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/template_formatting/__init__.py +0 -0
- {eval_framework-0.10.0 → eval_framework-0.10.6}/src/template_formatting/mistral_formatter.py +0 -0
- {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.
|
|
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.
|
|
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.
|
|
235
|
-
Requires-Dist: boto3>=1.43.
|
|
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>=
|
|
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.
|
|
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.
|
|
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.
|
|
42
|
-
"boto3>=1.43.
|
|
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>=
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
168
|
+
prompt_num_tokens=None,
|
|
169
169
|
completion="",
|
|
170
|
-
|
|
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
|
-
|
|
177
|
-
|
|
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
|
-
|
|
185
|
-
|
|
184
|
+
prompt_num_tokens = int(num_input_tokens)
|
|
185
|
+
completion_num_tokens = int(num_completion_tokens)
|
|
186
186
|
else:
|
|
187
|
-
|
|
188
|
-
|
|
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
|
-
|
|
192
|
+
prompt_num_tokens=prompt_num_tokens,
|
|
193
193
|
completion=completion,
|
|
194
|
-
|
|
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
|
-
|
|
258
|
-
|
|
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
|
-
|
|
270
|
+
prompt_num_tokens = None
|
|
271
271
|
choices_log_probs = {}
|
|
272
|
-
|
|
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
|
-
|
|
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
|
-
|
|
297
|
+
prompt_num_tokens = None
|
|
298
298
|
choices_log_probs = {}
|
|
299
|
-
|
|
299
|
+
choices_num_tokens = {}
|
|
300
300
|
|
|
301
301
|
results.append(
|
|
302
302
|
RawLoglikelihood(
|
|
303
303
|
prompt=prompt,
|
|
304
|
-
|
|
304
|
+
prompt_num_tokens=prompt_num_tokens,
|
|
305
305
|
loglikelihoods=choices_log_probs,
|
|
306
|
-
|
|
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
|
-
|
|
199
|
+
prompt_num_tokens=prompt_token_count,
|
|
200
200
|
completion="",
|
|
201
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
280
|
-
|
|
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
|
-
|
|
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
|
-
|
|
327
|
+
prompt_num_tokens = None
|
|
325
328
|
choices_log_probs = {}
|
|
326
|
-
|
|
329
|
+
choices_num_tokens = {}
|
|
327
330
|
|
|
328
331
|
results.append(
|
|
329
332
|
RawLoglikelihood(
|
|
330
333
|
prompt=prompt,
|
|
331
|
-
|
|
334
|
+
prompt_num_tokens=prompt_num_tokens,
|
|
332
335
|
loglikelihoods=choices_log_probs,
|
|
333
|
-
|
|
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
|
-
|
|
113
|
+
prompt_num_tokens=0,
|
|
114
114
|
loglikelihoods={},
|
|
115
|
-
|
|
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
|
-
|
|
135
|
+
prompt_num_tokens=raw_loglikelihood.prompt_num_tokens,
|
|
136
136
|
concat_compression=raw_loglikelihood.concat_compression,
|
|
137
137
|
loglikelihoods=raw_loglikelihood.loglikelihoods,
|
|
138
|
-
|
|
138
|
+
loglikelihoods_num_tokens=raw_loglikelihood.loglikelihoods_num_tokens,
|
|
139
139
|
error=raw_loglikelihood.raw_loglikelihood_error,
|
|
140
140
|
)
|
|
141
141
|
)
|