§
    æ˜ºhªJ  ã                  óô   — d Z ddlmZ ddlZddlmZmZmZmZm	Z	m
Z
mZ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 dd	lmZ ddlmZ d
Zdd„Z G d„ d¦  «        Z G d„ de¦  «        Z G d„ de¦  «        ZdS )zBA Tracer Implementation that records activity to Weights & Biases.é    )ÚannotationsN)	ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptionalÚSequenceÚTupleÚ	TypedDictÚUnion)Ú
BaseTracer)ÚRun)ÚSettings)ÚSpan)ÚStrPathTÚ
run_inputsúOptional[dict]ÚreturnÚdictc                ó  — | si S ddl m} ddlm} i }|                      ¦   «         D ]\\  }}t          ||¦  «        r ||¦  «        ||<   Œ$|dk    r-|                     d„ t          |¦  «        D ¦   «         ¦  «         ŒW|||<   Œ]|S )Nr   )ÚMessageToJson)ÚMessageÚinput_documentsc                óD   — i | ]\  }}d |› �|                      ¦   «         “ŒS )Úinput_document_)Újson)Ú.0ÚiÚdocs      ús/var/www/html/services/rag-service/venv/lib/python3.11/site-packages/langchain_community/callbacks/tracers/wandb.pyú
<dictcomp>z!_serialize_io.<locals>.<dictcomp>*   s/   € ÐRÐRÐR±v°q¸#Ð& 1Ð&Ð&¨¯ª©
¬
ÐRÐRÐRó    )Úgoogle.protobuf.json_formatr   Úgoogle.protobuf.messager   ÚitemsÚ
isinstanceÚupdateÚ	enumerate)r   r   r   Úserialized_inputsÚkeyÚvalues         r    Ú_serialize_ior,      sÚ   € Øð Øˆ	Ø9Ð9Ð9Ð9Ð9Ð9Ø/Ð/Ð/Ð/Ð/Ð/àÐØ ×&Ò&Ñ(Ô(ð +ð +‰
ˆˆUÝ�e˜WÑ%Ô%ð 	+Ø%2 ]°5Ñ%9Ô%9Ð˜cÑ"Ð"ØÐ%Ò%Ð%Ø×$Ò$ØRÐRÅÈ5ÑAQÔAQÐRÑRÔRñô ð ð ð &+Ð˜cÑ"Ð"ØÐr"   c                  ó|   — e Zd Z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&d„Z	 	 d'd(d„Zd)d„ZdS )*ÚRunProcessorz>Handles the conversion of a LangChain Runs into a WBTraceTree.Úwandb_moduler   Útrace_modulec                ó"   — || _         || _        d S ©N)ÚwandbÚ
trace_tree)Úselfr/   r0   s      r    Ú__init__zRunProcessor.__init__4   s   € Ø!ˆŒ
Ø&ˆŒˆˆr"   Úrunr   r   úOptional['Span']c                óª   — 	 |                       |¦  «        }|S # t          $ r/}t          r| j                             d|› �¦  «         Y d}~dS d}~ww xY w)z™Converts a LangChain Run into a W&B Trace Span.
        :param run: The LangChain Run to convert.
        :return: The converted W&B Trace Span.
        zVSkipping trace saving - unable to safely convert LangChain Run into W&B Trace due to: N)Ú_convert_lc_run_to_wb_spanÚ	ExceptionÚPRINT_WARNINGSr3   Útermwarn)r5   r7   ÚspanÚes       r    Úprocess_spanzRunProcessor.process_span8   s�   € ð
		Ø×2Ò2°3Ñ7Ô7ˆDØˆKøÝð 	ð 	ð 	Ýð Ø”
×#Ò#ð2Ø./ð2ð 2ñô ð ð �4�4�4�4�4øøøøð	øøøs   ‚ ™
A£$AÁAú'Span'c           	     óÂ  — |j         r	i |j         ¥ni }|j        |d<   | j                             |j        �t          |j        ¦  «        nd|j        t          |j         	                    ¦   «         dz  ¦  «        |j
        �)t          |j
         	                    ¦   «         dz  ¦  «        nd|j        €| j        j        j        n| j        j        j        |j        |¬¦  «        S )zBase utility to create a span from a run.
        :param run: The run to convert.
        :return: The converted Span.
        Úexecution_orderNiè  )Úspan_idÚnameÚstart_time_msÚend_time_msÚstatus_codeÚstatus_messageÚ
