
    Ah                     ^    S SK r S SKJrJrJrJr  S SKJr  S SKJ	r	  S SK
Jr   " S S\5      rg)    N)AnyCallableOptionalUnion)parse_json_markdown)override)StringEvaluatorc                     ^  \ rS rSrSr  SS\\\\/\4      S\\\	/\	4      S\	SS4U 4S jjjr
\S\4S	 j5       r\S\4S
 j5       r\S\4S j5       rS\	S\\\S\\\\4   4S jr\  SS\S\\   S\\   S\	S\4
S jj5       rSrU =r$ )JsonEditDistanceEvaluator
   ai  
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                    > [         TU ]  5         Ub  Xl        O" SSKJn  UR                  R                  U l        Ub  X l        g S U l        g ! [
         a  nSn[        U5      UeS nAff = f)Nr   )distancezThe default string_distance operator for the  JsonEditDistanceEvaluator requires installation of the rapidfuzz package. Please install it with `pip install rapidfuzz`.c                 .    [         R                  " U SSS9$ )N),:T)
separators	sort_keys)jsondumps)xs    b/var/www/html/shao/venv/lib/python3.13/site-packages/langchain/evaluation/parsing/json_distance.py<lambda>4JsonEditDistanceEvaluator.__init__.<locals>.<lambda>?   s    4::%,    )	super__init___string_distance	rapidfuzzr   ImportErrorDamerauLevenshteinnormalized_distance_canonicalize)selfr   r   r   rfdemsg	__class__s          r   r    "JsonEditDistanceEvaluator.__init__'   s|     	&$3!	.5 %($:$:$N$ND!#!-"D  .F  "#&A-.s   A 
A,A''A,c                     g)NF r'   s    r   requires_input(JsonEditDistanceEvaluator.requires_inputE   s    r   c                     g)NTr.   r/   s    r   requires_reference,JsonEditDistanceEvaluator.requires_referenceI   s    r   c                     g)Njson_edit_distancer.   r/   s    r   evaluation_name)JsonEditDistanceEvaluator.evaluation_nameM   s    #r   nodec                 F    [        U[        5      (       a  [        U5      $ U$ )N)
isinstancestrr   )r'   r9   s     r   _parse_json%JsonEditDistanceEvaluator._parse_jsonQ   s    dC  &t,,r   
predictioninput	referencec                     U R                  U R                  U5      5      nU R                  U R                  U5      5      nU R                  XV5      nSU0$ )Nscore)r&   r=   r!   )r'   r?   r@   rA   r   parsedlabelr   s           r   _evaluate_strings+JsonEditDistanceEvaluator._evaluate_stringsV   sU     ##D$4$4Z$@A""4#3#3I#>?((7""r   )r&   r!   )NN)__name__
__module____qualname____firstlineno____doc__r   r   r<   floatr   r    propertyboolr0   r3   r7   r   dictlistintr=   r   rF   __static_attributes____classcell__)r+   s   @r   r   r   
   s2   < BF7;!(C:u+<"=> xs
34 	
 
 <    D   $ $ $ dD$tSRU.U(V 
   $#'	
#
# }
# C=	
#
 
# 

# 
#r   r   )r   typingr   r   r   r   langchain_core.utils.jsonr   typing_extensionsr   langchain.evaluation.schemar	   r   r.   r   r   <module>rY      s%     1 1 9 & 7W# W#r   