Ë
    tPêjü[  ã                   óî   — d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlmZm	Z	 d dl
Z
d dlmZ d dl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 d d
lmZmZ d dl­ d dlmZmZ d„ Z  G d„ de«      Z!y)é    N)ÚdatetimeÚtimezone)ÚAnyÚFinal)Ú	BaseModel)Úverbose_logger)Úuuid)ÚCustomBatchLogger)Úcreate_mock_langsmith_clientÚshould_use_langsmith_mock)Úredact_user_api_key_info)Úget_async_httpx_clientÚhttpxSpecialProvider)Ú*)ÚStandardCallbackDynamicParamsÚStandardLoggingPayloadc                 ó„   — t         j                  t         j                  t         j                  t        f}t        | |«       S ©N)ÚtypesÚCoroutineTypeÚFunctionTypeÚGeneratorTyper   Ú
isinstance)ÚvalueÚnon_serializable_typess     úc/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/langsmith.pyÚis_serializabler      s;   € ä×ÑÜ×ÑÜ×ÑÜð	%Ðô ˜%Ð!7Ó8Ð8Ð8ó    c                   óè  ‡ — e Zd Z	 	 	 	 	 d)dedz  dedz  dedz  dedz  dedz  f
ˆ fd„Zdej                  e   dz  fd	„Z	d*d
„Z
	 	 	 	 	 d+dedz  dedz  dedz  dedz  dedefd„Zdedefd„Zdedefd„Zdefd„Zdedeeef   fd„Zdededz  fd„Zdefd„Zd„ Zd„ Zd„ Zd„ Zd,dedededefd„Zded ee   fd!„Zdeeef   fd"„Z d#eeef   defd$„Z!d#eeef   defd%„Z"d&„ Z#d'„ Z$defd(„Z%ˆ xZ&S )-ÚLangsmithLoggerNÚlangsmith_api_keyÚlangsmith_projectÚlangsmith_base_urlÚlangsmith_sampling_rateÚlangsmith_tenant_idc                 ó  •— t        j                  «       | _        t        ‰| �  d
