o
    ưi7                     @   s   d Z ddlZddlZddlZddlZddlZddlmZmZ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 ddlmZmZ dd	lmZmZmZ dd
lmZ dd ZG dd deZdS )z%
Send logs to Argilla for annotation
    N)AnyDictListOptional)	BaseModel)verbose_logger)CustomBatchLogger)CustomLogger)get_async_httpx_clienthttpxSpecialProvider)SUPPORTED_PAYLOAD_FIELDSArgillaCredentialsObjectArgillaItem)StandardLoggingPayloadc                 C   s   t jt jt jtf}t| | S )N)typesCoroutineTypeFunctionTypeGeneratorTyper   
isinstance)valueZnon_serializable_types r   S/home/app/Keep/.python/lib/python3.10/site-packages/litellm/integrations/argilla.pyis_serializable   s   r   c                       s   e Zd Z			ddee dee dee f fddZdeeef fdd	Zdee dee dee d
e	fddZ
ded
eeeef  fddZded
efddZd
ee fddZdd Zdd Zdd Zdd Zdd Z  ZS )ArgillaLoggerNargilla_api_keyargilla_dataset_nameargilla_base_urlc                    s   t jd u r	td| t j t j| _| j|||d| _tdd ur3td 	 r3t
tdnd| _ttjd| _tdd pEt j}|rMt|| _t|   t | _t jdi |d| ji d S )	NzT'litellm.argilla_transformation_object' is required, to log your payload to Argilla.)r   r   r   ZARGILLA_SAMPLING_RATE      ?)Zllm_providerZARGILLA_BATCH_SIZE
flush_lockr   )litellmargilla_transformation_object	Exception&validate_argilla_transformation_objectget_credentials_from_envdefault_credentialsosgetenvstripisdigitfloatsampling_rater
   r   ZLoggingCallbackasync_httpx_clientZargilla_batch_sizeint
batch_sizeasynciocreate_taskZperiodic_flushLockr   super__init__)selfr   r   r   kwargsZ_batch_size	__class__r   r   r2   *   s:   


 zArgillaLogger.__init__r    c                 C   s<   t |ts	td| D ]}|tvrtd| dqd S )NzU'argilla_transformation_object' must be a dictionary, to log your payload to Argilla.zWAll values in argilla_transformation_object must be a key in SUPPORTED_PAYLOAD_FIELDS, z is not a valid key.)r   dictr!   valuesr   )r3   r    vr   r   r   r"   Q   s   

z4ArgillaLogger.validate_argilla_transformation_objectreturnc           	      C   s   |pt d}|d u rtd|pt dpd}|d u r td|p(t dp(d}|d u r1tdtjj| d	| d
|id}| }d|v r_t|d tr_t	|d dkr_|d d d }t
|||dS )NARGILLA_API_KEYz9Invalid Argilla API Key given. _credentials_api_key=None.ARGILLA_BASE_URLzhttp://localhost:6900/z;Invalid Argilla Base URL given. _credentials_base_url=None.ARGILLA_DATASET_NAMEzlitellm-completionz)Invalid Argilla Dataset give. Value=None.z/api/v1/me/datasets?name=X-Argilla-Api-Key)urlheadersitemsr   id)r;   r<   r=   )r%   r&   r!   r   module_level_clientgetjsonr   listlenr   )	r3   r   r   r   Z_credentials_api_keyZ_credentials_base_urlZ_credentials_dataset_nameZdataset_responseZjson_responser   r   r   r#   _   sD   z&ArgillaLogger.get_credentials_from_envpayloadc                 C   sb   | dd }|d u rtdt|tr"t|dkr"t|d tr"|S t|tr*|gS td| )Nmessagesz"No chat messages found in payload.r   zInvalid chat messages format: )rD   r!   r   rF   rG   r7   )r3   rH   Zpayload_messagesr   r   r   get_chat_messages   s   
zArgillaLogger.get_chat_messagesc                 C   s`   |d }|d u rt dt|tr|S t|tr)|di gd di ddS t d| )	NresponsezNo response found in payload.choicesr   messagecontent zInvalid response format: )r!   r   strr7   rD   )r3   rH   rK   r   r   r   get_str_response   s   

 zArgillaLogger.get_str_responsec                 C   s   zI| dd }|d u rtd| |}| |}di i}| j D ]$\}	}
|
dkr1||d |	< q"|
dkr<||d |	< q"| |
d |d |	< q"|W S  tyQ    w )Nstandard_logging_objectz,Error logging request payload. Payload=none.fieldsrI   rK   )rD   r!   rJ   rQ   r    rA   )r3   r4   response_obj
start_timeend_timerH   Zargilla_messageZargilla_responseZargilla_itemkr9   r   r   r   _prepare_log_data   s&   

zArgillaLogger._prepare_log_datac                 C   s   | j sd S | jd }| jd }| d| d}| jd }d|i}z1tjj|| j |d}|jdkr>td	|j d
|j  nt	dt
| j  d | j   W d S  ty`   td Y d S w )Nr<   r=   /api/v1/datasets//records/bulkr;   r>   )r?   rE   r@   ,  Argilla Error:  - z	Batch of z runs successfully createdz*Argilla Layer Error - Error sending batch.)	log_queuer$   r   rC   poststatus_coder   errortextdebugrG   clearr!   	exceptionr3   Zargilla_api_baser   r?   r   r@   rK   r   r   r   _send_batch   s0   



