
    l0jM                       d dl mZ d dl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
 d dlm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Zd dlmZ d d	lmZ erd d
lmZ  ed            G d de	          Z  e             G d de                       Z! e             G d de                       Z" e             G d de                       Z# G d de#          Z$ G d d          Z%dS )    )annotationsN)ABCabstractmethod)OrderedDict)Path)TYPE_CHECKINGAny)utils)documentset_documentation_group)warn_deprecation)IOComponentflaggingc                  H    e Zd ZdZedd            Ze	 	 ddd            ZdS )FlaggingCallbackz[
    An abstract class for defining the methods that any FlaggingCallback should have.
    
componentslist[IOComponent]flagging_dirstrc                    dS )a  
        This method should be overridden and ensure that everything is set up correctly for flag().
        This method gets called once at the beginning of the Interface.launch() method.
        Parameters:
        components: Set of components that will provide flagged data.
        flagging_dir: A string, typically containing the path to the directory where the flagging file should be storied (provided as an argument to Interface.__init__()).
        N selfr   r   s      R/home/wildlama/miniconda3/envs/lam/lib/python3.11/site-packages/gradio/flagging.pysetupzFlaggingCallback.setup"   s	     	     N	flag_data	list[Any]flag_optionusername
str | Nonereturnintc                    dS )a  
        This method should be overridden by the FlaggingCallback subclass and may contain optional additional arguments.
        This gets called every time the <flag> button is pressed.
        Parameters:
        interface: The Interface object that is being used to launch the flagging interface.
        flag_data: The data to be flagged.
        flag_option (optional): In the case that flagging_options are provided, the flag option that is being used.
        username (optional): The username of the user that is flagging the data, if logged in.
        Returns:
        (int) The total number of samples that have been flagged.
        Nr   )r   r   r    r!   s       r   flagzFlaggingCallback.flag-   s	    $ 	r   r   r   r   r   r   Nr   r   r    r   r!   r"   r#   r$   )__name__
__module____qualname____doc__r   r   r&   r   r   r   r   r      sk             ^  #	    ^  r   r   c                  .    e Zd ZdZd ZddZ	 	 dddZd	S )SimpleCSVLoggera  
    A simplified implementation of the FlaggingCallback abstract class
    provided for illustrative purposes.  Each flagged sample (both the input and output data)
    is logged to a CSV file on the machine running the gradio app.
    Example:
        import gradio as gr
        def image_classifier(inp):
            return {'cat': 0.3, 'dog': 0.7}
        demo = gr.Interface(fn=image_classifier, inputs="image", outputs="label",
                            flagging_callback=SimpleCSVLogger())
    c                    d S Nr   r   s    r   __init__zSimpleCSVLogger.__init__P       r   r   r   r   
str | Pathc                N    || _         || _        t          j        |d           d S NT)exist_okr   r   osmakedirsr   s      r   r   zSimpleCSVLogger.setupS   s,    $(
L4000000r   r   Nr   r   r    r   r!   r"   r#   r$   c                   | j         }t          |          dz  }g }t          | j        |          D ]Z\  }}t          |          t	          j        |j        pd          z  }	|                    |                    ||	d                      [t          |dd          5 }
t          j        |
          }|                    t          j        |                     d d d            n# 1 swxY w Y   t          |          5 }
t          t!          t          j        |
                              dz
  }d d d            n# 1 swxY w Y   |S )Nlog.csvr   a)newline   )r   r   zipr   client_utils!strip_invalid_filename_characterslabelappenddeserializeopencsvwriterwriterowr
   sanitize_list_for_csvlenlistreader)r   r   r    r!   r   log_filepathcsv_data	componentsamplesave_dircsvfilerI   
