
    g B                         d dl Z d dlZd dlmZ d dlmZmZ d dlZd dlmZ d dl	Z	d dl	m
Z
 d dlmZ d dlmZmZmZ d dlmZ  eej&                  	      Z e       Zd
Zd Z G d de      Zy)    Ndatetime)OptionalDict)	BaseModel)verbose_logger)CustomLogger)HTTPHandlerget_async_httpx_clienthttpxSpecialProvider)print_verbose)llm_providerz!https://api.braintrustdata.com/v1c                      dd l } ddl m } t        | d      r |j                  | j                        S  |j                         S )Nr   r   UTC)r   hasattrnowr   utcnow)dtr   s     \/var/www/openai/venv/lib/python3.12/site-packages/litellm/integrations/braintrust_logging.pyget_utc_datetimer      s6    !r5x||BFF##x      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e	d
e
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         |           | j                  |       |xs t        | _        d | _        |xs t        j                  d      | _        d| j                  z   dd| _	        i | _
        y )N)r   BRAINTRUST_API_KEYzBearer zapplication/json)AuthorizationzContent-Type)super__init__validate_environmentAPI_BASEr   default_project_idosgetenvr   headers_project_id_cache)selfr   r   	__class__s      r   r!   zBraintrustLogger.__init__&   sk    !!'!2 ,H"&#Fryy1E'F&5.
 24r   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_environment2   sW     ?ryy)=tDL 45|q =DD\RSS !r   project_namec                 f   || j                   v r| j                   |   S 	 t        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(   #global_braintrust_sync_http_handlerpostr   r'   r6   httpxHTTPStatusErrorr.   responsetextr)   r1   r=   project_dict
project_ides         r   get_project_id_syncz$BraintrustLogger.get_project_id_sync@   s    
 4111)),77		N:??==/*DLLP\G] @ H $==?L%d+J3=D""<0$$ 	N:1::??:KLMM	Ns   AA6 6B0	"B++B0c                   K   || j                   v r| j                   |   S 	 t        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/registerr4   r5   Nr7   r8   )r(   global_braintrust_http_handlerr:   r   r'   r6   r;   r<   r.   r=   r>   r?   s         r   get_project_id_asyncz%BraintrustLogger.get_project_id_asyncS   s      4111)),77		N;@@==/!23T\\QWYePf A  H $==?L%d+J3=D""<0 $$ 	N:1::??:KLMM	Ns:   B?4B B )B ?B? B B<"B77B<<B?litellm_paramsmetadatac                 v   | |S | j                  d      |S |i }| j                  di       j                  di       xs i }|D ]r  }|j                  d      s|j                  ddd      }||v rt        j                  d| d       nt        j
                  d| d	       |j                  |      ||<   t |S )
at  
        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)rG   rH   proxy_headersmetadata_param_keytrace_param_keys        r   add_metadata_from_headerz)BraintrustLogger.add_metadata_from_headere   s     !O45=OH&**+A2FJJ9VXY_]_"/!,,\:"4"<"<\2q"Q"h."**-EoEVVk+lm"((+=o=NNa)bc,9,=,=>P,Q) #0 r   c                    K   t         j                  | j                   d| j                  ddi       d {   }|j	                         }|d   | _        y 7 wNr3   r4   litellmr5   r7   )rE   r:   r   r'   r6   r$   r)   projectr@   s      r   %create_default_project_and_experimentz6BraintrustLogger.create_default_project_and_experiment   sZ     6;;}}oX&FICV < 
 
 ||~".t"4
s   5AA Ac                     t         j                  | j                   d| j                  ddi      }|j	                         }|d   | _        y rX   )r9   r:   r   r'   r6   r$   rZ   s      r   *create_sync_default_project_and_experimentz;BraintrustLogger.create_sync_default_project_and_experiment   sL    5::}}oX&FICV ; 
 ||~".t"4r   c                 	   t        j                  d       	 |j                  d      }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                  |	|
      }
i }	 t        j                  |
      }
|
j                  d      }|&|
j                  d      }|r| j-                  |      nd }|(| j.                  | j1                          | j.                  }g }t        |
t$              rx|
j!                         D ]e  \  }}t        j2                  Ft        t        j2                  t"              r(|t        j2                  v r|j5                  | d|        |dv ra|||<   g |j                  dd       }|||d<   d }t7        |dd       }|rt        |t        j8                        rt        j:                  j=                  ||       |j>                  |j@                  |jB                  ||jE                         |jE                         z
  |jE                         |jE                         d}||d   ||dddd}|"|D cg c]  }|j%                          c}|d<   n||d<   |||d<   	 tG        dtH        jJ                          tH        jK                  | jL                   d| dd|gi| jN                         y # t        $ r i }|
j!                         D ]n  \  }}t        |t"              sAt        |t$              s1t        |t&              s!t        |t(              st        |t*              sWt        j                  |      ||<   p |}
Y w xY wc c}w # tP        jR                  $ r$}t        |jT                  j                        d }~ww xY w# t        $ r}|d }~ww xY w)NREACHES BRAINTRUST SUCCESSlitellm_call_idmessages	call_type	embeddingchoicesr   messagedatarG   rH   rA   r1   :r'   endpointcaching_groupsprevious_modelsresponse_costlitellm_response_costusage)prompt_tokenscompletion_tokenstotal_tokens
total_costtime_to_first_tokenstartendChat Completionllmr4   type)r7   inputrH   tagsspan_attributesoutputmetricsz*global_braintrust_sync_http_handler.post: /project_logs//inserteventsurlr6   r'   )+r   rR   rN   
isinstancerY   EmbeddingResponseModelResponser6   TextCompletionResponsere   r>   ImageResponserV   copydeepcopyr.   itemslistdictstrintfloatrC   r$   r^   langfuse_default_tagsr,   getattrUsageutilsget_logging_idrp   rq   rr   	timestampr   r9   r:   r   r'   r;   r<   r=   )r)   kwargsresponse_obj
start_timeend_timera   promptr~   re   rG   rH   clean_metadatanew_metadatakeyvaluerA   r1   r|   costr   	usage_objrequest_datachoicerB   s                           r   log_success_eventz"BraintrustLogger.log_success_event   sc    	9:q	$jj):;O &**Z"89FFG'

;-<
<Y`YrYr@s)jwG\G\.]%i03I>CCE&y1)jwGeGe.f%--a055&..)jwG\G\.]%f-#ZZ(8"=N%))*b9?RH44^XNHN(==2 "l3J!'||N;GST55lCY]
!**2CCE!44
D(D)"*.."2JC  55A&w'D'DdK7#@#@@se1UG$45    !.3s+% #3( ::ot4D:>67&*Ggt<IZ	7==A,,ZF%.%<%<)2)D)D$-$:$:"&+3+=+=+?*BVBVBX+X'113#--/ &
+*,=u#ML "FM)NgF&++-g)NX&)/X&"*1Y'1 JKnKsKsJtuv388==/
|7K"\N3 LL 9 c  (!"*.."2JC"5$/%eT2%eS1%eS1%eU3,0MM%,@S) #3 ((P *O (( 1

001 	G	so   D6Q< N( #GQ< +P=Q< AQ (A1P:P:6Q< 9P::Q< Q9Q44Q99Q< <	RRRc                 	  K   t        j                  d       	 |j                  d      }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                  |	|
      }
i }i }|
j                         D ]  \  }}t        |t              s0t        |t              s t        |t               st        |t"              r|||<   Lt        |t$              r|j'                         ||<   pt        |t(              s|j                         D ])  \  }}t        |t*              s|j-                         ||<   + |||<    |
j                  d      }|.|
j                  d      }|r| j/                  |       d {   nd }|0| j0                  | j3                          d {    | j0                  }g }t        |
t(              rx|
j                         D ]e  \  }}t        j4                  Ft        t        j4                  t              r(|t        j4                  v r|j7                  | d|        |dv ra|||<   g |j                  dd       }|||d<   d }t9        |dd       }|rt        |t        j:                        rt        j<                  j?                  ||       |j@                  |jB                  |jD                  ||jG                         |jG                         d}|j                  d      }|j                  d      }|&|$|jG                         |jG                         z
  |d<   ||d   |||dddd}|"|D cg c]  }|j)                          c}|d<   n||d<   |||d<   |||d<   	 tH        jK                  | jL                   d| dd|gi| jN                          d {    y 7 97 c c}w 7 # tP        jR                  $ r$}tU        |jV                  j                        d }~ww xY w# tT        $ r}|d }~ww xY ww)!Nr`   ra   rb   rc   rd   re   r   rf   rg   rG   rH   rA   r1   rh   ri   rm   rn   ro   )rp   rq   rr   rs   ru   rv   api_call_start_timecompletion_start_timert   rw   rx   ry   )r7   r{   r~   rH   r|   r}   r~   r   r   r   r   r   ),r   rR   rN   r   rY   r   r   r6   r   re   r>   r   rV   r   r   r   r   r   r   model_dump_jsonr   r   	isoformatrF   r$   r\   r   r,   r   r   r   r   rp   rq   rr   r   rE   r:   r   r'   r;   r<   r.   r=   )r)   r   r   r   r   ra   r   r~   re   rG   rH   r   r   r   r   kvrA   r1   r|   r   r   r   r   r   r   r   rB   s                               r   async_log_success_eventz(BraintrustLogger.async_log_success_event  s     	9:{	$jj):;O &**Z"89FFG'

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

3J(K%&27L7X5J5T5T5VYlYvYvYx5xG12 &
+ *,=u#ML "FM)NgF&++-g)NX&)/X&"*1Y'"*1Y'1499==/
|7K"\N3 LL :   Q K Gr *O
 (( 1

001 	G	s   S2GS "&S 	AS R 'S RF S (R?S 8R% R#R% S2S S S #R% %S8SSS 	S/(S**S//S2c                 (    t         |   ||||      S )N)r    log_failure_event)r)   r   r   r   r   r*   s        r   r   z"BraintrustLogger.log_failure_event  s    w(z8TTr   )NN)__name__
__module____qualname__r   r   r!   r"   rC   rF   staticmethodr   rV   r\   r^   r   r   r   __classcell__)r*   s   @r   r   r   %   s    
4 
4 
4Y] 
4THSM TN N N&Ns Ns N$   $  <55unBU Ur   r   )r   r%   r   typingr   r   r;   pydanticr   rY   r   "litellm.integrations.custom_loggerr	   &litellm.llms.custom_httpx.http_handlerr
   r   r   litellm.utilsr   LoggingCallbackrE   r9   r#   r   r    r   r   <module>r      se     	  !    " ; 
 (!7EYEiEi!j &1m #.!jU| jUr   