
    AHjYB                         d dl Z d dlmZ d dlmZmZ d dlZd dlZd dlmZ d dlm	Z	m
Z
 d dlmZ d dlmZmZmZ d dlmZ d	Zd
 Z G d de      Zy)    N)datetime)DictOptional)verbose_logger)should_use_braintrust_mockcreate_mock_braintrust_client)CustomLogger)HTTPHandlerget_async_httpx_clienthttpxSpecialProvider)print_verbosez!https://api.braintrustdata.com/v1c                      dd l } t        | d      rt        j                  | j                        S t        j                         S )Nr   UTC)r   hasattrnowr   utcnow)dts    _/root/tools/cai/cai_env/lib/python3.12/site-packages/litellm/integrations/braintrust_logging.pyget_utc_datetimer      s/    r5||BFF##      c                        e Zd Z	 ddee   dee   ddf fdZdee   fdZdedefdZdedefd	Zd
 Z	d Z
d Zd Z fdZ xZS )BraintrustLoggerNapi_keyapi_basereturnc                    t         |           t               | _        | j                  rt	                t        j                  d       | j                  |       |xs t        j                  d      xs t        | _        d | _        |xs t        j                  d      | _        d| j                  z   dd| _        i | _        t!        t"        j$                        | _        t)               | _        y )	Nz<[BRAINTRUST MOCK] Braintrust logger initialized in mock mode)r   BRAINTRUST_API_BASEBRAINTRUST_API_KEYzBearer zapplication/json)AuthorizationzContent-Type)llm_provider)super__init__r   is_mock_moder   r   infovalidate_environmentosgetenvAPI_BASEr   default_project_idr   headers_project_id_cacher   r   LoggingCallbackglobal_braintrust_http_handlerr
   #global_braintrust_sync_http_handler)selfr   r   	__class__s      r   r"   zBraintrustLogger.__init__%   s     	68)+N 	!!'!2 PBII.C$DP"&#Fryy1E'F&5.
  	 /E-==/
+ 4?=0r   c                     g }|'t        j                  dd      |j                  d       t        |      dkD  rt	        dj                  |            y)zP
        Expects
        BRAINTRUST_API_KEY

        in the environment
        Nr   r   zMissing keys={} in environment.)r&   r'   appendlen	Exceptionformat)r/   r   missing_keyss      r   r%   z%BraintrustLogger.validate_environment?   sW     ?ryy)=tDL 45|q =DD\RSS !r   project_namec                 r   || j                   v r| j                   |   S 	 | j                  j                  | j                   d| j                  d|i      }|j                         }|d   }|| j                   |<   |S # t        j                  $ r'}t        d|j                  j                         d}~ww xY w)zs
        Get project ID from name, using cache if available.
        If project doesn't exist, creates it.
        /projectnamer*   jsonidFailed to register project: N)r+   r.   postr   r*   r<   httpxHTTPStatusErrorr4   responsetextr/   r7   rB   project_dict