i |¤d| j                  i¤Ž t        «       | _        | j                  rt        «        t        j                  d«       | j                  ||||¬«      | _        t        j                  d«      �St        j                  d«      j                  «       j                  «       r"|xs  t!        t        j                  d«      «      nd| _        t        j                  dd«      | _        t'        t(        j*                  ¬«      | _        t        j                  d	d «      xs t.        j0                  }|rt3        |«      | _        g | _        | j9                  «       | _        y )NÚ
flush_lockz:[LANGSMITH MOCK] LangSmith logger initialized in mock mode)r!   r"   r#   r%   ÚLANGSMITH_SAMPLING_RATEg      ð?ÚLANGSMITH_DEFAULT_RUN_NAMEÚLLMRun)Úllm_providerÚLANGSMITH_BATCH_SIZE© )ÚasyncioÚLockr'   ÚsuperÚ__init__r   Úis_mock_moder   r   ÚdebugÚget_credentials_from_envÚdefault_credentialsÚosÚgetenvÚstripÚisdigitÚfloatÚsampling_rateÚlangsmith_default_run_namer   r   ÚLoggingCallbackÚasync_httpx_clientÚlitellmÚlangsmith_batch_sizeÚintÚ
batch_sizeÚ	log_queueÚ_start_periodic_flush_taskÚ_flush_task)	Úselfr!   r"   r#   r$   r%   ÚkwargsÚ_batch_sizeÚ	__class__s	           €r   r1   zLangsmithLogger.__init__*   s>  ø€ ô "Ÿ,™,›.ˆŒÜ‰ÑÑ>˜6Ñ>¨d¯o©oÓ>Ü5Ó7ˆÔà×ÒÜ(Ô*Ü× Ñ Ð!]Ô^à#'×#@Ñ#@Ø/Ø/Ø1Ø 3ð	 $Aó $
ˆÔ ô �y‰yÐ2Ó3Ð?Ü—	‘	Ð3Ó4×:Ñ:Ó<×DÑDÔFð $ÒR¤u¬R¯Y©YÐ7PÓ-QÔ'Rð ð	 	Ôô +-¯)©)Ð4PÐRZÓ*[ˆÔ'Ü"8ÔFZ×FjÑFjÔ"kˆÔÜŸY™YÐ'=¸tÓDÒdÌ×HdÑHdˆáÜ! +Ó.ˆDŒOØ57ˆŒØ59×5TÑ5TÓ5VˆÕr   Úreturnc                 ó²   — 	 t        j                  «       }|j                  | j                  «       «      S # t        $ r t        j                  d«       Y yw xY w)zIStart the periodic flush task only when an event loop is already running.zRLangsmith logger init: no running event loop, skipping periodic flush task startupN)r.   Úget_running_loopÚRuntimeErrorr   r3   Úcreate_taskÚperiodic_flush©rF   Úloops     r   rD   z*LangsmithLogger._start_periodic_flush_taskP   sT   € ð	Ü!×2Ñ2Ó4ˆDð
 ×Ñ × 3Ñ 3Ó 5Ó6Ð6øô	 ò 	Ü× Ñ Ð!uÔvÙð	ús   ‚5 µAÁAc                 ó|   — | j                   �| j                   j                  «       r| j                  «       | _         y y r   )rE   ÚdonerD   )rF   s    r   Ú_ensure_periodic_flush_taskz+LangsmithLogger._ensure_periodic_flush_taskZ   s7   € ð ×ÑÐ# t×'7Ñ'7×'<Ñ'<Ô'>Ø#×>Ñ>Ó@ˆDÕð (?r   Úallow_env_credentialsc                 ó  — |du r|�|}|xs d}|}|}	nl|xs t        j                  d«      }|xs t        j                  d«      xs d}|xs t        j                  d«      xs d}|xs t        j                  d«      }	t        ||||	¬«      S )	NFzlitellm-completionÚLANGSMITH_API_KEYÚLANGSMITH_PROJECTÚLANGSMITH_BASE_URLzhttps://api.smith.langchain.comÚLANGSMITH_TENANT_ID)rW   rY   rX   rZ   )r6   r7   ÚLangsmithCredentialsObject)
rF   r!   r"   r#   r%   rU   Ú_credentials_api_keyÚ_credentials_projectÚ_credentials_base_urlÚ_credentials_tenant_ids
             r   r4   z(LangsmithLogger.get_credentials_from_enva   s­   € ð ! EÑ)Ð.@Ð.LØ#4Ð Ø#4Ò#LÐ8LÐ Ø$6Ð!Ø%8Ñ"à#4Ò#V¼¿	¹	ÐBUÓ8VÐ Ø#4Ò#n¼¿	¹	ÐBUÓ8VÒ#nÐZnÐ à"Òj¤b§i¡iÐ0DÓ&EÒjÐIjð "ð &9Ò%\¼B¿I¹IÐF[Ó<\Ð"ä)Ø2Ø4Ø2Ø 6ô	
ð 	
r   ÚmetadataÚcredentialsc           
      ó0  — |j                  d|d   «      |j                  d| j                  «      |j                  d|j                  dd «      «      |j                  dd «      |j                  dd «      |j                  dd «      |j                  d	d «      d