attributes)ÚextrarC   r4   r   ÚidÚstrrE   ÚintÚ
start_timeÚ	timestampÚend_timeÚerrorÚ
StatusCodeÚSUCCESSÚERROR)r5   r7   rJ   s      r    Ú_convert_run_to_wb_spanz$RunProcessor._convert_run_to_wb_spanH   sÙ   € ð
 '*¤iÐ7�]˜œ	�]�]°Rˆ
Ø(+Ô(;ˆ
Ð$Ñ%àŒ×#Ò#Ø#&¤6Ð#5•C˜œ‘K”K�K¸4Ø”Ý˜cœn×6Ò6Ñ8Ô8¸4Ñ?Ñ@Ô@àŒ|Ð'õ ˜CœL×2Ò2Ñ4Ô4°tÑ;Ñ<Ô<Ð<ààŒyÐ ð œÔ2Ô:Ð:à”Ô+Ô1Øœ9Ø!ð $ñ 
ô 
ð 	
r"   c                ó"  ‡ ‡— ‰                       ‰¦  «        }|j        €i |_        ‰j        pi                      di ¦  «        |j        d<   ˆˆ fd„t	          ‰j        d         pg ¦  «        D ¦   «         |_        ‰ j        j        j	        |_
        |S )z¡Converts a LangChain LLM Run into a W&B Trace Span.
        :param run: The LangChain LLM Run to convert.
        :return: The converted W&B Trace Span.
        NÚ
llm_outputc           
     ó8  •— g | ]–\  }}‰j                              d |i‰j        �lt          ‰j        d         ¦  «        |k    rNt          ‰j        d         |         ¦  «        dk    r*d„ t	          ‰j        d         |         ¦  «        D ¦   «         nd¬¦  «        ‘Œ—S )ÚpromptNÚgenerationsr   c                ó,   — i | ]\  }}d |› �|d         “ŒS )Úgen_Útext© )r   Úg_iÚgens      r    r!   zGRunProcessor._convert_llm_run_to_wb_span.<locals>.<listcomp>.<dictcomp>k   s8   € ð ð ð á ˜˜Sð !˜3�L�L # f¤+ðð ð r"   ©ÚinputsÚoutputs)r4   ÚResultrd   Úlenr(   )r   ÚndxrZ   r7   r5   s      €€r    ú
<listcomp>z<RunProcessor._convert_llm_run_to_wb_span.<locals>.<listcomp>h   sË   ø€ ð 
ð 
ð 
ñ ��Vð ŒO×"Ò"Ø  &Ð)ð ”KÐ+Ý˜CœK¨Ô6Ñ7Ô7¸#Ò=Ð=Ý˜CœK¨Ô6°sÔ;Ñ<Ô<¸qÒ@Ð@ðð å$-¨c¬k¸-Ô.HÈÔ.MÑ$NÔ$Nðñ ô ð ð ð #ñ ô ð
ð 
ð 
r"   Úprompts)rV   rJ   rd   Úgetr(   rc   Úresultsr4   ÚSpanKindÚLLMÚ	span_kind©r5   r7   Ú	base_spans   `` r    Ú_convert_llm_run_to_wb_spanz(RunProcessor._convert_llm_run_to_wb_span^   s­   øø€ ð
 ×0Ò0°Ñ5Ô5ˆ	ØÔÐ'Ø#%ˆIÔ Ø.1¬kÐ.?¸R×-DÒ-DÀ\ÐSUÑ-VÔ-Vˆ	Ô˜\Ñ*ð
ð 
ð 
ð 
ð 
õ  )¨¬°IÔ)>Ð)DÀ"ÑEÔEð
ñ 
ô 
ˆ	Ôð  #œoÔ6Ô:ˆ	ÔàÐr"   c                ór  ‡ — ‰                       |¦  «        }‰ j                             t          |j        ¦  «        t          |j        ¦  «        ¬¦  «        g|_        ˆ fd„|j        D ¦   «         |_        d|j	         
                    ¦   «         v r‰ j        j        j        n‰ j        j        j        |_        |S )z¥Converts a LangChain Chain Run into a W&B Trace Span.
        :param run: The LangChain Chain Run to convert.
        :return: The converted W&B Trace Span.
        rb   c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r_   ©r:   ©r   Ú	child_runr5   s     €r    rh   z>RunProcessor._convert_chain_run_to_wb_span.<locals>.<listcomp>ˆ   ó4   ø€ ð !
