
    h|                         S r SSKrSSKrSSKJr  SSKJrJrJr  SSKJ	r	  SSK
Jr  SSKJr  SSKJr  \R                   " \5      r " S	 S
5      rg)z5
LangSmith integration handler for tracking AI usage
    N)datetime)OptionalDictAny)Client)LangChainTracer)capture_exception)MongoHandlerc                       \ rS rSrS rS\S\\   4S jrSS\S\\   S\	4S	 jjr
S\S
\\\\\4   4   S\\\4   4S jrSrg)LangSmithHandler   c                     [        5       U l        [        5       U l        [	        5       U l        [        R                  S5        g! [         a2  n[        R                  S[        U5       35        [        U5        e SnAff = f)zInitialize LangSmith handlerz*Successfully initialized LangSmith handlerz&Error initializing LangSmith handler: N)r   clientr   tracerr
   mongo_handlerloggerinfo	Exceptionerrorstrr	   )selfes     ;D:\Projects\AI-TestCaseGenerator\utils\langsmith_handler.py__init__LangSmithHandler.__init__   sf    
	 !(DK)+DK!-DKKDE 	LLA#a&JKa 	s   AA 
B-A<<Brun_idreturnc                 J    U R                   R                  U5      nUR                  R                  S0 5      nUR                  S5      nUR                  S5      nU(       a  U(       d  [        R                  SU 35        gUUUUR                  =(       d    SUR                  (       a  UR                  R                  S5      S   OSUR                  =(       d    SUR                  =(       d    SUR                  =(       d    [        R                  " 5       UR                  UR                  UR                  (       a  UR                  OS	UR                   UR                  (       a  [#        UR                  5      OSUR$                  UR&                  UR                  S
S5      S.S.nU R(                  R+                  U5      n[        R-                  SU 35        U$ ! [.         a9  n[        R                  SU S[#        U5       35        [1        U5         SnAgSnAff = f)z
Process a LangSmith run and store usage data. User information is extracted from run metadata.

Args:
    run_id (str): LangSmith run ID
    
Returns:
    Optional[str]: MongoDB record ID if successful, None otherwise
metadatauser_id
user_emailz!No user information found in run Nunknown/r   Successsource)tagsr   outputsfeedbackr%   )r   r    r!   
model_nameai_providerinput_tokensoutput_tokens	timestampend_time
latency_msstatusr   z&Successfully tracked AI usage for run zError processing LangSmith run : )r   read_runextragetr   warningmodelsplitprompt_tokenscompletion_tokens
start_timer   utcnowr.   
runtime_msr   r&   r   r'   r(   r   track_ai_usager   r   r	   )	r   r   runr   r    r!   
usage_data	record_idr   s	            r   process_runLangSmithHandler.process_run   s   +	++&&v.C yy}}Z4Hll9-G!l3J*!B6(KL !"(!ii49:=))syys3A6 # 1 1 6Q!$!6!6!;! ^^@x/@LL!nn'*yy#))iHH/2yyS^d"{{ #&ll8Y?J, **99*EIKK@IJ 	LL:6("SVHMNa 	s   A?G EG 
H")/HH"Nproject_namer:   c           	           U R                   R                  UUS9n[        U5      $ ! [         a;  n[        R                  SU S[        U5       35        [        U5        / s SnA$ SnAff = f)z
Get all runs for a specific project

Args:
    project_name (str): Name of the LangSmith project
    start_time (datetime, optional): Only get runs after this time
    
Returns:
    list: List of run data
)rC   r:   zError getting runs for project r1   N)r   	list_runslistr   r   r   r   r	   )r   rC   r:   runsr   s        r   get_project_runs!LangSmithHandler.get_project_runsU   sm    		;;(()% ) D : 	LL:<.3q6(STa I	s   $' 
A,0A'!A,'A,user_mappingc           	          U R                  U5      nSnSnSnU H|  nSnUR                  5        H!  u  pXR                  =(       d    / ;   d  M  U
n  O   U(       d  US-  nMH  U R                  UR                  US   US   5      (       a  US-  nMw  US-  nM~     [        U5      UUUS.$ ! [         aI  n[        R                  SU S[        U5       35        [        U5        [        U5      SSSS	.s SnA$ SnAff = f)
aU  
Sync all runs from a project to our tracking system

Args:
    project_name (str): Name of the LangSmith project
    user_mapping (dict): Mapping of run identifiers to user data
        Example: {
            "session_id": {"user_id": "123", "user_email": "user@example.com"}
        }
        
Returns:
    dict: Summary of sync operation
r   N   r    r!   )
total_runs	processedfailedskippedzError syncing project r1   )r   rN   rO   rP   )rH   itemsr&   rA   idlenr   r   r   r   r	   )r   rC   rJ   rG   rN   rO   rP   r>   	user_data
identifierdatar   s               r   sync_project_runs"LangSmithHandler.sync_project_runsk   s   (	((6DIFG 	(4(:(:(<$J!hhn"5$(	 )=
 !qLG ##CFFIi,@)LBYZZNIaKF! & "$i& "	   	LL1,r#a&JKa Q	 	s%   A	B+ AB+ +
C>5>C93C>9C>)r   r   r   )N)__name__
__module____qualname____firstlineno__r   r   r   rA   r   rF   rH   r   r   rW   __static_attributes__     r   r   r      s{    5# 5(3- 5nS hx>P \` ,6c 6c4PSUXPX>FYAZ 6_cdgildl_m 6r_   r   )__doc__osloggingr   typingr   r   r   	langsmithr   %langchain.callbacks.tracers.langchainr   utils.error_loggerr	   utils.mongo_handlerr
   	getLoggerrY   r   r   r^   r_   r   <module>ri      sC    
   & &  A 0 ,			8	$R Rr_   