Skip to content

Commit 77f6318

Browse files
author
Dylan Huang
committed
parameterize logger
1 parent e355931 commit 77f6318

4 files changed

Lines changed: 29 additions & 16 deletions

File tree

eval_protocol/pytest/default_agent_rollout_processor.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
from openai.types.chat import ChatCompletionContentPartTextParam, ChatCompletionMessage, ChatCompletionToolParam
99
from openai.types.chat.chat_completion_message_param import ChatCompletionMessageParam
1010

11-
from eval_protocol.dataset_logger import default_logger
11+
from eval_protocol.dataset_logger.dataset_logger import DatasetLogger
1212
from eval_protocol.mcp.execution.policy import LiteLLMPolicy
1313
from eval_protocol.mcp.mcp_multi_client import MCPMultiClient
1414
from eval_protocol.models import EvaluationRow, Message
@@ -20,12 +20,13 @@ class Agent:
2020
A really simple agent that calls the model until no more tool calls are needed.
2121
"""
2222

23-
def __init__(self, model: str, row: EvaluationRow, config_path: str):
23+
def __init__(self, model: str, row: EvaluationRow, config_path: str, logger: DatasetLogger):
2424
self.model = model
2525
self.evaluation_row: EvaluationRow = row
2626
self._policy = LiteLLMPolicy(model_id=model)
2727
self.mcp_client = MCPMultiClient(config_path=config_path) if config_path else None
2828
self.tools: Union[List[ChatCompletionToolParam], NotGiven] = NOT_GIVEN
29+
self.logger: DatasetLogger = logger
2930

3031
async def setup(self):
3132
if self.mcp_client:
@@ -40,9 +41,9 @@ async def _get_tools(self) -> Optional[List[ChatCompletionToolParam]]:
4041
def messages(self) -> list[Message]:
4142
return self.evaluation_row.messages
4243

43-
def append_message_and_log(self, message: Message):
44+
def append_message_and_log(self, message: Message, logger: DatasetLogger):
4445
self.messages.append(message)
45-
default_logger.log(self.evaluation_row)
46+
logger.log(self.evaluation_row)
4647

4748
async def call_agent(self) -> str:
4849
"""
@@ -77,7 +78,8 @@ async def call_agent(self) -> str:
7778
ChatCompletionContentPartTextParam(text=content.text, type="text") for content in content
7879
],
7980
tool_call_id=tool_call_id,
80-
)
81+
),
82+
logger=self.logger,
8183
)
8284
return await self.call_agent()
8385
return message.content
@@ -116,7 +118,7 @@ async def default_agent_rollout_processor(
116118
) -> List[EvaluationRow]:
117119
dataset: Dataset = []
118120
for row in rows:
119-
agent = Agent(model=config.model, row=row, config_path=config.mcp_config_path)
121+
agent = Agent(model=config.model, row=row, config_path=config.mcp_config_path, logger=config.logger)
120122
await agent.setup()
121123
await agent.call_agent()
122124
dataset.append(agent.evaluation_row)

eval_protocol/pytest/default_single_turn_rollout_process.py

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,9 @@
11
import asyncio
2-
from typing import List
3-
42
import logging
53
import os
4+
from typing import List
65

7-
from eval_protocol.dataset_logger import default_logger
8-
from eval_protocol.models import EvaluationRow, Message, ChatCompletionMessageToolCall
6+
from eval_protocol.models import ChatCompletionMessageToolCall, EvaluationRow, Message
97
from eval_protocol.pytest.types import RolloutProcessorConfig
108

119

@@ -49,6 +47,7 @@ async def process_row(row: EvaluationRow) -> EvaluationRow:
4947

5048
# Dynamic import to avoid static dependency/lint errors if LiteLLM isn't installed yet
5149
import importlib
50+
5251
_litellm = importlib.import_module("litellm")
5352
acompletion = getattr(_litellm, "acompletion")
5453
response = await acompletion(**request_params)
@@ -79,7 +78,7 @@ async def process_row(row: EvaluationRow) -> EvaluationRow:
7978
]
8079

8180
row.messages = messages
82-
default_logger.log(row)
81+
config.logger.log(row)
8382
return row
8483

8584
# Process rows with bounded concurrency if configured

