o
    vZh~                     @   s*  d dl Z d dlmZ d dlmZ d dlmZmZmZm	Z	 d dl
mZ d dlmZ d dlmZmZmZmZ d dlmZmZ d d	lmZmZmZmZ G d
d deZG dd deZG dd deZdedefddZedddeeee f fddZ edddededdfddZ!G dd deZ"dS )    N)	lru_cache)Path)AnyDictOptionalUnion)	constants)InferenceProviderMapping)RequestParameters_b64_encode_bytes_to_dict_open_as_binary)TaskProviderHelperfilter_none)build_hf_headersget_session	get_tokenhf_raise_for_statusc                	       s   e Zd ZdZdef fddZdee defddZd	ee defd
dZ	dededefddZ
dedededee fddZ  ZS )HFInferenceTaskz&Base class for HF Inference API tasks.taskc                    s    t  jdtjjdd|d d S )Nhf-inferenceprovider)r   base_urlr   )super__init__r   INFERENCE_PROXY_TEMPLATEformat)selfr   	__class__ `/var/www/auris/lib/python3.10/site-packages/huggingface_hub/inference/_providers/hf_inference.pyr      s
   
zHFInferenceTask.__init__api_keyreturnc                 C   s
   |pt  S N)r   )r   r#   r!   r!   r"   _prepare_api_key   s   
z HFInferenceTask._prepare_api_keymodelc                 C   sv   |d ur| drt||| jddS |d ur|nt | j}|d u r,td| j dt|| j t||| jddS )Nzhttp://zhttps://live)Z
providerIdZhf_model_idr   statuszTask z has no recommended model for HF Inference. Please specify a model explicitly. Visit https://huggingface.co/tasks for more info.)
startswithr	   r   _fetch_recommended_modelsget
ValueError_check_supported_task)r   r'   Zmodel_idr!   r!   r"   _prepare_mapping_info   s   z%HFInferenceTask._prepare_mapping_infomapped_modelc                 C   s@   | dr|S | jdv r| j d| d| j S | j d| S )Nr(   feature-extractionzsentence-similarity/models/z
/pipeline/)r+   r   r   )r   r#   r1   r!   r!   r"   _prepare_url'   s   

zHFInferenceTask._prepare_urlinputs
parametersprovider_mapping_infoc                 C   sL   t |trtd| j dt |trtd| j d| d|t|dS )Nz!Unexpected binary input for task .zUnexpected path input for task z (got )r6   r7   )
isinstancebytesr.   r   r   r   r   r6   r7   r8   r!   r!   r"   _prepare_payload_as_dict3   s
   

z(HFInferenceTask._prepare_payload_as_dict)__name__
__module____qualname____doc__strr   r   r&   r	   r0   r5   r   r   r?   __classcell__r!   r!   r   r"   r      s    r   c                   @   sP   e Zd Zdedededee fddZdedededee dee f
dd	Z	d
S )HFInferenceBinaryInputTaskr6   r7   r8   r$   c                 C   s   d S r%   r!   r>   r!   r!   r"   r?   >   s   z3HFInferenceBinaryInputTask._prepare_payload_as_dictextra_payloadc                 C   s   t dd | D }|pi }t|dkpt|dk}t|ttfs.t|ts.td| |sQt|}t|tr<|n|	 }|W  d    S 1 sLw   Y  t
t||d|dS )Nc                 S   s   i | ]\}}|d ur||qS r%   r!   ).0kvr!   r!   r"   
<dictcomp>J   s    zHHFInferenceBinaryInputTask._prepare_payload_as_bytes.<locals>.<dictcomp>r   z5Expected binary inputs or a local path or a URL. Got r;   zutf-8)r   itemslenr<   r=   r   rD   r.   r   readjsondumpsr   encode)r   r6   r7   r8   rG   Zhas_parametersdataZdata_as_bytesr!   r!   r"   _prepare_payload_as_bytesC   s   
 z4HFInferenceBinaryInputTask._prepare_payload_as_bytesN)
r@   rA   rB   r   r   r	   r   r?   r=   rS   r!   r!   r!   r"   rF   =   s*    
rF   c                	       sP   e Zd Z fddZdedededee fddZd	e	d
e	de	fddZ
  ZS )HFInferenceConversationalc                       t  d d S )Nconversationalr   r   r   r   r!   r"   r   ]      z"HFInferenceConversational.__init__r6   r7   r8   r$   c                 C   s@   |j }|dp	|}|d u s|drd}i t|||dS )Nr'   r(   dummy)r'   messages)Zprovider_idr-   r+   r   )r   r6   r7   r8   r1   Zpayload_modelr!   r!   r"   r?   `   s
   z2HFInferenceConversational._prepare_payload_as_dictr#   r1   c                 C   s.   | dr|ntjjdd d| }t|S )Nr(   r   r   r4   )r+   r   r   r   _build_chat_completion_url)r   r#   r1   r   r!   r!   r"   r5   k   s
   z&HFInferenceConversational._prepare_url)r@   rA   rB   r   r   r   r	   r   r?   rD   r5   rE   r!   r!   r   r"   rT   \   s    
rT   	model_urlr$   c                 C   s2   |  d} | dr| d7 } | ds| d7 } | S )N/z/v1z/chat/completionsz/v1/chat/completions)rstripendswith)r]   r!   r!   r"   r\   t   s   


r\      )maxsizec                  C   s8   t  jtj dt d} t|  dd |   D S )Nz
/api/tasks)headersc                 S   s$   i | ]\}}|t t|d  dqS )ZwidgetModelsN)nextiter)rH   r   detailsr!   r!   r"   rK      s   $ z-_fetch_recommended_models.<locals>.<dictcomp>)r   r-   r   ZENDPOINTr   r   rO   rL   )responser!   r!   r"   r,      s   r,   r'   r   c              
   C   s   ddl m} | | }|j}|jpg }d|v }|dv r5|dkr5|r$d S |dkr*d S td|  d| d|d	krJ|dkr?d S td|  d| d|d
krZ|rV|dkrVd S td|dv rh|dv rh||v rhd S ||kr}td|  d| d| d| d	d S )Nr   )HfApirV   )text-generationrV   ri   zModel 'z' doesn't support task 'z'.ztext2text-generationzimage-text-to-textz<Non-conversational image-text-to-text task is not supported.r2   z'. Supported tasks: 'z	', got: '')huggingface_hub.hf_apirh   
model_infopipeline_tagtagsr.   )r'   r   rh   rl   rm   rn   Zis_conversationalr!   r!   r"   r/      s:   
r/   c                       s@   e Zd Z fddZd	deeef dee de	fddZ
  ZS )
 HFInferenceFeatureExtractionTaskc                    rU   )Nr3   rW   rX   r   r!   r"   r      rY   z)HFInferenceFeatureExtractionTask.__init__Nrg   request_paramsr$   c                 C   s   t |tr	t|S |S r%   )r<   r=   r   )r   rg   rp   r!   r!   r"   get_response   s   
z-HFInferenceFeatureExtractionTask.get_responser%   )r@   rA   rB   r   r   r=   r   r   r
   r   rq   rE   r!   r!   r   r"   ro      s    ,ro   )#rO   	functoolsr   pathlibr   typingr   r   r   r   Zhuggingface_hubr   rk   r	   Z!huggingface_hub.inference._commonr
   r   r   r   Z,huggingface_hub.inference._providers._commonr   r   Zhuggingface_hub.utilsr   r   r   r   r   rF   rT   rD   r\   r,   r/   ro   r!   r!   r!   r"   <module>   s$    0+