a
    agN                     @   sL   d dl Z d dlmZmZmZmZ d dlmZ d dlm	Z	 G dd de	Z
dS )    N)AnyCallableOptionalUnion)parse_json_markdown)StringEvaluatorc                	       s   e Zd ZdZdeeeegef  eeegef  edd fddZ	e
edddZe
edd	d
Ze
edddZeeeedeeeef dddZdeee ee eedddZ  ZS )JsonEditDistanceEvaluatora  
    An evaluator that calculates the edit distance between JSON strings.

    This evaluator computes a normalized Damerau-Levenshtein distance between two JSON strings
    after parsing them and converting them to a canonical format (i.e., whitespace and key order are normalized).
    It can be customized with alternative distance and canonicalization functions.

    Args:
        string_distance (Optional[Callable[[str, str], float]]): A callable that computes the distance between two strings.
            If not provided, a Damerau-Levenshtein distance from the `rapidfuzz` package will be used.
        canonicalize (Optional[Callable[[Any], Any]]): A callable that converts a parsed JSON object into its canonical string form.
            If not provided, the default behavior is to serialize the JSON with sorted keys and no extra whitespace.
        **kwargs (Any): Additional keyword arguments.

    Attributes:
        _string_distance (Callable[[str, str], float]): The internal distance computation function.
        _canonicalize (Callable[[Any], Any]): The internal canonicalization function.

    Examples:
        >>> evaluator = JsonEditDistanceEvaluator()
        >>> result = evaluator.evaluate_strings(prediction='{"a": 1, "b": 2}', reference='{"a": 1, "b": 3}')
        >>> assert result["score"] is not None

    Raises:
        ImportError: If `rapidfuzz` is not installed and no alternative `string_distance` function is provided.

    N)string_distancecanonicalizekwargsreturnc                    sn   t    |d ur|| _n6zddlm} W n tyD   tdY n0 |jj| _|d ur`|| _n
dd | _d S )Nr   )distancezThe default string_distance operator for the  JsonEditDistanceEvaluator requires installation of the rapidfuzz package. Please install it with `pip install rapidfuzz`.c                 S   s   t j| dddS )N),:T)
separators	sort_keys)jsondumps)x r   x/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain/evaluation/parsing/json_distance.py<lambda>=   s   z4JsonEditDistanceEvaluator.__init__.<locals>.<lambda>)	super__init___string_distanceZ	rapidfuzzr   ImportErrorZDamerauLevenshteinZnormalized_distance_canonicalize)selfr	   r
   r   Zrfd	__class__r   r   r   &   s    


z"JsonEditDistanceEvaluator.__init__)r   c                 C   s   dS )NFr   r   r   r   r   requires_inputC   s    z(JsonEditDistanceEvaluator.requires_inputc                 C   s   dS )NTr   r    r   r   r   requires_referenceG   s    z,JsonEditDistanceEvaluator.requires_referencec                 C   s   dS )NZjson_edit_distancer   r    r   r   r   evaluation_nameK   s    z)JsonEditDistanceEvaluator.evaluation_name)noder   c                 C   s   t |trt|S |S )N)
isinstancestrr   )r   r$   r   r   r   _parse_jsonO   s    
z%JsonEditDistanceEvaluator._parse_json)
predictioninput	referencer   r   c                 K   s4   |  | |}|  | |}| ||}d|iS )NZscore)r   r'   r   )r   r(   r)   r*   r   parsedlabelr   r   r   r   _evaluate_stringsT   s    z+JsonEditDistanceEvaluator._evaluate_strings)NN)NN)__name__
__module____qualname____doc__r   r   r&   floatr   r   propertyboolr!   r"   r#   r   dictlistintr'   r-   __classcell__r   r   r   r   r   	   s2     "  r   )r   typingr   r   r   r   Zlangchain_core.utils.jsonr   Zlangchain.evaluation.schemar   r   r   r   r   r   <module>   s   