zArgillaLogger._send_batchc                 C   s   zet dd urt d  rtt dnd}t }||kr.td|| W d S t	d|| | 
||||}|d u rDW d S | j| t	d| j d t| j| jkrc|   W d S W d S  tyt   td Y d S w )NZLANGSMITH_SAMPLING_RATEr   >Skipping Langsmith logging. Sampling rate={}, random_sample={}z;Langsmith Sync Layer Logging - kwargs: %s, response_obj: %sz/Langsmith, event added to queue. Will flush in z seconds...z/Langsmith Layer Error - log_success_event error)r%   r&   r'   r(   r)   randomr   infoformatrc   rX   r^   appendZflush_intervalrG   r-   rg   r!   re   r3   r4   rT   rU   rV   r*   random_sampledatar   r   r   log_success_event   sB   zArgillaLogger.log_success_eventc           
   	      s"  z| j }t }||krtd|| W d S td|| |dd }| ||||}tj	D ]#}	t
|	trTz|d u r@W  n|	||I d H }W q1 tyS   Y q1w q1|d u r\W d S | j| tdt| j| j t| j| jkr|  I d H  W d S W d S  ty   td Y d S w )Nrh   z<Langsmith Async Layer Logging - kwargs: %s, response_obj: %srR   1Langsmith logging: queue length %s, batch size %sz8Argilla Layer Error - error logging async success event.)r*   ri   r   rj   rk   rc   rD   rX   r   	callbacksr   r	   Zasync_dataset_hookNotImplementedErrorr^   rl   rG   r-   flush_queuer!   re   )
r3   r4   rT   rU   rV   r*   rn   rH   ro   callbackr   r   r   async_log_success_event  s\   


z%ArgillaLogger.async_log_success_eventc                    s   | j }t }||krtd|| d S td z.| ||||}| j| tdt	| j| j
 t	| j| j
krH|  I d H  W d S W d S  tyY   td Y d S w )Nrh   z Langsmith Failure Event Logging!rq   z:Langsmith Layer Error - error logging async failure event.)r*   ri   r   rj   rk   rX   r^   rl   rc   rG   r-   rt   r!   re   rm   r   r   r   async_log_failure_event?  s6   

z%ArgillaLogger.async_log_failure_eventc                    s   | j sdS | jd }| jd }| d| d}| jd }d|i}z8| jj|td| j i|d	d
I dH }|  |jdkrNt	d|j d|j
  W dS tdt| j  W dS  tjyi   td Y dS  tyw   td Y dS w )z
        sends runs to /batch endpoint

        Sends runs from self.log_queue

        Returns: None

        Raises: Does not raise an exception, will only verbose_logger.exception()
        Nr<   r=   rY   rZ   r;   r>   rA   i`  )r?   ro   r@   timeoutr[   r\   r]   z%Batch of %s runs successfully createdzArgilla HTTP ErrorzArgilla Layer Error)r^   r$   r+   putrE   dumpsraise_for_statusr`   r   ra   rb   rc   rG   httpxZHTTPStatusErrorre   r!   rf   r   r   r   async_send_batchY  s>   








zArgillaLogger.async_send_batch)NNN)__name__
__module____qualname__r   rP   r2   r   r   r"   r   r#   r   r   rJ   rQ   r   rX   rg   rp   rv   rw   r}   __classcell__r   r   r5   r   r   )   sJ    '


.

!$0r   ) __doc__r.   rE   r%   ri   r   typingr   r   r   r   r|   Zpydanticr   r   Zlitellm._loggingr   Z(litellm.integrations.custom_batch_loggerr   Z"litellm.integrations.custom_loggerr	   Z&litellm.llms.custom_httpx.http_handlerr
   r   Z"litellm.types.integrations.argillar   r   r   Zlitellm.types.utilsr   r   r   r   r   r   r   <module>   s$    
