o
    ưiKB                     @   s   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
d ZG dd deZdS )    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                  C   s&   dd l } t| drt | jS t  S )Nr   UTC)r   hasattrnowr   utcnow)dt r   ^/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/braintrust_logging.pyget_utc_datetime   s   
r   c                       s   e Zd Z	ddee dee ddf fddZdee fddZd	edefd
dZd	edefddZdd Z	dd Z
dd Zdd Z fddZ  ZS )BraintrustLoggerNapi_keyapi_basereturnc                    s   t    t | _| jrt  td | j|d |p"t	dp"t
| _d | _|p-t	d| _d| j dd| _i | _ttjd| _t | _d S )	Nz<[BRAINTRUST MOCK] Braintrust logger initialized in mock mode)r   ZBRAINTRUST_API_BASEBRAINTRUST_API_KEYzBearer zapplication/json)AuthorizationzContent-Type)Zllm_provider)super__init__r   is_mock_moder   r   infovalidate_environmentosgetenvAPI_BASEr   default_project_idr   headers_project_id_cacher
   r   ZLoggingCallbackglobal_braintrust_http_handlerr	   #global_braintrust_sync_http_handler)selfr   r   	__class__r   r   r   %   s$   

zBraintrustLogger.__init__c                 C   sD   g }|du rt dddu r|d t|dkr td|dS )zP
        Expects
        BRAINTRUST_API_KEY

        in the environment
        Nr   r   zMissing keys={} in environment.)r    r!   appendlen	Exceptionformat)r(   r   Zmissing_keysr   r   r   r   =   s   
z%BraintrustLogger.validate_environmentproject_namec              
   C   s   || j v r
| j | S z | jj| j d| jd|id}| }|d }|| j |< |W S  tjy@ } z	td|j	j
 d}~w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$   r3   httpxHTTPStatusErrorr-   responsetextr(   r/   r9   project_dict
project_ider   r   r   get_project_id_syncK   s    



z$BraintrustLogger.get_project_id_syncc              
      s   || j v r| j | S z#| jj| j d| jd|idI dH }| }|d }|| j |< |W S  tjyD } z	td|j	j
 d}~ww )z6
        Async version of get_project_id_sync
        z/project/registerr1   r2   Nr4   r5   )r%   r&   r6   r   r$   r3   r7   r8   r-   r9   r:   r;   r   r   r   get_project_id_async`   s"   



z%BraintrustLogger.get_project_id_asyncc                    s>   | j j| j d| jddidI d H }| }|d | _d S Nr0   r1   litellmr2   r4   )r&   r6   r   r$   r3   r#   r(   projectr<   r   r   r   %create_default_project_and_experimentt   s   z6BraintrustLogger.create_default_project_and_experimentc                 C   s6   | j j| j d| jddid}| }|d | _d S rA   )r'   r6   r   r$   r3   r#   rC   r   r   r   *create_sync_default_project_and_experiment}   s
   z;BraintrustLogger.create_sync_default_project_and_experimentc              
   C   s  t d z|d}|di }d|di}d }g }	|d ur2|dd dks/t|tjr2d }n;|d urKt|tjrK|d d d	  }|d }	n"|d ur_t|tjr_|j	d j
}|j	}	n|d urmt|tjrm|d
 }|di pti }
|
di p|i }|d}|d u r|d}|r| |nd }|d u r| jd u r|   | j}g }t|tr| D ]+\}}tjd urttjtr|tjv r|| d|  t|tr||vr|||< q|dd }d }t|dd }|rt|tjrtj|| |j|j|j|| |  | | d}|dd}|d}|r)dd |dD }|d|d|d}||d ||ddd}|dd u rM||d< | D ]\}}|r\|||< qQ|	d urmd d |	D |d!< n||d!< |d urz||d"< z-td#| jj   | jj | j! d$| d%d&|gi| j"d' | j#rtd( W W d S W W d S  t$j%y } zt&|j'j
d }~ww  t&y } z|d }~ww ))NREACHES BRAINTRUST SUCCESSlitellm_call_idstandard_logging_objectmessages	call_type	embeddingchoicesr   messagedatalitellm_paramsmetadatar=   r/   :response_costusage)prompt_tokenscompletion_tokenstotal_tokens
total_costtime_to_first_tokenstartend	span_nameChat Completionspan_parentsc                 S      g | ]
}|  r|  qS r   strip.0sr   r   r   
<listcomp>       z6BraintrustLogger.log_success_event.<locals>.<listcomp>,span_idroot_span_idrh   ri   r^   llmr1   type)r4   inputrQ   span_attributestagsc                 S      g | ]}|  qS r   dictrc   choicer   r   r   re          outputmetricsz/self.global_braintrust_sync_http_handler.post: /project_logs//inserteventsurlr3   r$   z0[BRAINTRUST MOCK] Sync event successfully mocked)(r   debugget
isinstancerB   EmbeddingResponseModelResponser3   TextCompletionResponserM   r:   ImageResponser?   r#   rF   rs   itemslangfuse_default_tagslistr+   strgetattrUsageutilsget_logging_idrU   rV   rW   	timestampsplitr   r'   r6   r   r$   r   r7   r8   r-   r9   )r(   kwargsresponse_obj
start_timeend_timerH   rI   promptrw   rM   rP   dynamic_metadatar=   r/   rp   keyvaluecostrx   	usage_objr\   r^   ro   request_datar>   r   r   r   log_success_event   s   
















z"BraintrustLogger.log_success_eventc              
      s  t d z|d}|di }d|di}d }g }	|d ur3|dd dks0t|tjr3d }n;|d urLt|tjrL|d d d	  }|d }	n"|d ur`t|tjr`|j	d j
}|j	}	n|d urnt|tjrn|d
 }|di }
|
di p{i }|d}|d u r|d}|r| |I d H nd }|d u r| jd u r|  I d H  | j}g }t|tr| D ]+\}}tjd urttjtr|tjv r|| d|  t|tr||vr|||< q|dd }d }t|dd }|r-t|tjr-tj|| |j|j|j|| | d}|d}|d}|d ur-|d ur-| |  |d< |dd}|d}|rEdd |dD }|d|d|d}||d |||dd d!}|dd u rj||d"< | D ]\}}|ry|||< qn|	d urd#d |	D |d$< n||d$< |d ur||d%< z'| jj| j  d&| d'd(|gi| j!d)I d H  | j"rt#d* W W d S W W d S  t$j%y } zt&|j'j
d }~ww  t&y } z|d }~ww )+NrG   rH   rI   rJ   rK   rL   rM   r   rN   rO   rP   rQ   r=   r/   rR   rS   rT   )rU   rV   rW   rX   rZ   r[   api_call_start_timecompletion_start_timerY   r\   r]   r^   c                 S   r_   r   r`   rb   r   r   r   re   t  rf   z<BraintrustLogger.async_log_success_event.<locals>.<listcomp>rg   rh   ri   rj   rk   rl   )r4   rn   rw   rQ   ro   rp   c                 S   rq   r   rr   rt   r   r   r   re     rv   rw   rx   ry   rz   r{   r|   z1[BRAINTRUST MOCK] Async event successfully mocked)(r   r~   r   r   rB   r   r   r3   r   rM   r:   r   r@   r#   rE   rs   r   r   r   r+   r   r   r   r   r   rU   rV   rW   r   r   r&   r6   r   r$   r   r   r7   r8   r-   r9   )r(   r   r   r   r   rH   rI   r   rw   rM   rP   r   r=   r/   rp   r   r   r   rx   r   r   r   r\   r^   ro   r   r>   r   r   r   async_log_success_event  s   














	



	

z(BraintrustLogger.async_log_success_eventc                    s   t  ||||S )N)r   log_failure_event)r(   r   r   r   r   r)   r   r   r     s   z"BraintrustLogger.log_failure_event)NN)__name__
__module____qualname__r   r   r   r   r?   r@   rE   rF   r   r   r   __classcell__r   r   r)   r   r   $   s&    		  r   )r    r   typingr   r   r7   rB   r   Z+litellm.integrations.braintrust_mock_clientr   r   Z"litellm.integrations.custom_loggerr   Z&litellm.llms.custom_httpx.http_handlerr	   r
   r   Zlitellm.utilsr   r"   r   r   r   r   r   r   <module>   s   	