Ë
    tPêj"Ê  ã            
       ó  — U d dl Z d dlZd dlZd dl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mZmZmZm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mZ d dl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( d dl)­ d dl*m+Z+m,Z, d dl-m.Z.m/Z/m0Z0m1Z1m2Z2m3Z3m4Z4m5Z5m6Z6 erd dl7m8Z8m9Z9 d dl:m;Z; neZ;eZ9eZ8 e<h d£«      Z=ee>d<    ei «      Z?eee@eAf      e>d<    e<h d£«      ZBee<e@      e>d<   deAdee@eAf   dz  fd„ZC G d„ de«      ZDdeEfd„ZFd edz  d!eAde@dz  fd"„ZGdeAdeHfd#„ZIdeAdeJe@d$f   fd%„ZK	 	 	 	 	 d6d&eHfd'„ZL e	d(¬)«      d*e@d+e@ddfd,„«       ZM G d-„ d.«      ZNd/eOd0eOd1e4dz  d2edeOf
d3„ZPd0ee@ef   fd4„ZQd0ee@ef   fd5„ZRy)7é    N)ÚCallableÚIterableÚMapping)Údatetime)Ú	lru_cache)ÚMappingProxyType)ÚTYPE_CHECKINGÚAnyÚFinalÚLiteralÚProtocolÚcast)ÚVersion)Úverbose_logger)Ú MAX_LANGFUSE_INITIALIZED_CLIENTS)Úcreate_mock_langfuse_clientÚshould_use_langfuse_mock)Úfilter_exceptions_from_paramsÚreconstruct_model_nameÚsafe_deep_copy)Ú#validate_langfuse_environment_value)Úredact_user_api_key_info)Ú_get_httpx_client)Ústr_to_bool)Ú*)ÚHttpxBinaryResponseContentÚResponsesAPIResponse)	ÚEmbeddingResponseÚImageResponseÚModelResponseÚRerankResponseÚStandardLoggingMetadataÚStandardLoggingPayloadÚ'StandardLoggingPromptManagementMetadataÚTextCompletionResponseÚTranscriptionResponse)ÚLangfuseÚStatefulTraceClient)ÚDynamicLoggingCache>   ÚheadersÚendpointÚcaching_groupsÚprevious_modelsÚ_DENIED_STEERING_KEYSÚ_NO_METADATA>   ÚcookieÚrefererÚauthorizationÚ_REDACTED_PROXY_HEADERSÚvalueÚreturnc                 ó*   — t        | t        «      r| S dS )z8Return ``value`` as an opaque mapping when it is a dict.N)Ú
isinstanceÚdict©r4   s    úk/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/integrations/langfuse/langfuse.pyÚ_object_mappingr;   =   s   € ä˜u¤dÔ+ˆ5Ð5°Ð5ó    c                   ó,   — e Zd ZdZded   dedz  fd„Zy)Ú_UsageObjectzKToken-count surface the Langfuse logger reads off a response usage payload.Úkey)Úcache_creation_input_tokensÚcache_read_input_tokensr5   Nc                 ó   — y ©N© )Úselfr?   s     r:   Úgetz_UsageObject.getE   s   � r<   )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   ÚintrF   rD   r<   r:   r>   r>   B   s   „ ÙUào�wÐWÑXÐoÐ`cÐfjÑ`jÔor<   r>   c                 óÖ   — | j                  d«      xs d}t        | d«      rGt        | dd«      }|�8t        |d«      r,t        |dd«      }|�t        |t        t
        f«      r|dkD  r|}|S )a‹  
    Extract cache_read_input_tokens from usage object.

    Checks both:
    1. Top-level cache_read_input_tokens (Anthropic format)
    2. prompt_tokens_details.cached_tokens (Gemini, OpenAI format)

    See: https://github.com/BerriAI/litellm/issues/18520

    Args:
        usage_obj: Usage object from LLM response

    Returns:
        int: Number of cached tokens read, defaults to 0
    rA   r   Úprompt_tokens_detailsNÚcached_tokens)rF   ÚhasattrÚgetattrr7   rK   Úfloat)Ú	usage_objrA   rM   rN   s       r:   Ú _extract_cache_read_input_tokensrS   H   s€   € ð  (Ÿm™mÐ,EÓFÒKÈ!Ðô ˆyÐ1Ô2Ü'.¨yÐ:QÐSWÓ'XÐØ Ð,´Ð9NÐP_Ô1`Ü#*Ð+@À/ÐSWÓ#XˆMØÐ(¬Z¸ÌÌUÀ|Ô-TÐYfÐijÒYjØ*7Ð'à"Ð"r<   Ú
start_timeÚresponse_objc                 óB   — t         j                  j                  | |«      S )zMTyped view of the timestamped response id Langfuse uses as the generation id.)ÚlitellmÚutilsÚget_logging_id)rT   rU   s     r:   Ú_logging_idrZ   e   s   € ä�=‰=×'Ñ'¨
°LÓAÐAr<   c                 ól   — t        | t        «      rt        | «      }|€t        | «      S |S t        | «      S )zIA string ``str_to_bool`` does not recognise falls back to its truthiness.)r7   Ústrr   Úbool)r4   Úparseds     r:   Ú_as_steering_flagr_   j   s3   € ä�%œÔÜ# EÓ*ˆØ$˜nŒt�E‹{Ð8°&Ð8Ü�‹;Ðr<   .c                 óª   — t        | t        «      r!t        d„ | j                  d«      D «       «      S t        | t        «      rt        d„ | D «       «      S y)Nc              3   ó^   K  — | ]%  }|j                  «       sŒ|j                  «       –— Œ' y ­wrC   )Ústrip©Ú.0r?   s     r:   ú	<genexpr>z,_as_steering_key_sequence.<locals>.<genexpr>t   s   è ø€ ÒL SÀÇ	Á	Å�S—Y‘Y—[ÑLùs   ‚-˜-ú,c              3   ó2   K  — | ]  }t        |«      –— Œ y ­wrC   )r\   rc   s     r:   re   z,_as_steering_key_sequence.<locals>.<genexpr>v   s   è ø€ Ò/ #”S˜—XÑ/ùs   ‚rD   )r7   r\   ÚtupleÚsplitr   r9   s    r:   Ú_as_steering_key_sequencerj   r   sD   € Ü�%œÔÜÑL¨E¯K©K¸Ó,<ÔLÓLÐLÜ�%œÔ"ÜÑ/¨Ô/Ó/Ð/Ør<   Úallow_env_credentialsc                 óÊ   — |du r|�	|xs |}| }n6|xs |xs t        j                  d«      }| xs t        j                  d«      }|xs t        j                  dd«      }|||fS )NFÚLANGFUSE_SECRET_KEYÚLANGFUSE_PUBLIC_KEYÚLANGFUSE_HOSTzhttps://cloud.langfuse.com)ÚosÚgetenv)Úlangfuse_public_keyÚlangfuse_secretÚlangfuse_secret_keyÚlangfuse_hostrk   Ú
secret_keyÚ
public_keyÚresolved_hosts           r:   Úresolve_langfuse_credentialsry   z   sr   € ð  Ñ%¨-Ð*CØ$Ò;Ð(;ˆ
Ø(‰
à$Ò_Ð(;Ò_¼r¿y¹yÐI^Ó?_ˆ
Ø(ÒL¬B¯I©IÐ6KÓ,Lˆ
à(Òd¬B¯I©I°oÐGcÓ,d€Mà�z =Ð0Ð0r<   é   )ÚmaxsizeÚ	raw_valueÚerrorc                 ó2   — t        j                  d| |«       y )Nz†Ignoring invalid LANGFUSE_TRACING_ENVIRONMENT=%r for the langfuse callback: %s. Traces will be sent to Langfuse's default environment.)r   Úwarning)r|   r}   s     r:   Ú$_warn_invalid_deployment_environmentr€   �   s   € ä×Ñð	AàØõ	r<   c                   óò  — e Zd Z	 	 	 	 	 	 d/dedz  defd„Zdedefd„Ze	ded	edeee
f   fd
„«       Z	 	 	 	 	 d0deddez  ez  ez  ez  ez  ez  ez  ez  ez  dedz  dedz  dedz  dededz  defd„Zdeddez  ez  ez  ez  ez  ez  ez  ez  ez  dedededz  deedz  eez  ez  dz  f   fd„Zd„ Zd„ Zd„ Zdedz  d	eee
f   dedeez  ez  dz  dedz  dedz  dedededz  dededz  defd„Ze	dededz  fd„«       Ze	defd„«       Ze	defd„«       Ze	d e dz  dee   fd!„«       Z!d"„ Z"d#„ Z#d$„ Z$d%„ Z%d&„ Z&e	d'e'd(e(e'ge'f   de'fd)„«       Z)e	dedz  fd*„«       Z*e	d+e+de+fd,„«       Z,d-e-d e dz  fd.„Z.y)1ÚLangFuseLoggerNÚlangfuse_environmentrk   c                 ó  — 	 dd l }ddl m} t        ||||¬«      \  | _        | _        | _        | j                  j                  d«      s/| j                  j                  d«      sd| j                  z   | _        |�t        |«      j                  «       nd }
|
rt        |
«       |
| _        n| j                  «       | _        t        j                   d	«      | _        t        j                   d
«      | _        t&        j)                  |«      | _        t-        «       rt/        «       | _        d| _        n1t5        «       | _        | j6                  j8                  | _        d| _        | j                  | j                  | j                  | j"                  | j$                  | j*                  | j0                  dœ}|j:                  j<                  | _        dtA        jB                  |jD                  «      jF                  v r| j                  |d<   tI        | j>                  «      tI        d«      k\  rd|d<   | jK                  |«      | _        | j2                  r)dt        jL                  d<   tO        jP                  d«       nY	 | j                  j8                  jR                  jU                  «       jV                  d   jX                  }|t        jL                  d<   t        j                   d«      �Òt        j                   d«      }|�t[        |«      nd }t        j                   d«      | _.        t        j                   d«      | _/        t        j                   d«      | _0        t        j                   d«      | _1        || _2         || j^                  | j\                  | j`                  | jb                  |�|nd¬«      | _3        y d | _3        y # t        $ r)}	t        d|	› dt        j                  «       › d�«      ‚d }	~	ww xY w# t        $ r d }Y �Œ2w xY w)Nr   ©r'   zS[91mLangfuse not installed, try running 'pip install langfuse' to fix this error: ú
z[0m)rr   rs   ru   rk   zhttp://zhttps://ÚLANGFUSE_RELEASEÚLANGFUSE_DEBUGTF)rw   rv   ÚhostÚreleaseÚdebugÚflush_intervalÚhttpx_clientÚenvironmentz2.6.0rW   Úsdk_integrationzmock-project-idÚLANGFUSE_PROJECT_IDz$Langfuse Mock: Using mock project IDÚUPSTREAM_LANGFUSE_SECRET_KEYÚUPSTREAM_LANGFUSE_DEBUGÚUPSTREAM_LANGFUSE_PUBLIC_KEYÚUPSTREAM_LANGFUSE_HOSTÚUPSTREAM_LANGFUSE_RELEASE)rw   rv   r‰   rŠ   r‹   )4Úlangfuser'   Ú	ExceptionÚ	tracebackÚ
format_excry   rw   rv   ru   Ú
startswithr\   rb   r   rƒ   Úresolve_deployment_environmentrp   rq   Úlangfuse_releaseÚlangfuse_debugr‚   Ú_get_langfuse_flush_intervalÚlangfuse_flush_intervalr   r   Úlangfuse_clientÚis_mock_moder   Ú_http_handlerÚclientÚversionÚ__version__Úlangfuse_sdk_versionÚinspectÚ	signatureÚ__init__Ú
parametersr   Úsafe_init_langfuse_clientÚenvironr   r‹   ÚprojectsrF   ÚdataÚidr   Úupstream_langfuse_secret_keyÚupstream_langfuse_public_keyÚupstream_langfuse_hostÚupstream_langfuse_releaseÚupstream_langfuse_debugÚupstream_langfuse)rE   rr   rs   ru   rƒ   rŒ   rk   r–   r'   ÚeÚ_env_overriderª   Ú
project_idÚupstream_langfuse_debug_envr´   s                  r:   r©   zLangFuseLogger.__init__™   s”  € ð	ÛÝ)ô
 @\Ø 3Ø+Ø'Ø"7ô	@
