
    j-                     |   d dl Z d dlZd dlmZmZmZmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZmZ d dlmZ d dlmZ d dlmZ d dlmZ d d	lmZ d
dlm Z   ejB                  e"      Z#dZ$dede%fdZ&deejN                     deeejN                     eejN                     f   fdZ(dejR                  dee*   deejN                     fdZ+deejR                     deejN                     dedee*   ddf
dZ,deejN                     dee*ef   dedee*ef   dee*ef   deejZ                     fdZ. G d d      Z/y)    N)ListDictAnyOptionalCallableTuple)dataset_item)arguments_helpersbase_metricscore_resultarguments_validator)scorer_wrapper_metric)	llm_judge)config)ScoringKeyMappingType)models   )exception_analyzer	task_spanfuncreturnc                 |    	 t        j                  |       }t        |j                  v S # t        t
        f$ r Y yw xY w)z<Check if a scoring function expects the task_span parameter.F)inspect	signatureEVALUATION_SPAN_PARAMETER_NAME
parameters
ValueError	TypeError)r   sigs     /Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/opik/evaluation/engine/metrics_evaluator.py_has_evaluation_span_parameterr!      s=    %-??	" s   &) ;;scoring_metricsc                     g }g }| D ]:  }t        |j                        r|j                  |       *|j                  |       < ||fS )z
    Separate metrics into regular and task-span categories.

    Args:
        scoring_metrics: List of metrics to analyze.

    Returns:
        Tuple of (regular_metrics, task_span_metrics).
    )r!   scoreappend)r"   regular_metricstask_span_metricsmetrics       r    (split_into_regular_and_task_span_metricsr)   %   sO     57O68!)&,,7$$V,""6*	 " ---    itemevaluator_modelc                    | j                   sg S g }| j                   D ]  }	 |j                  dk(  rTt        j                  di |j                  }t
        j                  j                  |d|i      }|j                  |       n t        j                  d|j                          |S # t        $ r$ t        j                  d|j                  d        w xY w)	aE  
    Extract evaluators from dataset item.

    If the item has evaluator configs, instantiate LLMJudge evaluators from them.

    Args:
        item: The dataset item.
        evaluator_model: Optional model name to use for LLMJudge evaluators.

    Returns:
        List of evaluator instances extracted from the item.
    r   model)init_kwargsz>Unsupported evaluator type: %s. Only 'llm_judge' is supported.z/Failed to instantiate evaluator from config: %sTexc_info )
evaluatorstypellm_judge_configLLMJudgeConfigr   r   LLMJudgefrom_configr%   LOGGERwarning	Exceptionerror)r+   r,   r3   evaluator_itemr   	evaluators         r    _extract_item_evaluatorsr?   =   s      ??	/1J//	""k1)88Q>;P;PQ%..::/(B ; 	 !!),T"'' **   	LLA%%  
 	s   BB((-Cr&   scoring_key_mappingMetricsEvaluatorc                 |   t        |      }| t        | |      }|j                  |       |D cg c]  }t        |t        j
                        s|! }}|D cg c]  }t        |t        j
                        r|! }}t        j
                  j                  |      }	|	|	g|z   }t        ||      S c c}w c c}w )z?Build a MetricsEvaluator with suite-level + item-level metrics.)r,   )r"   r@   )listr?   extend
isinstancer   r7   mergedrA   )
r+   r&   r@   r,   all_metricsitem_evaluatorsmjudges
non_judgesrF   s
             r    build_metrics_evaluatorrL   i   s     15_0EK2/
 	?+$JA
1i6H6H(IaFJ(R[
1i>P>P0Q![JR&&v.Fh+#/  KRs   B4B4B9:B9mapped_scoring_inputsdataset_item_contenttask_outputc                 p   g }| D ]  }	 t         j                  d|j                         t        |t        j
                        rA|j                  t              x}	 |j                  |||      }n>|j                  ||      }n*t        j                  |||        |j                  di |}t         j                  d|j                         t        |t              r||z  }n|j                  |        |S # t        j                  $ r  t        $ r}	t         j!                  d|j                  d	       t#        j$                  |	      r#t         j!                  t&        j(                         |j                  t+        j,                  |j                  d
t/        |	      d             Y d}	~	d}	~	ww xY w)a  
    Compute scores using given metrics.

    Args:
        scoring_metrics: List of metrics to compute
        mapped_scoring_inputs: Scoring inputs after key mapping (will be used for regular metrics)
        scoring_key_mapping: Mapping for renaming score arguments (empty dict if no mapping)
        dataset_item_content: Dataset item content (will be used for ScorerWrapperMetric)
        task_output: Task output (will be used for ScorerWrapperMetric)

    Returns:
        List of computed score results
    zMetric %s score startedN)r	   task_outputsr   )r	   rQ   )r(   kwargsr@   zMetric %s score endedzCFailed to compute metric %s. Score result will be marked as failed.Tr0   g        )namevaluereasonscoring_failedr2   )r9   debugrS   rE   r   ScorerWrapperMetricgetr   r$   r   validate_score_argumentsrC   r%   