ð !
ð !
Ø;DˆD×+Ò+¨IÑ6Ô6ð!
ð !
ð !
r"   Úagent)rV   r4   re   r,   rc   rd   rk   Ú
child_runsÚchild_spansrE   Úlowerrl   ÚAGENTÚCHAINrn   ro   s   `  r    Ú_convert_chain_run_to_wb_spanz*RunProcessor._convert_chain_run_to_wb_span|   sÈ   ø€ ð
 ×0Ò0°Ñ5Ô5ˆ	ð ŒO×"Ò"Ý$ S¤ZÑ0Ô0½-ÈÌÑ:TÔ:Tð #ñ ô ð
ˆ	Ôð
!
ð !
ð !
ð !
ØHKÌð!
ñ !
ô !
ˆ	Ôð
 ˜#œ(Ÿ.š.Ñ*Ô*Ð*Ð*ð ŒOÔ$Ô*Ð*à”Ô)Ô/ð 	Ôð Ðr"   c                ó  ‡ — ‰                       |¦  «        }‰ j                             t          |j        ¦  «        t          |j        ¦  «        ¬¦  «        g|_        ˆ fd„|j        D ¦   «         |_        ‰ j        j	        j
        |_        |S )z£Converts a LangChain Tool Run into a W&B Trace Span.
        :param run: The LangChain Tool Run to convert.
        :return: The converted W&B Trace Span.
        rb   c                ó:   •— g | ]}‰                      |¦  «        ‘ŒS r_   rt   ru   s     €r    rh   z=RunProcessor._convert_tool_run_to_wb_span.<locals>.<listcomp>ž   rw   r"   )rV   r4   re   r,   rc   rd   rk   ry   rz   rl   ÚTOOLrn   ro   s   `  r    Ú_convert_tool_run_to_wb_spanz)RunProcessor._convert_tool_run_to_wb_span“   sš   ø€ ð
 ×0Ò0°Ñ5Ô5ˆ	àŒO×"Ò"Ý$ S¤ZÑ0Ô0½-ÈÌÑ:TÔ:Tð #ñ ô ð
ˆ	Ôð
!
ð !
ð !
ð !
ØHKÌð!
ñ !
ô !
ˆ	Ôð #œoÔ6Ô;ˆ	ÔàÐr"   c                óì   — |j         dk    r|                      |¦  «        S |j         dk    r|                      |¦  «        S |j         dk    r|                      |¦  «        S |                      |¦  «        S )z­Utility to convert any generic LangChain Run into a W&B Trace Span.
        :param run: The LangChain Run to convert.
        :return: The converted W&B Trace Span.
        ÚllmÚchainÚtool)Úrun_typerq   r~   r‚   rV   ©r5   r7   s     r    r:   z'RunProcessor._convert_lc_run_to_wb_span¥   s{   € ð
 Œ<˜5Ò Ð Ø×3Ò3°CÑ8Ô8Ð8ØŒ\˜WÒ$Ð$Ø×5Ò5°cÑ:Ô:Ð:ØŒ\˜VÒ#Ð#Ø×4Ò4°SÑ9Ô9Ð9à×/Ò/°Ñ4Ô4Ð4r"   úOptional[Dict[str, Any]]c                óŒ  — 	 t          j        |                      ¦   «         ¦  «        }|                      |¦  «        }d}|                      ||¬¦  «        }d\  }}|                      |||¬¦  «        }|                      |¦  «        }|S # t          $ r/}t          r| j         	                    d|› �¦  «         Y d}~dS d}~ww xY w)z­Utility to process a run for wandb model_dict serialization.
        :param run: The run to process.
        :return: The convert model_dict to pass to WBTraceTree.
        )rL   rE   Ú
serializedrc   rd   Úparent_run_idrC   )Ú	keep_keys))ÚlcÚtype)Úapi_key)Ú
exact_keysÚpartial_keysz$WARNING: Failed to serialize model: N)
r   ÚloadsÚflatten_runÚtruncate_run_iterativeÚmodify_serialized_iterativeÚ
build_treer;   r<   r3   r=   )	r5   r7   ÚdataÚ	processedr�   r‘   r’   Úoutputr?   s	            r    Úprocess_modelzRunProcessor.process_model³   sé   € ð
	Ý”:˜cŸhšh™jœjÑ)Ô)ˆDØ×(Ò(¨Ñ.Ô.ˆIðˆIð ×3Ò3°IÈÐ3ÑSÔSˆIØ'CÑ$ˆJ˜Ø×8Ò8Ø j¸|ð 9ñ ô ˆIð —_’_ YÑ/Ô/ˆFØˆMøÝð 	ð 	ð 	Ýð PØ”
×#Ò#Ð$NÈ1Ð$NÐ$NÑOÔOÐOØ�4�4�4�4�4øøøøð	øøøs   ‚BB
 Â

CÂ$B>Â>CúDict[str, Any]úList[Dict[str, Any]]c                ó(   ‡— dˆfd„Š ‰|g¦  «        S )zœUtility to flatten a nest run object into a list of runs.
        :param run: The base run to flatten.
        :return: The flattened list of runs.
        ry   r�   r   c                ó°   •— | €g S g }| D ]K}|                      dg ¦  «        } |                     |¦  «         |                      ‰| ¦  «        ¦  «         ŒL|S )z½Utility to recursively flatten a list of child runs in a run.
            :param child_runs: The list of child runs to flatten.
            :return: The flattened list of runs.
            Nry   )ÚpopÚappendÚextend)ry   ÚresultÚitemÚflattens      €r    r¥   z)RunProcessor.flatten_run.<locals>.flattenÖ   sm   ø€ ð
 Ð!Ø�	àˆFØ"ð 3ð 3�Ø!ŸXšX l°BÑ7Ô7�
Ø—’˜dÑ#Ô#Ð#Ø—’˜g˜g jÑ1Ô1Ñ2Ô2Ð2Ð2àˆMr"   )ry   r�   r   r�   r_   )r5   r7   r¥   s     @r    r”   zRunProcessor.flatten_runÐ   s3   ø€ ð	ð 	ð 	ð 	ð 	ð 	ð  ˆw˜�u‰~Œ~Ðr"   r_   Úrunsr�   úTuple[str, ...]c                óJ   ‡— dˆfd„}t          t          ||¦  «        ¦  «        S )a	  Utility to truncate a list of runs dictionaries to only keep the specified
            keys in each run.
        :param runs: The list of runs to truncate.
        :param keep_keys: The keys to keep in each run.
        :return: The truncated list of runs.
        r7   rœ   r   c                óN   •— i }| D ]}|‰v r|                       |¦  «        ||<   Œ|S )zÓUtility to truncate a single run dictionary to only keep the specified
                keys.
            :param run: The run dictionary to truncate.
            :return: The truncated run dictionary
            )rj   )r7   Únew_dictr*   r�   s      €r    Útruncate_singlez<RunProcessor.truncate_run_iterative.<locals>.truncate_singleò   s=   ø€ ð ˆHØð 1ð 1�Ø˜)Ð#Ð#Ø$'§G¢G¨C¡L¤L�H˜S‘MøØˆOr"   ©r7   rœ   r   rœ   ©ÚlistÚmap)r5   r¦   r�   r«   s     ` r    r•   z#RunProcessor.truncate_run_iterativeè   s;   ø€ ð
	ð 
	ð 
	ð 
	ð 
	ð 
	õ •C˜¨Ñ.Ô.Ñ/Ô/Ð/r"   r‘   r’   c                ó€   ‡‡‡‡‡— dˆˆˆfd„Š	 ddˆfd„Šdˆˆfd
„Šdˆfd„}t          t          ||¦  «        ¦  «        S )aÇ  Utility to modify the serialized field of a list of runs dictionaries.
        removes any keys that match the exact_keys and any keys that contain any of the
        partial_keys.
        recursively moves the dictionaries under the kwargs key to the top level.
        changes the "id" field to a string "_kind" field that tells WBTraceTree how to
        visualize the run. promotes the "serialized" field to the top level.

        :param runs: The list of runs to modify.
        :param exact_keys: A tuple of keys to remove from the serialized field.
        :param partial_keys: A tuple of partial keys to remove from the serialized
            field.
        :return: The modified list of runs.
        Úobjrœ   r   c                ó  •— t          | t          ¦  «        rJˆˆfd„|                      ¦   «         D ¦   «         } |                      ¦   «         D ]\  }} ‰|¦  «        | |<   Œn#t          | t          ¦  «        rˆfd„| D ¦   «         } | S )z´Recursively removes exact and partial keys from a dictionary.
            :param obj: The dictionary to remove keys from.
            :return: The modified dictionary.
            c                ó\   •‡— i | ]'\  Š}‰‰v¯	t          ˆfd „‰D ¦   «         ¦  «        °$‰|“Œ(S )c              3  ó    •K  — | ]}|‰v V — Œ	d S r2   r_   )r   ÚpartialÚks     €r    ú	<genexpr>zmRunProcessor.modify_serialized_iterative.<locals>.remove_exact_and_partial_keys.<locals>.<dictcomp>.<genexpr>  s'   øè è € ÐIÐI° ¨1 ÐIÐIÐIÐIÐIÐIr"   )Úany)r   Úvr¶   r‘   r’   s     @€€r    r!   zcRunProcessor.modify_serialized_iterative.<locals>.remove_exact_and_partial_keys.<locals>.<dictcomp>  sZ   øø€ ð ð ð á˜˜1Ø 