œS )NÚproject_namerX   Úrun_nameÚidÚrun_idÚparent_run_idÚtrace_idÚ
session_idÚdotted_order)rc   rd   rf   rg   rh   ri   rj   )Úgetr<   )rF   r`   ra   s      r   Ú_extract_metadata_fieldsz(LangsmithLogger._extract_metadata_fields}   s…   € à$ŸL™L¨¸ÐEXÑ9YÓZØ Ÿ™ Z°×1PÑ1PÓQØ—l‘l 4¨¯©°hÀÓ)EÓFØ%Ÿ\™\¨/¸4Ó@Ø Ÿ™ Z°Ó6Ø"Ÿ,™, |°TÓ:Ø$ŸL™L¨¸Ó>ñ
ð 	
r   c                 ó�   — t        t        |«      ¬«      }|j                  d«      }t        |t        «      rt        |¬«      |d<   |S )N)r`   Úrequester_metadata)r   Údictrk   r   )rF   r`   ÚredactedÚnesteds       r   Ú_redact_metadataz LangsmithLogger._redact_metadataˆ   s@   € ô 3¼DÀ»NÔKˆØ Ÿ™Ð%9Ó:ˆÜ�fœdÔ#Ü-EÈvÔ-VˆHÐ)Ñ*Øˆr   c                 ó²   — t        |«      }|j                  d«      }|r)t        |t         «      rdD ]  }||v sŒ||vsŒ||   ||<   Œ | j                  |«      S )Nrn   )ri   Ú	thread_idÚconversation_id)ro   rk   r   rr   )rF   r`   Úextra_metadatarn   Úkeys        r   Ú_build_extra_metadataz%LangsmithLogger._build_extra_metadata‘   sm   € Ü $ X£ˆØ$2×$6Ñ$6Ð7KÓ$LÐÙ¤*Ð-?ÄÔ"FØEò B�ØÐ,Ò,°¸NÒ1JØ*<¸SÑ*A�N 3Ò'ðBð ×$Ñ$ ^Ó4Ð4r   Úpayloadc                 óÖ   — |d   }t        |t        «      ri |¥}nd|i}|j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      dœ|d	<   |S )
NÚresponseÚoutputÚprompt_tokensr   Úcompletion_tokensÚtotal_tokensÚresponse_cost)Úinput_tokensÚoutput_tokensr   Ú
total_costÚusage_metadata)r   ro   rk   )rF   ry   r{   Úoutputss       r   Ú_build_outputs_with_usagez)LangsmithLogger._build_outputs_with_usage›   sv   € Ø! *Ñ-ˆä�h¤Ô%Ø"˜�l‰Gà Ð*ˆGà#ŸK™K¨¸Ó;Ø$Ÿ[™[Ð)<¸aÓ@Ø#ŸK™K¨¸Ó:Ø!Ÿ+™+ o°qÓ9ñ	%
ˆÐ Ñ!ð ˆr   Údatarf   c                 óø   — |xs t        t        j                  «       «      }d|vs|d   €||d<   d|vxs |d   d u xr d|vxs |d   d u }|s	d|vs|d   €||d<   d|vs|d   €| j                  |¬«      |d<   y y )Nre   rg   rj   rh   )rf   )Ústrr	   Úuuid4Úmake_dot_order)rF   r‡   rf   Úresolved_idÚposts_as_roots        r   Ú_ensure_required_idsz$LangsmithLogger._ensure_required_idsª   s¼   € Ø#Ò8¤s¬4¯:©:«<Ó'8ˆØ�tÑ˜t D™zÐ1Ø$ˆD�‰Jð !0°tÐ ;Ò \¸tÀOÑ?TÐX\Ð?\ò  
Ø $Ð&ÒF¨$¨~Ñ*>À$Ð*Fð 	ñ ˜J¨dÑ2°d¸:Ñ6FÐ6NØ*ˆD�Ñà Ñ%¨¨nÑ)=Ð)EØ#'×#6Ñ#6¸kÐ#6Ó#JˆD�Ò ð *Fr   c           
      óÊ  — 	 |j                  di «      xs i }|j                  di «      xs i }| j                  ||«      }|d   |d   k(  rd |d<   t        j                  d|d   |d   «       |j                  dd «      }	|	€t	        d	«      ‚|	d   }| j                  t        |«      «      }
