
    h*                        U d Z ddlZddlm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 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mZ ddlmZ ddl m!Z! ddl"m#Z# ddl$m%Z% er#ddl"m&Z& ddl'm(Z(m)Z) ddl*m+Z, e&Z-ee.d<   ee)e(f   Z/neZ/eZ-eZ, e       Z0 ed      	 	 	 	 	 dde-fd       Z1 G d de#e!e      Z2y)zF
Call Hook for LiteLLM Proxy which allows Langfuse prompt management.
    N)	lru_cache)	TYPE_CHECKINGAnyDictListLiteralOptionalTupleUnioncast)Version)	TypeAlias)CustomLogger)PromptManagementClient)run_async_function)AllMessageValuesChatCompletionSystemMessage)StandardCallbackDynamicParamsStandardLoggingPayload   )DynamicLoggingCache   )PromptManagementBase   )LangFuseLogger)LangFuseHandlerLangfuse)ChatPromptClientTextPromptClient)LoggingLangfuseClass
   )maxsizereturnc                 F   	 ddl }ddl m} |xs |xs t        j                  d      }| xs t        j                  d      }	|xs t        j                  dd	      }|j                  d
      s|j                  d      sd
|z   }t        j                  d      }
t        j                  d      }|	|||
|t        j                  |      d}t        |j                  j                        t        d      k\  rd|d<    |di |}|S # t        $ r}t        d| d      d}~ww xY w)a9  
    Initialize Langfuse client with caching to prevent multiple initializations.

    Args:
        langfuse_public_key (str, optional): Public key for Langfuse. Defaults to None.
        langfuse_secret (str, optional): Secret key for Langfuse. Defaults to None.
        langfuse_host (str, optional): Host URL for Langfuse. Defaults to None.
        flush_interval (int, optional): Flush interval in seconds. Defaults to 1.

    Returns:
        Langfuse: Initialized Langfuse client instance

    Raises:
        Exception: If langfuse package is not installed
    r   Nr   zS[91mLangfuse not installed, try running 'pip install langfuse' to fix this error: z
[0mLANGFUSE_SECRET_KEYLANGFUSE_PUBLIC_KEYLANGFUSE_HOSTzhttps://cloud.langfuse.comzhttp://zhttps://LANGFUSE_RELEASELANGFUSE_DEBUG)
public_key
secret_keyhostreleasedebugflush_intervalz2.6.0litellmsdk_integration )langfuser   	Exceptionosgetenv
startswithr   _get_langfuse_flush_intervalr   version__version__)langfuse_public_keylangfuse_secretlangfuse_secret_keylangfuse_hostr1   r5   r   er-   r,   langfuse_releaselangfuse_debug
parametersclients                 t/var/www/Befach/backend/env/lib/python3.12/site-packages/litellm/integrations/langfuse/langfuse_prompt_management.pylangfuse_client_initrG   )   s:   .
% 	R.R"))<Q2R  %H		2G(HJ! RYY5&M
 	  +}/G/G
/S "M1yy!34YY/0N ! #(EE
	J x++,0@@(1
$%#
#FMQ  
defdggpq
 	

s   
D 	D DD c                   z   e Zd Z	 	 	 	 ddZed        Z	 	 d dededee   dee	   de
f
d	Zd
e
dee   deed   ed   f   dee   fdZd
e
defdZ	 	 	 d!dedee   dedee   dee   dededeee      dee   dee	   deeee   ef   fdZdededefdZ	 	 d dedee   dedee   dee	   defdZd Zd Zd Zy)"LangfusePromptManagementNc                 j    dd l }|j                  j                  | _        t	        ||||      | _        y )Nr   )r=   r>   r@   r1   )r5   r;   r<   langfuse_sdk_versionrG   r   )selfr=   r>   r@   r1   r5   s         rF   __init__z!LangfusePromptManagement.__init__o   s3     	$,$4$4$@$@!, 3+')	
    c                      y)Nr5   r4   )rL   s    rF   integration_namez)LangfusePromptManagement.integration_name   s    rN   langfuse_prompt_idlangfuse_clientprompt_labelprompt_versionr%   c                 .    |j                  |||      }|S )N)labelr;   )
get_prompt)rL   rQ   rR   rS   rT   prompt_clients         rF   _get_prompt_from_idz,LangfusePromptManagement._get_prompt_from_id   s(     (22lN 3 
 rN   langfuse_prompt_clientlangfuse_prompt_variables	call_type
completiontext_completionc                     d }|i } |j                   di |}t        |t              rt        d|      g}|S t	        t
        t           |      }|S )Nsystem)rolecontentr4   )compile
