
    D_i'2                       % S r SSKJr  SSKrSSKJr  SSKJrJr  SSKJ	r	J
r
  SSKJr  SSKJrJr  SS	KJr  SS
KJ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KJ r J!r!  SSK"J#r#J$r$  SSK%J&r&  SSK'J(r(  \	(       a  SSK)J*r*  SSK+J,r,J-r-  \R\                  " \/5      r0\1" 5       r2Sq3S\4S'   SS jr5SS jr6S S jr7S!S jr8    S"S jr9 " S S\&5      r:g)#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                    U [        U5      4[        ;   a  g[        R                  U [        U5      45        [        R	                  U5        g)zzLog 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     Z/home/james-whalen/.local/lib/python3.13/site-packages/langchain_core/tracers/langchain.pylog_error_oncer(   &   s9     	Y G+KKi)*
LL    c                 d    [         R                  b  [         R                  R                  5         gg)zWait for all tracers to finish.N)rt_CLIENTflush r)   r'   wait_for_all_tracersr/   3   s!    	zz


 r)   c                 ,    [         R                  " 5       $ )z4Get the client.

Returns:
    The LangSmith client.
)r+   get_cached_clientr.   r)   r'   
get_clientr2   9   s     !!r)   c                 0    [         c
  [        5       q [         $ )zGet the executor.)r   r   r.   r)   r'   _get_executorr4   B   s     &(	r)   c                    SnU  H]  nU HT  n[        U[        5      (       d  M  SU;   d  M"  US   n[        U[        5      (       d  M>  SU;   d  MF  [        XS   5      nMV     M_     U$ )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   sh      $(F'*J*d++	Z0G$Y/gt,,1AW1L&v7G/HIF	 + ( Mr)   c                    ^  \ rS rSrSrSr    S           SU 4S jjjrS U 4S jjrSSSSS.                 S!S jjrS S	 jr	S"S
 jr
S#S jrS S jr\S S j5       rS S jr\  S$         S%U 4S jjj5       rS S jrS S jrS S jrS S jrS S jrS S jrS S jrS S jrS S jrS S jrS S jrS S jrS&S jrSrU =r $ )'LangChainTracerd   zHImplementation of the SharedTracer that POSTS to the LangChain endpoint.TNc                &  > [         TU ]  " S0 UD6  [        U[        5      (       a  [	        U5      OUU l        U=(       d    [        R                  " 5       U l        U=(       d
    [        5       U l
        U=(       d    / U l        SU l        0 U l        g)a  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)selfrF   rI   rJ   rK   kwargs	__class__s         r'   rD   LangChainTracer.__init__i   sr    " 	"6" *:s ; ;D 	 )IH,G,G,I,
