o
    ٷimP                     @  s  d Z 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	Z	ddl
Z
ddlmZ ddlmZmZmZ ddlmZ ddlmZmZ dedd	ZdfddZdgddZdhddZdiddZdjdd Zdkd#d$Zdjd%d&Zdld)d*Zdld+d,Zdld-d.Z dld/d0Z!dmd3d4Z"dnd8d9Z#dld:d;Z$dld<d=Z%dld>d?Z&d@dA Z'dBdC Z(dodEdFZ)dpdHdIZ*dqdLdMZ+	dedrdTdUZ,dsdXdYZ-dtd\d]Z.dud`daZ/dvdcddZ0dS )wzCUtility function for gradio/external.py, designed for internal use.    )annotationsN)encode_url_or_file_to_base64)HfApi ImageClassificationOutputElementInferenceClient)
components)ErrorTooManyRequestsErrorc                 C  s6   t |d}td|   || }|j}|j}||fS )N)tokenz,Fetching model from: https://huggingface.co/)r   print
model_infopipeline_tagtags)
model_namehf_tokenhf_apir   pipeliner    r   I/home/ubuntu/.local/lib/python3.10/site-packages/gradio/external_utils.pyget_model_info   s   

r   r   strreturndict[str, list[float]]c                 C  s   t d|  d}|jdkrtd|  t i }n(td|j}|d u r(i }nt	t
|jd | d  }|di di }|sLtd	|  d
| D ]}t|D ]\}}t|trht|rhd||< qVqP|S )Nzhttps://huggingface.co/z/resolve/main/README.md   z%Cannot load examples from README for z,(?:^|[
])---[
]+([\S\s]*?)[
]+---([
]|$)widgetstructuredDataz&No example data found in README.md of z - Cannot build gradio demo. See the README.md here: https://huggingface.co/scikit-learn/tabular-playground/blob/main/README.md for a reference on how to provide example data to your model.NaN)httpxgetstatus_codewarningswarnUserWarningresearchtextnextyamlsafe_load_allspan
ValueErrorvalues	enumerate
isinstancefloatmathisnan)r   readmeexample_data
yaml_regexexample_yamldataivalr   r   r   get_tabular_examples$   s0   