isinstancestrr   r   r   r   )rL   rZ   r[   r\   compiled_prompts        rF   _compile_promptz(LangfusePromptManagement._compile_prompt   si     7;$,(*%8088U;TUos++?SO  #4(8#9?KOrN   c                 h    |j                   }i }|j                         D ]  \  }}|dk7  s|||<    |S )Nmodel)configitems)rL   rZ   rj   optional_paramskvs         rF   "_get_optional_params_from_langfusez;LangfusePromptManagement._get_optional_params_from_langfuse   sA     (..LLNDAqG|%&" # rN   ri   messagesnon_default_params	prompt_idprompt_variablesdynamic_callback_paramslitellm_logging_objtoolsc           
      <   K   | j                  |||||||	|
      S w)N)rS   rT   )get_chat_completion_prompt)rL   ri   rp   rq   rr   rs   rt   ru   rv   rS   rT   s              rF    async_get_chat_completion_promptz9LangfusePromptManagement.async_get_chat_completion_prompt   s8     " ..#%) / 	
 		
s   c                     t        |j                  d      |j                  d      |j                  d      |j                  d            }| j                  ||      }|d uS )Nr=   r>   r?   r@   r=   r>   r?   r@   )rQ   rR   )rG   getrY   )rL   rr   rt   rR   rZ   s        rF   should_run_prompt_managementz5LangfusePromptManagement.should_run_prompt_management   st    
 / 7 ; ;<Q R3778IJ 7 ; ;<Q R155oF	
 "&!9!9(+ ": "
 &T11rN   c                 b   t        |j                  d      |j                  d      |j                  d      |j                  d            }| j                  ||||      }| j                  ||d      }|j                  j                  d	      }	| j                  |      }
t        |||	|
d 
      S )Nr=   r>   r?   r@   r{   )rQ   rR   rS   rT   r]   )rZ   r[   r\   ri   )rr   prompt_templateprompt_template_modelprompt_template_optional_paramscompleted_messages)rG   r|   rY   rg   rj   ro   r   )rL   rr   rs   rt   rS   rT   rR   rZ   rf   template_modeltemplate_optional_paramss              rF   _compile_prompt_helperz/LangfusePromptManagement._compile_prompt_helper   s     / 7 ; ;<Q R3778IJ 7 ; ;<Q R155oF	
 "&!9!9(+%)	 ": "
 ..#9&6" / 
 066::7C#'#J#J"$
  &+"0,D#
 	
rN   c                 4    t        | j                  ||||      S )N)r   async_log_success_event)rL   kwargsresponse_obj
start_timeend_times        rF   log_success_eventz*LangfusePromptManagement.log_success_event	  s     !((&,
H
 	
rN   c           
         K   |j                  d      }t        j                  | |t              }|j	                  |||||j                  dd              y w)N standard_callback_dynamic_paramsglobalLangfuseLoggerr   in_memory_dynamic_logger_cacheuser)r   r   r   r   user_id)r|   r   get_langfuse_logger_for_requestr   log_event_on_langfuse)rL   r   r   r   r   r   langfuse_logger_to_uses          rF   r   z0LangfusePromptManagement.async_log_success_event  sc     +1::.,
( "1!P!P!%-M+I"

 	44%!JJvt, 	5 	
s   AAc           	        K   |j                  d      }t        j                  | |t              }t	        t
        t           |j                  dd             }|y |j                  ||d |j                  dd       |d   d|       y w)Nr   r   standard_logging_objectr   	error_strERROR)r   r   r   r   status_messagelevelr   )r|   r   r   r   r   r	   r   r   )rL   r   r   r   r   r   r   r   s           rF   async_log_failure_eventz0LangfusePromptManagement.async_log_failure_event  s     +1::.,
( "1!P!P!%-M+I"

 #'+,JJ0$7#
 #*44!JJvt,2;? 	5 	
s   BB)NNNr   )NN)NNN)__name__
__module____qualname__rM   propertyrP   re   r"   r	   intPROMPT_CLIENTrY   dictr   r   r   r   rg   ro   r   LiteLLMLoggingObjr   r
   ry   boolr}   r   r   r   r   r   r4   rN   rF   rI   rI   n   s    !
"   '+(, ' sm	
 ! 
 - $,D> .8I0JJK	
 
	,&3	& '+&*(,

 '(
 !	

 C=
 #4.
 "?
 /
 T
#
 sm
 !
 
	

822 "?2 
	2, '+(,(
(
 #4.(
 "?	(

 sm(
 !(
 
 (
T


"
rN   rI   )NNNNr   )3__doc__r7   	functoolsr   typingr   r   r   r   r   r	   r
   r   r   packaging.versionr   typing_extensionsr   "litellm.integrations.custom_loggerr   +litellm.integrations.prompt_management_baser   #litellm.litellm_core_utils.asyncifyr   litellm.types.llms.openair   r   litellm.types.utilsr   r   9litellm_core_utils.specialty_caches.dynamic_logging_cacher   prompt_management_baser   r5   r   langfuse_handlerr   r   langfuse.clientr   r    *litellm.litellm_core_utils.litellm_loggingr!   r   r"   __annotations__r   r   rG   rI   r4   rN   rF   <module>r      s    
  X X X % ' ; N B S U : $ -!BW'M9'*,<<=MMM!4!6  2A A AHH
~/C\ H
rN   