refactor: move evals/ into src/openjarvis/evals/ as proper subpackage

Move the standalone evals framework from the project root into the
openjarvis package. Rewrite all ~50+ import statements from 'from evals.'
to 'from openjarvis.evals.' across the package, CLI, and tests. Remove
the evals-specific pyproject.toml (no longer a standalone package).
Update ruff per-file-ignores paths and fix line-length violations
introduced by the longer import paths.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Jon Saad-Falcon
2026-03-02 21:06:08 +00:00
co-authored by Claude Opus 4.6
parent 99d8f39613
commit a9518e1574
69 changed files with 212 additions and 230 deletions
-6
View File
@@ -1,6 +0,0 @@
"""Allow running as ``python -m evals``."""
from evals.cli import main
if __name__ == "__main__":
main()
-24
View File
@@ -1,24 +0,0 @@
[project]
name = "openjarvis-evals"
version = "0.1.0"
description = "Evaluation framework for OpenJarvis"
requires-python = ">=3.10"
dependencies = [
"openjarvis>=1.0.0",
"click>=8",
"datasets>=2.14",
"huggingface-hub>=0.20",
"tqdm>=4.65",
"rich>=13",
"tomli>=2.0; python_version < '3.11'",
]
[project.optional-dependencies]
dev = ["pytest>=8", "pytest-cov>=5"]
[project.scripts]
openjarvis-eval = "evals.cli:main"
[build-system]
requires = ["hatchling"]
build-backend = "hatchling.build"
+2 -2
View File
@@ -132,5 +132,5 @@ src = ["src", "tests"]
select = ["E", "F", "I", "W"]
[tool.ruff.lint.per-file-ignores]
"evals/datasets/*.py" = ["E501"]
"evals/scorers/*.py" = ["E501"]
"src/openjarvis/evals/datasets/*.py" = ["E501"]
"src/openjarvis/evals/scorers/*.py" = ["E501"]
+4 -4
View File
@@ -135,7 +135,7 @@ def eval_run(
# Config-driven mode: load TOML suite, expand, run all
if config_path is not None:
try:
from evals.core.config import expand_suite, load_eval_config
from openjarvis.evals.core.config import expand_suite, load_eval_config
except ImportError:
console.print(
"[red]Eval framework not available. "
@@ -159,7 +159,7 @@ def eval_run(
)
try:
from evals.cli import _run_single
from openjarvis.evals.cli import _run_single
except ImportError:
console.print(
"[red]Eval CLI module not available.[/red]"
@@ -195,7 +195,7 @@ def eval_run(
)
try:
from evals.core.types import RunConfig
from openjarvis.evals.core.types import RunConfig
except ImportError:
console.print(
"[red]Eval framework not available. "
@@ -219,7 +219,7 @@ def eval_run(
)
try:
from evals.cli import _run_single
from openjarvis.evals.cli import _run_single
console.print(
f"[cyan]Benchmark:[/cyan] {benchmark}\n"
+6
View File
@@ -0,0 +1,6 @@
"""Allow running as ``python -m openjarvis.evals``."""
from openjarvis.evals.cli import main
if __name__ == "__main__":
main()
@@ -5,7 +5,7 @@ from __future__ import annotations
import time
from typing import Any, Dict, List, Optional
from evals.core.backend import InferenceBackend
from openjarvis.evals.core.backend import InferenceBackend
class JarvisAgentBackend(InferenceBackend):
@@ -5,7 +5,7 @@ from __future__ import annotations
import time
from typing import Any, Dict, Optional
from evals.core.backend import InferenceBackend
from openjarvis.evals.core.backend import InferenceBackend
class JarvisDirectBackend(InferenceBackend):
+40 -38
View File
@@ -17,7 +17,7 @@ from rich.progress import (
TimeRemainingColumn,
)
from evals.core.display import (
from openjarvis.evals.core.display import (
print_banner,
print_completion,
print_full_results,
@@ -72,7 +72,7 @@ def _build_backend(backend_name: str, engine_key: Optional[str],
telemetry: bool = False, gpu_metrics: bool = False):
"""Construct the appropriate backend."""
if backend_name == "jarvis-agent":
from evals.backends.jarvis_agent import JarvisAgentBackend
from openjarvis.evals.backends.jarvis_agent import JarvisAgentBackend
return JarvisAgentBackend(
engine_key=engine_key,
agent_name=agent_name,
@@ -81,7 +81,7 @@ def _build_backend(backend_name: str, engine_key: Optional[str],
gpu_metrics=gpu_metrics,
)
else:
from evals.backends.jarvis_direct import JarvisDirectBackend
from openjarvis.evals.backends.jarvis_direct import JarvisDirectBackend
return JarvisDirectBackend(
engine_key=engine_key,
telemetry=telemetry,
@@ -92,49 +92,51 @@ def _build_backend(backend_name: str, engine_key: Optional[str],
def _build_dataset(benchmark: str):
"""Construct the dataset provider for a benchmark."""
if benchmark == "supergpqa":
from evals.datasets.supergpqa import SuperGPQADataset
from openjarvis.evals.datasets.supergpqa import SuperGPQADataset
return SuperGPQADataset()
elif benchmark == "gpqa":
from evals.datasets.gpqa import GPQADataset
from openjarvis.evals.datasets.gpqa import GPQADataset
return GPQADataset()
elif benchmark == "mmlu-pro":
from evals.datasets.mmlu_pro import MMLUProDataset
from openjarvis.evals.datasets.mmlu_pro import MMLUProDataset
return MMLUProDataset()
elif benchmark == "math500":
from evals.datasets.math500 import MATH500Dataset
from openjarvis.evals.datasets.math500 import MATH500Dataset
return MATH500Dataset()
elif benchmark == "natural-reasoning":
from evals.datasets.natural_reasoning import NaturalReasoningDataset
from openjarvis.evals.datasets.natural_reasoning import NaturalReasoningDataset
return NaturalReasoningDataset()
elif benchmark == "hle":
from evals.datasets.hle import HLEDataset
from openjarvis.evals.datasets.hle import HLEDataset
return HLEDataset()
elif benchmark == "simpleqa":
from evals.datasets.simpleqa import SimpleQADataset
from openjarvis.evals.datasets.simpleqa import SimpleQADataset
return SimpleQADataset()
elif benchmark == "wildchat":
from evals.datasets.wildchat import WildChatDataset
from openjarvis.evals.datasets.wildchat import WildChatDataset
return WildChatDataset()
elif benchmark == "ipw":
from evals.datasets.ipw_mixed import IPWDataset
from openjarvis.evals.datasets.ipw_mixed import IPWDataset
return IPWDataset()
elif benchmark == "gaia":
from evals.datasets.gaia import GAIADataset
from openjarvis.evals.datasets.gaia import GAIADataset
return GAIADataset()
elif benchmark == "frames":
from evals.datasets.frames import FRAMESDataset
from openjarvis.evals.datasets.frames import FRAMESDataset
return FRAMESDataset()
elif benchmark == "swebench":
from evals.datasets.swebench import SWEBenchDataset
from openjarvis.evals.datasets.swebench import SWEBenchDataset
return SWEBenchDataset()
elif benchmark == "swefficiency":
from evals.datasets.swefficiency import SWEfficiencyDataset
from openjarvis.evals.datasets.swefficiency import SWEfficiencyDataset
return SWEfficiencyDataset()
elif benchmark == "terminalbench":
from evals.datasets.terminalbench import TerminalBenchDataset
from openjarvis.evals.datasets.terminalbench import TerminalBenchDataset
return TerminalBenchDataset()
elif benchmark == "terminalbench-native":
from evals.datasets.terminalbench_native import TerminalBenchNativeDataset
from openjarvis.evals.datasets.terminalbench_native import (
TerminalBenchNativeDataset,
)
return TerminalBenchNativeDataset()
else:
raise click.ClickException(f"Unknown benchmark: {benchmark}")
@@ -143,46 +145,46 @@ def _build_dataset(benchmark: str):
def _build_scorer(benchmark: str, judge_backend, judge_model: str):
"""Construct the scorer for a benchmark."""
if benchmark == "supergpqa":
from evals.scorers.supergpqa_mcq import SuperGPQAScorer
from openjarvis.evals.scorers.supergpqa_mcq import SuperGPQAScorer
return SuperGPQAScorer(judge_backend, judge_model)
elif benchmark == "gpqa":
from evals.scorers.gpqa_mcq import GPQAScorer
from openjarvis.evals.scorers.gpqa_mcq import GPQAScorer
return GPQAScorer(judge_backend, judge_model)
elif benchmark == "mmlu-pro":
from evals.scorers.mmlu_pro_mcq import MMLUProScorer
from openjarvis.evals.scorers.mmlu_pro_mcq import MMLUProScorer
return MMLUProScorer(judge_backend, judge_model)
elif benchmark == "math500" or benchmark == "natural-reasoning":
from evals.scorers.reasoning_judge import ReasoningJudgeScorer
from openjarvis.evals.scorers.reasoning_judge import ReasoningJudgeScorer
return ReasoningJudgeScorer(judge_backend, judge_model)
elif benchmark == "hle":
from evals.scorers.hle_judge import HLEScorer
from openjarvis.evals.scorers.hle_judge import HLEScorer
return HLEScorer(judge_backend, judge_model)
elif benchmark == "simpleqa":
from evals.scorers.simpleqa_judge import SimpleQAScorer
from openjarvis.evals.scorers.simpleqa_judge import SimpleQAScorer
return SimpleQAScorer(judge_backend, judge_model)
elif benchmark == "wildchat":
from evals.scorers.wildchat_judge import WildChatScorer
from openjarvis.evals.scorers.wildchat_judge import WildChatScorer
return WildChatScorer(judge_backend, judge_model)
elif benchmark == "ipw":
from evals.scorers.ipw_mixed import IPWMixedScorer
from openjarvis.evals.scorers.ipw_mixed import IPWMixedScorer
return IPWMixedScorer(judge_backend, judge_model)
elif benchmark == "gaia":
from evals.scorers.gaia_exact import GAIAScorer
from openjarvis.evals.scorers.gaia_exact import GAIAScorer
return GAIAScorer(judge_backend, judge_model)
elif benchmark == "frames":
from evals.scorers.frames_judge import FRAMESScorer
from openjarvis.evals.scorers.frames_judge import FRAMESScorer
return FRAMESScorer(judge_backend, judge_model)
elif benchmark == "swebench":
from evals.scorers.swebench_structural import SWEBenchScorer
from openjarvis.evals.scorers.swebench_structural import SWEBenchScorer
return SWEBenchScorer(judge_backend, judge_model)
elif benchmark == "swefficiency":
from evals.scorers.swefficiency_structural import SWEfficiencyScorer
from openjarvis.evals.scorers.swefficiency_structural import SWEfficiencyScorer
return SWEfficiencyScorer(judge_backend, judge_model)
elif benchmark == "terminalbench":
from evals.scorers.terminalbench_judge import TerminalBenchScorer
from openjarvis.evals.scorers.terminalbench_judge import TerminalBenchScorer
return TerminalBenchScorer(judge_backend, judge_model)
elif benchmark == "terminalbench-native":
from evals.scorers.terminalbench_native_structural import (
from openjarvis.evals.scorers.terminalbench_native_structural import (
TerminalBenchNativeScorer,
)
return TerminalBenchNativeScorer(judge_backend, judge_model)
@@ -192,7 +194,7 @@ def _build_scorer(benchmark: str, judge_backend, judge_model: str):
def _build_judge_backend(judge_model: str):
"""Build the judge backend (always cloud for LLM-as-judge)."""
from evals.backends.jarvis_direct import JarvisDirectBackend
from openjarvis.evals.backends.jarvis_direct import JarvisDirectBackend
return JarvisDirectBackend(engine_key="cloud")
@@ -217,7 +219,7 @@ def _print_summary(
def _run_single(config, console: Optional[Console] = None) -> object:
"""Run a single eval from a RunConfig and return the summary."""
from evals.core.runner import EvalRunner
from openjarvis.evals.core.runner import EvalRunner
if console is None:
console = Console()
@@ -264,7 +266,7 @@ def _run_single(config, console: Optional[Console] = None) -> object:
def _run_from_config(config_path: str, verbose: bool) -> None:
"""Load a TOML config and run the full models x benchmarks matrix."""
from evals.core.config import expand_suite, load_eval_config
from openjarvis.evals.core.config import expand_suite, load_eval_config
console = Console()
@@ -381,7 +383,7 @@ def run(ctx, config_path, benchmark, backend, model, engine_key, agent_name,
"(required when --config is not provided)"
)
from evals.core.types import RunConfig
from openjarvis.evals.core.types import RunConfig
tool_list = [t.strip() for t in tools.split(",") if t.strip()] if tools else []
@@ -451,8 +453,8 @@ def run_all(model, engine_key, max_samples, max_workers, judge_model,
"""Run all benchmarks."""
_setup_logging(verbose)
from evals.core.runner import EvalRunner
from evals.core.types import RunConfig
from openjarvis.evals.core.runner import EvalRunner
from openjarvis.evals.core.types import RunConfig
console = Console()
@@ -7,7 +7,7 @@ import sys
from pathlib import Path
from typing import List
from evals.core.types import (
from openjarvis.evals.core.types import (
BenchmarkConfig,
DefaultsConfig,
EvalSuiteConfig,
@@ -5,7 +5,7 @@ from __future__ import annotations
from abc import ABC, abstractmethod
from typing import Iterable, Optional
from evals.core.types import EvalRecord
from openjarvis.evals.core.types import EvalRecord
class DatasetProvider(ABC):
@@ -12,7 +12,7 @@ from rich.table import Table
if TYPE_CHECKING:
from pathlib import Path
from evals.core.types import MetricStats, RunSummary
from openjarvis.evals.core.types import MetricStats, RunSummary
OPENJARVIS_BANNER = r"""
___ _ _
@@ -11,10 +11,10 @@ from concurrent.futures import ThreadPoolExecutor, as_completed
from pathlib import Path
from typing import Any, Callable, Dict, List, Optional
from evals.core.backend import InferenceBackend
from evals.core.dataset import DatasetProvider
from evals.core.scorer import Scorer
from evals.core.types import EvalRecord, EvalResult, MetricStats, RunConfig, RunSummary
from openjarvis.evals.core.backend import InferenceBackend
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.scorer import Scorer
from openjarvis.evals.core.types import EvalRecord, EvalResult, MetricStats, RunConfig, RunSummary
try:
from openjarvis.telemetry.efficiency import compute_efficiency
@@ -5,8 +5,8 @@ from __future__ import annotations
from abc import ABC, abstractmethod
from typing import Any, Dict, Optional, Tuple
from evals.core.backend import InferenceBackend
from evals.core.types import EvalRecord
from openjarvis.evals.core.backend import InferenceBackend
from openjarvis.evals.core.types import EvalRecord
class Scorer(ABC):
@@ -8,8 +8,8 @@ from __future__ import annotations
import random
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
_DEFAULT_INPUT_PROMPT = """Please answer the question below. You should:
@@ -11,8 +11,8 @@ import shutil
from pathlib import Path
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
_DEFAULT_CACHE_DIR = Path.home() / ".cache" / "gaia_benchmark"
@@ -8,8 +8,8 @@ from __future__ import annotations
import random
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
def _format_options(options: Iterable[str]) -> str:
@@ -8,8 +8,8 @@ from __future__ import annotations
import random
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
# Fields whose presence signals a multimodal row.
_MULTIMODAL_FIELDS = frozenset(
@@ -13,8 +13,8 @@ import random
from pathlib import Path
from typing import Any, Dict, Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -8,8 +8,8 @@ from __future__ import annotations
import random
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
_PROMPT_TEMPLATE = (
"Solve the following math problem step by step. "
@@ -8,8 +8,8 @@ from __future__ import annotations
import random
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
def _format_options(options: Iterable[str]) -> str:
@@ -8,8 +8,8 @@ from __future__ import annotations
import random
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
_PROMPT_TEMPLATE = (
"Please solve the following reasoning problem. "
@@ -9,8 +9,8 @@ import ast
import random
from typing import Any, Dict, Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
_PROMPT_TEMPLATE = """Please answer the following question with a short, factual response.
Your answer should be a word, phrase, name, number, or date.
@@ -8,8 +8,8 @@ from __future__ import annotations
import random
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
def _format_options(options: Iterable[str]) -> str:
@@ -9,8 +9,8 @@ import json
import random
from typing import Any, Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
_HF_PATHS = {
"verified": "princeton-nlp/SWE-bench_Verified",
@@ -9,8 +9,8 @@ import json
import random
from typing import Any, Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
_HF_PATH = "swefficiency/swefficiency"
@@ -8,8 +8,8 @@ from __future__ import annotations
import random
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
try:
from datasets import load_dataset as _load_dataset # noqa: F401
@@ -10,8 +10,8 @@ import random
from pathlib import Path
from typing import Any, Dict, Iterable, List, Optional
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
try:
from terminal_bench import Task, TaskPaths
@@ -8,8 +8,8 @@ from __future__ import annotations
import random
from typing import Iterable, List, MutableMapping, Optional, Sequence
from evals.core.dataset import DatasetProvider
from evals.core.types import EvalRecord
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.types import EvalRecord
class WildChatDataset(DatasetProvider):
@@ -9,8 +9,8 @@ import logging
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -10,8 +10,8 @@ import re
import string
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -9,8 +9,8 @@ import logging
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -11,9 +11,9 @@ import logging
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from evals.scorers.reasoning_judge import reasoning_exact_match
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
from openjarvis.evals.scorers.reasoning_judge import reasoning_exact_match
LOGGER = logging.getLogger(__name__)
@@ -11,8 +11,8 @@ import logging
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -9,8 +9,8 @@ import logging
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -11,8 +11,8 @@ import re
import string
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -11,8 +11,8 @@ import re
import string
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -9,8 +9,8 @@ import logging
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -11,8 +11,8 @@ from __future__ import annotations
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import Scorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import Scorer
from openjarvis.evals.core.types import EvalRecord
_DIFF_MARKERS = [
r"^---\s",
@@ -12,8 +12,8 @@ from __future__ import annotations
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import Scorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import Scorer
from openjarvis.evals.core.types import EvalRecord
_DIFF_MARKERS = [
r"^---\s",
@@ -10,8 +10,8 @@ import logging
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -9,8 +9,8 @@ from __future__ import annotations
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import Scorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import Scorer
from openjarvis.evals.core.types import EvalRecord
class TerminalBenchNativeScorer(Scorer):
@@ -9,8 +9,8 @@ import logging
import re
from typing import Any, Dict, Optional, Tuple
from evals.core.scorer import LLMJudgeScorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.scorer import LLMJudgeScorer
from openjarvis.evals.core.types import EvalRecord
LOGGER = logging.getLogger(__name__)
@@ -11,10 +11,10 @@ import pytest
# Ensure evals package is importable from the repo root
sys.path.insert(0, str(Path(__file__).resolve().parent.parent.parent))
from evals.core.backend import InferenceBackend
from evals.core.dataset import DatasetProvider
from evals.core.scorer import Scorer
from evals.core.types import EvalRecord
from openjarvis.evals.core.backend import InferenceBackend
from openjarvis.evals.core.dataset import DatasetProvider
from openjarvis.evals.core.scorer import Scorer
from openjarvis.evals.core.types import EvalRecord
# ---------------------------------------------------------------------------
# Mock backend
@@ -16,7 +16,7 @@ class TestJarvisDirectBackend:
mock_builder.build.return_value = mock_system
mock_builder_cls.return_value = mock_builder
from evals.backends.jarvis_direct import JarvisDirectBackend
from openjarvis.evals.backends.jarvis_direct import JarvisDirectBackend
backend = JarvisDirectBackend()
assert backend.backend_id == "jarvis-direct"
@@ -33,7 +33,7 @@ class TestJarvisDirectBackend:
mock_builder.build.return_value = MagicMock()
mock_builder_cls.return_value = mock_builder
from evals.backends.jarvis_direct import JarvisDirectBackend
from openjarvis.evals.backends.jarvis_direct import JarvisDirectBackend
JarvisDirectBackend(engine_key="cloud")
mock_builder.engine.assert_called_with("cloud")
@@ -54,7 +54,7 @@ class TestJarvisDirectBackend:
mock_builder.build.return_value = mock_system
mock_builder_cls.return_value = mock_builder
from evals.backends.jarvis_direct import JarvisDirectBackend
from openjarvis.evals.backends.jarvis_direct import JarvisDirectBackend
backend = JarvisDirectBackend()
result = backend.generate_full("What is 2+2?", model="test-model")
@@ -77,7 +77,7 @@ class TestJarvisDirectBackend:
mock_builder.build.return_value = mock_system
mock_builder_cls.return_value = mock_builder
from evals.backends.jarvis_direct import JarvisDirectBackend
from openjarvis.evals.backends.jarvis_direct import JarvisDirectBackend
backend = JarvisDirectBackend()
text = backend.generate("Capital of France?", model="m")
@@ -96,7 +96,7 @@ class TestJarvisAgentBackend:
mock_builder.build.return_value = MagicMock()
mock_builder_cls.return_value = mock_builder
from evals.backends.jarvis_agent import JarvisAgentBackend
from openjarvis.evals.backends.jarvis_agent import JarvisAgentBackend
backend = JarvisAgentBackend(
engine_key="cloud", agent_name="orchestrator",
@@ -128,7 +128,7 @@ class TestJarvisAgentBackend:
mock_builder.build.return_value = mock_system
mock_builder_cls.return_value = mock_builder
from evals.backends.jarvis_agent import JarvisAgentBackend
from openjarvis.evals.backends.jarvis_agent import JarvisAgentBackend
backend = JarvisAgentBackend(agent_name="orchestrator")
result = backend.generate_full("What is 2+2?", model="gpt-4o")
@@ -4,7 +4,7 @@ from __future__ import annotations
from click.testing import CliRunner
from evals.cli import main
from openjarvis.evals.cli import main
class TestCompactFlag:
@@ -7,8 +7,8 @@ from pathlib import Path
import pytest
from evals.core.config import EvalConfigError, expand_suite, load_eval_config
from evals.core.types import (
from openjarvis.evals.core.config import EvalConfigError, expand_suite, load_eval_config
from openjarvis.evals.core.types import (
BenchmarkConfig,
DefaultsConfig,
EvalSuiteConfig,
@@ -597,7 +597,7 @@ class TestExpandSuite:
class TestCLIConfig:
def test_run_missing_benchmark_and_config(self):
from click.testing import CliRunner
from evals.cli import main
from openjarvis.evals.cli import main
runner = CliRunner()
result = runner.invoke(main, ["run", "-m", "qwen3:8b"])
@@ -606,7 +606,7 @@ class TestCLIConfig:
def test_run_missing_model_and_config(self):
from click.testing import CliRunner
from evals.cli import main
from openjarvis.evals.cli import main
runner = CliRunner()
result = runner.invoke(main, ["run", "-b", "supergpqa"])
@@ -615,7 +615,7 @@ class TestCLIConfig:
def test_run_config_file_not_found(self):
from click.testing import CliRunner
from evals.cli import main
from openjarvis.evals.cli import main
runner = CliRunner()
result = runner.invoke(main, ["run", "--config", "/nonexistent.toml"])
@@ -630,7 +630,7 @@ class TestCLIConfig:
from unittest.mock import patch
from click.testing import CliRunner
from evals.cli import main
from openjarvis.evals.cli import main
p = _write_toml(tmp_path, """\
[meta]
@@ -6,7 +6,7 @@ from io import StringIO
from rich.console import Console
from evals.core.display import (
from openjarvis.evals.core.display import (
print_accuracy_panel,
print_energy_table,
print_latency_table,
@@ -14,7 +14,7 @@ from evals.core.display import (
print_compact_table,
print_full_results,
)
from evals.core.types import MetricStats, RunSummary
from openjarvis.evals.core.types import MetricStats, RunSummary
def _make_summary(**overrides) -> RunSummary:
@@ -2,9 +2,9 @@
from __future__ import annotations
from evals.core.types import EvalRecord
from evals.scorers.frames_judge import _GRADER_TEMPLATE, FRAMESScorer
from evals.tests.conftest import MockBackend
from openjarvis.evals.core.types import EvalRecord
from openjarvis.evals.scorers.frames_judge import _GRADER_TEMPLATE, FRAMESScorer
from openjarvis.evals.tests.conftest import MockBackend
class TestGraderTemplate:
@@ -2,8 +2,8 @@
from __future__ import annotations
from evals.core.types import EvalRecord
from evals.scorers.gaia_exact import (
from openjarvis.evals.core.types import EvalRecord
from openjarvis.evals.scorers.gaia_exact import (
GAIAScorer,
_is_float,
_normalize_number_str,
@@ -11,7 +11,7 @@ from evals.scorers.gaia_exact import (
_split_string,
exact_match,
)
from evals.tests.conftest import MockBackend
from openjarvis.evals.tests.conftest import MockBackend
class TestNormalization:
@@ -6,9 +6,13 @@ import json
import pytest
from evals.core.runner import EvalRunner, _metric_stats, _metric_stats_to_dict
from evals.core.types import EvalRecord, MetricStats, RunConfig
from evals.tests.conftest import MockBackend, MockDataset, MockScorer
from openjarvis.evals.core.runner import (
EvalRunner,
_metric_stats,
_metric_stats_to_dict,
)
from openjarvis.evals.core.types import EvalRecord, MetricStats, RunConfig
from openjarvis.evals.tests.conftest import MockBackend, MockDataset, MockScorer
class TestEvalRunner:
@@ -2,8 +2,8 @@
from __future__ import annotations
from evals.core.types import EvalRecord
from evals.tests.conftest import MockBackend
from openjarvis.evals.core.types import EvalRecord
from openjarvis.evals.tests.conftest import MockBackend
class TestSuperGPQAScorer:
@@ -25,7 +25,7 @@ class TestSuperGPQAScorer:
)
def test_correct_extraction(self):
from evals.scorers.supergpqa_mcq import SuperGPQAScorer
from openjarvis.evals.scorers.supergpqa_mcq import SuperGPQAScorer
backend = MockBackend(responses={})
backend._default_response = "B"
@@ -39,7 +39,7 @@ class TestSuperGPQAScorer:
assert meta["candidate_letter"] == "B"
def test_incorrect_extraction(self):
from evals.scorers.supergpqa_mcq import SuperGPQAScorer
from openjarvis.evals.scorers.supergpqa_mcq import SuperGPQAScorer
backend = MockBackend()
backend._default_response = "A"
@@ -52,7 +52,7 @@ class TestSuperGPQAScorer:
assert meta["candidate_letter"] == "A"
def test_missing_reference(self):
from evals.scorers.supergpqa_mcq import SuperGPQAScorer
from openjarvis.evals.scorers.supergpqa_mcq import SuperGPQAScorer
backend = MockBackend()
scorer = SuperGPQAScorer(backend, "gpt-4o")
@@ -64,7 +64,7 @@ class TestSuperGPQAScorer:
assert meta["reason"] == "missing_reference_letter"
def test_no_extraction(self):
from evals.scorers.supergpqa_mcq import SuperGPQAScorer
from openjarvis.evals.scorers.supergpqa_mcq import SuperGPQAScorer
backend = MockBackend()
backend._default_response = "NONE"
@@ -77,7 +77,7 @@ class TestSuperGPQAScorer:
assert meta["reason"] == "no_choice_letter_extracted"
def test_valid_letters_from_options(self):
from evals.scorers.supergpqa_mcq import SuperGPQAScorer
from openjarvis.evals.scorers.supergpqa_mcq import SuperGPQAScorer
backend = MockBackend()
scorer = SuperGPQAScorer(backend, "gpt-4o")
@@ -92,7 +92,7 @@ class TestSuperGPQAScorer:
assert letters == "ABCD"
def test_extraction_with_verbose_response(self):
from evals.scorers.supergpqa_mcq import SuperGPQAScorer
from openjarvis.evals.scorers.supergpqa_mcq import SuperGPQAScorer
backend = MockBackend()
backend._default_response = "THE ANSWER IS: C"
@@ -2,7 +2,7 @@
from __future__ import annotations
from evals.core.types import (
from openjarvis.evals.core.types import (
BenchmarkConfig,
DefaultsConfig,
EvalRecord,
@@ -2,9 +2,9 @@
from __future__ import annotations
from evals.core.types import EvalRecord
from evals.scorers.wildchat_judge import WildChatScorer
from evals.tests.conftest import MockBackend
from openjarvis.evals.core.types import EvalRecord
from openjarvis.evals.scorers.wildchat_judge import WildChatScorer
from openjarvis.evals.tests.conftest import MockBackend
class TestVerdictParsing:
+43 -43
View File
@@ -23,91 +23,91 @@ class TestDatasetInstantiation:
"""Verify each dataset class can be instantiated with correct attributes."""
def test_supergpqa(self) -> None:
from evals.datasets.supergpqa import SuperGPQADataset
from openjarvis.evals.datasets.supergpqa import SuperGPQADataset
ds = SuperGPQADataset()
assert ds.dataset_id == "supergpqa"
assert ds.dataset_name == "SuperGPQA"
def test_gpqa(self) -> None:
from evals.datasets.gpqa import GPQADataset
from openjarvis.evals.datasets.gpqa import GPQADataset
ds = GPQADataset()
assert ds.dataset_id == "gpqa"
assert ds.dataset_name == "GPQA"
def test_mmlu_pro(self) -> None:
from evals.datasets.mmlu_pro import MMLUProDataset
from openjarvis.evals.datasets.mmlu_pro import MMLUProDataset
ds = MMLUProDataset()
assert ds.dataset_id == "mmlu-pro"
assert ds.dataset_name == "MMLU-Pro"
def test_math500(self) -> None:
from evals.datasets.math500 import MATH500Dataset
from openjarvis.evals.datasets.math500 import MATH500Dataset
ds = MATH500Dataset()
assert ds.dataset_id == "math500"
assert ds.dataset_name == "MATH-500"
def test_natural_reasoning(self) -> None:
from evals.datasets.natural_reasoning import NaturalReasoningDataset
from openjarvis.evals.datasets.natural_reasoning import NaturalReasoningDataset
ds = NaturalReasoningDataset()
assert ds.dataset_id == "natural-reasoning"
assert ds.dataset_name == "Natural Reasoning"
def test_hle(self) -> None:
from evals.datasets.hle import HLEDataset
from openjarvis.evals.datasets.hle import HLEDataset
ds = HLEDataset()
assert ds.dataset_id == "hle"
assert ds.dataset_name == "HLE"
def test_simpleqa(self) -> None:
from evals.datasets.simpleqa import SimpleQADataset
from openjarvis.evals.datasets.simpleqa import SimpleQADataset
ds = SimpleQADataset()
assert ds.dataset_id == "simpleqa"
assert ds.dataset_name == "SimpleQA"
def test_wildchat(self) -> None:
from evals.datasets.wildchat import WildChatDataset
from openjarvis.evals.datasets.wildchat import WildChatDataset
ds = WildChatDataset()
assert ds.dataset_id == "wildchat"
assert ds.dataset_name == "WildChat"
def test_ipw(self) -> None:
from evals.datasets.ipw_mixed import IPWDataset
from openjarvis.evals.datasets.ipw_mixed import IPWDataset
ds = IPWDataset()
assert ds.dataset_id == "ipw"
assert ds.dataset_name == "IPW"
def test_gaia(self) -> None:
from evals.datasets.gaia import GAIADataset
from openjarvis.evals.datasets.gaia import GAIADataset
ds = GAIADataset()
assert ds.dataset_id == "gaia"
assert ds.dataset_name == "GAIA"
def test_frames(self) -> None:
from evals.datasets.frames import FRAMESDataset
from openjarvis.evals.datasets.frames import FRAMESDataset
ds = FRAMESDataset()
assert ds.dataset_id == "frames"
assert ds.dataset_name == "FRAMES"
def test_swebench(self) -> None:
from evals.datasets.swebench import SWEBenchDataset
from openjarvis.evals.datasets.swebench import SWEBenchDataset
ds = SWEBenchDataset()
assert ds.dataset_id == "swebench"
assert ds.dataset_name == "SWE-bench"
def test_swefficiency(self) -> None:
from evals.datasets.swefficiency import SWEfficiencyDataset
from openjarvis.evals.datasets.swefficiency import SWEfficiencyDataset
ds = SWEfficiencyDataset()
assert ds.dataset_id == "swefficiency"
assert ds.dataset_name == "SWEfficiency"
def test_terminalbench(self) -> None:
from evals.datasets.terminalbench import TerminalBenchDataset
from openjarvis.evals.datasets.terminalbench import TerminalBenchDataset
ds = TerminalBenchDataset()
assert ds.dataset_id == "terminalbench"
assert ds.dataset_name == "TerminalBench"
def test_terminalbench_native(self) -> None:
from evals.datasets.terminalbench_native import (
from openjarvis.evals.datasets.terminalbench_native import (
TerminalBenchNativeDataset,
)
ds = TerminalBenchNativeDataset()
@@ -131,74 +131,74 @@ class TestScorerInstantiation:
"""Verify each scorer class can be constructed."""
def test_supergpqa_scorer(self) -> None:
from evals.scorers.supergpqa_mcq import SuperGPQAScorer
from openjarvis.evals.scorers.supergpqa_mcq import SuperGPQAScorer
s = SuperGPQAScorer(_mock_backend(), "test-model")
assert s.scorer_id == "supergpqa"
def test_gpqa_scorer(self) -> None:
from evals.scorers.gpqa_mcq import GPQAScorer
from openjarvis.evals.scorers.gpqa_mcq import GPQAScorer
s = GPQAScorer(_mock_backend(), "test-model")
assert s.scorer_id == "gpqa"
def test_mmlu_pro_scorer(self) -> None:
from evals.scorers.mmlu_pro_mcq import MMLUProScorer
from openjarvis.evals.scorers.mmlu_pro_mcq import MMLUProScorer
s = MMLUProScorer(_mock_backend(), "test-model")
assert s.scorer_id == "mmlu-pro"
def test_reasoning_judge_scorer(self) -> None:
from evals.scorers.reasoning_judge import ReasoningJudgeScorer
from openjarvis.evals.scorers.reasoning_judge import ReasoningJudgeScorer
s = ReasoningJudgeScorer(_mock_backend(), "test-model")
assert s.scorer_id == "reasoning_judge"
def test_hle_scorer(self) -> None:
from evals.scorers.hle_judge import HLEScorer
from openjarvis.evals.scorers.hle_judge import HLEScorer
s = HLEScorer(_mock_backend(), "test-model")
assert s.scorer_id == "hle"
def test_simpleqa_scorer(self) -> None:
from evals.scorers.simpleqa_judge import SimpleQAScorer
from openjarvis.evals.scorers.simpleqa_judge import SimpleQAScorer
s = SimpleQAScorer(_mock_backend(), "test-model")
assert s.scorer_id == "simpleqa"
def test_wildchat_scorer(self) -> None:
from evals.scorers.wildchat_judge import WildChatScorer
from openjarvis.evals.scorers.wildchat_judge import WildChatScorer
s = WildChatScorer(_mock_backend(), "test-model")
assert s.scorer_id == "wildchat"
def test_ipw_mixed_scorer(self) -> None:
from evals.scorers.ipw_mixed import IPWMixedScorer
from openjarvis.evals.scorers.ipw_mixed import IPWMixedScorer
s = IPWMixedScorer(_mock_backend(), "test-model")
assert s.scorer_id == "ipw"
def test_gaia_scorer(self) -> None:
from evals.scorers.gaia_exact import GAIAScorer
from openjarvis.evals.scorers.gaia_exact import GAIAScorer
s = GAIAScorer(_mock_backend(), "test-model")
assert s.scorer_id == "gaia"
def test_frames_scorer(self) -> None:
from evals.scorers.frames_judge import FRAMESScorer
from openjarvis.evals.scorers.frames_judge import FRAMESScorer
s = FRAMESScorer(_mock_backend(), "test-model")
assert s.scorer_id == "frames"
def test_swebench_scorer(self) -> None:
from evals.scorers.swebench_structural import SWEBenchScorer
from openjarvis.evals.scorers.swebench_structural import SWEBenchScorer
s = SWEBenchScorer(_mock_backend(), "test-model")
assert s.scorer_id == "swebench"
def test_swefficiency_scorer(self) -> None:
from evals.scorers.swefficiency_structural import (
from openjarvis.evals.scorers.swefficiency_structural import (
SWEfficiencyScorer,
)
s = SWEfficiencyScorer(_mock_backend(), "test-model")
assert s.scorer_id == "swefficiency"
def test_terminalbench_scorer(self) -> None:
from evals.scorers.terminalbench_judge import TerminalBenchScorer
from openjarvis.evals.scorers.terminalbench_judge import TerminalBenchScorer
s = TerminalBenchScorer(_mock_backend(), "test-model")
assert s.scorer_id == "terminalbench"
def test_terminalbench_native_scorer(self) -> None:
from evals.scorers.terminalbench_native_structural import (
from openjarvis.evals.scorers.terminalbench_native_structural import (
TerminalBenchNativeScorer,
)
s = TerminalBenchNativeScorer(_mock_backend(), "test-model")
@@ -222,7 +222,7 @@ class TestCLIFactories:
@pytest.mark.parametrize("benchmark", ALL_BENCHMARKS)
def test_build_dataset(self, benchmark: str) -> None:
from evals.cli import _build_dataset
from openjarvis.evals.cli import _build_dataset
ds = _build_dataset(benchmark)
assert ds is not None
assert hasattr(ds, "load")
@@ -231,20 +231,20 @@ class TestCLIFactories:
@pytest.mark.parametrize("benchmark", ALL_BENCHMARKS)
def test_build_scorer(self, benchmark: str) -> None:
from evals.cli import _build_scorer
from openjarvis.evals.cli import _build_scorer
scorer = _build_scorer(benchmark, _mock_backend(), "test-model")
assert scorer is not None
assert hasattr(scorer, "score")
def test_build_dataset_unknown(self) -> None:
import click
from evals.cli import _build_dataset
from openjarvis.evals.cli import _build_dataset
with pytest.raises(click.ClickException, match="Unknown benchmark"):
_build_dataset("nonexistent")
def test_build_scorer_unknown(self) -> None:
import click
from evals.cli import _build_scorer
from openjarvis.evals.cli import _build_scorer
with pytest.raises(click.ClickException, match="Unknown benchmark"):
_build_scorer("nonexistent", _mock_backend(), "test-model")
@@ -258,12 +258,12 @@ class TestConfigBenchmarks:
"""Verify KNOWN_BENCHMARKS includes all 15 benchmarks."""
def test_all_benchmarks_known(self) -> None:
from evals.core.config import KNOWN_BENCHMARKS
from openjarvis.evals.core.config import KNOWN_BENCHMARKS
for b in ALL_BENCHMARKS:
assert b in KNOWN_BENCHMARKS, f"{b} missing from KNOWN_BENCHMARKS"
def test_benchmarks_count(self) -> None:
from evals.core.config import KNOWN_BENCHMARKS
from openjarvis.evals.core.config import KNOWN_BENCHMARKS
assert len(KNOWN_BENCHMARKS) == 15
@@ -276,8 +276,8 @@ class TestStructuralScorers:
"""Test structural scorers that don't need LLM calls."""
def test_swebench_empty_response(self) -> None:
from evals.core.types import EvalRecord
from evals.scorers.swebench_structural import SWEBenchScorer
from openjarvis.evals.core.types import EvalRecord
from openjarvis.evals.scorers.swebench_structural import SWEBenchScorer
scorer = SWEBenchScorer(_mock_backend(), "test-model")
record = EvalRecord(
record_id="swe-1", problem="Fix bug", reference="patch",
@@ -288,8 +288,8 @@ class TestStructuralScorers:
assert meta["reason"] == "empty_response"
def test_swebench_with_diff(self) -> None:
from evals.core.types import EvalRecord
from evals.scorers.swebench_structural import SWEBenchScorer
from openjarvis.evals.core.types import EvalRecord
from openjarvis.evals.scorers.swebench_structural import SWEBenchScorer
scorer = SWEBenchScorer(_mock_backend(), "test-model")
record = EvalRecord(
record_id="swe-2", problem="Fix bug", reference="patch",
@@ -302,8 +302,8 @@ class TestStructuralScorers:
assert meta["has_diff_markers"] is True
def test_terminalbench_native_no_results(self) -> None:
from evals.core.types import EvalRecord
from evals.scorers.terminalbench_native_structural import (
from openjarvis.evals.core.types import EvalRecord
from openjarvis.evals.scorers.terminalbench_native_structural import (
TerminalBenchNativeScorer,
)
scorer = TerminalBenchNativeScorer(_mock_backend(), "test-model")
@@ -316,8 +316,8 @@ class TestStructuralScorers:
assert meta["reason"] == "no_test_results"
def test_terminalbench_native_resolved(self) -> None:
from evals.core.types import EvalRecord
from evals.scorers.terminalbench_native_structural import (
from openjarvis.evals.core.types import EvalRecord
from openjarvis.evals.scorers.terminalbench_native_structural import (
TerminalBenchNativeScorer,
)
scorer = TerminalBenchNativeScorer(_mock_backend(), "test-model")
+3 -3
View File
@@ -1,11 +1,11 @@
"""Tests for the Rich display helpers in evals.core.display."""
"""Tests for the Rich display helpers in openjarvis.evals.core.display."""
from __future__ import annotations
from io import StringIO
from pathlib import Path
from evals.core.display import (
from openjarvis.evals.core.display import (
print_banner,
print_completion,
print_metrics_table,
@@ -14,7 +14,7 @@ from evals.core.display import (
print_subject_table,
print_suite_summary,
)
from evals.core.types import MetricStats, RunSummary
from openjarvis.evals.core.types import MetricStats, RunSummary
from rich.console import Console