
    hhG                         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)DictOptional)	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     c/var/www/Befach/backend/env/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__(   sp     	!!'!2 ,H"&#Fryy1E'F&5.
  	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_environment8   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_syncF   s    
 4111)),77	N:??==/*l+ @ 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_async[   s      4111)),77	N;@@==/!23l+ 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 )
ax  
        Adds metadata from proxy request headers to Braintrust logging if keys start with "braintrust_"
        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_headero   s     !O45=OH 5r:>>y"MSQS 	 #0!,,\:"4"<"<\2q"Q"h."**2?2CCXY #((,_,==PQ -:,=,=>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                 P	   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<   |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model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_idrq   rr   rs   	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}   costlitellm_modelr   	usage_objrequest_datachoicerB   s                            r   log_success_eventz"BraintrustLogger.log_success_event   s    	9:F	$jj):;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"":r28b  44^XNHN(==" "l3J!'||N;>JD,,\:PT  !**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 #JJw5M(*7w'&*Ggt<IZ	7==A,,ZF%.%<%<)2)D)D$-$:$:"&+3+=+=+? **,,-'113#--/	 &
+*,=u#ML "FM)NF&++-)NX&)/X&"*1Y'
1@AdAiAi@jk 488==/
|7K"\N3 LL 9 w  (!"*.."2JC"5$/%eT2%eS1%eS1%eU3,0MM%,@S) #3 ((` *O  (( 1

001 	G	so   D6R O #G!R QR /AQ A1Q3QR QR R.RRR 	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<   |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 R7 -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   rt   rv   rw   api_call_start_timecompletion_start_timeru   rx   ry   rz   )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   rq   rr   rs   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   r   rB   s                                r   async_log_success_eventz(BraintrustLogger.async_log_success_event2  s(     	9:S	$jj):;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"":r28b  44^XNHNL&nn.
Uud+!%-!%-!%/(-L%y1(-(=(=(?L%t, %1%a2'({{}E!H !. ).L% /" "l3J!'||N; $ 33LAAA  !**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 #JJw5M(*7w'&*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 &
+ *,=u#ML "FM)NF&++-)NX&)/X&"*1Y'"*1Y'1499==/
|7K"\N3 LL :   m B GH *O
 (( 1

001 	G	s   TGS8 "&S8 	AS8 R1 'S8 R4F9S8 R7S8 38R> +R<,R> 0T1S8 4S8 7S8 <R> >S5S00S55S8 8	TTTT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    GK}7?}	 THSM TN N N*Ns Ns N( " " "$ " "H55JXWr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      si     	  !    " ; 
 (!7%55"  '2m #.!eU| eUr   