Ð*Ð*ÝÐIÐIÐIÐI¸LÐIÑIÔIÑIÔIð +ð �qà*Ð*Ð*r"   c                ó&   •— g | ]} ‰|¦  «        ‘ŒS r_   r_   )r   ÚxÚremove_exact_and_partial_keyss     €r    rh   zcRunProcessor.modify_serialized_iterative.<locals>.remove_exact_and_partial_keys.<locals>.<listcomp>#  s%   ø€ ÐEÐEÐE¸AÐ4Ð4°QÑ7Ô7ÐEÐEÐEr"   )r&   r   r%   r®   )r±   r¶   r¹   r‘   r’   r¼   s      €€€r    r¼   zORunProcessor.modify_serialized_iterative.<locals>.remove_exact_and_partial_keys  s¶   ø€ õ
 ˜#�tÑ$Ô$ð 
Fðð ð ð ð à #§	¢	¡¤ðñ ô �ð  ŸIšI™KœKð >ð >‘D�A�qØ:Ð:¸1Ñ=Ô=�C˜‘F�Fð>å˜C¥Ñ&Ô&ð FØEÐEÐEÐEÀÐEÑEÔE�ØˆJr"   FÚrootÚboolc                ó  •— t          | t          ¦  «        rÏd| v sd| v rž|sœ|                      d¦  «        }|s|                      d¦  «        g}|d         | d<   |                      dd¦  «         |                      dd¦  «         d| v r4|                      d¦  «        }|                     ¦   «         D ]
\  }}|| |<   Œ|                      ¦   «         D ]\  }} ‰|¦  «        | |<   Œn#t          | t
          ¦  «        rˆfd„| D ¦   «         } | S )aõ  Recursively handles the id and kwargs fields of a dictionary.
            changes the id field to a string "_kind" field that tells WBTraceTree how
            to visualize the run. recursively moves the dictionaries under the kwargs
            key to the top level.
            :param obj: a run dictionary with id and kwargs fields.
            :param root: whether this is the root dictionary or the serialized
                dictionary.
            :return: The modified dictionary.
            rL   rE   éÿÿÿÿÚ_kindNÚkwargsc                ó&   •— g | ]} ‰|¦  «        ‘ŒS r_   r_   )r   r»   Úhandle_id_and_kwargss     €r    rh   zZRunProcessor.modify_serialized_iterative.<locals>.handle_id_and_kwargs.<locals>.<listcomp>A  s%   ø€ Ð<Ð<Ð<°1Ð+Ð+¨AÑ.Ô.Ð<Ð<Ð<r"   )r&   r   rj   r    r%   r®   )r±   r½   rÁ   rÂ   r¶   r¹   rÄ   s         €r    rÄ   zFRunProcessor.modify_serialized_iterative.<locals>.handle_id_and_kwargs&  s0  ø€ õ ˜#�tÑ$Ô$ð =Ø˜C�K�K 6¨S = =¸$ =ØŸGšG D™MœM�EØ ð 2Ø!$§¢¨¡¤Ð 1˜Ø#(¨¤9�C˜‘LØ—G’G˜D $Ñ'Ô'Ð'Ø—G’G˜F DÑ)Ô)Ð)Ø 3��Ø!$§¢¨Ñ!2Ô!2˜Ø$*§L¢L¡N¤Nð 'ð '™D˜A˜qØ%&˜C ™F˜FØŸIšI™KœKð 5ð 5‘D�A�qØ1Ð1°!Ñ4Ô4�C˜‘F�Fð5å˜C¥Ñ&Ô&ð =Ø<Ð<Ð<Ð<¸Ð<Ñ<Ô<�ØˆJr"   r‹   c                ó8   •—  ‰| d¬¦  «        }  ‰| ¦  «        } | S )zóTransforms the serialized field of a run dictionary to be compatible
                with WBTraceTree.
            :param serialized: The serialized field of a run dictionary.
            :return: The transformed serialized field.
            T)r½   r_   )r‹   rÄ   r¼   s    €€r    Útransform_serializedzFRunProcessor.modify_serialized_iterative.<locals>.transform_serializedD  s0   ø€ ð .Ð-¨j¸tÐDÑDÔDˆJØ6Ð6°zÑBÔBˆJØÐr"   r7   c                ó$  •—  ‰	| ¦  «        }|                      d¦  «        }|                     ¦   «         D ]
\  }}|||<   Œ|                     dd¦  «        }|                      dd¦  «        }|                      dd¦  «        }|s|}|› d|› �|i}|S )z¹Transforms a run dictionary to be compatible with WBTraceTree.
            :param run: The run dictionary to transform.
            :return: The transformed run dictionary.
            r‹   rÁ   NrE   rC   Ú_)r    r%   rj   )