r9   r3   #dict[str, list[float | str] | None]#tuple[list[str], list[list[float]]]c                   s   t   }t fdd|D }g }t|D ]'}g }|D ]} | p$g }|t|kr1|d q|||  q|| q||fS )Nc                 3  s     | ]}t  | p
g V  qd S N)len).0headerr3   r   r   	<genexpr>F   s    zcols_to_rows.<locals>.<genexpr>r   )listkeysmaxranger=   append)r3   headersn_rowsr6   	row_indexrow_datar?   colr   r@   r   cols_to_rowsB   s   rL   incoming_datadict*dict[str, dict[str, dict[str, list[str]]]]c                   s@   i }t | d D ]\ } fdd| d D ||< qdd|iiS )NrG   c                   s   g | ]}t |  qS r   )r   )r>   rowr7   r   r   
<listcomp>W   s    z rows_to_cols.<locals>.<listcomp>r6   inputs)r-   )rM   data_column_wiser?   r   rQ   r   rows_to_colsT   s   rU   scores&list[ImageClassificationOutputElement]c                 C     dd | D S )Nc                 S  s   i | ]}|j |jqS r   )labelscorer>   cr   r   r   
<dictcomp>a       z%postprocess_label.<locals>.<dictcomp>r   rV   r   r   r   postprocess_label`      r`   list[dict[str, str | float]]c                 C  rX   )Nc                 S     i | ]	}|d  |d qS )	token_strrZ   r   r[   r   r   r   r]   e       z+postprocess_mask_tokens.<locals>.<dictcomp>r   r_   r   r   r   postprocess_mask_tokensd   ra   rf   answertuple[str, dict]c                 C  s   | d | d | d ifS )Nrg   rZ   r   )rg   r   r   r   postprocess_question_answeringh   s   ri   c                 C  rX   )Nc                 S  rc   )rg   rZ   r   r[   r   r   r   r]   m   re   z9postprocess_visual_question_answering.<locals>.<dictcomp>r   r_   r   r   r   %postprocess_visual_question_answeringl   ra   rj   clientr   c                   s   d fdd}|S )	Ninputr   labelsmulti_labelboolc                   s    j | |d|dS )N,)rn   )zero_shot_classificationsplit)rl   rm   rn   rk   r   r   zero_shot_classification_innerq   s   zHzero_shot_classification_wrapper.<locals>.zero_shot_classification_inner)rl   r   rm   r   rn   ro   r   )rk   rt   r   rs   r    zero_shot_classification_wrapperp   s   ru   c                   s   d fdd}|S )Nrl   r   	sentencesc                   s     | |dS )N
)sentence_similarityrr   )rl   rv   rs   r   r   sentence_similarity_innerz   s   z>sentence_similarity_wrapper.<locals>.sentence_similarity_inner)rl   r   rv   r   r   )rk   ry   r   rs   r   sentence_similarity_wrappery      rz   c                      d fdd}|S )Nrl   r   c                   s   |   |  S r<   )text_generation)rl   rs   r   r   text_generation_inner   ra   z6text_generation_wrapper.<locals>.text_generation_innerrl   r   r   )rk   r~   r   rs   r   text_generation_wrapper   r{   r   c                       fdd}|S )Nc              
   3  s    |sg }| d| d z"d} j|ddD ]}||jr&|jd jjp%dnd7 }|V  qW d S  tyF } zt| W Y d }~d S d }~ww )Nuserrolecontent Tmessagesstreamr   )rF   chat_completionchoicesdeltar   	Exceptionhandle_hf_error)messagehistoryoutchunkers   r   r   chat_fn   s     z'conversational_wrapper.<locals>.chat_fnr   rk   r   r   rs   r   conversational_wrapper   s   r   rhttpx.Responsec              
   C  s   t | jd}d}||v r|S | jd}|dkr=z|  d }|d }|d }W n ty< } ztd|d }~ww 	 d| d| }|S )	Nzutf-8z;base64,zcontent-typeapplication/jsonr   blobz7Cannot determine content type returned by external API.zdata:)	base64	b64encoder   decoderG   r   jsonKeyErrorr+   )r   base64_reprdata_prefixcontent_typer6   ke
new_base64r   r   r   encode_to_base64   s*   r   input_string
ner_groupslist[dict[str, str | int]]c                 C  s   t |dkr| d fgS g }d}d}|D ](}|d |d |d }}}|| || d f || || |f |}q|| |d  d f |S )Nr   entity_groupstartend)r=   rF   )r   r   outputr   prev_endgroupentityr   r   r   r   format_ner_list   s   
r   c                   r|   )Nrl   r   c                   s     | }t| |S r<   )token_classificationr   )rl   ner_listrs   r   r   token_classification_inner   s   

z@token_classification_wrapper.<locals>.token_classification_innerr   r   )rk   r   r   rs   r   token_classification_wrapper   s   r   c                   r|   )Nrl   r   c                   s      | }dd |D }| |fS )Nc                 S  s@   g | ]}|d  d |d  d |d  d |d  d f|d fqS )boxxminyminxmaxymaxrY   r   )r>   ar   r   r   rR      s    




zLobject_detection_wrapper.<locals>.object_detection_inner.<locals>.<listcomp>)object_detection)rl   r   formatted_annotationsrs   r   r   object_detection_inner   s
   

z8object_detection_wrapper.<locals>.object_detection_innerr   r   )rk   r   r   rs   r   object_detection_wrapper   s   r   c                   r   )Nc                   s   dddt | idd|dgdg}z j|dd	}|jd
 jjW S  tyW } z*z | }d| d| dW W  Y d }~S  tyK   t| Y nw W Y d }~d S d }~ww )Nr   	image_urlurl)typer   r&   )r   r&   r   Fr   r   zImage description: z

User question: zZ