i |	¥d| j                  t        |«      «      i¥}| j                  |	«      }|d   d
|||d   |	d   |	d   |	d   |
dœ	}|	d   �|	d   dk(  r|	d   |d<   dD ]  }|dk(  rdn|}||   sŒ||   ||<   Œ | j                  ||d   «       t        j                  d|«       |S # t        $ r ‚ w xY w)NÚlitellm_paramsr`   ri   rh   z1Langsmith Logging - project_name: %s, run_name %src   rd   Ústandard_logging_objectz,Error logging request payload. Payload=none.ÚllmÚ	startTimeÚendTimeÚrequest_tags)	ÚnameÚrun_typeÚinputsr…   Úsession_nameÚ
start_timeÚend_timeÚtagsÚextraÚ	error_strÚstatusÚfailureÚerror)re   rg   rh   ri   rj   re   rf   z'Langsmith Logging data on langsmith: %s)
rk   rl   r   r3   Ú	Exceptionrx   ro   rr   r†   rŽ   )rF   rG   Úresponse_objrš   r›   ra   Ú_litellm_paramsr`   Úfieldsry   rv   r˜   r…   r‡   rw   Ú	field_keys                   r   Ú_prepare_log_dataz!LangsmithLogger._prepare_log_dataº   sÒ  € ð5	Ø%+§Z¡ZÐ0@À"Ó%EÒ%KÈˆOØ&×*Ñ*¨:°rÓ:Ò@¸bˆHà ×9Ñ9¸(ÀKÓPˆFð �lÑ# v¨jÑ'9Ò9Ø'+��|Ñ$Ü× Ñ ØCÀVÈNÑE[Ð]cÐdnÑ]oôð =C¿J¹JÐG`ÐbfÓ<gˆGØˆÜÐ NÓOÐOà˜zÑ*ˆHØ$(×$>Ñ$>¼tÀH»~Ó$NˆNØZ˜wÐZ¨
°D×4IÑ4IÌ$ÈxË.Ó4YÑZˆFØ!×;Ñ;¸GÓDˆGð ˜zÑ*Ø!Ø Ø"Ø & ~Ñ 6Ø% kÑ2Ø# IÑ.Ø Ñ/Ø'ñ
ˆDð �{Ñ#Ð/°G¸HÑ4EÈÒ4RØ '¨Ñ 4��W‘ðò 	2�ð ),¨tª™H¸�	Ø˜)Ó$Ø & yÑ 1�D˜’Ið	2ð ×%Ñ% d¨F°8Ñ,<Ô=Ü× Ñ Ð!JÈDÔQØˆKøÜò 	Øð	ús   ‚DE Ä 6E ÅE"c                 óD  — 	 | j                  |¬«      }t        j                  «       }||kD  rt        j                  d||«       y t        j                  d||«       | j                  |¬«      }| j                  |||||¬«      }| j                  j                  t        ||¬«      «       t        j                  d| j                  «       t        | j                  «      | j                  k\  r| j                  «        y y # t        $ r t        j                  d«       Y y w xY w)N©rG   ú>Skipping Langsmith logging. Sampling rate=%s, random_sample=%sz;Langsmith Sync Layer Logging - kwargs: %s, response_obj: %s©rG   r£   rš   r›   ra   ©r‡   ra   z<Langsmith, event added to queue. Will flush in %s seconds...z/Langsmith Layer Error - log_success_event error)Ú%_get_sampling_rate_to_use_for_requestÚrandomr   Úinfor3   Ú#_get_credentials_to_use_for_requestr§   rC   ÚappendÚLangsmithQueueObjectÚflush_intervalÚlenrB   Ú_send_batchr¢   Ú	exception©	rF   rG   r£   rš   r›   r;   Úrandom_samplera   r‡   s	            r   Úlog_success_eventz!LangsmithLogger.log_success_eventù   s   € ð"	XØ#'×#MÑ#MÐU[Ð#MÓ#\ˆMÜ#)§=¡=£?ˆMØ˜}Ò,Ü×#Ñ#ØTÐVcÐerôð Ü× Ñ ØMØØôð "&×!IÑ!IÐQWÐ!IÓ!XˆKØ×0Ñ0ØØ)Ø%Ø!Ø'ð 1ó ˆDð �N‰N×!Ñ!Ü$ØØ +ôôô × Ñ Ð!_Ðae×atÑatÔuä�4—>‘>Ó" d§o¡oÒ5Ø× Ñ Õ"ð 6øô ò 	XÜ×$Ñ$Ð%VÖWð	Xús   ‚AC> ÁB7C> Ã>DÄDc              ƒ   ó¨  K  — 	 | j                  «        | j                  |¬«      }t        j                  «       }||kD  rt        j                  d||«       y t        j
                  d||«       | j                  |¬«      }| j                  |||||¬«      }| j                  j                  t        ||¬«      «       t        j
                  dt        | j                  «      | j                  «       t        | j                  «      | j                  k\  r| j                  «       ƒ d {  –—†  y y 7 Œ# t        $ r t        j                  d«       Y y w xY w­w)Nr©   rª   z<Langsmith Async Layer Logging - kwargs: %s, response_obj: %sr«   r¬   ú1Langsmith logging: queue length %s, batch size %sz:Langsmith Layer Error - error logging async success event.)rT   r­   r®   r   r¯   r3   r°   r§   rC   r±   r²   r´   rB   Úflush_queuer¢   r¶   r·   s	            r   Úasync_log_success_eventz'LangsmithLogger.async_log_success_event  sD  è ø€ ð$	cØ×,Ñ,Ô.Ø#'×#MÑ#MÐU[Ð#MÓ#\ˆMÜ#)§=¡=£?ˆMØ˜}Ò,Ü×#Ñ#ØTÐVcÐerôð Ü× Ñ ØNØØôð
 "&×!IÑ!IÐQWÐ!IÓ!XˆKØ×0Ñ0ØØ)Ø%Ø!Ø'ð 1ó ˆDð �N‰N×!Ñ!Ü$ØØ +ôôô × Ñ ØCÜ�D—N‘NÓ#Ø—‘ôô
 �4—>‘>Ó" d§o¡oÒ5Ø×&Ñ&Ó(×(Ñ(ð 6Ø(ùÜò 	cÜ×$Ñ$Ð%aÖbð	cüsH   ‚E„AD. ÁEÁCD. Ä%D,Ä&D. Ä*EÄ,D. Ä.EÅEÅEÅEc              ƒ   ó¤  K  — 	 | j                  «        | j                  |¬«      }t        j                  «       }||kD  rt        j                  d||«       y t        j                  d«       | j                  |¬«      }| j                  |||||¬«      }| j                  j                  t        ||¬«      «       t        j                  dt        | j                  «      | j                  «       t        | j                  «      | j                  k\  r| j                  «       ƒ d {  –—†  y y 7 Œ# t        $ r t        j                  d«       Y y w xY w­w)Nr©   rª   z Langsmith Failure Event Logging!r«   r¬   r»   z:Langsmith Layer Error - error logging async failure event.)rT   r­   r®   r   r¯   r°   r§   rC   r±   r²   r3   r´   rB   r¼   r¢   r¶   r·   s	            r   Úasync_log_failure_eventz'LangsmithLogger.async_log_failure_eventE  s:  è ø€ ð 	cØ×,Ñ,Ô.Ø#'×#MÑ#MÐU[Ð#MÓ#\ˆMÜ#)§=¡=£?ˆMØ˜}Ò,Ü×#Ñ#ØTÐVcÐerôð Ü×ÑÐ BÔCØ!%×!IÑ!IÐQWÐ!IÓ!XˆKØ×0Ñ0ØØ)Ø%Ø!Ø'ð 1ó ˆDð �N‰N×!Ñ!Ü$ØØ +ôôô × Ñ ØCÜ�D—N‘NÓ#Ø—‘ôô
 �4—>‘>Ó" d§o¡oÒ5Ø×&Ñ&Ó(×(Ñ(ð 6Ø(ùÜò 	cÜ×$Ñ$Ð%aÖbð	cüsH   ‚E„AD, ÁEÁCD, Ä#D*Ä$D, Ä(EÄ*D, Ä,EÅ
EÅEÅEc              ƒ   óÒ   K  — | j                   sy| j                  «       }|j                  «       D ]1  }| j                  |j                  |j
                  ¬«      ƒ d{  –—†  Œ3 y7 Œ­w)aX  
        Handles sending batches of runs to Langsmith

        self.log_queue contains LangsmithQueueObjects
            Each LangsmithQueueObject has the following:
                - "credentials" - credentials to use for the request (langsmith_api_key, langsmith_project, langsmith_base_url)
                - "data" - data to log on to langsmith for the request


        This function
         - groups the queue objects by credentials
         - loops through each unique credentials and sends batches to Langsmith


        This was added to support key/team based logging on langsmith
        N©ra   Úqueue_objects)rC   Ú_group_batches_by_credentialsÚvaluesÚ_log_batch_on_langsmithra   rÂ   )rF   Úbatch_groupsÚbatch_groups      r   Úasync_send_batchz LangsmithLogger.async_send_batchh  sl   è ø€ ð" �~Š~Øà"×@Ñ@ÓBˆØ'×.Ñ.Ó0ò 	ˆKØ×.Ñ.Ø'×3Ñ3Ø)×7Ñ7ð /ó ÷ ñ ñ	ðús   ‚AA'ÁA%ÁA'ÚurlÚendpointÚapi_versionc                 óp   — ||vr|j                  d«      › |› �}|j                  d«      r|› |› �S |› d|› �S )Nú/)ÚrstripÚendswith)rF   rÉ   rÊ   rË   s       r   Ú_add_endpoint_to_urlz$LangsmithLogger._add_endpoint_to_urlƒ  sM   € Ø˜cÑ!Ø—Z‘Z “_Ð% k ]Ð3ˆCà�<‰<˜ÔØ�U˜8˜*Ð%Ð%Ø��a˜�zÐ"Ð"r   rÂ   c              ƒ   óâ  K  — |d   }|d   }|j                  d«      }| j                  |d«      }d|i}|r||d<   |D �cg c]  }|d   ‘Œ	 }	}	 t        j                  dt	        |	«      «       | j
                  rt        j                  d	«       | j                  j                  |d
