
    qi>%                     l   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e      Z G d de      Z G d de      Z de!de!fdZ" ed      de#e!ee!   f   fd       Z$ ed      de!de!ddfd       Z% G d de      Z&y)    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            	            e Zd ZdZdef fdZdee   defdZdee   defdZ	ded	edefd
Z
dedededee   fdZ xZS )HFInferenceTaskz&Base class for HF Inference API tasks.taskc                 f    t         |   dt        j                  j	                  d      |       y )Nhf-inferenceprovider)r   base_urlr   )super__init__r
   INFERENCE_PROXY_TEMPLATEformat)selfr   	__class__s     c/opt/pipecat/venv/lib/python3.12/site-packages/huggingface_hub/inference/_providers/hf_inference.pyr    zHFInferenceTask.__init__   s2    #77>>>W 	 	
    api_keyreturnc                     |xs
 t               S N)r   )r#   r'   s     r%   _prepare_api_keyz HFInferenceTask._prepare_api_key   s    %)+%r&   modelc                 @   |+|j                  d      rt        d||| j                  d      S ||n"t               j	                  | j                        }|t        d| j                   d      t        || j                         t        d||| j                  d      S )Nzhttp://zhttps://r   live)r   
providerId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,   model_ids      r%   _prepare_mapping_infoz%HFInferenceTask._prepare_mapping_info"   s    !1!12I!J+'EuSWS\S\ek  "-53L3N3R3RSWS\S\3]		{ #Q Q  	h		2'#hUYU^U^gm
 	
r&   mapped_modelc                     |j                  d      r|S | j                  dv r| j                   d| d| j                   S | j                   d| S )Nr.   feature-extractionzsentence-similarity/models/z
/pipeline/)r3   r   r   )r#   r'   r:   s      r%   _prepare_urlzHFInferenceTask._prepare_url2   sb    ""#:; yyII }}oXl^:dii[I	

 MM?(<.9	
r&   inputs
parametersprovider_mapping_infoc                     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 )r@   rA   
isinstancebytesr6   r   r   r   r#   r@   rA   rB   s       r%   _prepare_payload_as_dictz(HFInferenceTask._prepare_payload_as_dict>   sb     fe$@1MNNfd#>tyykPVxWXYZZfJGHHr&   )__name__
__module____qualname____doc__strr    r   r+   r   r9   r?   r   dictrN   __classcell__r$   s   @r%   r   r      s    0
S 
& &# &
8C= 
=U 
 

C 

s 

s 

II'+ID\I	$Ir&   r   c                   R    e Zd Zdedededee   fdZdedededee   dee   f
dZ	y)	HFInferenceBinaryInputTaskr@   rA   rB   r(   c                      y r*    rM   s       r%   rN   z3HFInferenceBinaryInputTask._prepare_payload_as_dictI   s     r&   extra_payloadc                 \   t        |      }|xs i }t        |      dkD  xs t        |      dkD  }t        |t        t        f      st        |t
              st        d|       |st        |      S t        t        j                  t        |      |d|      j                  d      d      S )Nr   z5Expected binary inputs or a local path or a URL. Got rI   zutf-8zapplication/json)	mime_type)r   lenrK   rL   r   rS   r6   r   r   jsondumpsr   encode)r#   r@   rA   rB   r[   has_parameterss         r%   _prepare_payload_as_bytesz4HFInferenceBinaryInputTask._prepare_payload_as_bytesN   s     !,
%+Z1,FM0BQ0F &5$-0FC9PTU[T\]^^ &v.. JJ+f"5ZaS`abiijqr(
 	
r&   N)
rO   rP   rQ   r   rT   r   r   rN   r   rc   rZ   r&   r%   rX   rX   H   si    '+D\	$


 
  8	

  ~
 
)	
r&   rX   c            	       P     e Zd Z fdZdedededee   fdZde	de	de	fd	Z
 xZS )
HFInferenceConversationalc                 $    t         |   d       y )Nconversationalr   r    r#   r$   s    r%   r    z"HFInferenceConversational.__init__i   s    )*r&   r@   rA   rB   r(   c                    t        |      }|j                  }|j                  d      xs |}||j                  d      rd}|j                  d      }t	        |t
              r"|j                  d      dk(  rd|d   d   d	|d<   i |||d