Note: This model doesn't support question-answering about images, only image captioning.)r   r   r   r   r   r   image_to_textr   )imager&   r   responser   resultrs   r   r   r      s*   

 z+image_text_to_text_wrapper.<locals>.chat_fnr   r   r   rs   r   image_text_to_text_wrapper   s   r   c                 C  s(   |s| g g fS | |d d |d d fS )Nconversationgenerated_responsespast_user_inputsr   )r&   stater   r   r   chatbot_preprocess   s   


r   c                 C  s*   t t| d d | d d dd}|| fS )Nr   r   r   F)strict)rB   zip)r   chatbot_historyr   r   r   chatbot_postprocess  s   

r   r   c                   s    fdd}|S )Nc                   sJ   dvrt dd jsJ dkr j|  jdS  j|  jdS )N)tabular_classificationtabular_regressionzpipeline type z not supportedr   )model)	TypeErrorr   r   r   )r6   rk   r   r   r   tabular_inner  s   
z&tabular_wrapper.<locals>.tabular_innerr   )rk   r   r   r   r   r   tabular_wrapper  s   	r   configc                   sJ   dd  d D  d< dd  d D  d< h d} fd	d
|D   S )zGStreamlines the interface config dictionary to remove unnecessary keys.c                 S     g | ]}t |qS r   r   get_component_instancer>   	componentr   r   r   rR   )      z/streamline_spaces_interface.<locals>.<listcomp>input_componentsrS   c                 S  r   r   r   r   r   r   r   rR   -  r   output_componentsoutputs>   titlerS   articler   descriptionflagging_optionsc                   s   i | ]}| | qS r   r   )r>   kr   r   r   r]   9  r^   z/streamline_spaces_interface.<locals>.<dictcomp>r   )r   
parametersr   r   r   streamline_spaces_interface'  s   

r   r   r   c                 C  sD   dt | v r
t | dt | v sdt | v rtd| tt | | )N429401zYou must provide an api_keyz1Unauthorized, please make sure you are signed in.)r   r	   r   )r   r   r   r   r   =  s
   
r   endpoint_pathendpoint_methodendpoint_operationbase_url
auth_token
str | Nonec                   s|   di } fdd} dd} dd}g }	g }
 dg D ]7}| dd}| dd}| d	i }| d
g }|rM|dd| d7 }|
| |	d| d|  q&|rs| dd}|	d|  |
d g }|sy|r||p~| |	r|d ||	 d||_|
rg }|
D ]}|tj|tjjd q|tjdtjjd tj	|d}||_
|S )NrequestBodyc               
     sx   d  }ddi} rd  |d< i }i }dg }di }d}|D ]3}|t| k r]|d	d
krB| | ||d < n|d	dkrY|d|d  dt| | }|d7 }q*d}	|r{|t| k r{|di }
|
D ]
}|dv rzd}	 nqp|r|t| k r|	r| | }|rd|d< |}n
d}nt| | }z dkrtj|||d}nb dkrtj	|||	r|nd |	s|nd |d}nI dkrtj
|||	r|nd |	s|nd |d}n0 dkrtj|||	r|nd |	s|nd |d}n dkrtj|||d}ntd |jdv r| W S d|j|jd W S  ty; } zd!t| W  Y d }~S d }~ww )"N/zContent-Typer   zBearer Authorizationr   r   r   inquerynamepath{}   Fr   application/octet-streamzmultipart/form-dataTr       r   )paramsrG   post)r   r   r   rG   putpatchdeletezUnsupported HTTP method: )r            error)
__status__r    r   zError: )rstripr   r=   replacer   r   loadslowerr   r   r   r  r  r+   r    r&   r   )argsr   rG   r   	body_dataoperation_paramsrequest_bodyparam_indexparamis_file_uploadr   r   	file_datar   r   r   r   r   r   r   r   r   endpoint_fnP  s    