eval_protocol/pytest/evaluation_test.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import pytest
99

1010
from eval_protocol.dataset_logger import default_logger
11+
from eval_protocol.dataset_logger.dataset_logger import DatasetLogger
1112
from eval_protocol.human_id import generate_id
1213
from eval_protocol.models import CompletionParams, EvalMetadata, EvaluationRow, InputMetadata, Message
1314
from eval_protocol.pytest.default_dataset_adapter import default_dataset_adapter
@@ -55,6 +56,7 @@ def evaluation_test( # noqa: C901
5556
steps: int = 30,
5657
mode: EvaluationTestMode = "batch",
5758
combine_datasets: bool = True,
59+
logger: Optional[DatasetLogger] = None,
5860
) -> Callable[
5961
[TestFunction],
6062
TestFunction,
@@ -117,8 +119,11 @@ def evaluation_test( # noqa: C901
117119
mode: Evaluation mode. "batch" (default) expects test function to handle
118120
full dataset. "pointwise" applies test function to each row. If your evaluation requires
119121
the full rollout of all rows to compute the score, use
122+
logger: DatasetLogger to use for logging. If not provided, a default logger will be used.
120123
"""
121124

125+
active_logger: DatasetLogger = logger if logger else default_logger
126+
122127
def decorator(
123128
test_func: TestFunction,
124129
):
@@ -287,7 +292,7 @@ def wrapper_body(**kwargs):
287292
def _log_eval_error(
288293
status: Literal["finished", "error"], rows: Optional[List[EvaluationRow]] | None, passed: bool
289294
) -> None:
290-
log_eval_status_and_rows(eval_metadata, rows, status, passed, default_logger)
295+
log_eval_status_and_rows(eval_metadata, rows, status, passed, active_logger)
291296

292297
try:
293298
# Handle dataset loading
@@ -369,7 +374,7 @@ def _log_eval_error(
369374
# has to be done in the pytest main process since it's
370375
# used to determine whether this eval has stopped
371376
row.pid = os.getpid()
372-
default_logger.log(row)
377+
active_logger.log(row)
373378

374379
# Prepare rollout processor config once; we will generate fresh outputs per run
375380
config = RolloutProcessorConfig(
@@ -379,6 +384,7 @@ def _log_eval_error(
379384
max_concurrent_rollouts=max_concurrent_rollouts,
380385
server_script_path=server_script_path,
381386
steps=steps,
387+
logger=active_logger,
382388
)
383389

384390
for _ in range(num_runs):
@@ -463,7 +469,7 @@ def _log_eval_error(
463469
if r.eval_metadata is not None:
464470
r.eval_metadata.status = "finished"
465471
r.eval_metadata.passed = passed
466-
default_logger.log(r)
472+
active_logger.log(r)
467473

468474
# Optional: print and/or persist a summary artifact for CI
469475
try:

eval_protocol/pytest/types.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,9 @@
55
from dataclasses import dataclass
66
from typing import Any, Callable, Dict, List, Literal, Optional
77

8+
from eval_protocol.dataset_logger import default_logger
9+
from eval_protocol.dataset_logger.dataset_logger import DatasetLogger
10+
811
from ..models import EvaluationRow, Message
912

1013
ModelParam = str # gpt-4o, gpt-4o-mini, accounts/fireworks/models/llama-3.1-8b-instruct
@@ -39,10 +42,13 @@
3942
class RolloutProcessorConfig:
4043
model: ModelParam
4144
input_params: RolloutInputParam # optional input parameters for inference
42-
mcp_config_path: str
43-
server_script_path: Optional[str] = None # TODO: change from server_script_path to mcp_config_path for agent rollout processor
45+
mcp_config_path: str
46+
server_script_path: Optional[str] = (
47+
None # TODO: change from server_script_path to mcp_config_path for agent rollout processor
48+
)
4449
max_concurrent_rollouts: int = 8 # maximum number of concurrent rollouts
4550
steps: int = 30 # max number of rollout steps
51+
logger: DatasetLogger = default_logger # logger to use during rollout for mid-rollout logs
4652

4753

4854
RolloutProcessor = Callable[[List[EvaluationRow], RolloutProcessorConfig], List[EvaluationRow]]

0 commit comments

Comments
 (0)