r7   Útransformed_dictr‹   r¶   r¹   rÁ   rE   Úexec_ordÚoutput_dictrÆ   s
            €r    Útransform_runz?RunProcessor.modify_serialized_iterative.<locals>.transform_runN  sÈ   ø€ ð
  4Ð3°CÑ8Ô8Ðà)×-Ò-¨lÑ;Ô;ˆJØ"×(Ò(Ñ*Ô*ð (ð (‘��1Ø&'Ð  Ñ#Ð#à$×(Ò(¨°$Ñ7Ô7ˆEØ#×'Ò'¨°Ñ5Ô5ˆDØ'×+Ò+Ð,=¸tÑDÔDˆHàð Ø�ð Ð$Ð$˜dÐ$Ð$Ð&6ðˆKð Ðr"   )r±   rœ   r   rœ   ©F)r±   rœ   r½   r¾   r   rœ   )r‹   rœ   r   rœ   r¬   r­   )r5   r¦   r‘   r’   rÌ   rÄ   r¼   rÆ   s     `` @@@r    r–   z(RunProcessor.modify_serialized_iterative   s²   øøøøø€ ð(	ð 	ð 	ð 	ð 	ð 	ð 	ð 	ð& /4ð	ð 	ð 	ð 	ð 	ð 	ð 	ð<	ð 	ð 	ð 	ð 	ð 	ð 	ð	ð 	ð 	ð 	ð 	ð 	õ. •C˜ tÑ,Ô,Ñ-Ô-Ð-r"   c           	     óB  ‡— i }i Š|D ]V}|                      ¦   «         D ]?\  }}|                     dd¦  «        }|                     dd¦  «        }||i||<   |r|‰|<   Œ@ŒW‰                      ¦   «         D ]~\  }}	||	         }
||         t          t          ||         ¦  «        ¦  «                 |
t          t          |
¦  «        ¦  «                 t          t          ||         ¦  «        ¦  «        <   Œt          ˆfd„|                      ¦   «         D ¦   «         ¦  «        }|S )zùBuilds a nested dictionary from a list of runs.
        :param runs: The list of runs to build the tree from.
        :return: The nested dictionary representing the langchain Run in a tree
            structure compatible with WBTraceTree.
        rL   NrŒ   c              3  ó*   •K  — | ]\  }}|‰v¯	|V — Œd S r2   r_   )r   Úid_valr˜   Úchild_to_parents      €r    r·   z*RunProcessor.build_tree.<locals>.<genexpr>~  s:   øè è € ð 