Ñ<ˆŒ˜œ¨$Ô*<ð ×"Ñ"×-Ñ-¨iÔ8¸D×<NÑ<N×<YÑ<YÐZdÔ<eà!*¨T×-?Ñ-?Ñ!?ˆDÔØDXÐDdœsÐ#7Ó8×>Ñ>Ô@ÐjnˆÙÜ/°Ô>Ø4AˆDÕ%à(,×(KÑ(KÓ(MˆDÔ%Ü "§	¡	Ð*<Ó =ˆÔÜ Ÿi™iÐ(8Ó9ˆÔÜ'5×'RÑ'RÐSaÓ'bˆÔ$ä#Ô%Ü#>Ó#@ˆDÔ Ø $ˆDÕä(9Ó(;ˆDÔØ#'×#5Ñ#5×#<Ñ#<ˆDÔ Ø %ˆDÔð Ÿ/™/ØŸ/™/Ø×&Ñ&Ø×,Ñ,Ø×(Ñ(Ø"×:Ñ:Ø ×0Ñ0ñ
ˆ
ð *2×)9Ñ)9×)EÑ)EˆÔ!àœG×-Ñ-¨h×.?Ñ.?Ó@×KÑKÑKØ(,×(AÑ(AˆJ�}Ñ%Ü�4×,Ñ,Ó-´¸Ó1AÒAØ,5ˆJÐ(Ñ)Ø"&×"@Ñ"@ÀÓ"LˆŒð ×ÒØ0AŒB�J‰JÐ,Ñ-Ü× Ñ Ð!GÕHð"Ø!Ÿ]™]×1Ñ1×:Ñ:×>Ñ>Ó@×EÑEÀaÑH×KÑK�
Ø4>”—
‘
Ð0Ñ1ô �9‰9Ð3Ó4Ð@Ü13·±Ð;TÓ1UÐ'à<WÐ<c”Ð7Ô8Ðimð $ô 13·	±	Ð:XÓ0YˆDÔ-Ü02·	±	Ð:XÓ0YˆDÔ-Ü*,¯)©)Ð4LÓ*MˆDÔ'Ü-/¯Y©YÐ7RÓ-SˆDÔ*Ø+FˆDÔ(Ù%-Ø×<Ñ<Ø×<Ñ<Ø×0Ñ0Ø×6Ñ6Ø2IÐ2UÑ.Ð[`ô&ˆDÕ"ð &*ˆDÕ"øô] ò 	ÜØhÐijÐhkÐkmÔnw÷  oCñ  oCó  oEð  nFð  FMð  Nóð ûð	ûôr ò "Ø!“
ð"ús*   ‚
N= É6AO2 Î=	O/Ï$O*Ï*O/Ï2PÐ Prª   r5   c                 ó  — ddl m} t        j                  t        k\  r#t        dt        j                  › dt        › �«      ‚ |di |¤Ž}t        xj                  dz  c_        t        j                  dt        j                  «       |S )aM  
        Safely init a langfuse client if the number of initialized clients is less than the max

        Note:
            - Langfuse initializes 1 thread everytime a client is initialized.
            - We've had an incident in the past where we reached 100% cpu utilization because Langfuse was initialized several times.
        r   r…   zMax langfuse clients reached: z is greater than é   z!Created langfuse client number %srD   )r–   r'   rW   Úinitialized_langfuse_clientsr   r—   r   r‹   )rE   rª   r'   r    s       r:   r«   z(LangFuseLogger.safe_init_langfuse_clientõ   s…   € õ 	&ä×/Ñ/Ô3SÒSÜØ0´×1UÑ1UÐ0VÐVgô  iIð  hJð  Kóð ñ "*Ñ!7¨JÑ!7ˆÜ×,Ò,°Ñ1Õ,Ü×ÑÐ@Ä'×BfÑBfÔgØÐr<   Úlitellm_paramsÚmetadatac                 ój  — | €|S | j                  d«      €|S |€i }| j                  di «      j                  di «      xs i }|D ]l  }|j                  d«      sŒ|j                  ddd«      }||v rt        j                  d|«       nt        j
                  d|«       |j                  |«      ||<   Œn |S )at  
        Adds metadata from proxy request headers to Langfuse logging if keys start with "langfuse_"
        and overwrites litellm_params.metadata if already included.

        For example if you want to append your trace to an existing `trace_id` via header, send
        `headers: { ..., langfuse_existing_trace_id: your-existing-trace-id }` via proxy request.
        Úproxy_server_requestr*   Ú	langfuse_Ú r»   z-Overwriting Langfuse `%s` from request headerz%Found Langfuse `%s` in request header)rF   rš   Úreplacer   r   r‹   )r½   r¾   Úproxy_headersÚmetadata_param_keyÚtrace_param_keys        r:   Úadd_metadata_from_headerz'LangFuseLogger.add_metadata_from_header  sÖ   € ð Ð!ØˆOà×ÑÐ4Ó5Ð=ØˆOàÐØˆHà-×1Ñ1Ð2HÈ"ÓM×QÑQÐR[Ð]_Ó`ÒfÐdfˆà"/ò 	RÐØ!×,Ñ,¨[Õ9Ø"4×"<Ñ"<¸[È"ÈaÓ"P�Ø" hÑ.Ü"×*Ñ*Ð+ZÐ\kÕlä"×(Ñ(Ð)PÐRaÔbØ,9×,=Ñ,=Ð>PÓ,Q�˜Ò)ð	Rð ˆr<   ÚkwargsrU   rT   Úend_timeÚuser_idÚlevelÚstatus_messagec                 ó&  — 	 t        j                  d|«       d}d}	|j                  di «      }
|j                  dd«      }|
j                  di «      xs i }| j                  |
|«      }t	        |j                  di «      «      }d|j                  d«      i}|j                  dd«      }|j                  d	d«      }|j                  d
d«       |�||d<   |�||d	<   |j                  «       D ]5  \  }}t        |t        t        t        t        f«      rŒ'	 t        |«      ||<   Œ7 | j                  |||||¬«      \  }}	t        j                  d|	|«       d}d}| j                  «       r!| j                  |||
|	||||||||¬«      \  }}n|�| j!                  |||	||||||¬«	       t        j                  d|«       t        j"                  d«       ||dœS # t        $ r Y Œôw xY w# t        $ r%}t        j$                  d|«       dddœcY d}~S d}~ww xY w)z;
        Logs a success or error event on Langfuse
        z7Langfuse Logging - Enters logging function for model %sNr½   Úlitellm_call_idr¾   Úoptional_paramsÚmessagesÚ	functionsÚtoolsÚsecret_fields)rÈ   rU   ÚpromptrË   rÌ   z$OUTPUT IN LANGFUSE: %s; original: %s)rÊ   r¾   r½   ÚoutputrT   rÉ   rÈ   rÏ   ÚinputrU   rË   rÎ   )	rÊ   r¾   rÕ   rT   rÉ   rÈ   rÏ   rÖ   rU   z2Langfuse Layer Logging - final response object: %sz(Langfuse Layer Logging - logging success)Útrace_idÚgeneration_idz.Langfuse Layer Error(): Exception occured - %s)r   r‹   rF   rÇ   r   ÚpopÚitemsr7   r\   rK   r]   rQ   r—   Ú"_get_langfuse_input_output_contentÚ_is_langfuse_v2Ú_log_langfuse_v2Ú_log_langfuse_v1ÚinfoÚ	exception)rE   rÈ   rU   rT   rÉ   rÊ   rË   rÌ   rÖ   rÕ   r½   rÎ   r¾   rÏ   rÔ   rÑ   rÒ   Úparamr4   r×   rØ   r¶   s                         r:   Úlog_event_on_langfusez$LangFuseLogger.log_event_on_langfuse'  sp  € ð,L	=Ü× Ñ Ð!ZÐ\bÔcð ˆEØˆFà$*§J¡JÐ/?ÀÓ$DˆNØ%+§Z¡ZÐ0AÀ4Ó%HˆOØ%×)Ñ)¨*°bÓ9Ò?¸RˆHØ×4Ñ4°^ÀXÓNˆHÜ%3°F·J±JÐ?PÐRTÓ4UÓ%VˆOà'¨¯©°JÓ)?Ð@ˆFà.×2Ñ2°;ÀÓEˆIØ*×.Ñ.¨w¸Ó=ˆEà×Ñ °Ô6ØÐ$Ø&/��{Ñ#ØÐ Ø"'��w‘ð !0× 5Ñ 5Ó 7ò ‘��uÜ! %¬#¬s´D¼%Ð)@ÕAðÜ14°U³˜¨Ò.ðð !×CÑCØØ)ØØØ-ð Dó ‰MˆE�6ô × Ñ Ð!GÈÐQ]Ô^ØˆHØ ˆMØ×#Ñ#Ô%Ø*.×*?Ñ*?Ø#Ø%Ø#1Ø!Ø)Ø%Ø!Ø$3ØØ!-ØØ$3ð +@ó +Ñ'�™-ð Ð)Ø×%Ñ%Ø#Ø%Ø!Ø)Ø%Ø!Ø$3ØØ!-ð &ô 
