
    jV                        d 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Zeegeeef   f   Z G d d	e      Zy# e$ r dZY "w xY w)
zLLanguage adherence metric leveraging fastText-style language identification.    )annotations)AnyCallableOptionalTuple)MetricComputationError)
BaseMetric)ScoreResultNc                  Z     e Zd ZdZ	 	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 	 	 d fdZddZddZ xZS )	LanguageAdherenceMetrica  
    Check whether text is written in the expected language.

    The metric relies on a fastText language identification model (or a
    user-supplied detector callable) to predict the language of the evaluated text
    and compares it with ``expected_language``. It outputs ``1.0`` when the detected
    language matches and ``0.0`` otherwise, along with the detected label and
    confidence score in ``metadata``.

    References:
      - fastText language identification models
        https://fasttext.cc/docs/en/language-identification.html
      - Joulin et al., "Bag of Tricks for Efficient Text Classification" (EACL 2017)
        https://aclanthology.org/E17-2068/

    Args:
        expected_language: Language code the text should conform to, e.g. ``"en"``.
        model_path: Path to a fastText language identification model. Required unless
            ``detector`` is provided.
        name: Display name for the metric result. Defaults to
            ``"language_adherence_metric"``.
        track: Whether to automatically track metric results. Defaults to ``True``.
        project_name: Optional tracking project name. Defaults to ``None``.
        detector: Optional callable accepting text and returning a
            ``(language, confidence)`` tuple. When provided, ``model_path`` is not
            needed.

    Example:
        >>> from opik.evaluation.metrics import LanguageAdherenceMetric
        >>> # Assuming `lid.176.ftz` is available locally for fastText
        >>> metric = LanguageAdherenceMetric(expected_language="en", model_path="lid.176.ftz")
        >>> result = metric.score("This response is written in English.")  # doctest: +SKIP
        >>> result.value  # doctest: +SKIP
        1.0
    c                   t         |   |||       || _        |  || _        |  ||| _        d | _        y t        t        d      |t        d      t        j                  |      | _        | j                  | _        y )N)nametrackproject_namezInstall fasttext via `pip install fasttext` and provide a fastText language model (e.g., lid.176.ftz) or supply a custom detector callable.z>model_path is required when using the fastText-based detector.)super__init___expected_language_model_path_detector_fn_fasttext_modelfasttextImportError
ValueError
load_model_predict_with_fasttext)selfexpected_language
model_pathr   r   r   detector	__class__s          /Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/opik/evaluation/metrics/heuristics/language_adherence.pyr   z LanguageAdherenceMetric.__init__9   s     	d%lK"3% (D#'D S  P   (22:> 77    c                   |}|j                         st        d      | j                  |      \  }}|| j                  k(  rdnd}||| j                  d}|dk(  rdnd| d| j                   d}t	        || j
                  ||	      S )
Nz+Text is empty for language adherence check.g      ?        )detected_language
confidencer   zLanguage adheres to expectationzDetected language 'z' differs from expected '')valuer   reasonmetadata)stripr   r   r   r
   r   )	r   outputignored_kwargs	processedlanguager&   	adherencer*   r)   s	            r!   scorezLanguageAdherenceMetric.scoreZ   s    	 ()VWW#00;*#t'>'>>CC	 "*$!%!8!8
 C .&xj0I$JaJaIbbcd 	 $))FX
 	
r"   c                    | j                   t        d      | j                   j                  |      }|d   r|d   d   nd}|j                  dd      }|d   rt	        |d   d         nd}||fS )NzfastText model is not loaded. Ensure that LanguageAdherenceMetric was initialized with a valid model_path and fastText is installed.r    	__label__   r$   )r   r   predictreplacefloat)r   text
predictionlabelr/   r&   s         r!   r   z.LanguageAdherenceMetric._predict_with_fasttextr   s    '( W  ))11$7
$.qM
1a r==b10:1U:a=+,3
##r"   )Nlanguage_adherence_metricTNN)r   strr   Optional[str]r   r=   r   boolr   r>   r   zOptional[DetectorFn]returnNone)r,   r=   r-   r   r@   r
   )r9   r=   r@   ztuple[str, float])__name__
__module____qualname____doc__r   r1   r   __classcell__)r    s   @r!   r   r      sn    "N %)/&*)-88 "8 	8
 8 $8 '8 
8B
0	$r"   r   )rE   
__future__r   typingr   r   r   r   opik.exceptionsr   #opik.evaluation.metrics.base_metricr	   $opik.evaluation.metrics.score_resultr
   r   r   r=   r8   
DetectorFnr    r"   r!   <module>rN      sb    R " 1 1 2 : <
 seU3:../
g$j g$  Hs   A AA