Ë
    uPêj1  ã                   ó¤  — U d Z 	 ddlZddlZddlmZ ddlmZ ddlmZ ddlZddl	m
Z
mZmZmZmZ ddlZddlmZmZ ddl­ dd	lmZ dd
lmZ ddlmZ ddlmZ  e
«       Zeed<   dZeed<   dZeed<   def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%de!dz  de!dz  fd„Z&de!de!de%fd„Z'ejQ                  dg d ¢d!d"g¬#«      de!ded$efd%„«       Z)y)&z/
What is this?

Logging Pass-Through Endpoints
é    N)Ú	b64encode)ÚFinal©Úunquote)Ú	APIRouterÚHTTPExceptionÚRequestÚResponseÚstatus)Ú	SSRFErrorÚvalidate_url)Ú*)Úuser_api_key_auth)Ú_safe_get_request_headers)Ú_get_dynamic_logging_metadata)Úcreate_pass_through_routeÚrouterÚdefault_vertex_configzhttps://cloud.langfuse.comÚ_DEFAULT_LANGFUSE_HOSTÚrequestc                 ó´   — | j                   t        | j                  «      t        | «      j	                  «       | j
                  t        | j                  «      dœS )N)ÚmethodÚurlÚheadersÚcookiesÚquery_params)r   Ústrr   r   Úcopyr   Údictr   )r   s    úy/home/oem/CyberBrain26-unified/.venv/lib/python3.12/site-packages/litellm/proxy/vertex_ai_endpoints/langfuse_endpoints.pyÚcreate_request_copyr!   #   sE   € à—.‘.Ü�7—;‘;ÓÜ,¨WÓ5×:Ñ:Ó<Ø—?‘?Ü˜W×1Ñ1Ó2ñð ó    ÚvalueÚreturnc                 ó2   — | }	 t        |«      }||k(  r|S |}Œ)Nr   )r#   ÚpreviousÚdecodeds      r    Ú_decode_to_convergencer(   -   s+   € Ø€HØ
Ü˜(Ó#ˆØ�hÒØˆNØˆð	 r"   Úbase_target_urlc                 ó´  — | j                  d«      s| j                  d«      sd| z   } 	 t        j                  | «      }|j                  dvs|j                  st	        t
        j                  ddi¬«      ‚|j                  rt	        t
        j                  ddi¬«      ‚t        |«      S # t        $ r%}t	        t
        j                  dd|› �i¬«      ‚d }~ww xY w)	Nzhttp://zhttps://ÚerrorúInvalid Langfuse host: ©Ústatus_codeÚdetail)ÚhttpÚhttpszInvalid Langfuse hostz*Langfuse host must not include credentials)Ú
startswithÚhttpxÚURLÚ	Exceptionr   r   ÚHTTP_400_BAD_REQUESTÚschemeÚhostÚuserinfor   )r)   Úbase_urlÚes      r    Ú_normalize_langfuse_base_urlr<   6   sÝ   € Ø×&Ñ& yÔ1°_×5OÑ5OÐPZÔ5[à# oÑ5ˆð
ÜŸ)™) OÓ4ˆð ‡�Ð/Ñ/°x·}²}ÜÜ×3Ñ3ØÐ4Ð5ô
ð 	
ð
 ×ÒÜÜ×3Ñ3ØÐIÐJô
ð 	
ô
 ˆx‹=Ðøô% ò 