JB	&*8:$r)   c                  > U R                   (       a  U R                   Ul        U R                  ba  UR                  (       a1  [        [	        UR                  U R                  -   5      5      Ul        OU R                  R                  5       Ul        [        TU ]  U5        UR                  c  U R                  Ul        [        5       R                  S5      SL a  SUR                  S'   g g )NenabledFT
__disabled)rI   session_namerK   sortedsetcopyrC   _start_trace	ls_clientrJ   r   getextra)rN   runrP   s     r'   rY   LangChainTracer._start_trace   s    #00C99 xx!#chh&:";<99>>+S!==  KKCM $$Y/58&*CIIl# 9r)   )rK   parent_run_idmetadatanamec               d   [         R                  " [        R                  5      n	U(       a  UR	                  SU05        [        UUUSU V
Vs/ s H  o Vs/ s H  n[        U5      PM     snPM      snn
0USU	S./U	SUUS9
nU R                  U5        U R                  U5        U$ s  snf s  snn
f )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)ra   timellm)
idr_   
serializedinputsr\   events
start_timerun_typerK   ra   )	r   nowr   utcupdater   r   rY   _on_chat_model_start)rN   rh   rc   run_idrK   r_   r`   ra   rO   rk   batchmsgchat_model_runs                r'   on_chat_model_start#LangChainTracer.on_chat_model_start   s    6 \\(,,/
MM:x01'!H UH5!>%*!>H UV$j9:!
 	.)!!.1 "? Us   	B,B'+B,'B,c                n    [        U1 SkS9n[        S0 UDUR                  UR                  S.D6U l        g )N>   ri   outputs
child_runs)exclude)ri   rx   r.   )r   r   ri   rx   rL   )rN   r]   run_datas      r'   _persist_runLangChainTracer._persist_run   s8     s,OP' 

::KK
r)   c                d   U R                   (       d  Sn[        U5      e[        [        S5      [	        5       [        [        R                  5      S9 H=  nU   U R                  R                  U R                   U R                  S9sSSS5        s  $    Sn[        U5      e! , (       d  f       M]  = f)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]   rI   NzFailed to get run URL.)rL   
ValueErrorr   r   r   r   rG   LangSmithErrorrJ   get_run_urlrI   )rN   rs   attempts      r'   r   LangChainTracer.get_run_url   s     (CS/!  #A&(*)(*A*AB
G
 {{..d6G6G /  
 'o s   .B  
B/	c                    [        UR                  =(       d    / 5      nUR                  U R                  =(       d    / 5        [        U5      $ )zGet combined tags for a run.)rW   rK   ro   list)rN   r]   rK   s      r'   	_get_tagsLangChainTracer._get_tags   s2    388>r"DIIO$Dzr)   c                T   UR                   R                  S5      (       a  g [        5       UR                   S'   U R                  U5      Ul        UR
                  U R                  La  U R                  Ul        UR                  5         g! [         a  n[        SU5        e SnAff = f)zPersist a run.rT   Nruntimepost)
r\   r[   r   r   rK   rZ   rJ   r   	Exceptionr(   )rN   r]   es      r'   _persist_run_single#LangChainTracer._persist_run_single   s    99==&&		#:#<CIIi ~~c*CH}}DKK/ $HHJ 	61%	s   A'B 
B'B""B'c                    U R                   R                  S5      (       a  g U R                  U R                   R                  SS5      S9  g! [         a  n[	        SU5        e SnAff = f)zUpdate a run.rT   Ninputs_is_truthyF)exclude_inputspatch)r\   r[   r   r   r(   )r]   r   s     r'   _update_run_single"LangChainTracer._update_run_single   sZ     99==&&	IISYY]]3Eu%MIN 	7A&	s   )A 
A)A$$A)c                b    UR                   c  U R                  Ul        U R                  U5        gzPersist an LLM run.Nr_   rF   reference_example_idr   rN   r]   s     r'   _on_llm_startLangChainTracer._on_llm_start  (    $'+C$  %r)   c                   > [        U5      nXPR                  ;  a  SU R                  U'   OU R                  USS1S9$ [        TU ]  UUS US9$ )NTrf   
chat_model)rl   )chunkr_   )rE   rM   _get_runrC   _llm_run_with_token_event)rN   tokenrq   r   r_   
run_id_strrP   s         r'   r   )LangChainTracer._llm_run_with_token_event  se     [
9997;D((4==5,2G=HHw0' 1 
 	
r)   c                b    UR                   c  U R                  Ul        U R                  U5        gr   r   r   s     r'   rp   $LangChainTracer._on_chat_model_start#  r   r)   c                    UR                   (       a[  SUR                   ;   aK  [        UR                   S   5      nUb0  SUR                  ;  a  0 UR                  S'   X!R                  S   S'   U R                  U5        g)zProcess the LLM Run.r:   Nr`   r7   )rx   r>   r\   r   )rN   r]   r7   s      r'   _on_llm_endLangChainTracer._on_llm_end)  sn     ;;=CKK7AM*N )SYY.,.CIIj):H		*%&67$r)   c                &    U R                  U5        g)zProcess the LLM Run upon error.Nr   r   s     r'   _on_llm_errorLangChainTracer._on_llm_error6      $r)   c                    UR                   c  U R                  Ul        UR                  R	                  S5      (       d  U R                  U5        gg)z!Process the Chain Run upon start.Ndefers_inputs)r_   rF   r   r\   r[   r   r   s     r'   _on_chain_startLangChainTracer._on_chain_start:  sB    $'+C$ yy}}_--$$S) .r)   c                    UR                   R                  S5      (       a  U R                  U5        gU R                  U5        g)zProcess the Chain Run.r   Nr\   r[   r   r   r   s     r'   _on_chain_endLangChainTracer._on_chain_endC  3     99==))$$S)##C(r)   c                    UR                   R                  S5      (       a  U R                  U5        gU R                  U5        g)z!Process the Chain Run upon error.r   Nr   r   s     r'   _on_chain_errorLangChainTracer._on_chain_errorL  r   r)   c                b    UR                   c  U R                  Ul        U R                  U5        g)z Process the Tool Run upon start.Nr   r   s     r'   _on_tool_startLangChainTracer._on_tool_startU  r   r)   c                &    U R                  U5        g)zProcess the Tool Run.Nr   r   s     r'   _on_tool_endLangChainTracer._on_tool_end[  r   r)   c                &    U R                  U5        g)z Process the Tool Run upon error.Nr   r   s     r'   _on_tool_errorLangChainTracer._on_tool_error_  r   r)   c                b    UR                   c  U R                  Ul        U R                  U5        g)z%Process the Retriever Run upon start.Nr   r   s     r'   _on_retriever_start#LangChainTracer._on_retriever_startc  r   r)   c                &    U R                  U5        g)zProcess the Retriever Run.Nr   r   s     r'   _on_retriever_end!LangChainTracer._on_retriever_endi  r   r)   c                &    U R                  U5        g)z%Process the Retriever Run upon error.Nr   r   s     r'   _on_retriever_error#LangChainTracer._on_retriever_errorm  r   r)   c                T    U R                   b  U R                   R                  5         gg)z'Wait for the given futures to complete.N)rJ   r-   )rN   s    r'   wait_for_futures LangChainTracer.wait_for_futuresq  s!    ;;"KK #r)   )rJ   rF   rL   rI   rM   rK   )NNNN)rF   zUUID | str | NonerI   
str | NonerJ   zClient | NonerK   list[str] | NonerO   r   returnNone)r]   r   r   r   )rh   zdict[str, Any]rc   zlist[list[BaseMessage]]rq   r	   rK   r   r_   UUID | Noner`   zdict[str, Any] | Nonera   r   rO   r   r   r   )r   rE   )r]   r   r   z	list[str])NN)
r   rE   rq   r	   r   z,GenerationChunk | ChatGenerationChunk | Noner_   r   r   r   r   r   )!__name__
__module____qualname____firstlineno____doc__
run_inlinerD   rY   ru   r|   r   r   r   staticmethodr   r   r   r   rp   r   r   r   r   r   r   r   r   r   r   r   r   __static_attributes____classcell__)rP   s   @r'   r@   r@   d   s   RJ )-#' $!%;%; !; 	;
 ; ; 
; ;6+* "&%)*.,", *,
 , , #, (, , , 
,\
8 	 	& 
 ?C%)

 
 <	

 #
 

 
(&%%*))&%%&%%   r)   r@   )r%   rE   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   rG   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#   rW   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)   