ð 
Ù!�V˜T¸6ÈÐ;XÐ;XˆDÐ;XÐ;XÐ;XÐ;Xð
ð 
r"   )r%   r    ÚnextÚiter)r5   r¦   Ú
id_to_dataÚentityr*   r˜   rÐ   rŒ   Úchild_idÚ	parent_idÚparent_dictÚ	root_dictrÑ   s               @r    r—   zRunProcessor.build_treeg  s^  ø€ ð ˆ
Øˆàð 	<ð 	<ˆFØ#Ÿ\š\™^œ^ð <ð <‘	��TØŸš $¨Ñ-Ô-�Ø $§¢¨¸$Ñ ?Ô ?�Ø&)¨4 [�
˜6Ñ"Ø ð <Ø.;�O FÑ+øð<ð $3×#8Ò#8Ñ#:Ô#:ð 	Gð 	GÑˆH�iØ$ YÔ/ˆKð ˜8Ô$¥T­$¨z¸(Ô/CÑ*DÔ*DÑ%EÔ%EÔFð ��T +Ñ.Ô.Ñ/Ô/Ô0Ý•T˜* XÔ.Ñ/Ô/Ñ0Ô0ñð õ ð 
ð 
ð 
ð 
Ø%/×%5Ò%5Ñ%7Ô%7ð
ñ 
ô 
ñ 
ô 
ˆ	ð Ðr"   N)r/   r   r0   r   )r7   r   r   r8   )r7   r   r   rA   )r7   r   r   r‰   )r7   rœ   r   r�   )r_   )r¦   r�   r�   r§   r   r�   )r_   r_   )r¦   r�   r‘   r§   r’   r§   r   r�   )r¦   r�   r   rœ   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r6   r@   rV   rq   r~   r‚   r:   r›   r”   r•   r–   r—   r_   r"   r    r.   r.   1   s)  € € € € € ØHÐHð'ð 'ð 'ð 'ðð ð ð ð 
ð 
ð 
ð 
ð,ð ð ð ð<ð ð ð ð.ð ð ð ð$5ð 5ð 5ð 5ðð ð ð ð:ð ð ð ð2 HJð0ð 0ð 0ð 0ð 0ð6 ')Ø(*ð	e.ð e.ð e.ð e.ð e.ðNð ð ð ð ð r"   r.   c                  ó  — e Zd ZU dZded<   ded<   ded<   ded<   ded	<   d
ed<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   ded<   d
ed<   ded<   d
ed<   d
ed<   d
ed<   d
ed<   d
ed<   ded <   d!ed"<   d#S )$ÚWandbRunArgszArguments for the WandbTracer.zOptional[str]Újob_typezOptional[StrPath]ÚdirzUnion[Dict, str, None]ÚconfigÚprojectrÕ   zOptional[bool]ÚreinitzOptional[Sequence]ÚtagsÚgrouprE   Únotesz Optional[Union[dict, str, bool]]ÚmagiczOptional[List[str]]Úconfig_exclude_keysÚconfig_include_keysÚ	anonymousÚmodeÚallow_val_changezOptional[Union[bool, str]]ÚresumeÚforceÚtensorboardÚsync_tensorboardÚmonitor_gymÚ	save_coderL   z'Union[WBSettings, Dict[str, Any], None]ÚsettingsN)rÚ   rÛ   rÜ   rÝ   Ú__annotations__r_   r"   r    rß   rß   …  s8  € € € € € € Ø(Ð(àÐÐÑØÐÐÑØ"Ð"Ð"Ñ"ØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØÐÐÑØ+Ð+Ð+Ñ+Ø,Ð,Ð,Ñ,Ø,Ð,Ð,Ñ,ØÐÐÑØÐÐÑØ$Ð$Ð$Ñ$Ø&Ð&Ð&Ñ&ØÐÐÑØÐÐÑØ$Ð$Ð$Ñ$ØÐÐÑØÐÐÑØÐÐÑØ5Ð5Ð5Ñ5Ð5Ð5r"   rß   c                  óf   ‡ — e Zd ZU dZdZded<   dZded<   ddˆ fd„Zdd„Zdd„Z	ddd„Z
dd„Zˆ xZS )ÚWandbTracerzÑCallback Handler that logs to Weights and Biases.

    This handler will log the model architecture and run traces to Weights and Biases.
    This will ensure that all LangChain activity is logged to W&B.
    NzOptional[WBRun]Ú_runúOptional[WandbRunArgs]Ú	_run_argsÚrun_argsrÂ   r   r   ÚNonec                ó8  •—  t          ¦   «         j        di |¤Ž 	 ddl}ddlm} n"# t
          $ r}t          d¦  «        |‚d}~ww xY w|| _        || _        || _        |  	                    |j
        du ¬¦  «         t          | j        | j        ¦  «        | _        dS )ar  Initializes the WandbTracer.

        Parameters:
            run_args: (dict, optional) Arguments to pass to `wandb.init()`. If not
                provided, `wandb.init()` will be called with no arguments. Please
                refer to the `wandb.init` for more details.

        To use W&B to monitor all LangChain activity, add this tracer like any other
        LangChain callback:
        ```
        from wandb.integration.langchain import WandbTracer

        tracer = WandbTracer()
        chain = LLMChain(llm, callbacks=[tracer])
        # ...end of notebook / script:
        tracer.finish()
        ```
        r   N)r4   zTCould not import wandb python package.Please install it with `pip install -U wandb`.)Úshould_print_urlr_   )Úsuperr6   r3   Úwandb.sdk.data_typesr4   ÚImportErrorÚ_wandbÚ_trace_treerú   Ú_ensure_runr7   r.   Úrun_processor)r5   rû   rÂ   r3   r4   r?   Ú	__class__s         €r    r6   zWandbTracer.__init__¬  sÔ   ø€ ð& 	�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"ð	ØˆLˆLˆLØ7Ð7Ð7Ð7Ð7Ð7Ð7øÝð 	ð 	ð 	ÝðAñô ð ðøøøøð	øøøð
 ˆŒØ%ˆÔØ!ˆŒØ×Ò¨5¬9¸Ð+<ÐÑ>Ô>Ð>Ý)¨$¬+°tÔ7GÑHÔHˆÔÐÐs   œ