|	i|¬«      ƒ d{  –—† }
|
j                  «        |
j                  dk\  r,t        j                  d|
j                  |
j                  «       y| j
                  r t        j                  dt	        |	«      «       yt        j                  dt	        | j                  «      «       yc c}w 7 Œª# t        j                  $ rI}t        j                  d|j                   j                  |j                   j                  «       Y d}~yd}~wt"        $ r+ t        j                  dt%        j&                  «       «       Y yw xY w­w)aV  
        Logs a batch of runs to Langsmith
        sends runs to /batch endpoint for the given credentials

        Args:
            credentials: LangsmithCredentialsObject
            queue_objects: List[LangsmithQueueObject]

        Returns: None

        Raises: Does not raise an exception, will only verbose_logger.exception()
        rY   rW   rZ   z
runs/batchú	x-api-keyúx-tenant-idr‡   z%Sending batch of %s runs to LangsmithzB[LANGSMITH MOCK] Mock mode enabled - API calls will be interceptedÚpost)rÉ   ÚjsonÚheadersNi,  zLangsmith Error: %s - %sz5[LANGSMITH MOCK] Batch of %s runs successfully mockedz%Batch of %s runs successfully createdzLangsmith HTTP Error: %s - %szLangsmith Layer Error - %s)rk   rÐ   r   r3   r´   r2   r>   rÔ   Úraise_for_statusÚstatus_coder¡   ÚtextrC   ÚhttpxÚHTTPStatusErrorr¶   r{   r¢   Ú	tracebackÚ
format_exc)rF   ra   rÂ   Úlangsmith_api_baser!   r%   rÉ   rÖ   Úqueue_objectÚelements_to_logr{   Úes               r   rÅ   z'LangsmithLogger._log_batch_on_langsmith‹  sÅ  è ø€ ð" %0Ð0DÑ$EÐØ#.Ð/BÑ#CÐØ%0§_¡_Ð5JÓ%KÐØ×.Ñ.Ð/AÀ<ÓPˆØ%Ð'8Ð9ˆÙØ%8ˆG�MÑ"ØKXÖ!Y¸< ,¨vÓ"6Ð!YˆÐ!Yð	[Ü× Ñ Ð!HÌ#ÈoÓJ^Ô_Ø× Ò Ü×$Ñ$Ð%iÔjØ$(×$;Ñ$;×$@Ñ$@ØØ˜oÐ.Øð %Aó %÷ ˆHð
 ×%Ñ%Ô'à×#Ñ# sÒ*Ü×$Ñ$Ð%?À×AUÑAUÐW_×WdÑWdÕeà×$Ò$Ü"×(Ñ(Ð)`ÔbeÐfuÓbvÕwä"×(Ñ(Ð)PÔRUÐVZ×VdÑVdÓReÕfùò' "Zðùô ×$Ñ$ò 	oÜ×$Ñ$Ð%DÀaÇjÁj×F\ÑF\Ð^_×^hÑ^h×^mÑ^m×nÑnûÜò 	[Ü×$Ñ$Ð%AÄ9×CWÑCWÓCYÖZð	[üsr   ‚=G/¿EÁG/ÁA#E Â1EÂ2AE Ä G/Ä+E Ä,G/Ä-)E ÅG/ÅE ÅG,Å1?F5Æ0G/Æ54G,Ç)G/Ç+G,Ç,G/c           	      ó8  — i }| j                   D ]ˆ  }|d   }|d   �|d   €t        j                  d|d   |d   «       Œ0t        |d   |d   |d   |j	                  d«      ¬«      }||vrt        |g ¬«      ||<   ||   j                  j                  |«       ŒŠ |S )	z@Groups queue objects by credentials using a proper key structurera   rW   rX   zBLangsmith Logging - credentials missing - api_key: %s, project: %srY   rZ   )Úapi_keyÚprojectÚbase_urlÚ	tenant_idrÁ   )rC   r   ÚwarningÚCredentialsKeyrk   Ú
BatchGrouprÂ   r±   )rF   Úlog_queue_by_credentialsrß   ra   rw   s        r   rÃ   z-LangsmithLogger._group_batches_by_credentials¼  s×   € àLNÐ à ŸN™Nò 	MˆLØ& }Ñ5ˆKàÐ.Ñ/Ð7¸;ÐGZÑ;[Ð;cÜ×&Ñ&ØXØÐ 3Ñ4ØÐ 3Ñ4ôð
 Ü Ø#Ð$7Ñ8Ø#Ð$7Ñ8Ø$Ð%9Ñ:Ø%Ÿ/™/Ð*?Ó@ô	ˆCð Ð2Ñ2Ü0:À{ÐbdÔ0eÐ(¨Ñ-à$ SÑ)×7Ñ7×>Ñ>¸|ÕLð)	Mð, (Ð'r   rG   c                 ó‚   — |j                  dd «      }| j                  }|�|j                  d«      }|�t        |«      }|S )NÚ standard_callback_dynamic_paramsr$   )rk   r;   r:   )rF   rG   rì   r;   Ú_sampling_rates        r   r­   z5LangsmithLogger._get_sampling_rate_to_use_for_requestØ  sS   € ØX^×XbÑXbØ.°óY
Ð(ð  $×1Ñ1ˆØ+Ð7Ø$D×$HÑ$HÐIbÓ$cˆNØÐ)Ü % nÓ 5�ØÐr   c           
      ó  — |j                  dd«      }|�j| j                  |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      |j                  dd«      du ¬«      }|S | j                  }|S )z³
        Handles key/team based logging

        If standard_callback_dynamic_params are provided, use those credentials.

        Otherwise, use the default credentials.
        rì   Nr!   r"   r#   r%   )r!   r"   r#   r%   rU   )rk   r4   r5   )rF   rG   rì   ra   s       r   r°   z3LangsmithLogger._get_credentials_to_use_for_requestã  sµ   € ð Y_×XbÑXbØ.°óY