ô × Ñ Ð!UÐWcÔdÜ×ÑÐ JÔKà (¸=ÑIÐIøôY %ò áðûôZ ò 	=Ü×$Ñ$Ð%UÐWXÔYØ $°tÑ<Õ<ûð	=úsC   ‚DG" ÄGÄ B2G" Ç	GÇG" ÇGÇG" Ç"	HÇ+HÈHÈHrÔ   c                 óš  — d}d}|dk(  r|�t        |t        «      r|}|}||fS |�7|j                  dd«      dk(  st        |t        j                  «      r|}d}||fS |�1t        |t        j
                  «      r|}| j                  |«      }||fS |�"t        |t        j                  «      r|}d}||fS |�1t        |t        j                  «      r|}| j                  |«      }||fS |�2t        |t        j                  «      r|}|j                  dd«      }||fS |�2t        |t        j                  «      r|}|j                  dd«      }||fS |�,t        |t        j                  «      r|}|j                  }||fS |�1t        |t        j                  «      r|}| j                  |«      }||fS |j                  d«      �=|j                  d«      dk(  r)|�'t        |t         «      r|j                  d	«      }|}||fS |j                  d«      �:|j                  d«      d
k(  r&|�$t        |t"        «      r|}|j                  dd«      }||fS )a  
        Get the input and output content for Langfuse logging

        Args:
            kwargs: The keyword arguments passed to the function
            response_obj: The response object returned by the function
            prompt: The prompt used to generate the response
            level: The level of the log message
            status_message: The status message of the log message

        Returns:
            input: The input content for Langfuse logging
            output: The output content for Langfuse logging
        NÚERRORÚ	call_typeÚ	embeddingzspeech-outputr®   ÚtextÚ
_arealtimerÖ   Úpass_through_endpointÚresponserÂ   )r7   r\   rF   rW   r   r    Ú_get_chat_content_for_langfuser   r%   Ú)_get_text_completion_content_for_langfuser   r&   r!   Úresultsr   Ú'_get_responses_api_content_for_langfuseÚlistr8   )rE   rÈ   rU   rÔ   rË   rÌ   rÖ   rÕ   s           r:   rÛ   z1LangFuseLogger._get_langfuse_input_output_content‹  s¤  € ð> ˆØ04ˆØ�GÒ Ð :¼zÈ.ÔZ]Ô?^ØˆEØ#ˆFðV �fˆ}ÐðU Ð%Ø�J‰J�{ DÓ)¨[Ò8¼JÀ|ÔU\×UnÑUnÔ<oàˆEØˆFðL �fˆ}ÐðK Ð%¬*°\Ä7×CXÑCXÔ*YØˆEØ×8Ñ8¸ÓFˆFðF �fˆ}ÐðE Ð%¬*°\Ä7×CeÑCeÔ*fØˆEØ$ˆFð@ �fˆ}Ðð? Ð%¬*°\Ä7×CaÑCaÔ*bØˆEØ×CÑCÀLÓQˆFð: �fˆ}Ðð9 Ð%¬*°\Ä7×CXÑCXÔ*YØˆEØ!×%Ñ% f¨dÓ3ˆFð4 �fˆ}Ðð3 Ð%¬*°\Ä7×C`ÑC`Ô*aØˆEØ!×%Ñ% f¨dÓ3ˆFð. �fˆ}Ðð- Ð%¬*°\Ä7×CYÑCYÔ*ZØˆEØ!×)Ñ)ˆFð( �fˆ}Ðð' Ð%¬*°\Ä7×C_ÑC_Ô*`ØˆEØ×AÑAÀ,ÓOˆFð" �fˆ}Ðð �J‰J�{Ó#Ð/Ø—
‘
˜;Ó'¨<Ò7ØÐ(Ü˜<¬Ô.à—J‘J˜wÓ'ˆEØ!ˆFð �fˆ}Ðð �J‰J�{Ó#Ð/Ø—
‘
˜;Ó'Ð+BÒBØÐ(Ü˜<¬Ô.àˆEØ!×%Ñ% j°"Ó5ˆFØ�fˆ}Ðr<   c              ƒ   ó   K  — y­w)z�
        Langfuse SDK uses a background thread to log events

        This approach does not impact latency and runs in the background
        NrD   )rE   rÈ   rU   rT   rÉ   rÊ   s         r:   Ú_async_log_eventzLangFuseLogger._async_log_eventÛ  s   è ø� ùs   ‚c                 ó`   — dd l }t        |j                  j                  «      t        d«      k\  S )Nr   z2.0.0)r–   r   r¤   r¥   )rE   r–   s     r:   rÜ   zLangFuseLogger._is_langfuse_v2â  s&   € Ûä�x×'Ñ'×3Ñ3Ó4¼ÀÓ8HÑHÐHr<   c
                 óÜ  — ddl m}
