
    j
                     n    d dl Z d dlmZmZmZmZ d dlZd dlmZ	 ddl
mZ  G d de j                        Zy)    N)AnyListOptionalUnion   )score_resultc            
           e Zd ZdZ	 	 	 ddee   dedee   ddfdZej                  de
d	e
deej                  eej                     f   fd
       Zde
d	e
deej                  eej                     f   fdZy)
BaseMetricaW  
    Abstract base class for all metrics. When creating a new metric, you should inherit
    from this class and implement the abstract methods.

    Args:
        name: The name of the metric. If not provided, uses the class name as default.
        track: Whether to track the metric. Defaults to True.
        project_name: Optional project name to track the metric in for the cases when
            there is no parent span/trace to inherit project name from.

    Example:
        >>> from opik.evaluation.metrics import base_metric, score_result
        >>>
        >>> class MyCustomMetric(base_metric.BaseMetric):
        >>>     def __init__(self, name: str, track: bool = True):
        >>>         super().__init__(name=name, track=track)
        >>>
        >>>     def score(self, input: str, output: str, **ignored_kwargs: Any):
        >>>         # Add your logic here
        >>>
        >>>         return score_result.ScoreResult(
        >>>             value=0,
        >>>             name=self.name,
        >>>             reason="Optional reason for the score"
        >>>         )
    Nnametrackproject_namereturnc                 `   ||n| j                   j                  | _        || _        t	        j
                         }|s|t        d      |rc|j                         du rPt        j                  | j                  |      } || j                        | _	         || j                        | _
        y y y )Nz8project_name can be set only when `track` is set to TrueF)r   r   )	__class____name__r   r   opik_config
OpikConfig
ValueError!check_for_known_misconfigurationsopikscoreascore)selfr   r   r   configtrack_decorators         |/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/opik/evaluation/metrics/base_metric.py__init__zBaseMetric.__init__%   s     !,D$..2I2I	
'')1WXXV==?5H"jjdiilSO(4DJ)$++6DK I5    argskwargsc                     t               )zA
        Public method that can be called independently.
        )NotImplementedErrorr   r   r    s      r   r   zBaseMetric.score8   s     "##r   c                 .   K    | j                   |i |S w)zG
        Async public method that can be called independently.
        )r   r#   s      r   r   zBaseMetric.ascoreA   s      tzz4*6**s   )NTN)r   
__module____qualname____doc__r   strboolr   abcabstractmethodr   r   r   ScoreResultr   r   r    r   r   r
   r
   	   s    : #&*	7sm7 7 sm	7
 
7& 	$$$'$	|''l.F.F)GG	H$ $++$'+	|''l.F.F)GG	H+r   r
   )r*   typingr   r   r   r   r   opik.configr   r   metricsr   ABCr
   r-   r   r   <module>r2      s'    
 - -  ! ">+ >+r   