exceptionsScoreMethodMissingArgumentsr;   r<   r    is_llm_provider_rate_limit_errorlogging_messages;LLM_PROVIDER_RATE_LIMIT_ERROR_DETECTED_IN_EVALUATE_FUNCTIONr   ScoreResultstr)
r"   rM   r@   rN   rO   score_resultsr(   r   result	exceptions
             r    _compute_metric_scoresre      s   ( 57M!8	LL2FKK@&"7"K"KL "7!:!:6" I 	
 $\\%9%0"+ * F $\\%9%0 * F
 $<<!0(;
 &>(=>LL0&++>&$''$$V,E "v / 55 	 	LLU   "BB9M$``   ((y>#'	 	s   C,C99F5BF00F5c                      e Zd ZdZdeej                     defdZe	de
fd       Ze	deej                     fd       Ze	deej                     fd       Ze	defd	       Zdeej                     dd
fdZdeeef   deeef   deeej*                     eeef   f   fdZdeeef   deeef   dej0                  deeej*                     eeef   f   fdZy
)rA   z
    Handles metric computation and scoring.

    Separates metrics into:
    - Regular metrics: Score based on inputs/outputs
    - Task span metrics: Score based on LLM call metadata (tokens, latency, etc)
    r"   r@   c                 P    || _         g | _        g | _        | j                  |       y )N)_scoring_key_mapping_regular_metrics_task_span_metrics_analyze_metrics)selfr"   r@   s      r    __init__zMetricsEvaluator.__init__   s*    
 %8!>@@Bo.r*   r   c                 2    t        | j                        dkD  S )z6Check if any task span scoring metrics are configured.r   )lenrj   rl   s    r    has_task_span_metricsz&MetricsEvaluator.has_task_span_metrics   s     4**+a//r*   c                     | j                   S )z&Get list of task span scoring metrics.)rj   rp   s    r    r'   z"MetricsEvaluator.task_span_metrics   s     &&&r*   c                     | j                   S )z$Get list of regular scoring metrics.)ri   rp   s    r    r&   z MetricsEvaluator.regular_metrics   s     $$$r*   c                     | j                   S )zGet the scoring key mapping.)rh   rp   s    r    r@   z$MetricsEvaluator.scoring_key_mapping   s     (((r*   Nc                     t        |      \  | _        | _        | j                  r*t        j                  dt        | j                               yy)z7Separate metrics into regular and task-span categories.z*Detected %d LLM task span scoring metrics.N)r)   ri   rj   rq   r9   rW   ro   )rl   r"   s     r    rk   z!MetricsEvaluator._analyze_metrics   sH     5_E 	7t6 %%LL<D++, &r*   rN   rO   c                     t        j                  ||| j                        }t        | j                  || j                  ||      }||fS )a  
        Compute scores using regular metrics.

        Args:
            dataset_item_content: Dataset item content
            task_output: Task output

        Returns:
            Tuple of (score results, mapped scoring inputs used for scoring regular non-wrapper metrics)
        r	   rO   r@   r"   rM   r@   rN   rO   )r
   create_scoring_inputsrh   re   ri   )rl   rN   rO   rM   rb   s        r    compute_regular_scoresz'MetricsEvaluator.compute_regular_scores  sY     !2 G G-# $ 9 9!
 / 11"7 $ 9 9!5#
 333r*   r   c                     t        j                  ||| j                        }i |t        |i}t	        | j
                  || j                  ||      }||fS )ad  
        Compute scores using task span metrics.

        Args:
            dataset_item_content: Dataset item content
            task_output: Task output
            task_span: Span model containing task execution metadata

        Returns:
            Tuple of (score results, mapped scoring inputs used for scoring regular non-wrapper metrics)
        rw   rx   )r
   ry   rh   r   re   rj   )rl   rN   rO   r   rM   mapped_scoring_inputs_with_spanrb   s          r    compute_task_span_scoresz)MetricsEvaluator.compute_task_span_scores-  ss    " !2 G G-# $ 9 9!
+
#+
*I+
'
 / 33"A $ 9 9!5#
 ===r*   )__name__
__module____qualname____doc__r   r   
BaseMetricr   rm   propertyboolrq   r'   r&   r@   rk   r   ra   r   r   r   r`   rz   r   	SpanModelr}   r2   r*   r    rA   rA      sz   	/k445	/ 3	/ 0t 0 0 '4(>(>#? ' ' %k&<&<!= % % )%: ) )k445 
4"38n4 #s(^4 
tL,,-tCH~=	>	4>$>"38n$> #s(^$> ##	$>
 
tL,,-tCH~=	>$>r*   )0r   loggingtypingr   r   r   r   r   r   opik.exceptionsr[   opik.logging_messagesr^   opik.api_objects.datasetr	   opik.evaluation.metricsr
   r   r   r   opik.evaluation.scorersr    opik.evaluation.suite_evaluatorsr   *opik.evaluation.suite_evaluators.llm_judger   r5   opik.evaluation.typesr   !opik.message_processing.emulationr    r   	getLoggerr~   r9   r   r   r!   r   r)   DatasetItemra   r?   rL   r`   re   rA   r2   r*   r    <module>r      s     = = $ 0 1  : 6 Q 7 4   
		8	$!,  d .+001.
4&&'k.D.D)EEF.0)

"
")c]) 
+
 
 !)X
<++
,+001 / c]	
 4Q+001QS>Q /Q sCx.	Q
 c3hQ 
,
"
"#Qhz> z>r*   