
    ^h5                         S SK r S SKrS SKJr  S SKJr  S SKrS SKJr  S SKrS SKJ	r	  S SK
Jr  S SKJrJrJr  S SKJr  \" \R$                  S	9r\" 5       rS
rS r " S S\5      rg)    Ndatetime)Optional)	BaseModel)verbose_logger)CustomLogger)HTTPHandlerget_async_httpx_clienthttpxSpecialProvider)print_verbose)llm_providerz!https://api.braintrustdata.com/v1c                      SS K n SSK J n  [        U S5      (       a  UR                  " U R                  5      $ UR                  " 5       $ )Nr   r   UTC)r   hasattrnowr   utcnow)dtr   s     a/home/james-whalen/.local/lib/python3.13/site-packages/litellm/integrations/braintrust_logging.pyget_utc_datetimer      s5    !r5||BFF##      c                      ^  \ rS rSr SS\\   S\\   SS4U 4S jjjrS\\   4S jr\S\	S	\	S\	4S
 j5       r
S rS rS rS rU 4S jrSrU =r$ )BraintrustLogger'   Napi_keyapi_basereturnc                    > [         TU ]  5         U R                  US9  U=(       d    [        U l        S U l        U=(       d    [        R                  " S5      U l        SU R                  -   SS.U l	        g )N)r   BRAINTRUST_API_KEYzBearer zapplication/json)AuthorizationzContent-Type)
super__init__validate_environmentAPI_BASEr   default_project_idosgetenvr   headers)selfr   r   	__class__s      r   r!   BraintrustLogger.__init__(   sc     	!!'!2 ,H"&#Fryy1E'F&5.
r   c                     / nUc)  [         R                  " SS5      c  UR                  S5        [        U5      S:  a  [	        SR                  U5      5      eg)z0
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"   %BraintrustLogger.validate_environment5   sW     ?ryy)=tDL 45|q =DD\RSS !r   litellm_paramsmetadatac                    U c  U$ U R                  S5      c  U$ Uc  0 nU R                  S0 5      R                  S0 5      =(       d    0 nU H{  nUR                  S5      (       d  M  UR                  SSS5      nXA;   a  [        R                  " SU S35        O[        R
                  " SU S	35        UR                  U5      X'   M}     U$ )
aL  
Adds metadata from proxy request headers to Langfuse logging if keys start with "langfuse_"
and overwrites litellm_params.metadata if already included.

For example if you want to append your trace to an existing `trace_id` via header, send
`headers: { ..., langfuse_existing_trace_id: your-existing-trace-id }` via proxy request.
proxy_server_requestr'   
braintrust    zOverwriting Braintrust `z` from request headerzFound Braintrust `z` in request header)get
startswithreplacer   warningdebug)r2   r3   proxy_headersmetadata_param_keytrace_param_keys        r   add_metadata_from_header)BraintrustLogger.add_metadata_from_headerC   s     !O45=OH 5r:>>y"MSQS 	 #0!,,\::"4"<"<\2q"Q"."**2?2CCXY #((,_,==PQ -:,=,=>P,Q) #0 r   c                    #    [         R                  U R                   S3U R                  SS0S9I S h  vN nUR	                  5       nUS   U l        g  N7fNz/projectnamelitellm)r'   jsonid)global_braintrust_http_handlerpostr   r'   rG   r$   r(   projectproject_dicts      r   %create_default_project_and_experiment6BraintrustLogger.create_default_project_and_experimenth   sY     6;;}}oX&FICV < 
 
 ||~".t"4