S )Nr,   r.   dummyresponse_formattypejson_schemajson_objectschema)rm   value)r,   messages)r   provider_idr5   r3   rK   rT   )r#   r@   rA   rB   payloadr:   payload_modelrl   s           r%   rN   z2HFInferenceConversational._prepare_payload_as_dictl   s     j),88"w/?< M$<$<=T$U#M$..):;ot,1D1DV1LP]1]%(7A*G%& G'FMvFFr&   r'   r:   c                     |j                  d      r|n$t        j                  j                  d       d| }t	        |      S )Nr.   r   r   r>   )r3   r
   r!   r"   _build_chat_completion_url)r#   r'   r:   r   s       r%   r?   z&HFInferenceConversational._prepare_url~   sP     &&'>? 66==~=VWW_`l_mn 	
 *(33r&   )rO   rP   rQ   r    r   rT   r   r   rN   rS   r?   rU   rV   s   @r%   re   re   h   sP    +GG'+GD\G	$G$4C 4s 4s 4r&   re   	model_urlr(   c                    t        |       }|j                  j                  d      }|j                  d      r| S |j                  d      r|dz   }n
|sd}n|dz   }|j	                  |      }t        t        |            S )N/z/chat/completionsz/v1z/v1/chat/completions)path)r   r{   rstripendswith_replacerS   r	   )rx   parsedr{   new_path
new_parseds        r%   rw   rw      s    i F;;c"D }}() }}U--) 00 h/Jz*%&&r&      )maxsizec                     t               j                  t        j                   dt	                     } t        |        | j                         j                         D ci c]  \  }}|t        t        |d         d         c}}S c c}}w )Nz
/api/tasks)headerswidgetModels)
r   r5   r
   ENDPOINTr   r   r_   itemsnextiter)responser   detailss      r%   r4   r4      ss    }  I$6$6#7z!BL\L^ _H!QYQ^Q^Q`QfQfQhigD$tGN34d;;iiis   !#Br,   r   c                    ddl m}  |       j                  |       }|j                  }|j                  xs g }d|v }|dv r |dk(  r|ry |dk(  ry t        d|  d| d      |d	k(  r|dk(  ry t        d|  d| d      |d
k(  r|r|dk(  ry t        d      |dv r	|dv r||v ry ||k7  rt        d|  d| d| d| d	      y )Nr   )HfApirg   )text-generationrg   r   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.r<   z'. Supported tasks: 'z	', got: '')huggingface_hub.hf_apir   
model_infopipeline_tagtagsr6   )r,   r   r   r   r   r   is_conversationals          r%   r7   r7      s.   ,##E*J**L?? bD(D044,, ((wug-EdV2NOO--$$75')A$rJKK++)9!9WXX 	==IIDL 	 teW4TF:OP\~]fgkfllmn
 	
 r&   c            	       b     e Zd Z fdZdedededee   fdZd
de	e
ef   dee   defd	Z xZS ) HFInferenceFeatureExtractionTaskc                 $    t         |   d       y )Nr=   rh   ri   s    r%   r    z)HFInferenceFeatureExtractionTask.__init__   s    -.r&   r@   rA   rB   r(   c                     t        |t              rt        d| j                   d      t        |t              rt        d| j                   d| d      d|it        |      S )NrD   rE   rF   rG   rH   r@   rJ   rM   s       r%   rN   z9HFInferenceFeatureExtractionTask._prepare_payload_as_dict   si     fe$@1MNNfd#>tyykPVxWXYZZ &<K
$;<<r&   r   request_paramsc                 <    t        |t              rt        |      S |S r*   )rK   rL   r   )r#   r   r   s      r%   get_responsez-HFInferenceFeatureExtractionTask.get_response   s    h&!(++r&   r*   )rO   rP   rQ   r    r   rT   r   r   rN   r   rL   r   r   rU   rV   s   @r%   r   r      s[    /
=
='+
=D\
=	$
=U5$;%7 RcId ps r&   r   )'r_   	functoolsr   pathlibr   typingr   r   r   urllib.parser   r	   huggingface_hubr
   r   r   !huggingface_hub.inference._commonr   r   r   r   r   ,huggingface_hub.inference._providers._commonr   r   huggingface_hub.utilsr   r   r   r   r   rX   re   rS   rw   rT   r4   r7   r   rZ   r&   r%   <module>r      s       ' ' - % ;  Y _ _1I( 1Ih
 
@4 4>'# '# '. 1j4Xc](:#; j j 4( (C (D ( (V r&   