m} t        j                  d«       | j
                  j                   ||j                  dd«      |||¬«      «      }t        t        d z  |j                  d«      «      }t        |j                  dd	«      ||«      }|j                   |
|j                  dd«      |||||||	j                  j                  |	j                  j                  d
œ|¬«	      «       y )Nr   )ÚCreateGenerationÚCreateTracezlPlease upgrade langfuse to v2.0.0 or higher: https://github.com/langfuse/langfuse-python/releases/tag/v2.0.1Úgeneration_namezlitellm-completion)ÚnamerÖ   rÕ   ÚuserIdÚcustom_llm_providerÚmodelrÂ   )Úprompt_tokensÚcompletion_tokens)	r÷   Ú	startTimeÚendTimerú   ÚmodelParametersrÔ   Ú
completionÚusager¾   )Úlangfuse.modelrô   rõ   r   r   r'   ÚtracerF   r   r\   r   Ú
generationr  rû   rü   )rE   rÊ   r¾   rÕ   rT   rÉ   rÈ   rÏ   rÖ   rU   rô   rõ   r  rù   Ú
model_names                  r:   rÞ   zLangFuseLogger._log_langfuse_v1ç  sè   € ÷ 	Aä×ÑØzô	
ð —}‘}×*Ñ*ÙØ—\‘\Ð"3Ð5IÓJØØØô	ó
ˆô &*¬#°©*°f·j±jÐAVÓ6WÓ%XÐÜ2°6·:±:¸gÀrÓ3JÐL_ÐaiÓjˆ
à×ÑÙØ—\‘\Ð"3Ð5IÓJØ$Ø Ø Ø /ØØ!à%1×%7Ñ%7×%EÑ%EØ)5×);Ñ);×)MÑ)Mñð "ôõ	
r<   rÕ   rÏ   rÖ   rÎ   c                 ó¨  — t        j                  d«       	 t        t        d z  |j	                  dd «      «      }| j                  «       r| j                  |¬«      ng }|�|d   nt        }|j	                  dd «      }t        t        d z  |j	                  dd «      «      }i }|�||d<   t        |«      }|�||j                  «       D ]i  \  }}t        j                  �Ft        t        j                  t        «      r(|t        j                  v r|j                  |› d|› �«       |t         v rŒe|||<   Œk | j#                  |||¬«      }|j%                  d	d «      }t        t&        d z  |j%                  d
d «      «      }|j%                  dd «      }|€$|�"t        t&        d z  |j	                  d«      «      }|€|j	                  d«      xs |}|j%                  dd «      }|�|}t)        |j%                  dd«      «      }t+        t        j,                  «      r|nd}|j%                  dd «      }t+        |j%                  dd«      «      }t+        |j%                  dd«      «      }|j	                  d«      xs |j%                  dd «      }|�/t/        |«      r$| j1                  |	|«      }	| j1                  ||«      }t3        |¬«      }|€|€d|j	                  dd«      › �}|�’d|i} |D ]3  }!|!j5                  dd«      }"|"| vsŒ|j%                  |!d «      }#|#€Œ/|#| |"<   Œ5 t        t7        d„ |j9                  «       «      «      D ]  }|j%                  |d «       Œ d|v r	|s|	nd| d<   d |v r™|s|nd| d <   n�||||s|	nd|j%                  d!|j	                  d"d «      «      |d#œ} t        t7        d$„ |j9                  «       «      «      D ]'  }|j%                  |d «      | |j5                  dd«      <   Œ) |d%k(  r|| d&<   n	|s|nd| d <   |d'u s#t        |t&        «      ry|j;                  «       d(k(  rf|j                  «       D ��ci c])  \  }}t        |t&        t<        t>        t@        f«      sŒ'||“Œ+ }$}}i | j	                  d«      xs t        ¥d)|$i¥| d<   |j	                  d*d «      }%t        j                  d+|%«       |r|j	                  d,«      nd }&t        j                  �ft        t        j                  t        «      rHd-t        j                  v r6tB        jD                  j	                  d.d «      }'|'�|j                  d/|'› �«       |j	                  d0d «      }(|j	                  d1d «      })|j	                  d2d «      }*d3|%d'fd,tG        |&«      |&d ufd0|(tA        |(«      fd1|)tA        |)«      fd2|*tA        |*«      fd4|j	                  d4«      xs d| j                  «       xr d4|v ff}+|+D ���,ci c]  \  }}},|,sŒ
||“Œ }-}}},| j                  «       r#d4|v r
|d4   €d|d4<   |€| jI                  d5|i«       |j	                  d6d «      }.|.rn|.j	                  d7d «       |.j	                  d8d «       |.j	                  d9d «      }/i }0|/r4|/j                  «       D ]!  \  }}|j;                  «       tJ        vsŒ||0|<   Œ#  | jL                  jN                  di | ¤Ž}1tQ        |1|-«       | jS                  |1|¬:«       d }2d }3d }4|
�¹tU        |
d«      r|
j	                  dd «      �tW        ||
«      }2tY        |
d;d «      }5|5r€tY        |5d<d «      xs d=}6tY        |5d>d «      xs d=}7tY        |5d?d «      xs d=}8|5j	                  d@«      xs d=}9t[        |5«      }:|6|7| j]                  «       r|%nd dAœ}3|6|:z
  };t_        |;|7|8|9|:¬B«      }4|j%                  dCd «      }<|<€Mt        t&        d z  |j	                  dDd «      «      }=dt        t&        |j	                  dd«      «      › �}<|=�dE|=› �}<|
