o
    0i>%                     @   s:  d dl Z d dlmZ d dlmZ d dlmZmZm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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OptionalUnion)urlparse
urlunparse)	constants)InferenceProviderMapping)	MimeBytesRequestParameters_b64_encode_bytes_to_dict_open_as_mime_bytes)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__ k/home/kim/smarthome/.venv/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   sz   |d ur| drtd||| jddS |d ur|nt | j}|d u r-td| j dt|| j td||| jddS )Nzhttp://zhttps://r   live)r   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%   r3   r#   r#   r$   _prepare_url2   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 )N!Unexpected binary input for task .Unexpected path input for task  (got )r8   r9   
isinstancebytesr0   r   r   r   r    r8   r9   r:   r#   r#   r$   _prepare_payload_as_dict>   s
   

z(HFInferenceTask._prepare_payload_as_dict)__name__
__module____qualname____doc__strr   r   r(   r
   r2   r7   r   dictrE   __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 )HFInferenceBinaryInputTaskr8   r9   r:   r&   c                 C   s   d S r'   r#   rD   r#   r#   r$   rE   I   s   z3HFInferenceBinaryInputTask._prepare_payload_as_dictextra_payloadc                 C   s   t |}|pi }t|dkpt|dk}t|ttfs't|ts'td| |s-t|S tt	
t||d|dddS )Nr   z5Expected binary inputs or a local path or a URL. Got r@   zutf-8zapplication/json)Z	mime_type)r   lenrB   rC   r   rJ   r0   r   r   jsondumpsr   encode)r    r8   r9   r:   rN   Zhas_parametersr#   r#   r$   _prepare_payload_as_bytesN   s   z4HFInferenceBinaryInputTask._prepare_payload_as_bytesN)
rF   rG   rH   r   rK   r
   r   rE   r   rS   r#   r#   r#   r$   rM   H   s*    
rM   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   i      z"HFInferenceConversational.__init__r8   r9   r:   r&   c                 C   s|   t |}|j}|dp|}|d u s|drd}|d}t|tr5|ddkr5d|d d d	|d< i |||d
S )Nr)   r*   dummyresponse_formattypeZjson_schemaZjson_objectZschema)r\   value)r)   messages)r   Zprovider_idr/   r-   rB   rK   )r    r8   r9   r:   payloadr3   Zpayload_modelr[   r#   r#   r$   rE   l   s   


z2HFInferenceConversational._prepare_payload_as_dictr%   r3   c                 C   s.   | dr|ntjjdd d| }t|S )Nr*   r   r   r6   )r-   r	   r   r   _build_chat_completion_url)r    r%   r3   r   r#   r#   r$   r7   ~   s
   z&HFInferenceConversational._prepare_url)rF   rG   rH   r   r   rK   r
   r   rE   rJ   r7   rL   r#   r#   r!   r$   rT   h   s    
rT   	model_urlr&   c                 C   s`   t | }|jd}|dr| S |dr|d }n	|s d}n|d }|j|d}tt|S )N/z/chat/completionsz/v1z/v1/chat/completions)path)r   rc   rstripendswith_replacerJ   r   )ra   parsedrc   new_path
new_parsedr#   r#   r$   r`      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).0r   detailsr#   r#   r$   
<dictcomp>   s   $ z-_fetch_recommended_models.<locals>.<dictcomp>)r   r/   r	   ZENDPOINTr   r   rP   items)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   ru   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.r4   z'. Supported tasks: 'z	', got: '')huggingface_hub.hf_apirt   
model_infopipeline_tagtagsr0   )r)   r   rt   rx   ry   rz   Zis_conversationalr#   r#   r$   r1      s:   
r1   c                	       s^   e Zd Z fddZdedededee fddZdd
e	e
ef dee defddZ  ZS ) HFInferenceFeatureExtractionTaskc                    rU   )Nr5   rW   rX   r!   r#   r$   r      rY   z)HFInferenceFeatureExtractionTask.__init__r8   r9   r:   r&   c                 C   sN   t |trtd| j dt |trtd| j d| dd|it|S )Nr;   r<   r=   r>   r?   r8   rA   rD   r#   r#   r$   rE      s
   

z9HFInferenceFeatureExtractionTask._prepare_payload_as_dictNrs   request_paramsc                 C   s   t |tr	t|S |S r'   )rB   rC   r   )r    rs   r|   r#   r#   r$   get_response   s   
z-HFInferenceFeatureExtractionTask.get_responser'   )rF   rG   rH   r   r   rK   r
   r   rE   r   rC   r   r}   rL   r#   r#   r!   r$   r{      s    
,r{   )'rP   	functoolsr   pathlibr   typingr   r   r   urllib.parser   r   Zhuggingface_hubr	   rw   r
   Z!huggingface_hub.inference._commonr   r   r   r   r   Z,huggingface_hub.inference._providers._commonr   r   Zhuggingface_hub.utilsr   r   r   r   r   rM   rT   rJ   r`   rK   r.   r1   r{   r#   r#   r#   r$   <module>   s&    4 +