' §
A±AÁAc                ó8   — | j                              ¦   «          dS )zpWaits for all asynchronous processes to finish and data to upload.

        Proxy for `wandb.finish()`.
        N)r  Úfinish)r5   s    r    r  zWandbTracer.finishÎ  s   € ð
 	Œ×ÒÑÔÐÐÐr"   r7   r   c                ó4  — |                       ¦   «          | j                             |¦  «        }| j                             |¦  «        }|€dS | j                             ||¬¦  «        }| j        j        �#| j        j                             d|i¦  «         dS dS )z+Logs a LangChain Run to W*B as a W&B Trace.N)Ú	root_spanÚ
model_dictÚlangchain_trace)	r  r  r@   r›   r  ÚWBTraceTreer  r7   Úlog)r5   r7   r
  r  Úmodel_traces        r    Ú_log_trace_from_runzWandbTracer._log_trace_from_runÕ  s¦   € à×ÒÑÔÐàÔ&×3Ò3°CÑ8Ô8ˆ	ØÔ'×5Ò5°cÑ:Ô:ˆ
àÐØˆFàÔ&×2Ò2ØØ!ð 3ñ 
ô 
ˆð Œ;Œ?Ð&ØŒKŒO×ÒÐ!2°KÐ @ÑAÔAÐAÐAÐAð 'Ð&r"   Frþ   r¾   c                ó:  — | j         j        €*| j        pi }i |¥}d|vrddi|d<    | j         j        d	i |¤Ž | j         j        �X|r4| j         j        j        j        }| j                              d|› d�¦  «         | j         j                             d¬¦  «         dS dS )
zlEnsures an active W&B run exists.

        If not, will start a new run with the provided run_args.
        Nrô   ÚsilentTz'Streaming LangChain activity to W&B at z€
`WandbTracer` is currently in beta.
Please report any issues to https://github.com/wandb/wandb/issues with the tag `langchain`.Ú	langchain)Úrepor_   )r  r7   rú   Úinitrô   Úrun_urlÚtermlogÚ_label)r5   rþ   rû   r  s       r    r  zWandbTracer._ensure_runæ  sÔ   € ð
 Œ;Œ?Ð"Ø”~Ð+¨ˆHØ) ˜\ˆHà Ð)Ð)Ø(0°$Ð'7�˜Ñ$àˆDŒKÔÐ(Ð(˜xÐ(Ð(Ð(ØŒ;Œ?Ð&Øð Øœ+œ/Ô2Ô:�Ø”×#Ò#ð#¸gð #ð #ð #ñô ð ð ŒKŒO×"Ò"¨Ð"Ñ4Ô4Ð4Ð4Ð4ð 'Ð&r"   ú'Run'c                ó0   — |                       |¦  «         dS )zPersist a run.N)r  rˆ   s     r    Ú_persist_runzWandbTracer._persist_run   s   € à× Ò  Ñ%Ô%Ð%Ð%Ð%r"   r2   )rû   rù   rÂ   r   r   rü   )r   rü   )r7   r   r   rü   rÍ   )rþ   r¾   r   rü   )r7   r  r   rü   )rÚ   rÛ   rÜ   rÝ   rø   rõ   rú   r6   r  r  r  r  Ú__classcell__)r  s   @r    r÷   r÷   ¢  sÓ   ø€ € € € € € ðð ð !€DÐ Ð Ð Ñ Ø(,€IÐ,Ð,Ð,Ñ,ð Ið  Ið  Ið  Ið  Ið  Ið  IðDð ð ð ðBð Bð Bð Bð"5ð 5ð 5ð 5ð 5ð4&ð &ð &ð &ð &ð &ð &ð &r"   r÷   )r   r   r   r   ) rÝ   Ú
__future__r   r   Útypingr   r   r   r   r   r	   r
   r   r   Úlangchain_core.tracers.baser   Úlangchain_core.tracers.schemasr   r3   r   Ú
WBSettingsÚwandb.sdk.data_types.trace_treer   Úwandb.sdk.lib.pathsr   Úwandb.wandb_runÚWBRunr<   r,   r.   rß   r÷   r_   r"   r    ú<module>r&     s¾  ðØ HÐ HØ "Ð "Ð "Ð "Ð "Ð "à €€€ð
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 
ð 3Ð 2Ð 2Ð 2Ð 2Ð 2Ø .Ð .Ð .Ð .Ð .Ð .àð -Ø,Ð,Ð,Ð,Ð,Ð,Ø4Ð4Ð4Ð4Ð4Ð4Ø+Ð+Ð+Ð+Ð+Ð+Ø,Ð,Ð,Ð,Ð,Ð,ð €ðð ð ð ð&Qð Qð Qð Qð Qñ Qô Qð Qðh
6ð 6ð 6ð 6ð 6�9ñ 6ô 6ð 6ð:`&ð `&ð `&ð `&ð `&�*ñ `&ô `&ð `&ð `&ð `&r"   