�tY        |
dFd «      }>nd }>|>�|>|dF<   t        t&        d z  |j	                  dG«      «      }?ta        |j	                  dHd«      |?|«      }@|<|j%                  dI|2«      |||@||s|	nd|s|nd|3|4i tc        t3        |¬«      «      ¥|-¥||j%                  d"d «      dJœ}A|j	                  dKd «      }B|B�BAdK<   | je                  «       rtg        A||| jL                  ¬L«      }A|�t        |t&        «      r
|d%k(  r|Ad&<   | ji                  «       r|j	                  dMd «      AdM<    |1jj                  di A¤Ž}CtU        |Cd«      r<Cjl                  r0Cjl                  |k7  r!t        jn                  dN|Cjl                  «       ||2fS c c}}w c c},}}w # tp        $ r+ t        jr                  dOtu        jv                  «       «       Y yPw xY w)QNz/Langfuse Layer Logging - logging to langfuse v2Ústandard_logging_object©r  r¾   Úuser_api_key_end_user_idÚprompt_management_metadataú:)ÚtagsrÈ   r¾   Ú
session_idÚ
trace_namer×   Úlitellm_trace_idÚexisting_trace_idÚupdate_trace_keysrD   Údebug_langfuseÚ
mask_inputFÚmask_outputÚ_langfuse_masking_functionÚlangfuse_masking_function)r¾   zlitellm-rå   r   r¯   Útrace_rÂ   c                 ó$   — | j                  d«      S ©Nr  ©rš   ©r?   s    r:   ú<lambda>z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>‰  ó   € °3·>±>À(Ó3K€ r<   rÖ   zredacted-by-litellmrÕ   Útrace_versionr¤   )r¯   r÷   r  rÖ   r¤   rÊ   c                 ó$   — | j                  d«      S r  r  r  s    r:   r  z1LangFuseLogger._log_langfuse_v2.<locals>.<lambda>œ  r  r<   rä   rÌ   TÚtrueÚmetadata_passed_to_litellmÚresponse_costz	trace: %sÚhidden_paramsÚproxy_base_urlÚPROXY_BASE_URLzproxy_base_url:Úapi_baseÚvertex_locationÚaws_region_nameÚlitellm_response_costÚ	cache_hitr  rÀ   ÚmethodÚurlr*   )r  r  r  rû   r   rü   Útotal_tokensr@   )rû   rü   Ú
total_cost)rÖ   rÕ   Útotalr@   rA   rö   Úuser_api_key_aliaszlitellm:Úsystem_fingerprintrù   rú   rØ   )r÷   r¯   rT   rÉ   rú   Úmodel_parametersrÖ   rÕ   r  Úusage_detailsr¾   rË   r¤   Úparent_observation_id)Úgeneration_paramsÚclean_metadatar
  r    Úcompletion_start_timezjLangfuse trace_id mismatch: set %s, but langfuse returned %s. Using our intended trace_id for consistency.zLangfuse Layer Error - %s)NN)<r   r‹   r   r#   rF   Ú_supports_tagsÚ_get_langfuse_tagsr/   r$   r;   rÚ   rW   Úlangfuse_default_tagsr7   rï   Úappendr.   Úadd_default_langfuse_tagsrÙ   r\   rj   r_   Ú!langfuse_enable_update_trace_keysÚcallableÚ_apply_masking_functionr   rÃ   ÚfilterÚkeysÚlowerrK   rQ   r]   rp   r¬   r   Úupdater3   r'   r  Ú)log_provider_specific_information_as_spanÚ"_log_guardrail_information_as_spanrO   rZ   rP   rS   Ú_supports_costsÚLangfuseUsageDetailsr   Úlog_requester_metadataÚ_supports_promptÚ _add_prompt_to_generation_paramsÚ_supports_completion_start_timer  r×   r   r—   r}   r˜   r™   )DrE   rÊ   r¾   r½   rÕ   rT   rÉ   rÈ   rÏ   rÖ   rU   rË   rÎ   r  r  Úallowlisted_metadataÚend_user_idr
  r6  Úmetadata_entriesr?   r4   r  r  r×   r  Úrequested_trace_keysr  r‹   r  r  Úmasking_functionÚtrace_paramsrÅ   rÆ   Úupdated_trace_valueÚdebug_metadataÚcostr#  r$  r&  r'  r(  Úcandidate_enrichmentsÚincludeÚenrichmentsrÀ   r*   Úclean_headersr  rØ   r  r3  Ú
