Skip to content

Commit b1eaf1e

Browse files
committed
Update
1 parent 57a28d0 commit b1eaf1e

13 files changed

Lines changed: 57 additions & 42 deletions

eval_protocol/benchmarks/suites/gpqa.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
from eval_protocol.benchmarks.registry import export_benchmark
1010
from eval_protocol.models import EvaluateResult, EvaluationRow, Message, MetricResult
11-
from eval_protocol.pytest.default_base_rollout_process import BaseRolloutProcessor
1211
from eval_protocol.pytest.default_single_turn_rollout_process import (
1312
SingleTurnRolloutProcessor,
1413
)
1514
from eval_protocol.pytest.evaluation_test import evaluation_test
15+
from eval_protocol.pytest.rollout_processor import RolloutProcessor
1616
from eval_protocol.pytest.types import RolloutProcessorConfig
1717

1818
SYSTEM_PROMPT = (
@@ -63,7 +63,7 @@ def _strip_gt_messages(msgs: List[Message]) -> List[Message]:
6363
return [m for m in msgs if not (m.role == "system" and (m.content or "").startswith("__GT__:"))]
6464

6565

66-
class GPQAStripGTRolloutProcessor(BaseRolloutProcessor):
66+
class GPQAStripGTRolloutProcessor(RolloutProcessor):
6767
"""Preprocess rows to set ground_truth and remove __GT__ messages, then delegate to SingleTurnRolloutProcessor."""
6868

6969
def __init__(self):

eval_protocol/pytest/__init__.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,18 @@
11
from .default_agent_rollout_processor import AgentRolloutProcessor
2-
from .default_base_rollout_process import BaseRolloutProcessor
32
from .default_dataset_adapter import default_dataset_adapter
43
from .default_mcp_gym_rollout_processor import MCPGymRolloutProcessor
4+
from .default_no_op_rollout_processor import NoOpRolloutProcessor
55
from .default_single_turn_rollout_process import SingleTurnRolloutProcessor
66
from .evaluation_test import evaluation_test
7+
from .rollout_processor import RolloutProcessor
78
from .types import RolloutProcessorConfig
89

910
__all__ = [
1011
"AgentRolloutProcessor",
1112
"MCPGymRolloutProcessor",
12-
"BaseRolloutProcessor",
13+
"RolloutProcessor",
1314
"SingleTurnRolloutProcessor",
15+
"NoOpRolloutProcessor",
1416
"default_dataset_adapter",
1517
"RolloutProcessorConfig",
1618
"evaluation_test",

eval_protocol/pytest/default_agent_rollout_processor.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
from eval_protocol.mcp.execution.policy import LiteLLMPolicy
1414
from eval_protocol.mcp.mcp_multi_client import MCPMultiClient
1515
from eval_protocol.models import EvaluationRow, Message
16-
from eval_protocol.pytest.default_base_rollout_process import BaseRolloutProcessor
16+
from eval_protocol.pytest.rollout_processor import RolloutProcessor
1717
from eval_protocol.pytest.types import Dataset, RolloutProcessorConfig
1818

1919
logger = logging.getLogger(__name__)
@@ -116,7 +116,7 @@ def _get_content_from_tool_result(self, tool_result: CallToolResult) -> List[Tex
116116
return tool_result.content
117117

118118

119-
class AgentRolloutProcessor(BaseRolloutProcessor):
119+
class AgentRolloutProcessor(RolloutProcessor):
120120
"""Agent rollout processor for tool-calling agents."""
121121

122122
def __call__(self, rows: List[EvaluationRow], config: RolloutProcessorConfig) -> List[asyncio.Task[EvaluationRow]]:

eval_protocol/pytest/default_mcp_gym_rollout_processor.py

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6,15 +6,13 @@
66
import subprocess
77
import time
88
from pathlib import Path
9-
from typing import Any, AsyncIterator, Dict, List, Optional
9+
from typing import List, Optional
1010

1111
import eval_protocol as ep
12-
from eval_protocol.models import EvaluationRow, Message
13-
from eval_protocol.pytest.default_base_rollout_process import BaseRolloutProcessor
12+
from eval_protocol.models import EvaluationRow
13+
from eval_protocol.pytest.rollout_processor import RolloutProcessor
1414
from eval_protocol.pytest.types import RolloutProcessorConfig
1515

16-
CURRENT_RUN_STATE: Dict[str, Any] = {}
17-
1816

1917
class MCPServerManager:
2018
"""Manages MCP server lifecycle for testing."""
@@ -195,7 +193,7 @@ def __exit__(self, exc_type, exc_val, exc_tb):
195193
return False # Don't suppress exceptions
196194

197195

198-
class MCPGymRolloutProcessor(BaseRolloutProcessor):
196+
class MCPGymRolloutProcessor(RolloutProcessor):
199197
"""
200198
Rollout processor for tau bench environments.
201199

eval_protocol/pytest/default_base_rollout_process.py renamed to eval_protocol/pytest/default_no_op_rollout_processor.py

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -2,18 +2,16 @@
22
from typing import List
33

44
from eval_protocol.models import EvaluationRow
5+
from eval_protocol.pytest.rollout_processor import RolloutProcessor
56
from eval_protocol.pytest.types import RolloutProcessorConfig
67

78

8-
class BaseRolloutProcessor:
9+
class NoOpRolloutProcessor(RolloutProcessor):
910
"""
10-
Base rollout processor - minimal implementation that all others inherit from.
11+
No-op rollout processor that passes input dataset through unchanged.
1112
12-
This is the Strategy pattern base class. It provides:
13-
1. __call__(rows, config) -> tasks (the main interface)
14-
2. cleanup() -> None (resource cleanup)
15-
16-
All other processors inherit from this and override as needed.
13+
Simply returns the input rows as completed tasks. This is useful for testing
14+
or when you want to handle rollout processing manually.
1715
"""
1816

1917
def __call__(self, rows: List[EvaluationRow], config: RolloutProcessorConfig) -> List[asyncio.Task[EvaluationRow]]:
@@ -26,6 +24,4 @@ async def return_row(row: EvaluationRow) -> EvaluationRow:
2624
tasks = [asyncio.create_task(return_row(row)) for row in rows]
2725
return tasks
2826

29-
def cleanup(self) -> None:
30-
"""No-op cleanup - override in subclasses if needed."""
31-
pass
27+
# Inherits cleanup() from RolloutProcessor - no override needed

eval_protocol/pytest/default_single_turn_rollout_process.py

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,21 +2,20 @@
22
import logging
33
import os
44
import time
5-
from typing import AsyncIterator, List
5+
from typing import List
66

7-
import litellm
87
from litellm import acompletion
98
from openai.types.chat.chat_completion_message import ChatCompletionMessageToolCall
109

1110
from eval_protocol.dataset_logger import default_logger
1211
from eval_protocol.models import EvaluationRow, Message
13-
from eval_protocol.pytest.default_base_rollout_process import BaseRolloutProcessor
12+
from eval_protocol.pytest.rollout_processor import RolloutProcessor
1413
from eval_protocol.pytest.types import RolloutProcessorConfig
1514

1615
logger = logging.getLogger(__name__)
1716

1817

19-
class SingleTurnRolloutProcessor(BaseRolloutProcessor):
18+
class SingleTurnRolloutProcessor(RolloutProcessor):
2019
"""Single turn rollout processor for direct LLM calls."""
2120

2221
def __call__(self, rows: List[EvaluationRow], config: RolloutProcessorConfig) -> List[asyncio.Task[EvaluationRow]]:

eval_protocol/pytest/evaluation_test.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,9 @@
2424
InputMetadata,
2525
Message,
2626
)
27-
from eval_protocol.pytest.default_base_rollout_process import BaseRolloutProcessor
2827
from eval_protocol.pytest.default_dataset_adapter import default_dataset_adapter
28+
from eval_protocol.pytest.default_no_op_rollout_processor import NoOpRolloutProcessor
29+
from eval_protocol.pytest.rollout_processor import RolloutProcessor
2930
from eval_protocol.pytest.types import (
3031
Dataset,
3132
DatasetPathParam,
@@ -61,7 +62,7 @@ def evaluation_test( # noqa: C901
6162
input_messages: Optional[List[InputMessagesParam]] = None,
6263
input_dataset: Optional[List[DatasetPathParam]] = None,
6364
dataset_adapter: Callable[[List[Dict[str, Any]]], Dataset] = default_dataset_adapter,
64-
rollout_processor: BaseRolloutProcessor = BaseRolloutProcessor(),
65+
rollout_processor: RolloutProcessor = NoOpRolloutProcessor(),
6566
evaluation_test_kwargs: Optional[List[EvaluationInputParam]] = None,
6667
rollout_processor_kwargs: Optional[RolloutProcessorInputParam] = None,
6768
aggregation_method: AggregationMethod = "mean",
@@ -749,7 +750,7 @@ def run_evaluation_test_direct(
749750
input_dataset: Optional[List[DatasetPathParam]] = None,
750751
dataset_adapter: Callable[[List[Dict[str, Any]]], Dataset] = default_dataset_adapter,
751752
completion_params: Optional[CompletionParams] = None,
752-
rollout_processor: BaseRolloutProcessor = BaseRolloutProcessor(),
753+
rollout_processor: RolloutProcessor = NoOpRolloutProcessor(),
753754
rollout_processor_kwargs: Optional[RolloutProcessorInputParam] = None,
754755
aggregation_method: AggregationMethod = "mean",
755756
passed_threshold: Optional[Union[EvaluationThreshold, float]] = None,
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import asyncio
2+
from abc import ABC, abstractmethod
3+
from typing import List
4+
5+
from eval_protocol.models import EvaluationRow
6+
from eval_protocol.pytest.types import RolloutProcessorConfig
7+
8+
9+
class RolloutProcessor(ABC):
10+
"""
11+
Abstract base class for all rollout processor strategies.
12+
"""
13+
14+
@abstractmethod
15+
def __call__(self, rows: List[EvaluationRow], config: RolloutProcessorConfig) -> List[asyncio.Task[EvaluationRow]]:
16+
"""Process evaluation rows and return async tasks. Must be implemented by subclasses."""
17+
pass
18+
19+
def cleanup(self) -> None:
20+
"""Cleanup resources. Override in subclasses if cleanup is needed."""
21+
pass

eval_protocol/pytest/utils.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
from eval_protocol.dataset_logger.dataset_logger import DatasetLogger
99
from eval_protocol.models import EvalMetadata, EvaluationRow
10-
from eval_protocol.pytest.default_base_rollout_process import BaseRolloutProcessor
10+
from eval_protocol.pytest.rollout_processor import RolloutProcessor
1111
from eval_protocol.pytest.types import (
1212
CompletionParams,
1313
DatasetPathParam,
@@ -234,7 +234,7 @@ def generate_parameter_combinations(
234234

235235

236236
async def rollout_processor_with_retry(
237-
rollout_processor: BaseRolloutProcessor,
237+
rollout_processor: RolloutProcessor,
238238
fresh_dataset: List[EvaluationRow],
239239
config: RolloutProcessorConfig,
240240
max_retry: int,

tests/pytest/test_pytest_ensure_logging.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
from eval_protocol.dataset_logger.dataset_logger import DatasetLogger
66
from eval_protocol.dataset_logger.sqlite_evaluation_row_store import SqliteEvaluationRowStore
77
from eval_protocol.models import EvaluationRow
8-
from eval_protocol.pytest.default_base_rollout_process import BaseRolloutProcessor
8+
from eval_protocol.pytest.default_no_op_rollout_processor import NoOpRolloutProcessor
99
from tests.pytest.test_markdown_highlighting import markdown_dataset_to_evaluation_row
1010

1111

@@ -34,7 +34,7 @@ async def test_ensure_logging(monkeypatch):
3434
],
3535
completion_params=[{"temperature": 0.0, "model": "dummy/local-model"}],
3636
dataset_adapter=markdown_dataset_to_evaluation_row,
37-
rollout_processor=BaseRolloutProcessor(),
37+
rollout_processor=NoOpRolloutProcessor(),
3838
mode="pointwise",
3939
combine_datasets=False,
4040
num_runs=2,

0 commit comments

Comments
 (0)