
    g3fi'2                       U d Z ddlmZ ddlZddlmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZ ddlmZmZ dd	lm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m Z m!Z! ddl"m#Z#m$Z$ ddl%m&Z& ddl'm(Z( e	rddl)m*Z* ddl+m,Z,m-Z-  ej\                  e/      Z0 e1       Z2da3de4d<   ddZ5ddZ6d dZ7d!dZ8	 	 	 	 d"dZ9 G d de&      Z:y)#z;A Tracer implementation that records to LangChain endpoint.    )annotationsN)ThreadPoolExecutor)datetimetimezone)TYPE_CHECKINGAny)UUID)Clientget_tracing_context)	run_trees)utils)Retryingretry_if_exception_typestop_after_attemptwait_exponential_jitter)override)get_runtime_environment)dumpd)UsageMetadata	add_usage)run_constructrun_to_dict)
BaseTracer)Run)BaseMessage)ChatGenerationChunkGenerationChunkzThreadPoolExecutor | None	_EXECUTORc                    | t        |      ft        v ryt        j                  | t        |      f       t        j	                  |       y)zLog an error once.

    Args:
        method: The method that raised the exception.
        exception: The exception that was raised.
    N)type_LOGGEDaddloggererror)method	exceptions     ^/var/www/auto_recruiter/arenv/lib/python3.12/site-packages/langchain_core/tracers/langchain.pylog_error_oncer(   &   s9     	Y G+KKi)*
LL    c                 b    t         j                  t         j                  j                          yy)zWait for all tracers to finish.N)rt_CLIENTflush r)   r'   wait_for_all_tracersr/   3   s!    	zz


 r)   c                 *    t        j                         S )z@Get the client.

    Returns:
        The LangSmith client.
    )r+   get_cached_clientr.   r)   r'   
get_clientr2   9   s     !!r)   c                 .    t         
t               a t         S )zGet the executor.)r   r   r.   r)   r'   _get_executorr4   B   s     &(	r)   c                    d}| D ]I  }|D ]B  }t        |t              sd|v s|d   }t        |t              s/d|v s4t        ||d         }D K |S )a  Extract and aggregate `usage_metadata` from generations.

    Iterates through generations to find and aggregate all `usage_metadata` found in
    messages. This is typically present in chat model outputs.

    Args:
        generations: List of generation batches, where each batch is a list
            of generation dicts that may contain a `'message'` key with
            `'usage_metadata'`.

    Returns:
        The aggregated `usage_metadata` dict if found, otherwise `None`.
    Nmessageusage_metadata)
isinstancedictr   )generationsoutputgeneration_batch
generationr6   s        r'   $_get_usage_metadata_from_generationsr>   J   sr      $(F' J* 	JJ*d+	Z0G$Y/gt,1AW1L&vw7G/HIF		JJ Mr)   c                  Z    e Zd ZdZdZ	 	 	 	 d	 	 	 	 	 	 	 	 	 	 	 d fdZd fdZddddd	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 ddZddZd d	Z	d!d
Z
ddZedd       ZddZe	 	 d"	 	 	 	 	 	 	 	 	 d# fd       ZddZddZddZddZddZddZddZddZddZddZddZddZd$dZ xZS )%LangChainTracerzHImplementation of the SharedTracer that POSTS to the LangChain endpoint.TNc                    t        |   di | t        |t              rt	        |      n|| _        |xs t        j                         | _        |xs
 t               | _
        |xs g | _        d| _        i | _        y)aV  Initialize the LangChain tracer.

        Args:
            example_id: The example ID.
            project_name: The project name. Defaults to the tracer project.
            client: The client. Defaults to the global client.
            tags: The tags. Defaults to an empty list.
            **kwargs: Additional keyword arguments.
        Nr.   )super__init__r8   strr	   
example_idls_utilsget_tracer_projectproject_namer2   clienttags
latest_runrun_has_token_event_map)selfrE   rH   rI   rJ   kwargs	__class__s         r'   rC   zLangChainTracer.__init__i   so    " 	"6" *:s ;D 	 )IH,G,G,I,
JB	&*8:$r)   c                   | j                   r| j                   |_        | j                  \|j                  r1t        t	        |j                  | j                  z               |_        n| j                  j                         |_        t        |   |       |j                  | j                  |_        t               j                  d      du rd|j                  d<   y y )NenabledFT
__disabled)rH   session_namerJ   sortedsetcopyrB   _start_trace	ls_clientrI   r   getextra)rM   runrO   s     r'   rW   zLangChainTracer._start_trace   s    #00C99 xx!#chh&:";<99>>+S!==  KKCM $$Y/58&*CIIl# 9r)   )rJ   parent_run_idmetadatanamec               T   t        j                  t        j                        }	|r|j	                  d|i       t        |||d|D 
cg c]  }
|
D cg c]  }t        |       c} c}}
i|d|	dg|	d||
      }| j                  |       | j                  |       |S c c}w c c}}