_usage_objrû   rü   r-  r@   rA   Úinput_tokensrö   Ú_user_api_key_aliasr1  rù   r  r5  r4  Úgeneration_clientsD                                                                       r:   rÝ   zLangFuseLogger._log_langfuse_v2  s,  € ô 	×ÑÐNÔOðk	ÜLPÜ&¨Ñ-Ø—
‘
Ð4°dÓ;óMÐ#ð ×&Ñ&Ô(ð ×'Ñ'Ð@WÐ'ÔXàð ð 8OÐ7ZÐ'¨
Ò3Ô`lð !ð "6×!9Ñ!9Ð:TÐVZÓ![ˆKÜ`dÜ7¸$Ñ>Ø$×(Ñ(Ð)EÀtÓLóaÐ&ð 13ˆNØ)Ð5Ø?Y�Ð;Ñ<Ü&5°hÓ&?ÐØÐ+Ø"2×"8Ñ"8Ó":ò 4‘J�C˜ô  ×5Ñ5ÐAÜ&¤w×'DÑ'DÄdÔKØ¤7×#@Ñ#@Ñ@àŸ™ s e¨1¨U¨GÐ$4Ô5ð Ô3Ñ3Ø à.3˜ sÒ+ð4ð  ×1Ñ1°tÀFÐU]Ð1Ó^ˆDà .× 2Ñ 2°<ÀÓ FˆJÜœc D™j¨.×*<Ñ*<¸\È4Ó*PÓQˆJØ%×)Ñ)¨*°dÓ;ˆHð ÐÐ$;Ð$GÜ¤ d¡
Ð,C×,GÑ,GÈ
Ó,SÓT�àÐØ!Ÿ:™:Ð&8Ó9ÒL¸_�Ø'5×'9Ñ'9Ð:MÈtÓ'TÐð !Ð,Ø,�Ü*CÀN×DVÑDVÐWjÐlnÓDoÓ*pÐ ä(9¼'×:cÑ:cÔ(dÑ$Ðjlð ð *×-Ñ-Ð.>ÀÓEˆEÜ 1°.×2DÑ2DÀ\ÐSXÓ2YÓ ZˆJÜ!2°>×3EÑ3EÀmÐUZÓ3[Ó!\ˆKð '5×&8Ñ&8Ð9UÓ&Vò 'ÐZh×ZlÑZlØ+¨Tó[Ðð
  Ð+´Ð9IÔ0JØ×4Ñ4°UÐ<LÓM�Ø×5Ñ5°fÐ>NÓO�ä5¸~ÔNˆNàÐ!Ð&7Ð&?ð  (¨¯
©
°;ÀÓ(MÐ'NÐO�
à Ð,Ø04Ð6GÐ/H�ð +<ò PÐ&Ø&8×&@Ñ&@ÀÈ2Ó&N�OØ&¨lÒ:Ø.<×.@Ñ.@ÐASÐUYÓ.ZÐ+Ø.Ñ:Ø<O˜L¨Ò9ðPô  ¤Ñ'KÈ^×M`ÑM`ÓMbÓ cÓdò 2�CØ"×&Ñ& s¨DÕ1ð2ð Ð/Ñ/Ù9C©EÐI^�L Ñ)ØÐ0Ñ0Ù;F©VÐLa�L Ò*ð #Ø&Ø",Ù*4™UÐ:OØ-×1Ñ1Ø'¨×);Ñ);¸IÀtÓ)Ló ð  +ñ	 �ô  ¤Ñ'KÈ^×M`ÑM`ÓMbÓ cÓdò \�CØ>L×>PÑ>PÐQTÐVZÓ>[�L §¡¨X°rÓ!:Ò;ð\ð ˜GÒ#Ø5;�LÐ!1Ò2á;F©VÐLa�L Ñ*à˜‰}¤¨E´3Ô!7¸E¿K¹K»MÈVÒ<Sà19·±Ó1A÷)Ù#- 3¨ÄZÐPUÔX[Ô]`ÔbgÔimÐWnÕEo�C˜‘Jð)�ñ )ð,Ø#×'Ñ'¨
Ó3ÒC´|ð,à0°.ñ,�˜ZÑ(ð
 !Ÿ*™* _°dÓ;ˆDÜ× Ñ  ¨dÔ3áSjÐ#:×#>Ñ#>¸Ô#OÐptˆMô ×-Ñ-Ð9Üœw×<Ñ<¼dÔCØ$¬×(EÑ(EÑEä(*¯
©
¯©Ð7GÈÓ(N�Ø!Ð-Ø—K‘K /°.Ð1AÐ BÔCà,×0Ñ0°¸TÓBˆHØ%+§Z¡ZÐ0AÀ4Ó%HˆOØ%+§Z¡ZÐ0AÀ4Ó%HˆOð )¨$°Ð5Ø Ô"?ÀÓ"NÐP]ÐeiÐPiÐjØ˜X¤t¨H£~Ð6Ø" O´T¸/Ó5JÐKØ" O´T¸/Ó5JÐKØ˜fŸj™j¨Ó5Ò>¸À×@SÑ@SÓ@UÒ@oÐZeÐioÐZoÐpð,Ð!ð 7L÷5ð 5Ù2˜s E¨7Êw��U‘
ð5ˆKò 5ð ×"Ñ"Ô$Ø &Ñ(¨V°KÑ-@Ð-HØ*/�F˜;Ñ'Ø$Ð,Ø ×'Ñ'¨°¨Ô7à*8×*<Ñ*<Ð=SÐUYÓ*ZÐ Ù#Ø$×(Ñ(¨°4Ô8Ø$×(Ñ(¨°Ô5Ø!5×!9Ñ!9¸)ÀTÓ!J�Ø')�ÙØ&-§m¡m£oò 7™
˜˜UàŸ9™9›;Ô.EÒEØ16˜M¨#Ò.ð7ð
 1D°·±×0CÑ0CÑ0SÀlÑ0SˆEô 6°e¸[ÔIð ×3Ñ3ØØ(?ð 4ô ð
 !ˆMØˆEØ ˆMØÐ'Ü˜<¨Ô.°<×3CÑ3CÀDÈ$Ó3OÐ3[Ü$/°
¸LÓ$I�MÜ9@ÀÈwÐX\Ó9]�
áô ,3°:¸ÐPTÓ+UÒ+ZÐYZ�MÜ/6°zÐCVÐX\Ó/]Ò/bÐabÐ%Ü*1°*¸nÈdÓ*SÒ*XÐWX�Là9C¿¹ÐHeÓ9fÒ9kÐjkÐ/Ü5UÐV`Ó5aÐ+ð *7Ø->Ø.2×.BÑ.BÔ.D¡dÈ$ñ�Eð +8Ð:QÑ*Q�LÜ$8Ø*Ø0Ø*Ø4OØ0Gô%�Mð -×0Ñ0Ð1BÀDÓIˆOØÐ&ô .2´#¸±*¸n×>PÑ>PÐQeÐgkÓ>lÓ-mÐ#Ø$,¬T´#°v·z±zÀ+È|Ó7\Ó-]Ð,^Ð"_�Ø&Ð2Ø(0Ð1DÐ0EÐ&F�OàÐ'Ü%,¨\Ð;OÐQUÓ%VÑ"à%)Ð"à!Ð-Ø8J�Ð 4Ñ5ä)-¬c°D©j¸&¿*¹*ÐEZÓ:[Ó)\ÐÜ 6°v·z±zÀ'È2Ó7NÐPcÐemÓ nˆJð (Ø$×(Ñ(¨¸-ÓHØ(Ø$Ø#Ø$3Ù&0™Ð6KÙ(3™&Ð9NØØ!.ðÜ,Ô-EÐOcÔ-dÓeðà!ðð Ø)×-Ñ-¨i¸Ó>ñ!!Ðð& ,4¯<©<Ð8OÐQUÓ+VÐ!Ø$Ð0Ø=RÐ!Ð"9Ñ:à×$Ñ$Ô&Ü$DØ&7Ø#1Ø/IØ$(§M¡Mô	%Ð!ð Ð!¤j°¼Ô&=À%È7ÒBRØ6<Ð!Ð"2Ñ3à×3Ñ3Ô5Ø=C¿Z¹ZÐH_ÐaeÓ=fÐ!Ð"9Ñ:à'7 u×'7Ñ'7Ñ'LÐ:KÑ'LÐô Ð(¨*Ô5Ð:K×:TÒ:TØ$×-Ñ-°Ò9Ü"×*Ñ*ð EØ Ø)×2Ñ2ôð
 ˜]Ð*Ð*ùóU)ùôD5øôR ò 	Ü× Ñ Ð!<¼i×>RÑ>RÓ>TÔUÙð	úsR   —K%f Ë=f ÌD&f Ð8(fÑ!fÑ&E;f ×!f×-f×2B1f Ú$K+f æf æ1gçgc                 ó‚   — | j                   r3t        | j                   «      dkD  r| d   d   d   j                  «       }|S y)z;
        Get the chat content for Langfuse logging
        r   ÚchoicesÚmessageN)r^  ÚlenÚjson)rU   rÕ   s     r:   rë   z-LangFuseLogger._get_chat_content_for_langfuseT  sD   € ð ×Ò¤C¨×(<Ñ(<Ó$=ÀÒ$AØ(¨Ñ3°AÑ6°yÑA×FÑFÓHˆFØˆMàr<   c                 ó~   — | j                   r1t        | j                   «      dkD  r| j                   d   j                  S y)zF
        Get the text completion content for Langfuse logging
        r   N)r^  r`  rç   ©rU   s    r:   rì   z8LangFuseLogger._get_text_completion_content_for_langfusea  s9   € ð ×Ò¤C¨×(<Ñ(<Ó$=ÀÒ$AØ×'Ñ'¨Ñ*×/Ñ/Ð/àr<   c                 óL   — t        | d«      r| j                  r| j                  S y)zD
        Get the responses API content for Langfuse logging
        rÕ   N)rO   rÕ   rc  s    r:   rî   z6LangFuseLogger._get_responses_api_content_for_langfusem  s%   € ô �< Ô*¨|×/BÒ/Bà×&Ñ&Ð&àr<   r  c                 ó6   — | €g S | j                  dg «      xs g S )NÚrequest_tags)rF   r  s    r:   r9  z!LangFuseLogger._get_langfuse_tagsz  s'   € ð #Ð*ØˆIØ&×*Ñ*¨>¸2Ó>ÒDÀ"ÐDr<   c                 óÔ  — t         j                  �×t        t         j                  t        «      r¹dt         j                  v r&|j	                  dd«      }|j                  d|› �«       dt         j                  v ro|j	                  di «      xs i }|j	                  dd«      }|€1t         j                  �!t        j                  j                  di |¤Ž}|}|j                  d|› �«       |S )	z˜
        Helper function to add litellm default langfuse tags

        - Special LiteLLM tags:
            - cache_hit
            - cache_key

        Nr*  Fz