Ð(ð ,Ð7Ø×7Ñ7Ø"B×"FÑ"FÐGZÐ\`Ó"aØ"B×"FÑ"FÐGZÐ\`Ó"aØ#C×#GÑ#GÐH\Ð^bÓ#cØ$D×$HÑ$HÐI^Ð`dÓ$eØ&F×&JÑ&JÐK_ÐaeÓ&fÐjnÐ&nð 8ó ˆKð Ðð ×2Ñ2ˆKØÐr   c                 óR  — | j                   sy	 t        j                  «       }|j                  «       r$t        j                  | j                  «       «       y|j                  | j                  «       «       y# t        $ r& t        j                  | j                  «       «       Y yw xY w)z'Calls async_send_batch in an event loopN)	rC   r.   Úget_event_loopÚ
is_runningrN   rÈ   Úrun_until_completerM   ÚrunrP   s     r   rµ   zLangsmithLogger._send_batchú  s}   € à�~Š~Øð	1ä!×0Ñ0Ó2ˆDØ�‰Ô ä×#Ñ# D×$9Ñ$9Ó$;Õ<ð ×'Ñ'¨×(=Ñ(=Ó(?Õ@øÜò 	1ä�K‰K˜×-Ñ-Ó/Ö0ð	1ús   �AA7 ÁA7 Á7,B&Â%B&c                 óú   — | j                   d   }| j                   d   }| j                   j                  d«      }|› d|› �}d|i}|r||d<   t        j                  j                  ||¬«      }|j	                  «       S )NrW   rY   rZ   z/runs/rÒ   rÓ   )rÉ   rÖ   )r5   rk   r?   Úmodule_level_clientrÕ   )rF   rf   r!   rÞ   r%   rÉ   rÖ   r{   s           r   Úget_run_by_idzLangsmithLogger.get_run_by_id  s–   € Ø#'×#;Ñ#;Ð<OÑ#PÐØ$(×$<Ñ$<Ð=QÑ$RÐØ%)×%=Ñ%=×%AÑ%AÐBWÓ%XÐà*Ð+¨6°&°Ð:ˆØ%Ð'8Ð9ˆÙØ%8ˆG�MÑ"Ü!×5Ñ5×9Ñ9ØØð :ó 
ˆð
 �}‰}‹Ðr   c                 ó†   — t        j                  t        j                  «      }|}|j	                  d«      t        |«      z   S )Nz%Y%m%dT%H%M%S%fZ)r   Únowr   ÚutcÚstrftimer‰   )rF   rf   ÚstÚid_s       r   r‹   zLangsmithLogger.make_dot_order  s2   € Ü—L‘L¤§¡Ó.ˆØˆØ�{‰{Ð-Ó.´°S³Ñ9Ð9r   )NNNNN)rJ   N)NNNNT)z/api/v1)'Ú__name__Ú