s   2AA Ac                     [         R                  U R                   S3U R                  SS0S9nUR	                  5       nUS   U l        g rD   )#global_braintrust_sync_http_handlerrJ   r   r'   rG   r$   rK   s      r   *create_sync_default_project_and_experiment;BraintrustLogger.create_sync_default_project_and_experimentq   sL    5::}}oX&FICV ; 
 ||~".t"4r   c                 t   [         R                  " S5         UR                  S5      nUR                  SS 5      nUc)  U R                  c  U R	                  5         U R                  nSUR                  S5      0nS nUb8  UR                  SS 5      S:X  d  [        U[        R                  5      (       a  S nOUb9  [        U[        R                  5      (       a  US   S   S	   R                  5       nOcUb9  [        U[        R                  5      (       a  UR                  S   R                  nO'Ub$  [        U[        R                  5      (       a  US
   nUR                  S0 5      n	U	R                  S0 5      =(       d    0 n
U R                  X5      n
0 n [        R                   " U
5      n
/ n[        U
[(        5      (       a  U
R%                  5        Ho  u  p[        R0                  bM  [        [        R0                  [&        5      (       a*  U[        R0                  ;   a  UR3                  U SU 35        US;   a  Mk  XU'   Mq     UR                  SS 5      nUb  UUS'   S n[5        USS 5      nU(       ac  [        U[        R6                  5      (       aD  [        R8                  R;                  X25        UR<                  UR>                  UR@                  US.nUUUUUS.nUb  UUS'    [C        S[D        RF                   35        [D        RG                  U RH                   SU S3SU/0U RJ                  S9  g ! ["         a    0 nU
R%                  5        H  u  p[        U[&        5      (       dV  [        U[(        5      (       dA  [        U[*        5      (       d,  [        U[,        5      (       d  [        U[.        5      (       d  Mp  [        R                   " U5      X'   M     Un
 GN:f = f! [L        RN                   a$  n[#        URP                  R                  5      eS nAff = f! ["         a  nUeS nAff = f)NREACHES BRAINTRUST SUCCESSlitellm_call_id
project_idmessages	call_type	embeddingchoicesr   messagedatar2   r3   :r'   endpointcaching_groupsprevious_modelsresponse_costlitellm_response_costusageprompt_tokenscompletion_tokenstotal_tokens
total_costrH   inputoutputr3   tagsmetricsz*global_braintrust_sync_http_handler.post: /project_logs//inserteventsurlrG   r'   ))r   r=   r9   r$   rR   
isinstancerF   EmbeddingResponseModelResponserG   TextCompletionResponser[   textImageResponserA   copydeepcopyr.   itemslistdictstrintfloatlangfuse_default_tagsr,   getattrUsageutilsget_logging_idrg   rh   ri   r   rQ   rJ   r   r'   httpxHTTPStatusErrorresponse)r(   kwargsresponse_obj
start_timeend_timerV   rW   promptrm   r2   r3   clean_metadatanew_metadatakeyvaluern   costro   	usage_objrequest_dataes                        r   log_success_event"BraintrustLogger.log_success_eventz   s    	9:o	$jj):;OL$7J!**2CCE!44
 &**Z"89FF'

;-<lG,E,EFF)jg33/ / &i03I>CCE)jg<</ / &--a055)jg33/ / &f-#ZZ(8"=N"":r28b  44^NHN(==  D(D))"*.."2JC  55A&w'D'DdKK7#@#@@se1UG$45    !.3s+' #3* ::ot4D:>67&*Ggt<IZ	7==AA,,ZF%.%<%<)2)D)D$-$:$:"&	 & *L "*1Y'
1@AdAiAi@jk 488==/
|7K"\N3 LL 9 C  (!"*.."2JC"5$//%eT22%eS11%eS11%eU33,0MM%,@) #3 ((L (( 1

001 	G	sc   E>P& L: -D=P& +AO+ :BO(O($P& 'O((P& +P#?PP##P& &
P70P22P7c                   #    [         R                  " S5         UR                  S5      nUR                  SS 5      nUc1  U R                  c  U R	                  5       I S h  vN   U R                  nSUR                  S5      0nS nUb8  UR                  SS 5      S:X  d  [        U[        R                  5      (       a  S nOUb9  [        U[        R                  5      (       a  US   S   S	   R                  5       nOcUb9  [        U[        R                  5      (       a  UR                  S   R                  nO'Ub$  [        U[        R                  5      (       a  US
   nUR                  S0 5      n	U	R                  S0 5      =(       d    0 n
U R                  X5      n
0 n0 nU
R                  5        H  u  p[        U[         5      (       d?  [        U["        5      (       d*  [        U[$        5      (       d  [        U[&        5      (       a  XU'   M_  [        U[(        5      (       a  UR+                  5       X'   M  [        U[,        5      (       d  M  UR                  5        H/  u  nn[        U[.        5      (       d  M  UR1                  5       X'   M1     XU'   M     Un
/ n[        U
[,        5      (       a  U
R                  5        Ho  u  p[        R2                  bM  [        [        R2                  [         5      (       a*  U[        R2                  ;   a  UR5                  U SU 35        US;   a  Mk  XU'   Mq     UR                  SS 5      nUb  UUS'   S n[7        USS 5      nU(       ac  [        U[        R8                  5      (       aD  [        R:                  R=                  X25        UR>                  UR@                  URB                  US.nUUUUUS.nUb  UUS'    [D        RG                  U RH                   SU S3SU/0U RJ                  S9I S h  vN   g  GN N! [L        RN                   a$  n[Q        URR                  R                  5      eS nAff = f! [P         a  nUeS nAff = f7f)NrU   rV   rW   rX   rY   rZ   r[   r   r\   r]   r2   r3   r^   r_   rc   rd   re   rf   rk   ro   rp   rq   rr   rs   )*r   r=   r9   r$   rN   ru   rF   rv   rw   rG   rx   r[   ry   rz   rA   r}   r~   r   r   r   r   model_dump_jsonr   r   	isoformatr   r,   r   r   r   r   rg   rh   ri   rI   rJ   r   r'   r   r   r.   r   )r(   r   r   r   r   rV   rW   r   rm   r2   r3   r   r   r   r   kvrn   r   ro   r   r   r   s                          r   async_log_success_event(BraintrustLogger.async_log_success_event   s     	9:o	$jj):;OL$7J!**2DDFFF!44
 &**Z"89FF'

;-<lG,E,EFF)jg33/ / &i03I>CCE)jg<</ / &--a055)jg33/ / &f-#ZZ(8"=N"":r28b  44^NHNL&nn.
ud++!%--!%--!%//(-%y11(-(=(=(?L%t,, %1%a22'({{}EH !. ).% /  $HD(D))"*.."2JC  55A&w'D'DdKK7#@#@@se1UG$45    !.3s+' #3* ::ot4D:>67&*Ggt<IZ	7==AA,,ZF%.%<%<)2)D)D$-$:$:"&	 & *L "*1Y'1499==/
|7K"\N3 LL :   E GD
 (( 1

001 	G	sy   Q+AQ  P!G,Q )Q >EQ 5P PP Q+Q P Q0QQQ 
Q(!Q##Q((Q+c                 $   > [         TU ]  XX45      $ )N)r    log_failure_event)r(   r   r   r   r   r)   s        r   r   "BraintrustLogger.log_failure_eventd  s    w(zTTr   )r   r   r$   r'   )NN)__name__
__module____qualname____firstlineno__r   r   r!   r"   staticmethodr   rA   rN   rR   r   r   r   __static_attributes____classcell__)r)   s   @r   r   r   '   s    GK
}
7?}
	
 
THSM T " " "$ " "H55sjsjU Ur   r   )r{   r%   r   typingr   r   pydanticr   rF   r   "litellm.integrations.custom_loggerr   &litellm.llms.custom_httpx.http_handlerr	   r
   r   litellm.utilsr   LoggingCallbackrI   rQ   r#   r   r    r   r   <module>r      si     	      " ; 
 (!7%55"  '2m #.!~U| ~Ur   