cache_hit:Ú	cache_keyr#  z
cache_key:rD   )rW   r:  r7   rï   rF   r;  ÚcacheÚ!_get_preset_cache_key_from_kwargs)rE   r  rÈ   r¾   Ú_cache_hit_valueÚ_hidden_paramsÚ
_cache_keyÚ_preset_cache_keys           r:   r<  z(LangFuseLogger.add_default_langfuse_tags‚  sÎ   € ô ×(Ñ(Ð4¼ÄG×DaÑDaÔcgÔ9hØœg×;Ñ;Ñ;Ø*0¯*©*°[À%Ó*HÐ Ø—‘˜jÐ)9Ð(:Ð;Ô<Øœg×;Ñ;Ñ;Ø(0¯©°_ÀbÓ(IÒ(OÈR�Ø+×/Ñ/°¸TÓB�
ØÐ%¬'¯-©-Ð*Cä/6¯}©}×/^Ñ/^Ñ/hÐagÑ/hÐ%Ø!2�JØ—‘˜j¨¨Ð5Ô6Øˆr<   c                 óD   — t        | j                  «      t        d«      k\  S )z/Check if current langfuse version supports tagsz2.6.3©r   r¦   ©rE   s    r:   r8  zLangFuseLogger._supports_tags™  ó   € ä�t×0Ñ0Ó1´W¸WÓ5EÑEÐEr<   c                 óD   — t        | j                  «      t        d«      k\  S )z1Check if current langfuse version supports promptú2.7.3rp  rq  s    r:   rI  zLangFuseLogger._supports_prompt�  rr  r<   c                 óD   — t        | j                  «      t        d«      k\  S )z0Check if current langfuse version supports costsrt  rp  rq  s    r:   rF  zLangFuseLogger._supports_costs¡  rr  r<   c                 óD   — t        | j                  «      t        d«      k\  S )z@Check if current langfuse version supports completion start timert  rp  rq  s    r:   rK  z.LangFuseLogger._supports_completion_start_time¥  rr  r<   r®   rP  c                 ó¢  — | €y	 t        | t        «      r || «      S t        | t        «      r5i }| j                  «       D ]  \  }}t        j                  ||«      ||<   Œ  |S t        | t        «      r$| D �cg c]  }t        j                  ||«      ‘Œ c}S  || «      S c c}w # t        $ r"}t        j                  d|«       | cY d}~S d}~ww xY w)a%  
        Apply a masking function to data, handling different data types.

        Args:
            data: The data to mask (can be str, dict, list, or None)
            masking_function: A callable that takes data and returns masked data

        Returns:
            The masked data
        Nz>Failed to apply masking function: %s. Returning original data.)
r7   r\   r8   rÚ   r‚   r?  rï   r—   r   r   )r®   rP  Úmasked_dictr?   r4   Úitemr¶   s          r:   r?  z&LangFuseLogger._apply_masking_function©  sÔ   € ð ˆ<Øð	Ü˜$¤Ô$Ù'¨Ó-Ð-Ü˜D¤$Ô'Ø%'�Ø"&§*¡*£,ò g‘J�C˜Ü'5×'MÑ'MÈeÐUeÓ'f�K Ò$ðgà"Ð"Ü˜D¤$Ô'ØcgÖhÐ[_œ×>Ñ>¸tÐEUÕVÒhÐhñ (¨Ó-Ð-ùò iøô ò 	Ü×"Ñ"Ð#cÐefÔgØ�Kûð	úsA   …B# �AB# Á"B# Á6BÂB# ÂB# ÂB# Â#	CÂ,C	ÃCÃ	Cc                  óÄ   — t        j                  d«      } | sy| j                  «       }	 t        |«       |S # t        $ r}t        | t        |«      «       Y d}~yd}~ww xY w)zmResolve LANGFUSE_TRACING_ENVIRONMENT: stripped value, "default" plus a warning when invalid, None when unset.ÚLANGFUSE_TRACING_ENVIRONMENTNÚdefault)rp   rq   rb   r   Ú
ValueErrorr€   r\   )Úrawr4   r¶   s      r:   r›   z-LangFuseLogger.resolve_deployment_environmentÉ  s[   € ô —Y‘YÐ=Ó>ˆÙØØ—y‘y“{ˆð	Ü/°Ô6ð ˆøô ò 	Ü0°´c¸!³fÔ=Üûð	ús   ª7 ·	AÁ AÁArŒ   c                 óF   — t        t        j                  d«      xs | «      S )a¬  
        Get the langfuse flush interval to initialize the Langfuse client

        Reads `LANGFUSE_FLUSH_INTERVAL` from the environment variable.
        If not set, uses the flush interval passed in as an argument.

        Args:
            flush_interval: The flush interval to use if LANGFUSE_FLUSH_INTERVAL is not set

        Returns:
            [int] The flush interval to use to initialize the Langfuse client
        ÚLANGFUSE_FLUSH_INTERVAL)rK   rp   rq   )rŒ   s    r:   rž   z+LangFuseLogger._get_langfuse_flush_interval×  s   € ô ”2—9‘9Ð6Ó7ÒI¸>ÓJÐJr<   r  c                 ó¸  — |€t        j                  d«       y|j                  dd«      }|st        j                  d«       yt        |t        «      s t        j                  dt        |«      «       y|D ]ã  }t        |t        «      s t        j                  dt        |«      «       Œ3|j                  d|j                  dd«      |j                  d	d«      |j                  d
d«      |j                  dd«      |j                  dd«      dœ|j                  dd«      |j                  dd«      ¬«      }t        j                  d|«       |j                  «        Œå y)z5
        Log guardrail information as a span
        NzQNot logging guardrail information as span because standard_logging_object is NoneÚguardrail_informationzPNot logging guardrail information as span because guardrail_information is emptyzYNot logging guardrail information as span because guardrail_information is not a list: %sz1Skipping guardrail entry with unexpected type: %sÚ	guardrailÚguardrail_requestÚguardrail_responseÚguardrail_nameÚguardrail_modeÚmasked_entity_count)r†  r‡  Úguardrail_masked_entity_countrT   rÉ   )r÷   rÖ   rÕ   r¾   rT   rÉ   z(Logged guardrail information as span: %s)	r   r‹   rF   r7   rï   Útyper8   ÚspanÚend)rE   r  r  r‚  Úguardrail_entryr‹  s         r:   rE  z1LangFuseLogger._log_guardrail_information_as_spanç  sV  € ð #Ð*Ü× Ñ Ð!tÔuØà'>×'BÑ'BÐCZÐ\`Ó'aÐÙ$Ü× Ñ Ð!sÔtØäÐ/´Ô6Ü× Ñ ØkÜÐ*Ó+ôð à4ò 	ˆOÜ˜o¬tÔ4Ü×$Ñ$ØGÜ˜Ó)ôð à—:‘:Ø Ø%×)Ñ)Ð*=¸tÓDØ&×*Ñ*Ð+?ÀÓFà&5×&9Ñ&9Ð:JÈDÓ&QØ&5×&9Ñ&9Ð:JÈDÓ&QØ5D×5HÑ5HÐI^Ð`dÓ5eñð
 +×.Ñ.¨|¸TÓBØ(×,Ñ,¨Z¸Ó>ð ó ˆDô × Ñ Ð!KÈTÔRØ�H‰H�Jñ-	r<   )NNNNr»   T)NNNÚDEFAULTN)/rG   rH   rI   r\   r]   r©   r8   r'   r«   ÚstaticmethodÚobjectrÇ   r   r    r%   r   r&   r!   r   r   r   râ   rh   rï   rÛ   rñ   rÜ   rÞ   rÝ   rë   rì   rî   r#   r9  r<  r8  rI  rF  rK  r
   r   r?  r›   rK   rž   r(   rE  rD   r<   r:   r‚   r‚   —   s  „ ð !ØØØ+/ØØ&*ñZ*ð
 " D™jðZ*ð  $óZ*ðx°Dð ¸Xó ð& ð°ð Àð È$ÈsÐTZÈ{ÑJ[ò ó ððV '+Ø$(Ø"ØØ%)ñ#b=àðb=ð Ø
ñà
ñð ñð !ñ	!ð
 ñð  ñ ð ñð %ñ%ð ñ	ðb=ð ˜t‘Oðb=ð ˜T‘/ðb=ð �t‘ðb=ð  ð!b=ð" ˜d™
ð#b=ð$ 
ó%b=ðHNàðNð Ø
ñà
ñð ñð !ñ	!ð
 ñð  ñ ð ñð %ñ%ð ñ	ðNð ðNð ðNð ˜d™