line_counts                r   r&   zSimpleCSVLogger.flagX   s    (L))I5!$T_i!@!@ 
	 
	Iv >y?TRTUUVH OO%%     ,R000 	CGZ((FOOE7AABBB	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C , 	<7T#*W"5"56677!;J	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<s$   <C&&C*-C* 2D>>EEr   r   r   r5   r(   r)   r*   r+   r,   r-   r3   r   r&   r   r   r   r/   r/   B   sb        
 
  1 1 1 1 #	      r   r/   c                  .    e Zd ZdZd ZddZ	 	 dddZd	S )	CSVLoggera  
    The default implementation of the FlaggingCallback abstract class. Each flagged
    sample (both the input and output data) is logged to a CSV file with headers on the machine running the gradio app.
    Example:
        import gradio as gr
        def image_classifier(inp):
            return {'cat': 0.3, 'dog': 0.7}
        demo = gr.Interface(fn=image_classifier, inputs="image", outputs="label",
                            flagging_callback=CSVLogger())
    Guides: using-flagging
    c                    d S r1   r   r2   s    r   r3   zCSVLogger.__init__   r4   r   r   r   r   r5   c                N    || _         || _        t          j        |d           d S r7   r9   r   s      r   r   zCSVLogger.setup   s.    
 %(
L4000000r   r   Nr   r   r    r   r!   r"   r#   r$   c           	         | j         }t          |          dz  }t          |                                           }d t          | j                  D             g dz   }g }t          t          | j        |                    D ]\  }	\  }
}t          |          t          j        t          |
dd           pd|	           z  }t          j
        |          r#|                    t          |                     w|                    ||
                    ||          nd           |                    |           |                    ||nd           |                    t          t          j                                                             t!          |ddd	
          5 }t#          j        |          }|r'|                    t          j        |                     |                    t          j        |                     d d d            n# 1 swxY w Y   t!          |d	          5 }t+          t-          t#          j        |                              dz
  }d d d            n# 1 swxY w Y   |S )Nr=   c                @    g | ]\  }}t          |d d          pd| S )rD   N
component )getattr).0idxrQ   s      r   
<listcomp>z"CSVLogger.flag.<locals>.<listcomp>   sF     
 
 
Y Iw--C1Cc1C1C
 
 
r   )r&   r!   	timestamprD   r^   )rS   r   r>   utf-8r?   encodingrf   r@   )r   r   exists	enumerater   rA   rB   rC   r_   r
   	is_updaterE   r   rF   datetimenowrG   rH   rI   rJ   rK   rL   rM   rN   )r   r   r    r!   r   rO   is_newheadersrP   ra   rQ   rR   rS   rT   rI   rU   s                   r   r&   zCSVLogger.flag   s    (L))I5,''..000
 
"+DO"<"<
 
 

 
 

 (1#doy2Q2Q(R(R 	 	$C$)V >	7D11G5G#5G5G H
 v&& F,,,,) ))&8)DDD   
 	$$$H$8bAAAH-113344555,R'BBB 	CgZ((F F ;G D DEEEOOE7AABBB		C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C 	C ,111 	<WT#*W"5"56677!;J	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	< 	<s%   (A%HH H52I33I7:I7rV   r(   r)   rW   r   r   r   rY   rY   w   sb        
 
  1 1 1 1 #	- - - - - - -r   rY   c                      e Zd ZdZ	 	 	 	 	 d*d+dZd,dZ	 	 d-d.dZ	 	 d/d0d!Zed1d%            Z	ed2d&            Z
	 	 d/d3d)ZdS )4HuggingFaceDatasetSavera  
    A callback that saves each flagged sample (both the input and output data) to a HuggingFace dataset.

    Example:
        import gradio as gr
        hf_writer = gr.HuggingFaceDatasetSaver(HF_API_TOKEN, "image-classification-mistakes")
        def image_classifier(inp):
            return {'cat': 0.3, 'dog': 0.7}
        demo = gr.Interface(fn=image_classifier, inputs="image", outputs="label",
                            allow_flagging="manual", flagging_callback=hf_writer)
    Guides: using-flagging
    NFdataset_info.jsonThf_tokenr   dataset_nameorganizationr"   privateboolinfo_filenameseparate_dirsverbosec                n    |t          d           || _        || _        || _        || _        || _        dS )a;  
        Parameters:
            hf_token: The HuggingFace token to use to create (and write the flagged sample to) the HuggingFace dataset (defaults to the registered one).
            dataset_name: The repo_id of the dataset to save the data to, e.g. "image-classifier-1" or "username/image-classifier-1".
            organization: Deprecated argument. Please pass a full dataset id (e.g. 'username/dataset_name') to `dataset_name` instead.
            private: Whether the dataset should be private (defaults to False).
            info_filename: The name of the file to save the dataset info (defaults to "dataset_infos.json").
            separate_dirs: If True, each flagged item will be saved in a separate directory. This makes the flagging more robust to concurrent editing, but may be less convenient to use.
        NzParameter `organization` is not used anymore. Please pass a full dataset id (e.g. 'username/dataset_name') to `dataset_name` instead.)r   rr   
