"""Abstract base class for evaluation agents."""

from abc import ABC, abstractmethod
from typing import Any, Callable, Optional

from agenteval.channels.base import EvalChannel
from agenteval.models import EvalRun, EvalTarget, Scenario

ProgressCallback = Callable[[str, dict[str, Any]], None]


class EvalAgent(ABC):
    """Base class for evaluation agents that execute scenarios against targets."""

    @abstractmethod
    async def run(
        self,
        target: EvalTarget,
        scenario: Scenario,
        channel: EvalChannel,
        progress_callback: Optional[ProgressCallback] = None,
    ) -> EvalRun:
        """Execute the scenario against the target via the channel.

        Returns the completed EvalRun record.
        """
        ...