ðNð  
ˆt�d‰{˜C $™J¨Ñ-°Ñ4Ð4Ñ	5ó!Nò`òIò
-
ð^|à�t‘ð|ð �s˜F�{Ñ#ð|ð ð	|ð
 �d‘
˜TÑ! DÑ(ð|ð ˜t‘Oð|ð ˜T‘/ð|ð ð|ð ð|ð �d‰{ð|ð ð|ð ˜t™ð|ð 
ó|ð|	 ð
Ø#ð
à	ˆt‰ò
ó ð
ð ð	Ø,ò	ó ð	ð ð
Ø*ò
ó ð
ð ðEØ!7¸$Ñ!>ðEà	ˆc‰òEó ðEòò.FòFòFòFð ð cð ¸XÀsÀeÈSÀjÑ=Qð ÐVYò ó ðð> ð¨C°$©Jò ó ðð ðK°Sð K¸Sò Kó ðKð.à"ð.ð "8¸$Ñ!>ô.r<   r‚   r5  r6  r
  r    c                 óÆ  — ddl m} ddlm}m}m}m} t        ||«      }|j                  dd «      }	|	€|€	 | S t        |	t        «      �rÂ|	j                  dd«      dk(  r |di |	¤Ž}
 ||
¬«      | d<   | S |	j                  dd«      d	k(  r |di |	¤Ž} ||¬«      | d<   | S d
|	v �rPd|	v �rKt        |	d   t        «      r‡t        |d|j                  «      }|	d   |	d   |	d
   |	j                  dd «      dœ}d|v r6d|v r2|	j                  dg «      xs g |d<   |	j                  dg «      xs g |d<    |di |¤Ž} ||¬«      | d<   | S t        |	d   t        «      r‡t        |d|j                  «      }|	d   |	d   |	d
   |	j                  dd «      dœ}d|v r6d|v r2|	j                  dg «      xs g |d<   |	j                  dg «      xs g |d<    |di |¤Ž} ||¬«      | d<   | S t!        j"                  d«       | S t!        j"                  d«       | S |�"|d   dk(  r	 |j%                  |d   «      | d<   | S |	| d<   | S # t&        $ r!}t!        j(                  d|«       Y d }~| S d }~ww xY w)Nr   r…   )ÚChatPromptClientÚPrompt_ChatÚPrompt_TextÚTextPromptClientrÔ   rŠ  rÂ   Úchat)rÔ   rç   r¤   Úmodel_fieldsr÷   Úconfig)r÷   rÔ   r¤   r˜  Úlabelsr  z5[Non-blocking] Langfuse Logger: Invalid prompt formatzS[Non-blocking] Langfuse Logger: Invalid prompt format. No prompt logged to LangfuseÚprompt_integrationr–   Ú	prompt_idzK[Non-blocking] Langfuse Logger: Error getting prompt client for logging: %srD   )r–   r'   r  r’  r“  r”  r•  r   rÙ   r7   r8   rF   r\   rP   Ú
__fields__rï   r   r}   Ú
get_promptr—   r‹   )r5  r6  r
  r    r'   r’  r“  r”  r•  Úuser_promptÚ_prompt_chatÚ_prompt_textÚprompt_text_paramsÚ_dataÚ_prompt_objÚprompt_chat_paramsr¶   s                    r:   rJ  rJ    s  € õ "÷ó ô ˜8 _Ó5€Oà'×+Ñ+¨H°dÓ;€KØÐÐ9ÐAØðh Ðôg 
�K¤Õ	&Ø�?‰?˜6 2Ó&¨&Ò0Ù"-Ñ"<°Ñ"<ˆLÙ*:À,Ô*OÐ˜hÑ'ð` Ðð_ �_‰_˜V RÓ(¨FÒ2Ù"-Ñ"<°Ñ"<ˆLÙ*:À,Ô*OÐ˜hÑ'ðZ ÐðY ˜+Ò%¨(°kÒ*Aä˜+ hÑ/´Ô5Ü,3°KÀÐQ\×QgÑQgÓ,hÐ"à'¨Ñ/Ø)¨(Ñ3Ø*¨9Ñ5Ø)Ÿo™o¨h¸Ó=ñ	�ð Ð1Ñ1°fÐ@RÑ6RØ&1§o¡o°hÀÓ&CÒ&IÀr�E˜(‘OØ$/§O¡O°F¸BÓ$?Ò$EÀ2�E˜&‘MÙ)Ñ2¨EÑ2�Ù.>ÀkÔ.RÐ! (Ñ+ð< Ðô9 ˜K¨Ñ1´4Ô8Ü,3°KÀÐQ\×QgÑQgÓ,hÐ"à'¨Ñ/Ø)¨(Ñ3Ø*¨9Ñ5Ø)Ÿo™o¨h¸Ó=ñ	�ð Ð1Ñ1°fÐ@RÑ6RØ&1§o¡o°hÀÓ&CÒ&IÀr�E˜(‘OØ$/§O¡O°F¸BÓ$?Ò$EÀ2�E˜&‘Má)Ñ2¨EÑ2�á.>ÀkÔ.RÐ! (Ñ+ð Ðô ×$Ñ$Ð%\Ô]ð Ðô × Ñ Ð!vÔwð Ðð 
$Ð	/Ð4NÐOcÑ4dÐhrÒ4rð	sØ*9×*DÑ*DÐE_Ð`kÑElÓ*mÐ˜hÑ'ð Ðð '2Ð˜(Ñ#àÐøô ò 	sÜ× Ñ Ð!nÐpq×rÐrð
 Ðûð	sús   ÈH6 È6	I È?IÉI c                 óL  — |j                  dd«      }|€y|j                  dd«      }|�{t        |t        «      rW|D ]Q  }t        |t        «      r,|j	                  «       D ]  \  }}| j                  ||¬«       Œ Œ?| j                  d|¬«       ŒS y| j                  d|¬«       yy)zÞ
    Logs provider-specific information as spans.

    Parameters:
        trace: The tracing object used to log spans.
        clean_metadata: A dictionary containing metadata to be logged.

    Returns:
        None
    r#  NÚvertex_ai_grounding_metadata)r÷   rÖ   )rF   r7   rï   r8   rÚ   r‹  )r  r6  rl  r¦  Úelemr?   r4   s          r:   rD  rD  a  sÇ   € ð :H×9KÑ9KÈOÐ]aÓ9b€NØÐØà*8×*<Ñ*<Ð=[Ð]aÓ*bÐ à#Ð/ÜÐ2´DÔ9Ø4ò �Ü˜d¤DÔ)Ø&*§j¡j£lò ™
˜˜UØŸ
™
Ø!$Ø"'ð #õ ñð —J‘JØ;Ø"ð õ ñð �J‰JØ3Ø2ð õ ð 0r<   c                 óž   — i }| j                  d«      xs i }| j                  «       D ]  \  }}||vsŒ|||<   Œ |j                  d|i«       |S )NÚrequester_metadata)rF   rÚ   rC  )r6  Úreturned_metadatar©  ÚkÚvs        r:   rH  rH  ‹  sl   € Ø!ÐØ .× 2Ñ 2Ð3GÓ HÒ NÈBÐØ×$Ñ$Ó&ò %‰ˆˆ1ØÐ&Ò&Ø#$Ð˜aÒ ð%ð ×ÑÐ2Ð4FÐGÔHàÐr<   )NNNNT)Sr§   rp   r˜   Úcollections.abcr   r   r   r   Ú	functoolsr   Útypesr   Útypingr	   r
   r   r   r   r   Úpackaging.versionr   rW   Úlitellm._loggingr   Úlitellm.constantsr   Ú2litellm.integrations.langfuse.langfuse_mock_clientr   r   Ú'litellm.litellm_core_utils.core_helpersr   r   r   Ú=litellm.litellm_core_utils.initialize_dynamic_callback_paramsr   Ú*litellm.litellm_core_utils.redact_messagesr   Ú&litellm.llms.custom_httpx.http_handlerr   Úlitellm.secret_managers.mainr   Ú#litellm.types.integrations.langfuseÚlitellm.types.llms.openair   r   Úlitellm.types.utilsr   r   r    r!   r"   r#   r$   r%   r&   Úlangfuse.clientr'   r(   Ú*litellm.litellm_core_utils.litellm_loggingr)   Ú	frozensetr.   Ú__annotations__r/   r\   r�  r3   r;   r>   rK   rS   rZ   r]   r_   rh   rj   ry   r€   r‚   r8   rJ  rD  rH  rD   r<   r:   ú<module>rÁ     s"  ðô Û 	Û ß 7Ñ 7Ý Ý Ý "ß E× Eå %ã Ý +Ý >÷÷ñ õ
õ PÝ DÝ 4Ü 1ß V÷
÷ 
õ 
ñ ß=æNàÐØÐØ€Hñ  )Ò)eÓfÐ �uÓ fÙ,<¸RÓ,@€ˆe�G˜C ˜KÑ(Ñ)Ó @Ù1:Ò;aÓ1bÐ ˜˜y¨™~Ñ.Ó bð6˜6ð 6 g¨c°6¨kÑ&:¸TÑ&Aó 6ô
p�8ô pð#°3ó #ð:B˜H t™Oð B¸6ð BÀcÈDÁjó Bð
˜Vð ¨ó ð Vð °°c¸3°h±ó ð ØØØØ"&ñ1ð
  ó1ñ& �1Ôð°Cð Àð Èò ó ð÷~ñ ~ðBFØðFàðFð !HÈ$Ñ NðFð ð	Fð
 
óFðR'à˜C ˜HÑ%ó'ðT	¨7°3¸°8Ñ+<ô 	r<   