ÜÜ×3Ñ3ØÐ6°q°cÐ:Ð;ô
ð 	
ûð
ús   ©B) Â)	CÂ2 CÃCÚendpointc                 ó‚  — t        | «      }t        d„ |D «       «      rt        t        j                  ddi¬«      ‚d|v s|j                  d«      rt        t        j                  ddi¬«      ‚d|j                  d«      z   }t        d„ |j                  d«      D «       «      rt        t        j                  ddi¬«      ‚|S )	Nc              3   ó8   K  — | ]  }t        |«      d k  –— Œ y­w)é    N)Úord)Ú.0Úchars     r    ú	<genexpr>z0_validate_langfuse_proxy_path.<locals>.<genexpr>T   s   è ø€ Ò
7˜dŒ3ˆt‹9�r�>Ñ
7ùs   ‚r+   zInvalid Langfuse endpoint pathr-   ú\z//ú/c              3   ó$   K  — | ]  }|d v –— Œ
 y­w))ú.z..N© )rB   Úsegments     r    rD   z0_validate_langfuse_proxy_path.<locals>.<genexpr>`   s   è ø€ Ò
J gˆ7�kÔ!Ñ
Jùs   ‚)r(   Úanyr   r   r6   r2   ÚlstripÚsplit)r=   Údecoded_endpointÚendpoint_paths      r    Ú_validate_langfuse_proxy_pathrP   R   sË   € Ü4°XÓ>ÐÜ
Ñ
7Ð&6Ô
7Ô7ÜÜ×3Ñ3ØÐ=Ð>ô
ð 	
ð ÐÑÐ#3×#>Ñ#>¸tÔ#DÜÜ×3Ñ3ØÐ=Ð>ô
ð 	
ð
 Ð!1×!8Ñ!8¸Ó!=Ñ=€MÜ
Ñ
J°×1DÑ1DÀSÓ1IÔ
JÔJÜÜ×3Ñ3ØÐ=Ð>ô
ð 	
ð Ðr"   Údynamic_host_suppliedÚdynamic_langfuse_public_keyÚdynamic_langfuse_secret_keyc                 óà   — | r%|r|st        t        j                  ddi¬«      ‚||fS |xs  t        j                  j                  d¬«      |xs  t        j                  j                  d¬«      fS )Nr+   z@Dynamic Langfuse hosts must include dynamic Langfuse credentialsr-   ÚLANGFUSE_PUBLIC_KEY)Úsecret_nameÚLANGFUSE_SECRET_KEY)r   r   r6   ÚlitellmÚutilsÚ
get_secret©rQ   rR   rS   s      r    Ú_get_langfuse_proxy_credentialsr\   h   s|   € ñ Ù*Ñ2MÜÜ"×7Ñ7ØÐ!cÐdôð ð +Ð,GÐGÐGð 	$Òb¤w§}¡}×'?Ñ'?ÐLaÐ'?Ó'bØ#Òb¤w§}¡}×'?Ñ'?ÐLaÐ'?Ó'bðð r"   c                 ó`  — t        | «      }t        j                  t        |«      «      }|j	                  |¬«      }i }|r2t        t        dd«      r!	 t        t        |«      «      \  }}||d<   ||fS t        |«      |fS # t        $ r%}	t        t        j                  dd|	› �i¬«      ‚d }	~	ww xY w)N)ÚpathÚuser_url_validationTr+   r,   r-   ÚHost)rP   r3   r4   r<   Ú	copy_withÚgetattrrX   r   r   r   r   r   r6   )
r=   r)   rQ   rO   r:   Úupdated_urlÚcustom_headersÚ
target_urlÚhost_headerr;   s
             r    Ú_build_langfuse_proxy_targetrg   |   sÁ   € ô 9¸ÓB€MÜ—i‘iÔ <¸_Ó MÓN€HØ!×+Ñ+°Ð+Ó?€KØ€Ná¤¬Ð2GÈÔ!Nð	Ü&2´3°{Ó3CÓ&DÑ#ˆJ˜ð "-ˆ�vÑØ˜>Ð)Ð)äˆ{Ó˜^Ð+Ð+øô ò 	ÜÜ"×7Ñ7ØÐ#:¸1¸#Ð!>Ð?ôð ûð	ús   ÁA? Á?	B-Â B(Â(B-z/langfuse/{endpoint:path})ÚGETÚPOSTÚPUTÚDELETEÚPATCHzLangfuse Pass-throughzpass-through)ÚmethodsÚtagsÚfastapi_responsec              ƒ   óJ  K  — ddl m} |j                  j                  d«      xs d}|j	                  dd«      }t        j                  |«      }|j                  d«      }|j                  d«      d   }t        |d	|› �¬
«      ƒ d{  –—† }t        ||¬«      }d}	d}
d}|�F|j                  �:|j                  j                  «       D ]  \  }}|dk(  r|}	Œ|dk(  r|}
Œ|dk(  sŒ|}Œ |du}|xs" t        j                  dt        «      xs t        }t!        ||	|
¬«      \  }}t#        | ||¬«      \  }}dt%        |› d|› �j'                  «       «      j                  d«      z   }||d<   t)        | ||t+        |j,                  «      ¬«      } ||||«      ƒ d{  –—† }|S 7 �Œ7 Œ	­w)zƒ
    Call Langfuse via LiteLLM proxy. Works with Langfuse SDK.

    [Docs](https://docs.litellm.ai/docs/pass_through/langfuse)
    r   )Úproxy_configÚAuthorizationÚ zBasic zutf-8ú:é   zBearer )r   Úapi_keyN)Úuser_api_key_dictrq   Úlangfuse_public_keyÚlangfuse_secret_keyÚlangfuse_hostÚLANGFUSE_HOSTr[   )r=   r)   rQ   Úascii)r=   Útargetrd   r   )Úlitellm.proxy.proxy_serverrq   r   ÚgetÚreplaceÚbase64Ú	b64decodeÚdecoderM   r   r   Úcallback_varsÚitemsÚosÚgetenvr   r\   rg   r   Úencoder   r   r   )r=   r   ro   rq   rv   Údecoded_bytesÚdecoded_strrw   Úcallback_settings_objrR   rS   Údynamic_langfuse_hostÚkÚvrQ   r)   rx   ry   re   Útarget_headersÚlangfuse_combined_keyÚendpoint_funcÚreceived_values                          r    Úlangfuse_proxy_router“   •   s  è ø€ õ 8ð �o‰o×!Ñ! /Ó2Ò8°b€Gð �o‰o˜h¨Ó+€Gä!×+Ñ+¨GÓ4€MØ&×-Ñ-¨gÓ6€KØ×Ñ Ó$ QÑ'€Gä%6¸wÐRYÐZaÐYbÐPcÔ%d×dÐä@]Ø+¸,ôAÐð /3ÐØ.2ÐØ(,ÐØÐ(Ð-B×-PÑ-PÐ-\Ø)×7Ñ7×=Ñ=Ó?ò 	*‰DˆAˆqØÐ)Ò)Ø./Ñ+ØÐ+Ò+Ø./Ñ+Ø�oÓ%Ø()Ñ%ð	*ð $9ÀÐ#DÐàÒm¤§¡¨?Ô<RÓ!SÒmÔWmð ô 0OØ3Ø$?Ø$?ô0Ñ,ÐÐ,ô
 ">ØØ'Ø3ô"Ñ€J�ð $,¬iÐ;NÐ:OÈqÐQdÐPeÐ8f×8mÑ8mÓ8oÓ.p×.wÑ.wØó/ñ $Ðð '<€N�?Ñ#ô 5ØØØ%Ü˜'×.Ñ.Ó/ô	€Mñ #0ØØØó#÷ €Nð Ððg  eùðZús,   ‚BF#ÂFÂAF#Ã#B4F#ÆF!ÆF#Æ!F#)*Ú__doc__r�   r†   r   Útypingr   Úurllib.parser   r3   Úfastapir   r   r	   r
   r   rX   Ú$litellm.litellm_core_utils.url_utilsr   r   Úlitellm.proxy._typesÚ$litellm.proxy.auth.user_api_key_authr   Ú-litellm.proxy.common_utils.http_parsing_utilsr   Ú$litellm.proxy.litellm_pre_call_utilsr   Ú;litellm.proxy.pass_through_endpoints.pass_through_endpointsr   r   Ú__annotations__r   r   r!   r   r(   r<   rP   Úboolr\   rg   Ú	api_router“   rI   r"   r    ú<module>r¡      sD  ðòðó Û 	Ý Ý Ý  ã ß GÕ Gã ß HÜ "Ý BÝ SÝ Nõñ “€ˆÓ Ø#Ð �uÓ #Ø <Ð ˜Ó <ð ó ð #ð ¨#ó ð°#ð ¸#ó ð8¨Cð °Có ð,àðð "% t¡ðð "% t¡ó	ð(,àð,ð ð,ð  ó	,ð2 ×ÑØÚ5Ø
! >Ð	2ð ó ð
IØðIàðIð òIóñ
Ir"   