
    6|h              	       r   d dl Z d dlZd dlmZ d dlmZ d dlmZmZm	Z	m
Z
mZmZmZ  G d de      Z G d de      Zd	ed
ede	e   fdZ G d d      Z G d de      Z G d de      Z G d de      Z G d de      Zeeee	eeef      gef   e	e   ef   ZdedefdZdddede
e   deegef   fdZy)    N)abstractmethod)defaultdict)AnyCallableListOptionalTuple	TypedDictUnionc                       e Zd ZU ee   ed<   y)_ExtractOptions	max_depthN)__name__
__module____qualname__r   int__annotations__     S/var/www/html/test/engine/venv/lib/python3.12/site-packages/langsmith/anonymizer.pyr   r      s    }r   r   c                   8    e Zd ZU dZeed<   	 eeeef      ed<   y)
StringNodez$String node extracted from the data.valuepathN)	r   r   r   __doc__strr   r   r   r   r   r   r   r   r      s#    .J
uS#X
.r   r   dataoptionsreturnc                     |j                  d      xs d}| dg fg}g }|r|j                  d      }||\  }}}t        |t        t        f      r:||k\  r8|j                         D ]   \  }	}
|j                  |
|dz   ||	gz   f       " nqt        |t              r5||k\  rt        |      D ]   \  }}|j                  ||dz   ||gz   f       " n,t        |t              r|j                  t        ||             |r|S )Nr   
   r      r   r   )getpop
isinstancedictr   itemsappendlist	enumerater   r   )r   r   r   queueresulttaskr   depthr   keynested_valueiitems                r   _extract_string_nodesr4      s   K(.BI<@!R=/E!F
yy|<!udedK01	!%*[[] F!\lEAItse|DEFt$	!$U+ <4dEAItqcz:;<s#MM*5t<=# & Mr   c                   6    e Zd ZdZedee   dee   fd       Zy)StringNodeProcessorz-Processes a list of string nodes for masking.nodesr   c                      y)z6Accept and return a list of string nodes to be masked.Nr   )selfr7   s     r   
mask_nodeszStringNodeProcessor.mask_nodes8   s    r   N)r   r   r   r   r   r   r   r:   r   r   r   r6   r6   5   s3    7EZ 0 ET*5E E Er   r6   c                   4    e Zd ZU dZee   ed<   	 ee   ed<   y)ReplacerOptionsz3Configuration options for replacing sensitive data.r   
deep_cloneN)r   r   r   r   r   r   r   boolr   r   r   r<   r<   =   s    =}?/r   r<   c                   B    e Zd ZU dZej
                  ed<   	 ee   ed<   y)StringNodeRulez3Declarative rule used for replacing sensitive data.patternreplaceN)	r   r   r   r   rePatternr   r   r   r   r   r   r@   r@   G   s    =ZZ!c]Gr   r@   c                   R    e Zd ZU dZee   ed<   	 dee   fdZdee   dee   fdZ	y)RuleNodeProcessorzJString node processor that uses a list of rules to replace sensitive data.rulesc           	          |D cg c]c  }t        |d   t        j                        r|d   nt        j                  |d         t        |j	                  d      t
              r|d   ndde c}| _        yc c}w )z.Initialize the processor with a list of rules.rA   rB   z
[redacted])rA   rB   N)r&   rC   rD   compiler$   r   rG   )r9   rG   rules      r   __init__zRuleNodeProcessor.__init__[   ss     
  "$y/2::> ODO4 "$((9"5s; O%

 
s   A(A6r7   r   c                     g }|D ]X  }|d   }| j                   D ]  }|d   j                  |d   |      } ||d   k7  s:|j                  t        ||d                Z |S )zMask nodes using the rules.r   rA   rB   r   r#   )rG   subr)   r   )r9   r7   r-   r3   	new_valuerJ   s         r   r:   zRuleNodeProcessor.mask_nodesm   sz     	NDWI

 L O//YK	LDM)jytF|LM	N r   N)
r   r   r   r   r   r@   r   rK   r   r:   r   r   r   rF   rF   Q   sC    T
d>2 
$	Z 0 	T*5E 	r   rF   c            	           e Zd ZU dZeeegef   eeeeeef      gef   f   e	d<   	 e
e	d<   	 deeegef   eeeeeef      gef   f   fdZdee   dee   fdZy)	CallableNodeProcessorzNString node processor that uses a callable function to replace sensitive data.funcaccepts_pathc                 r    || _         t        t        j                  |      j                        dk(  | _        y)z2Initialize the processor with a callable function.   N)rQ   leninspect	signature
parametersrR   )r9   rQ   s     r   rK   zCallableNodeProcessor.__init__   s.    
 	 1 1$ 7 B BCqHr   r7   r   c                     g }|D ]b  }| j                   r| j                  |d   |d         n| j                  |d         }||d   k7  sD|j                  t        ||d                d |S )z'Mask nodes using the callable function.r   r   r#   )rR   rQ   r)   r   )r9   r7   retvalnode	candidates        r   r:   z CallableNodeProcessor.mask_nodes   s|    #% 	ND $$ 		$w-f6YYtG}- 
 DM)jytF|LM	N r   N)r   r   r   r   r   r   r   r   r   r   r>   rK   r   r:   r   r   r   rP   rP   y   s    X
#$hT%S/5J/KS/P&QQ
RR G
IHcUCZ((CeCHo9N3OQT3T*UUVIZ 0 T*5E r   rP   replacerc                 l    t        | t              rt        |       S t        |       rt	        |       S | S )N)rG   )rQ   )r&   r*   rF   callablerP   )r]   s    r   _get_node_processorr`      s/    (D! x00	(	$(33r   )r   r   c                F    t        |       dt        dt        ffd}|S )zCreate an anonymizer function.r   r   c                     t        | dxs di      }| }	j                  |      }|D ]1  }|d   s|d   }|}|d   d d D ]  }||   }	 |d   d   }|d   ||<   3 |S )Nr   r!   r   r   )r4   r:   )
r   r7   mutate_value	to_updater[   temppart	last_partr   	processors
           r   
anonymizerz%create_anonymizer.<locals>.anonymizer   s    %d[)/r,JK((/	 		0D<#G}# L"- &D:D& !L,	"&w-Y		0 r   )r`   r   )r]   r   rj   ri   s    ` @r   create_anonymizerrk      s*     $H-I  $ r   )rC   rV   abcr   collectionsr   typingr   r   r   r   r	   r
   r   r   r   r4   r6   r<   r@   rF   rP   r   r   ReplacerTyper`   rk   r   r   r   <module>rp      s   	   # I I Ii / / o $zBR 8E E0i 0HY H%+ %P#/ #L c4c3h()3./, 3F   $ } seSj	r   