project_ides         r   get_project_id_syncz$BraintrustLogger.get_project_id_syncM   s    
 4111)),77	N??DD==/*l+ E H
 $==?L%d+J3=D""<0$$ 	N:1::??:KLMM	Ns   AA< <B6"B11B6c                   K   || j                   v r| j                   |   S 	 | j                  j                  | j                   d| j                  d|i       d{   }|j                         }|d   }|| j                   |<   |S 7 *# t        j                  $ r'}t        d|j                  j                         d}~ww xY ww)z6
        Async version of get_project_id_sync
        z/project/registerr:   r;   Nr=   r>   )r+   r-   r?   r   r*   r<   r@   rA   r4   rB   rC   rD   s         r   get_project_id_asyncz%BraintrustLogger.get_project_id_asyncb   s      4111)),77	N!@@EE==/!23l+ F  H
 $==?L%d+J3=D""<0 $$ 	N:1::??:KLMM	Ns:   C:B B)B CB C"B==CCc                    K   | j                   j                  | j                   d| j                  ddi       d {   }|j	                         }|d   | _        y 7 wNr9   r:   litellmr;   r=   )r-   r?   r   r*   r<   r)   r/   projectrE   s      r   %create_default_project_and_experimentz6BraintrustLogger.create_default_project_and_experimentv   sa     ;;@@}}oX&FICV A 
 
 ||~".t"4
s   ;AA Ac                     | j                   j                  | j                   d| j                  ddi      }|j	                         }|d   | _        y rL   )r.   r?   r   r*   r<   r)   rN   s      r   *create_sync_default_project_and_experimentz;BraintrustLogger.create_sync_default_project_and_experiment   sS    ::??}}oX&FICV @ 
 ||~".t"4r   c                 	   t        j                  d       	 |j                  d      }|j                  di       }d|j                  d      i}d }g }	|2|j                  dd       dk(  st        |t        j
                        rd }n|9t        |t        j                        r|d   d   d	   j                         }|d   }	nc|@t        |t        j                        r&|j                  d   j                  }|j                  }	n!|t        |t        j                        r|d
   }|j                  di       xs i }
|
j                  di       xs i }|j                  d      }|&|j                  d      }|r| j                  |      nd }|(| j                  | j                          | j                  }g }t        |t              r|j!                         D ]v  \  }}t        j"                  Ft        t        j"                  t$              r(|t        j"                  v r|j'                  | d|        t        |t(              sm||vsr|||<   x |j                  dd       }d }t+        |dd       }|rt        |t        j,                        rt        j.                  j1                  ||       |j2                  |j4                  |j6                  ||j9                         |j9                         z
  |j9                         |j9                         d}|j                  dd      }|j                  d      }|r=|j;                  d      D cg c]#  }|j=                         s|j=                         % }}|j                  d      |j                  d      |d}||d   ||ddd}|j                  d      ||d<   |j!                         D ]  \  }}|s	|||<    |	"|	D cg c]  }|j                          c}|d<   n||d<   |||d<   	 t?        d | j@                  jB                          | j@                  jC                  | jD                   d!| d"d#|gi| jF                  $       | jH                  rt?        d%       y y c c}w c c}w # tJ        jL                  $ r$}tO        |jP                  j                        d }~ww xY w# tN        $ r}|d }~ww xY w)&NREACHES BRAINTRUST SUCCESSlitellm_call_idstandard_logging_objectmessages	call_type	embeddingchoicesr   messagedatalitellm_paramsmetadatarF   r7   :response_costusage)prompt_tokenscompletion_tokenstotal_tokens
total_costtime_to_first_tokenstartend	span_nameChat Completionspan_parents,span_idroot_span_idrm   rn   rk   llmr:   type)r=   inputr^   span_attributestagsoutputmetricsz/self.global_braintrust_sync_http_handler.post: /project_logs//inserteventsurlr<   r*   z0[BRAINTRUST MOCK] Sync event successfully mocked))r   debugget
isinstancerM   EmbeddingResponseModelResponser<   TextCompletionResponserZ   rC   ImageResponserH   r)   rR   dictitemslangfuse_default_tagslistr2   strgetattrUsageutilsget_logging_idrb   rc   rd   	timestampsplitstripr   r.   r?   r   r*   r#   r@   rA   r4   rB   )r/   kwargsresponse_obj
start_timeend_timerU   rV   promptrv   rZ   r]   dynamic_metadatarF   r7   ru   keyvaluecostrw   	usage_objri   rk   srt   request_datachoicerG   s                              r   log_success_eventz"BraintrustLogger.log_success_event   s    	9:D	$jj):;O&,jj1JB&O# &**Z"89FFG'

;-<lG,E,EF)jg33/ &i03I>CCE&y1)jg<</ &--a055&..)jg33/ &f-#ZZ(8"=CN-11*bAGR *--l;J!/33NC>JD,,\:PT  !**2CCE!44
D*D1"2"8"8": =JC  55A&w'D'DdK7#@#@@se1UG$45 #5#.3>U3U7</4= ::ot4D&*Ggt<IZ	7==A,,ZF%.%<%<)2)D)D$-$:$:"&+3+=+=+? **,,-'113#--/	 ),,[:KLI ,//?L 3?3E3Ec3JXaaggi	XX ,//	: 0 4 4^ D ,O &
+3,5u#E	L  ##N3;'+V$ .335 .
U(-L%. "FM)NF&++-)NX&)/X&"*1Y'1EdFnFnFsFsEtu 88====/
|7K"\N3 LL > 
 $$!"TU %U  Y4 *O$ (( 1

001 	G	so   H)S S C?S Q=Q=-A!S S R3S A4R =
S R>R99R>>S 	S
SSc                 	  K   t        j                  d       	 |j                  d      }|j                  di       }d|j                  d      i}d }g }	|2|j                  dd       dk(  st        |t        j
                        rd }n|9t        |t        j                        r|d   d   d	   j                         }|d   }	nc|@t        |t        j                        r&|j                  d   j                  }|j                  }	n!|t        |t        j                        r|d
   }|j                  di       }
|
j                  di       xs i }|j                  d      }|.|j                  d      }|r| j                  |       d {   nd }|0| j                  | j                          d {    | j                  }g }t        |t              r|j!                         D ]v  \  }}t        j"                  Ft        t        j"                  t$              r(|t        j"                  v r|j'                  | d|        t        |t(              sm||vsr|||<   x |j                  dd       }d }t+        |dd       }|rt        |t        j,                        rt        j.                  j1                  ||       |j2                  |j4                  |j6                  ||j9                         |j9                         d}|j                  d      }|j                  d      }|&|$|j9                         |j9                         z
  |d<   |j                  dd      }|j                  d      }|r=|j;                  d      D cg c]#  }|j=                         s|j=                         % }}|j                  d      |j                  d      |d}||d   |||ddd}|j                  d      ||d <   |j!                         D ]  \  }}|s	|||<    |	"|	D cg c]  }|j                          c}|d!<   n||d!<   |||d"<   	 | j>                  jA                  | jB                   d#| d$d%|gi| jD                  &       d {    | jF                  rtI        d'       y y 7 7 c c}w c c}w 7 -# tJ        jL                  $ r$}tO        |jP                  j                        d }~ww xY w# tN        $ r}|d }~ww xY ww)(NrT   rU   rV   rW   rX   rY   rZ   r   r[   r\   r]   r^   rF   r7   r_   r`   ra   )rb   rc   rd   re   rg   rh   api_call_start_timecompletion_start_timerf   ri   rj   rk   rl   rm   rn   ro   rp   rq   )r=   rs   rv   r^   rt   ru   rv   rw   rx   ry   rz   r{   z1[BRAINTRUST MOCK] Async event successfully mocked))r   r}   r~   r   rM   r   r   r<   r   rZ   rC   r   rJ   r)   rP   r   r   r   r   r2   r   r   r   r   r   rb   rc   rd   r   r   r   r-   r?   r   r*   r#   r   r@   rA   r4   rB   )r/   r   r   r   r   rU   rV   r   rv   rZ   r]   r   rF   r7   ru   r   r   r   rw   r   r   r   ri   rk   r   rt   r   r   rG   s                                r   async_log_success_eventz(BraintrustLogger.async_log_success_event  s'     	9:M	$jj):;O&,jj1JB&O# &**Z"89FFG'

;-<lG,E,EF)jg33/ &i03I>CCE&y1)jg<</ &--a055&..)jg33/ &f-#ZZ(8"=N-11*bAGR *--l;J!/33NC $ 33LAAA  !**2DDFFF!44
D*D1"2"8"8": =JC  55A&w'D'DdK7#@#@@se1UG$45 #5#.3>U3U7</4= ::ot4D&*Ggt<IZ	7==A,,ZF%.%<%<)2)D)D$-$:$:"&'113#--/ '-jj1F&G#(.

3J(K% (3-9 .779-779: 12 ),,[:KLI ,//?L 3?3E3Ec3JXaaggi	XX ,//	: 0 4 4^ D ,O &
+ 3,5u#EL  ##N3;'+V$ .335 .
U(-L%. "FM)NF&++-)NX&)/X&"*1Y'	199>>==/
|7K"\N3 LL ?   
 $$!"UV %M B Gn  Y6 *O (( 1

001 	G	s   S;E.S( R'S( /R0BS( S( D)S( =R"R"%A"S( S( R',S(  >R. >R,?R. S;S( S( "
S( ,R. .S%S  S%%S( (	S81S33S88S;c                 (    t         |   ||||      S )N)r!   log_failure_event)r/   r   r   r   r   r0   s        r   r   z"BraintrustLogger.log_failure_event  s    w(z8TTr   )NN)__name__
__module____qualname__r   r   r"   r%   rH   rJ   rP   rR   r   r   r   __classcell__)r0   s   @r   r   r   $   s    GKA}A7?}A	A4THSM TN N N*Ns Ns N(55HTQfU Ur   r   )r&   r   typingr   r   r@   rM   r   +litellm.integrations.braintrust_mock_clientr   r   "litellm.integrations.custom_loggerr	   &litellm.llms.custom_httpx.http_handlerr
   r   r   litellm.utilsr   r(   r   r    r   r   <module>r      sL    
  !   " < 
 (.!BU| BUr   