dataset_iddataset_privaterw   rx   )r   rr   rs   rt   ru   rw   rx   ry   s           r   r3   z HuggingFaceDatasetSaver.__init__   sP    & # X   !&&**r   r   r   r   c           	        t          j        | j        | j        | j        dd          j        | _        | j        rdnd}t          j        | j        dddd|d	gd
gid| j                   || _        t          |          
                                | j                            d          d         z  | _        | j                            dd           | j        | j        z  | _        | j        g}| j        s|                    d           |D ]E}	 t          j        | j        d|| j        | j                   ,# t           j        j        $ r Y Bw xY wdS )z
        Params:
        flagging_dir (str): local directory where the dataset is cloned,
        updated, and pushed from.
        datasetT)repo_idtokenru   	repo_typer8   z
**/*.jsonldata.csvconfigsdefaulttrain)splitpath)config_name
data_files)r   r   metadata	overwriter   /parentsr8   )r   r   filename	local_dirr   N)huggingface_hubcreate_repor{   rr   r|   r   rx   metadata_updater   r   absoluter   dataset_dirmkdirrw   
infos_filerE   hf_hub_downloadr
   EntryNotFoundError)r   r   r   	path_globremote_filesr   s         r   r   zHuggingFaceDatasetSaver.setup   s    *5O-(
 
 
  	 %)$6FLLJ	'O'018)'L'L&M  -	
 	
 	
 	
  %''))DO,A,A#,F,Fr,JJ 	 	td;;;*T-?? *+! 	,
+++$ 
	 
	H	/ O'%".-     #(;   
	 
	s   (D;;EEr   r   r   r    r!   r#   r$   c                    | j         r2t          t          j                              }| j        |z  }|dz  }|}n| j        }|dz  }d }|                     ||||||pd          S )Nzmetadata.jsonlr   r   )	data_filecomponents_dirpath_in_repor   r    r!   )rx   r   uuiduuid4r   _flag_in_dir)r   r   r    r!   	unique_idr   r   r   s           r   r&   zHuggingFaceDatasetSaver.flag%  s      
	 DJLL))I!-	9N&)99I$LL "-N&3IL  )%#^ ! 
 
 	
r   r   r   r   r   c           
        |                      ||||          \  }}t          j        t          | j                  dz             5  | j                                        sb| j                            t          j        dd|ii                     t          j
        | j        d| j        | j        j        | j                   d d d            n# 1 swxY w Y   t          |                                          }	| j        st          j        |dz            5  |                     ||	|          }
t          |
          }t          j        | j        dd| |d|| j        	           d d d            n# 1 swxY w Y   np|                     ||	|          }t)          d
 | j                                        D                       }
t          j        | j        dd| |d|| j        	           |
S )Nz.lockflaggedfeaturesr~   )r   r   r   r   path_or_fileobj)rn   rowzFlagged sample #z*.lock)r   r   commit_messager   ignore_patternsfolder_pathr   c                :    g | ]}|                                 |S r   )is_dir)r`   r   s     r   rb   z8HuggingFaceDatasetSaver._flag_in_dir.<locals>.<listcomp>o  s%    NNN$NNNNr   )_deserialize_componentsfilelockFileLockr   r   rh   
write_textjsondumpsr   upload_filer{   rr   namerM   keysrx   _save_as_csvupload_folder_save_as_jsonlrL   r   iterdir)r   r   r   r   r   r    r!   r   r   rn   	sample_nbsample_names               r   r   z$HuggingFaceDatasetSaver._flag_in_dir@  s    44I{H
 
#
 s4?33g=>> 	 	?))++ **J	J+ABCC    + O'-!%!5$(O   	 	 	 	 	 	 	 	 	 	 	 	 	 	 	 x}}''! 	">G#;<<   --ic-RR	!)nn- O'#Ck#C#C!-$, .-                  --ic-RRKNN$"2":":"<"<NNN I )#?+??) (*m    s&   A<CCCAE33E7:E7rn   	list[str]r   c                   |                                   }|                     ddd          5 }t          j        |          }|r'|                    t          j        |                     |                    t          j        |                     ddd           n# 1 swxY w Y   |                     d          5 }t          d t          j        |          D                       dz
  cddd           S # 1 swxY w Y   dS )	z9Save data as CSV and return the sample name (row number).r>   r   rd   re   Nrg   c              3     K   | ]}d V  dS )r@   Nr   )r`   _s     r   	<genexpr>z7HuggingFaceDatasetSaver._save_as_csv.<locals>.<genexpr>  s"      66Qq666666r   r@   )	rh   rG   rH   rI   rJ   r
   rK   sumrN   )r   rn   r   rm   rT   rI   s         r   r   z$HuggingFaceDatasetSaver._save_as_csv}  sx    %%'''^^Cg^>> 	>'Z((F  F ;G D DEEE OOE7<<===	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> 	> ^^W^-- 	;66#*W"5"566666:	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	; 	;s$   A%BB#&B# .C;;C?C?c           	        t          j        | j        dd           t          | d          5 }t	          j        t          t          ||                    |           ddd           n# 1 swxY w Y   | j        j        S )z5Save data as JSONL and return the sample name (uuid).Tr   wN)	r   r   parentrG   r   dumpdictrA   r   )r   rn   r   fs       r   r   z&HuggingFaceDatasetSaver._save_as_jsonl  s     	
9#TDAAAA)S!! 	2QId3w,,--q111	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2 	2$$s   1A**A.1A.data_dir tuple[dict[Any, Any], list[Any]]c                   t           j        dt           j        di}t                      }g }t	          | j        |          D ]\  }}	|j        pd}
|t          j        |
          z  }|	                    |	|d          }ddd||
<   	 t          |                                          sJ |                    t          t          |                              | j                                       nE# t           t"          t$          f$ r+ |dnt          |          }|                    |           Y nw xY wt'          |t)          |                    r|                                D ]!\  }}t'          ||          rd|i||
d	z   <    n"|ryt          t          |                              | j                                                d
d          }|                    t/          j        | j        |d                     |                    d           ddd|d<   ddd|d<   |                    |           |                    |           ||fS )zDeserialize components and return the corresponding row for the flagged sample.

        Images/audio are saved to disk as individual files.
        AudioImager   NstringValue)dtype_typer   z file\r   r~   )r   r   r   r&   r!   )grr   r   r   rA   r   rD   rB   rC   rF   r   rh   rE   r   relative_tor   AssertionError	TypeError
ValueError
isinstancetupleitemsreplacer   
hf_hub_urlr{   )r   r   r   r    r!   file_preview_typesr   r   rQ   rR   rD   rS   deserialized
_componentr   r   s                   r   r   z/HuggingFaceDatasetSaver._deserialize_components  s    !h7C ==!$T_i!@!@ $	# $	#IvO)rE,"PQV"W"WWH$004HHL )17CCHUO)L))0022222

3tL11==d>NOOPPQQQQ"Iz: ) ) )%1%9rrs<?P?P

<((((() )U+=%>%>?? #);)A)A)C)C  %J!)Z88 5<e4D1   ##&\**66t7GHH$ $gc  !
 JJ'2$(O%1&/      JJrNNN%-@@)1GDD

;

8}s   A*C11?D32D3)NFrq   FT)rr   r   rs   r   rt   r"   ru   rv   rw   r   rx   rv   ry   rv   r'   r(   r)   )r   r   )r   r   r   r   r   r"   r   r   r    r   r!   r   r#   r$   )r   r   rn   r   r   r   r#   r$   )r   r   rn   r   r   r   r#   r   )
r   r   r   r   r    r   r!   r   r#   r   )r*   r+   r,   r-   r3   r   r&   r   staticmethodr   r   r   r   r   r   rp   rp      s        " $(0#+ + + + +:6 6 6 6v #	
 
 
 
 
B ; ; ; ; ;z ; ; ; \;" % % % \% : : : : : : :r   rp   c                  *     e Zd Z	 	 	 	 dd fdZ xZS )HuggingFaceDatasetJSONSaverNFrq   Trr   r   rs   rt   r"   ru   rv   rw   ry   c                t    t          d           t                                          |||||d           d S )NzCallback `HuggingFaceDatasetJSONSaver` is deprecated in favor of using `HuggingFaceDatasetSaver` and passing `separate_dirs=True` as parameter.T)rr   rs   rt   ru   rw   rx   )r   superr3   )r   rr   rs   rt   ru   rw   ry   	__class__s          r   r3   z$HuggingFaceDatasetJSONSaver.__init__  s\     	X	
 	
 	
 	%%' 	 	
 	
 	
 	
 	
r   )NFrq   T)rr   r   rs   r   rt   r"   ru   rv   rw   r   ry   rv   )r*   r+   r,   r3   __classcell__)r   s   @r   r   r     sP        
 $(0
 
 
 
 
 
 
 
 
 
 
r   r   c                  ,    e Zd ZdZ	 ddd
ZddZd ZdS )
FlagMethodz
    Helper class that contains the flagging options and calls the flagging method. Also
    provides visual feedback to the user when flag is clicked.
    Tflagging_callbackr   rD   r   valuevisual_feedbackrv   c                L    || _         || _        || _        d| _        || _        d S )NFlag)r   rD   r   r*   r   )r   r   rD   r   r   s        r   r3   zFlagMethod.__init__  s/     "3

.r   request
gr.Requestc                <   	 | j                             t          |          | j        |j                   n6# t
          $ r)}t          d|            | j        rY d }~dS Y d }~nd }~ww xY w| j        sd S t          j	        d           | 
                                S )N)r    r!   zError while flagging: zError!g?)r   r&   rM   r   r!   	Exceptionprintr   timesleepreset)r   r   r   es       r   __call__zFlagMethod.__call__  s    	 "''YTZ'BR (      	  	  	 .1..///#  xxxxx         	  # 	F
3zz||s   47 
A*A%%A*c                N    t           j                            | j        d          S )NT)r   interactive)r   ButtonupdaterD   r2   s    r   r   zFlagMethod.reset  s    ydjdCCCr   N)T)r   r   rD   r   r   r   r   rv   )r   r   )r*   r+   r,   r-   r3   r   r   r   r   r   r   r     sd          !%/ / / / /   D D D D Dr   r   )&
__future__r   rH   rk   r   r:   r   r   abcr   r   collectionsr   pathlibr   typingr   r	   r   r   gradio_clientr
   rB   gradio_client.documentationr   r   gradior   gradio.deprecationr   gradio.componentsr   r   r/   rY   rp   r   r   r   r   r   <module>r     s   " " " " " " 



   				   # # # # # # # # # # # # # #       % % % % % % % %      / / / / / / I I I I I I I I           / / / / / / .------  
 # # #" " " " "s " " "J 
1 1 1 1 1& 1 1 1h 
F F F F F  F F FR 
O O O O O. O O Od
 
 
 
 
"9 
 
 
0"D "D "D "D "D "D "D "D "D "Dr   