z'create_endpoint_fn.<locals>.endpoint_fnsummaryr   r   r   r   schemaenumz (Choices: z, )z    z: zURL of filez    request_body: r  zParameters:rw   )r   kindr  )r   )r   joinrF   extend__doc__inspect	ParameterPOSITIONAL_OR_KEYWORDVAR_POSITIONAL	Signature__signature__)r   r   r   r   r   r  r  r  r   
param_docsparam_namesr  
param_name
param_descparam_schema
param_enum	body_descdocstring_parts
sig_paramsr   new_sigr   r  r   create_endpoint_fnF  sP   S



r.  
param_infocomponents.Componentc           	      C  s   dd l }| d}| d}| di }|d}|d}|d}|d ur3|j|||d|d	}|S |d
v rA|j|||d}|S |dkrO|j|||d}|S |dkr`|j| dd|d}|S |j|||d}|S )Nr   r   r   r  r   r  defaultF)r   rY   valueallow_custom_valueinfonumberintegerrY   r2  r4  booleanarrayz (JSON array)z[])gradior   DropdownNumberCheckboxTextbox)	r/  grr&  param_descriptionr(  
param_typeenum_valuesdefault_valuer   r   r   r   component_from_parameter_schema  sV   




 rE  r  specc                 C  s   d| v r?| d }| dr"|dd }|di di |i S | dr?|ddd	 }|}|D ]}||i }q4|S | S )
z*Resolve schema references in OpenAPI spec.z$refz#/components/schemas/r   r   r   schemasz#/r   N)
startswithrr   r   )r  rF  ref_pathschema_name
path_partscurrentpartr   r   r   resolve_schema_ref  s   

rN  r  components.Component | Nonec                 C  s  ddl }| sdS | di }| dd}| D ]'\}}|dv r?t|di |}|dd	kr?|d
dkr?|jdd  S q|di }|sZ| D ]\}}|drY|} nqL|s^dS t|di |}|di }	|	s|ddkr|di }
i }	|
 D ]N\}}t||}|d}|d	kr|dd|	|< q|dv r|dd|	|< q|dkr|dd|	|< q|dkr|dg |	|< q|dkr|di |	|< q|jdtj|	dd|d}|S )z>Create a Gradio component from an OpenAPI request body schema.r   Nr   r   zRequest Bodyr   r  r   stringformatbinaryFile)rY   r   zapplication/exampleobject
propertiesr   r5  r9  Fr:     )indentr8  )	r;  r   itemsrN  rS  rH  r?  r   dumps)r  rF  r@  r   r   r   content_schemar  json_contentrD  rV  	prop_nameprop_schema	prop_typer   r   r   r   "component_from_request_body_schema  sZ   


r`  methodc                 C  s<   dddddd}| |  d}d| d	| d
|   dS )Nz#61affez#49cc90z#fca130z#f93e3ez#50e3c2)GETPOSTPUTDELETEPATCHz#999z_<span style='display:inline-block;min-width:48px;padding:2px 10px;border-radius:4px;background:zh;color:white;font-weight:bold;font-family:monospace;margin-right:8px;text-align:center;border:2px solid z);box-shadow:0 1px 2px rgba(0,0,0,0.08);'>z</span>)r   upper)ra  	color_mapcolorr   r   r   
method_boxL  s   rj  r<   )r   r   r   r   )r3   r:   r   r;   )rM   rN   r   rO   )rV   rW   r   rN   )rV   rb   r   rN   )rg   rN   r   rh   )rk   r   )r   r   r   r   )r   r   r   r   )rk   r   r   r   )r   rN   r   rN   )r   r   )
r   r   r   r   r   rN   r   r   r   r   )r/  rN   r   r0  )r  rN   rF  rN   r   rN   )r  rN   rF  rN   r   rO  )ra  r   r   r   )1r  
__future__r   r   r  r   r0   r$   r!   r   r(   gradio_client.utilsr   huggingface_hubr   r   r   r;  r   gradio.exceptionsr   r	   r   r9   rL   rU   r`   rf   ri   rj   ru   rz   r   r   r   r   r   r   r   r   r   r   r   r   r.  rE  rN  r`  rj  r   r   r   r   <module>   sV    









	










 

/
9