w )a  Start a trace for an LLM run.

        Args:
            serialized: The serialized model.
            messages: The messages.
            run_id: The run ID.
            tags: The tags.
            parent_run_id: The parent run ID.
            metadata: The metadata.
            name: The name.
            **kwargs: Additional keyword arguments.

        Returns:
            The run.
        r]   messagesstart)r^   timellm)
idr\   
serializedinputsrZ   events
start_timerun_typerJ   r^   )	r   nowr   utcupdater   r   rW   _on_chat_model_start)rM   re   r`   run_idrJ   r\   r]   r^   rN   rh   batchmsgchat_model_runs                r'   on_chat_model_startz#LangChainTracer.on_chat_model_start   s    6 \\(,,/
MM:x01'!H U5!>%*!> UV$j9:!
 	.)!!.1 "? Us   	B$B"B$B$c                t    t        |h d      }t        di ||j                  |j                  d| _        y )N>   rf   outputs
child_runs)exclude)rf   rt   r.   )r   r   rf   rt   rK   )rM   r[   run_datas      r'   _persist_runzLangChainTracer._persist_run   s8     s,OP' 

::KK
r)   c                X   | j                   sd}t        |      t        t        d      t	               t        t        j                              D ]@  }|5  | j                  j                  | j                   | j                        cddd       c S  d}t        |      # 1 sw Y   YxY w)zGet the LangSmith root run URL.

        Returns:
            The LangSmith root run URL.

        Raises:
            ValueError: If no traced run is found.
            ValueError: If the run URL cannot be found.
        zNo traced run found.   )stopwaitretry)r[   rH   NzFailed to get run URL.)rK   
ValueErrorr   r   r   r   rF   LangSmithErrorrI   get_run_urlrH   )rM   rp   attempts      r'   r   zLangChainTracer.get_run_url   s     (CS/!  #A&(*)(*A*AB
 	G
  {{..d6G6G /  	 'o s   1B  B)	c                    t        |j                  xs g       }|j                  | j                  xs g        t        |      S )zGet combined tags for a run.)rU   rJ   rl   list)rM   r[   rJ   s      r'   	_get_tagszLangChainTracer._get_tags   s2    388>r"DIIO$Dzr)   c                F   |j                   j                  d      ry	 t               |j                   d<   | j                  |      |_        |j
                  | j                  ur| j                  |_        |j                          y# t        $ r}t        d|        d}~ww xY w)zPersist a run.rR   Nruntimepost)
rZ   rY   r   r   rJ   rX   rI   r   	Exceptionr(   )rM   r[   es      r'   _persist_run_singlez#LangChainTracer._persist_run_single   s|    99==&		#:#<CIIi ~~c*CH}}DKK/ $HHJ 	61%	s   A&B 	B BB c                    | j                   j                  d      ry	 | j                  | j                   j                  dd             y# t        $ r}t	        d|        d}~ww xY w)zUpdate a run.rR   Ninputs_is_truthyF)exclude_inputspatch)rZ   rY   r   r   r(   )r[   r   s     r'   _update_run_singlez"LangChainTracer._update_run_single   sW     99==&	IISYY]]3Eu%MIN 	7A&	s   ,A 	A&A!!A&c                `    |j                   | j                  |_        | j                  |       yzPersist an LLM run.Nr\   rE   reference_example_idr   rM   r[   s     r'   _on_llm_startzLangChainTracer._on_llm_start  (    $'+C$  %r)   c                    t        |      }|| j                  vrd| j                  |<   n| j                  |ddh      S t        |   ||d |      S )NTrc   
chat_model)ri   )chunkr\   )rD   rL   _get_runrB   _llm_run_with_token_event)rM   tokenrn   r   r\   
run_id_strrO   s         r'   r   z)LangChainTracer._llm_run_with_token_event  sg     [
T9997;D((4==5,2G=HHw0' 1 
 	
r)   c                `    |j                   | j                  |_        | j                  |       yr   r   r   s     r'   rm   z$LangChainTracer._on_chat_model_start#  r   r)   c                    |j                   rWd|j                   v rIt        |j                   d         }|/d|j                  vri |j                  d<   ||j                  d   d<   | j                  |       y)zProcess the LLM Run.r:   Nr]   r7   )rt   r>   rZ   r   )rM   r[   r7   s      r'   _on_llm_endzLangChainTracer._on_llm_end)  sp     ;;=CKK7AM*N )SYY.,.CIIj):H		*%&67$r)   c                &    | j                  |       y)zProcess the LLM Run upon error.Nr   r   s     r'   _on_llm_errorzLangChainTracer._on_llm_error6      $r)   c                    |j                   | j                  |_        |j                  j	                  d      s| j                  |       yy)z!Process the Chain Run upon start.Ndefers_inputs)r\   rE   r   rZ   rY   r   r   s     r'   _on_chain_startzLangChainTracer._on_chain_start:  s?    $'+C$ yy}}_-$$S) .r)   c                    |j                   j                  d      r| j                  |       y| j                  |       y)zProcess the Chain Run.r   NrZ   rY   r   r   r   s     r'   _on_chain_endzLangChainTracer._on_chain_endC  0     99==)$$S)##C(r)   c                    |j                   j                  d      r| j                  |       y| j                  |       y)z!Process the Chain Run upon error.r   Nr   r   s     r'   _on_chain_errorzLangChainTracer._on_chain_errorL  r   r)   c                `    |j                   | j                  |_        | j                  |       y)z Process the Tool Run upon start.Nr   r   s     r'   _on_tool_startzLangChainTracer._on_tool_startU  r   r)   c                &    | j                  |       y)zProcess the Tool Run.Nr   r   s     r'   _on_tool_endzLangChainTracer._on_tool_end[  r   r)   c                &    | j                  |       y)z Process the Tool Run upon error.Nr   r   s     r'   _on_tool_errorzLangChainTracer._on_tool_error_  r   r)   c                `    |j                   | j                  |_        | j                  |       y)z%Process the Retriever Run upon start.Nr   r   s     r'   _on_retriever_startz#LangChainTracer._on_retriever_startc  r   r)   c                &    | j                  |       y)zProcess the Retriever Run.Nr   r   s     r'   _on_retriever_endz!LangChainTracer._on_retriever_endi  r   r)   c                &    | j                  |       y)z%Process the Retriever Run upon error.Nr   r   s     r'   _on_retriever_errorz#LangChainTracer._on_retriever_errorm  r   r)   c                R    | j                   | j                   j                          yy)z'Wait for the given futures to complete.N)rI   r-   )rM   s    r'   wait_for_futuresz LangChainTracer.wait_for_futuresq  s!    ;;"KK #r)   )NNNN)rE   zUUID | str | NonerH   
str | NonerI   zClient | NonerJ   list[str] | NonerN   r   returnNone)r[   r   r   r   )re   zdict[str, Any]r`   zlist[list[BaseMessage]]rn   r	   rJ   r   r\   UUID | Noner]   zdict[str, Any] | Noner^   r   rN   r   r   r   )r   rD   )r[   r   r   z	list[str])NN)
r   rD   rn   r	   r   z,GenerationChunk | ChatGenerationChunk | Noner\   r   r   r   r   r   )__name__
__module____qualname____doc__
run_inlinerC   rW   rr   rx   r   r   r   staticmethodr   r   r   r   rm   r   r   r   r   r   r   r   r   r   r   r   r   __classcell__)rO   s   @r'   r@   r@   d   s   RJ )-#' $!%;%; !; 	;
 ; ; 
;6+* "&%)*.,", *,
 , , #, (, , , 
,\
8 	 	& 
 ?C%)

 
 <	

 #
 

 
(&%%*))&%%&%% r)   r@   )r%   rD   r&   r   r   r   r   )r   r
   )r   r   )r:   zlist[list[dict[str, Any]]]r   zUsageMetadata | None);r   
__future__r   loggingconcurrent.futuresr   r   r   typingr   r   uuidr	   	langsmithr
   r   r   r+   r   rF   tenacityr   r   r   r   typing_extensionsr   langchain_core.envr   langchain_core.loadr   langchain_core.messages.air   r   langchain_core.tracers._compatr   r   langchain_core.tracers.baser   langchain_core.tracers.schemasr   langchain_core.messagesr   langchain_core.outputsr   r   	getLoggerr   r#   rU   r!   r   __annotations__r(   r/   r2   r4   r>   r@   r.   r)   r'   <module>r      s    A "  1 ' %  1 % '  ' 6 % ? E 2 .3K			8	$
%'+	$ +
"+4P j P r)   