
    g                         d Z ddlZddlZddlZddlmZ ddlmZmZmZ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 dd	lmZ  G d
 de      Zy)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            
       \     e Zd Z fdZd Zd Zdedededede	f
d	Z
dedee   fd
Z xZS )DataDogLLMObsLoggerc                    	 t        j                  d       t        j                  dd       t	        d      t        j                  dd       t	        d      t        t        j                        | _        t        j                  d      | _	        t        j                  d      | _
        d| j                   d| _        t        j                  d	      }|r
| d| _        t        j                  | j                                t        j                         | _        g | _        t%        | L  di |d
| j                   i y # t        $ r(}t        j(                  dt+        |              |d }~ww xY w)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       a/var/www/openai/venv/lib/python3.12/site-packages/litellm/integrations/datadog/datadog_llm_obs.pyr$   z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 	E5#E00E5c                   K   	 t        j                  d|j                  dd              | j                  ||||      }t        j                  d|        | j                  j                  |       t        | j                        | j                  k\  r| j                          d {    y y 7 # t        $ r+}t        j                  dt        |              Y d }~y d }~ww xY ww)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_eventz+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$B1 (B/)B1 -C(/B1 1	C%:!C C( C%%C(c                   K   	 | j                   sy t        j                  dt        | j                          d       dt	        dt        dddt        j                  dd	       g| j                   
            i}| j                  j                  | j                  || j                  dd       d {   }|j                          |j                  dk7  r%t        d|j                   d|j                         t        j                  d|j                          | j                   j!                          y 7 # t        $ r+}t        j"                  dt%        |              Y d }~y d }~ww xY ww)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   r3   DDIntakePayloadDDSpanAttributesr   r   r   postr   r   raise_for_statusstatus_coder   textclearr%   r&   )r'   r9   responser*   s       r,   r5   z$DataDogLLMObsLogger.async_send_batchM   so    +	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   E2D; E2B"D; 3D94BD; 8E29D; ;	E/!E*%E2*E//E2r(   r6   r7   r8   returnc                 (   |j                  d      }|t        d      |d   }|j                  di       j                  di       }t        |      }t        | j	                  |            }	t        d||	      }
t        t        |j                  d	d
            t        |j                  dd
            t        |j                  dd
                  }t        |j                  dd      |j                  dt        t        j                                     |j                  dt        t        j                                     |j                  dd      |
t        |j                         dz        t        ||z
  j                         dz        |      S )Nstandard_logging_objectz1DataDogLLMObs: standard_logging_object is not setmessageslitellm_paramsmetadata)rU   llm)kindinputoutputprompt_tokensr   completion_tokenstotal_tokens)input_tokensoutput_tokensr^   	parent_id	undefinedtrace_idspan_idnamelitellm_llm_callg    eA)ra   rc   rd   re   metastart_nsdurationmetrics)r0   r   	InputMeta
OutputMeta_get_response_messagesMeta
LLMMetricsfloatLLMObsPayloadr&   uuiduuid4int	timestamptotal_seconds)r'   r(   r6   r7   r8   standard_logging_payloadrU   rW   
input_metaoutput_metarg   rj   s               r,   r1   z*DataDogLLMObsLogger.create_llm_obs_payload{   sg    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(Z/>>@3FG	
 		
    c                 n    t        |t        j                        r|d   d   d   j                         gS g S )z}
        Get the messages from the response object

        for now this handles logging /chat/completions responses
        choicesr   message)
isinstancer>   ModelResponserG   )r'   r6   s     r,   rm   z*DataDogLLMObsLogger._get_response_messages   s:     lG$9$9: +A.y9>>@AA	rz   )__name__
__module____qualname__r$   r:   r5   r   r   r   rq   r1   r   rm   __classcell__)r+   s   @r,   r   r      sZ    @$,W\!
!
*-!
;C!
OW!
	!
F3 49 rz   r   )__doc__r   r   rr   r   typingr   r   r   r   r>   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   rz   r,   <module>r      sC     	   , ,  + F 9 6L+ Lrz   