
    ^h                         S r SSKrSSKrSSKrSSKJr  SSKJrJrJrJ	r	  SSK
r
SSKJr  SSKJr  SSKJrJr  SSK7  SS	KJr   " S
 S\5      rg)z
Implements logging integration with Datadog's LLM Observability Service


API Reference: https://docs.datadoghq.com/llm_observability/setup/api/?tab=example#api-standards

    N)datetime)AnyDictListOptional)verbose_logger)CustomBatchLogger)get_async_httpx_clienthttpxSpecialProvider)*)StandardLoggingPayloadc            
       j   ^  \ rS rSrU 4S jrS rS rS\S\S\	S\	S	\
4
S
 jrS\S	\\   4S jrSrU =r$ )DataDogLLMObsLogger   c                   >  [         R                  " S5        [        R                  " SS 5      c  [	        S5      e[        R                  " SS 5      c  [	        S5      e[        [        R                  S9U l        [        R                  " S5      U l	        [        R                  " S5      U l
        SU R                   S3U l        [        R                  " S	5      nU(       a
  U S3U l        [        R                  " U R                  5       5        [        R                  " 5       U l        / U l        [$        TU ]L  " S0 UDS
U R                   0D6  g ! [         a)  n[         R(                  " S[+        U5       35        UeS nAff = f)Nz"DataDogLLMObs: Initializing logger
DD_API_KEYz*DD_API_KEY is not set, set 'DD_API_KEY=<>'DD_SITEzGDD_SITE is not set, set 'DD_SITE=<>', example sit = `us5.datadoghq.com`)llm_providerzhttps://api.z"/api/intake/llm-obs/v1/trace/spansDD_BASE_URL
flush_lockz$DataDogLLMObs: Error initializing -  )r   debugosgetenv	Exceptionr
   r   LoggingCallbackasync_clientr   r   
intake_urlasynciocreate_taskperiodic_flushLockr   	log_queuesuper__init__	exceptionstr)selfkwargsdd_base_urle	__class__s       f/home/james-whalen/.local/lib/python3.13/site-packages/litellm/integrations/datadog/datadog_llm_obs.pyr%   DataDogLLMObsLogger.__init__   s=   	  !EFyyt,4 LMMyyD)1]  !71AA!D !ii5DO99Y/DLt||n,NO O
 ))M2K%0M1S"T 3 3 56%llnDO24DNGBvB$//B 	$$'KCPQF8%TUG	s   EE 
F$E??Fc                   #     [         R                  " SUR                  SS5       35        U R                  XX45      n[         R                  " SU 35        U R                  R                  U5        [        U R                  5      U R                  :  a  U R                  5       I S h  vN   g g  N! [         a,  n[         R                  " S[        U5       35         S nAg S nAff = f7f)Nz/DataDogLLMObs: Logging success event for model modelunknownzDataDogLLMObs: Payload: z-DataDogLLMObs: Error logging success event - )r   r   getcreate_llm_obs_payloadr#   appendlen
batch_sizeasync_send_batchr   r&   r'   )r(   r)   response_obj
start_timeend_timepayloadr+   s          r-   async_log_success_event+DataDogLLMObsLogger.async_log_success_event;   s     	  A&**WV_B`Aab 11jG   #;G9!EFNN!!'*4>>"doo5++--- 6- 	$$?AxH 	sA   C+B%B2 )B0*B2 .C+0B2 2
C(<"C#C+#C((C+c                   #     U R                   (       d  g [        R                  " S[        U R                   5       S35        S[	        S[        SSS[        R                  " SS	5       3/U R                   S
9S90nU R                  R                  U R                  UU R                  SS.S9I S h  vN nUR                  5         UR                  S:w  a%  [        SUR                   SUR                   35      e[        R                  " SUR                   35        U R                   R!                  5         g  N! [         a,  n[        R"                  " S[%        U5       35         S nAg S nAff = f7f)NzDataDogLLMObs: Flushing z eventsdataspanlitellmzservice:litellmzenv:DD_ENV
production)ml_apptagsspans)type
attributeszapplication/json)z
DD-API-KEYzContent-Type)urljsonheaders   z2DataDogLLMObs: Unexpected response - status_code: z, text: z6DataDogLLMObs: Successfully sent batch - status_code: z%DataDogLLMObs: Error sending batch - )r#   r   r   r5   DDIntakePayloadDDSpanAttributesr   r   r   postr   r   raise_for_statusstatus_coder   textclearr&   r'   )r(   r;   responser+   s       r-   r7   $DataDogLLMObsLogger.async_send_batchM   sn    +	W>>  *3t~~+>*?wG /(-"299X|#D"EF #nn 
G "..33OO"&//$6 4  H %%'##s*HI]I]H^^fgogtgtfuv    HI]I]H^_ NN  "%&  	W$$'LSQRVH%UVV	WsL   E4D; E4BD; 1D92BD; 8E49D; ;
E1"E,'E4,E11E4r)   r8   r9   r:   returnc                    UR                  S5      nUc  [        S5      eUS   nUR                  S0 5      R                  S0 5      n[        US9n[        U R	                  U5      S9n	[        SXS9n
[        [        UR                  S	S
5      5      [        UR                  SS
5      5      [        UR                  SS
5      5      S9n[        UR                  SS5      UR                  S[        [        R                  " 5       5      5      UR                  S[        [        R                  " 5       5      5      UR                  SS5      U
[        UR                  5       S-  5      [        XC-
  R                  5       S-  5      US9$ )Nstandard_logging_objectz1DataDogLLMObs: standard_logging_object is not setmessageslitellm_paramsmetadata)rY   llm)kindinputoutputprompt_tokensr   completion_tokenstotal_tokens)input_tokensoutput_tokensrb   	parent_id	undefinedtrace_idspan_idnamelitellm_llm_callg    eA)re   rg   rh   ri   metastart_nsdurationmetrics)r2   r   	InputMeta
OutputMeta_get_response_messagesMeta
LLMMetricsfloatLLMObsPayloadr'   uuiduuid4int	timestamptotal_seconds)r(   r)   r8   r9   r:   standard_logging_payloadrY   r[   
input_metaoutput_metark   rn   s               r-   r3   *DataDogLLMObsLogger.create_llm_obs_payload{   sc    FLZZ%F
  $+OPP+J7::.377
BG1
 $*E*El*STjE 7;;OQOP 8 < <=PRS TU7;;NANO
 ll;<\\*c$**,.?@LLC

,=>f&89--/#56(/>>@3FG	
 		
    c                 x    [        U[        R                  5      (       a  US   S   S   R                  5       /$ / $ )ze
Get the messages from the response object

for now this handles logging /chat/completions responses
choicesr   message)
isinstancerA   ModelResponserJ   )r(   r8   s     r-   rq   *DataDogLLMObsLogger._get_response_messages   s=     lG$9$9:: +A.y9>>@AA	r   )r   r   r   r   r   r#   )__name__
__module____qualname____firstlineno__r%   r<   r7   r   r   r   ru   r3   r   rq   __static_attributes____classcell__)r,   s   @r-   r   r      s_    @$,W\!
!
*-!
;C!
OW!
	!
F3 49  r   r   )__doc__r   r   rv   r   typingr   r   r   r   rA   litellm._loggingr   (litellm.integrations.custom_batch_loggerr	   &litellm.llms.custom_httpx.http_handlerr
   r   *litellm.types.integrations.datadog_llm_obslitellm.types.utilsr   r   r   r   r-   <module>r      sC     	   , ,  + F 9 6L+ Lr   