__module__Ú__qualname__r‰   r:   r1   r.   ÚTaskr   rD   rT   Úboolr[   r4   ro   rl   rr   rx   r   r†   rŽ   r§   r¹   r½   r¿   rÈ   rÐ   Úlistr²   rÅ   rè   ré   rÃ   r­   r°   rµ   rö   r‹   Ú__classcell__)rI   s   @r   r    r    )   s   ø„ ð )-Ø(,Ø)-Ø04Ø*.ñ$Wà ™:ð$Wð  ™:ð$Wð   $™Jð	$Wð
 "'¨¡ð$Wð ! 4™Zõ$WðL7¨G¯L©L¸Ñ,=ÀÑ,Dó 7óAð )-Ø(,Ø)-Ø*.Ø&*ñ
à ™:ð
ð  ™:ð
ð   $™Jð	
ð
 ! 4™Zð
ð  $ð
ð 
$ó
ð8	
°ð 	
ÐD^ó 	
ð¨ð °$ó ð5¨dó 5ðÐ1Gð ÈDÐQTÐVYÐQYÉNó ðK¨ð K°s¸T±zó Kð =ð 0ó=ò~#XòJ%còN!còFñ6#¨ð #°sð #Èð #Ð]`ó #ð/[à/ð/[ð Ð0Ñ1ó/[ðb(¨t°NÀJÐ4NÑ/Oó (ð8	¸DÀÀcÀ¹Nð 	Èuó 	ð¸$¸sÀC¸x¹.ð ÐMgó ò.1ò$ð : S÷ :r   r    )"r.   r6   r®   rÜ   r   r   r   Útypingr   r   rÚ   Úpydanticr   r?   Úlitellm._loggingr   Úlitellm._uuidr	   Ú(litellm.integrations.custom_batch_loggerr
   Ú*litellm.integrations.langsmith_mock_clientr   r   Ú*litellm.litellm_core_utils.redact_messagesr   Ú&litellm.llms.custom_httpx.http_handlerr   r   Ú$litellm.types.integrations.langsmithÚlitellm.types.utilsr   r   r   r    r-   r   r   ú<module>r     sZ   ðó Û 	Û Û Û ß 'ß ã Ý ã Ý +Ý Ý F÷õ P÷ô 3ß Uò9ôv:Ð'õ v:r   