o
    -ibW                     @   s  d dl Z d dl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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mZmZmZmZ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& d dl'm(Z( d dl)m*Z* d dl+m,Z, ddl-m.Z. e!e/Z0e1e2e3e4f e3dB f  Z5	 de&de4de3dB fddZ6de&de3dB de7e1e3ef  dB ddde3dB f
ddZ8de
j9j:de3de4fddZ;de
j9j:de3d e3de4fd!d"Z<	dMde
j9j:de3d e3dB de4fd#d$Z=d%e
j9j:de3fd&d'Z>d%e
j9j:fd(d)Z?d%e
j9j:fd*d+Z@de3de
j9jAdB fd,d-ZBed.d/de3d0edefd1d2ZCde3dB de7e1e3ef  dB de&dddef
d3d4ZDede3dB d5ed6efd7d8ZEde3dB de7e1e3ef  dB d5ede&dddefd9d:ZFG d;d< d<e
jGjHZIde3dee3 fd=d>ZJeeJZKedeLe3 fd?d@ZM	AdNde&de3dBe1e3ef dCe4de1e3ef f
dDdEZNdddAdFddde&dGe7e de7e1e3ef  dB de3dB dHe4de3e7eO B fdIdJZPG dKdL dLe.ZQdS )O    N)deque)Set)	lru_cache)Anycast)ModelConfig)
ChatCompletionMessageParamChatTemplateContentFormatChatTemplateContentFormatOptionChatTemplateResolutionErrorConversationMessage build_video_prompts_from_mm_dataload_chat_templateparse_chat_messagesparse_chat_messages_asyncrebuild_mm_uuids_from_mm_data)
TextPromptTokensPrompt)init_logger)cached_get_tokenizer)CachedHfTokenizerHfTokenizer)get_chat_template_fallback_path)cached_get_processor)supports_kw   )RendererLike	tokenizertrust_remote_codereturnc                C   s   | j |f}|tv rt| S ddlm}m}m} z%t| j |||f|d}t||r;t|dr;|j	 }d ur;|t|< |W S W n t
yN   tjd| j dd Y nw d t|< d S )Nr   )PreTrainedTokenizerPreTrainedTokenizerFastProcessorMixin)processor_clsr   chat_templatez1Failed to load AutoProcessor chat template for %sTexc_info)name_or_path_PROCESSOR_CHAT_TEMPLATEStransformersr    r!   r"   r   
isinstancehasattrr$   	Exceptionloggerdebug)r   r   	cache_keyr    r!   r"   	processorr$    r1   N/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/renderers/hf.py _try_get_processor_chat_template3   s<   


r3   r$   toolsmodel_configr   c                C   s   |d ur|S |d u rt | |jd}|d ur|S z| j||dW S  ty1   tjd| jdd Y nw t|jj	| jd}|d urLt
d| j t|}|S td| j |S )	N)r   )r4   z1Failed to load AutoTokenizer chat template for %sTr%   )
model_typetokenizer_name_or_pathzKLoading chat template fallback for %s as there isn't one defined on HF Hub.z)There is no chat template fallback for %s)r3   r   get_chat_templater,   r-   r.   r'   r   	hf_configr6   	info_oncer   
debug_once)r   r$   r4   r5   pathr1   r1   r2   resolve_chat_template^   sB   
r=   nodevarnamec                 C   s&   t | tjjr| jdko| j|kS dS )NloadF)r*   jinja2nodesNamectxname)r>   r?   r1   r1   r2   _is_var_access   s   rF   keyc                 C   s^   t | tjjrt| j|ot | jtjjo| jj|kS t | tjj	r-t| j|o,| j
|kS dS )NF)r*   rA   rB   GetitemrF   r>   argConstvalueGetattrattrr>   r?   rG   r1   r1   r2   _is_attr_access   s   
rO   c                 C   s   t | tjjr| jd uot| j||S t | tjjr!t| j||S t | tjjr7t | jtjj	r7t| j||S |r?t
| ||S t| |S N)r*   rA   rB   Filterr>   _is_var_or_elems_accessTestrH   rI   SlicerO   rF   rN   r1   r1   r2   rR      s   
rR   rootc                 c   s    | |fV  t |g}|rD| }| tjjD ]'}|j}|j}t||r?t	|tjj
s.J ||jfV  |j|kr?||j q|sd S d S rP   )r   popleftfind_allrA   rB   Assigntargetr>   rR   r*   rC   rE   append)rU   r?   related_varnamesrelated_varname
assign_astlhsrhsr1   r1   r2   _iter_nodes_assign_var_or_elems   s   



r`   c                 c   sp    dd t | dD }| tjjD ]#}|j}|j}|D ]}t||r4t|tjj	s,J ||j
fV   nqqd S )Nc                 S      g | ]\}}|qS r1   r1   .0_r?   r1   r1   r2   
<listcomp>       z4_iter_nodes_assign_messages_item.<locals>.<listcomp>messages)r`   rW   rA   rB   ForiterrY   rR   r*   rC   rE   )rU   messages_varnamesloop_ast	loop_iterloop_targetr?   r1   r1   r2    _iter_nodes_assign_messages_item   s   
rn   c                 c   sp    dd t | D }| tjjD ]$}|j}|j}|D ]}t||dr4t|tjj	s,J ||j
fV   nqqd S )Nc                 S   ra   r1   r1   rb   r1   r1   r2   re      rf   z3_iter_nodes_assign_content_item.<locals>.<listcomp>content)rn   rW   rA   rB   rh   ri   rY   rR   r*   rC   rE   )rU   message_varnamesrk   rl   rm   r?   r1   r1   r2   _iter_nodes_assign_content_item   s   rq   c                 C   sJ   dd l m  m} z|| }|j| W S  ty$   td Y d S w )Nr   z#Error when compiling Jinja template)	&transformers.utils.chat_template_utilsutilschat_template_utils_compile_jinja_templateenvironmentparser,   r-   	exception)r$   hf_chat_utilsjinja_compiledr1   r1   r2   _try_extract_ast   s   

r{       )maxsizedefaultc                C   sZ   t | }|d u r
|S z	tt| W dS  ty   Y dS  ty,   td | Y S w )Nstringz(Error when parsing AST of Jinja templateopenai)r{   nextrq   StopIterationr,   r-   rx   )r$   r~   	jinja_astr1   r1   r2   _detect_content_format   s   
r   c                C   sJ   t || ||d}t|tr|nt| dd}|d u rd}|S t|dd}|S )Nr$   r4   r5   T)
is_literalr   )r~   )r=   r*   strr   r   )r$   r4   r   r5   resolved_chat_template
jinja_textdetected_formatr1   r1   r2   %_resolve_chat_template_content_format  s"   	

r   given_formatr   c                 C   s6   t d| |dkr||krt d|| d S d S d S )NztDetected the chat template content format to be '%s'. You can set `--chat-template-content-format` to override this.autoa  You specified `--chat-template-content-format %s` which is different from the detected format '%s'. If our automatic detection is incorrect, please consider opening a GitHub issue so that we can improve it: https://github.com/vllm-project/vllm/issues/new/choose)r-   infowarning)r$   r   r   r1   r1   r2   !_log_chat_template_content_format0  s   r   c                C   s.   |dkr|S t | |||d}t| ||d |S )Nr   )r5   )r   r   )r   r   )r$   r4   r   r   r5   r   r1   r1   r2   $resolve_chat_template_content_formatH  s   r   c                   @   s,   e Zd ZdhZdejjdejjfddZ	dS )AssistantTracker
generationparserr   c                 C   s@   t |jj}|jddd}| d}tj|g g |}||S )N)zname:endgenerationT)drop_needle_generation_support)	r   streamlinenoparse_statementscall_methodrA   rB   	CallBlock
set_lineno)selfr   r   bodycall
call_blockr1   r1   r2   rw   h  s
   

zAssistantTracker.parseN)
__name__
__module____qualname__tagsrA   r   ParserrB   Noderw   r1   r1   r1   r2   r   e  s    r   c                 C   s4   t jjddtt jjgd}|| }t j|}|S )NT)trim_blockslstrip_blocks
extensions)	rA   sandboxImmutableSandboxedEnvironmentr   extloopcontrolsrw   metafind_undeclared_variables)r$   envparsed_contenttemplate_varsr1   r1   r2   _resolve_chat_template_kwargsp  s   

r   c                  C   s0   ddl m}  t| j}tdd |j D S )Nr   )r    c                 s   s,    | ]}|j tjjtjjfvr|jV  qd S rP   )kindinspect	ParameterVAR_KEYWORDVAR_POSITIONALrE   )rc   pr1   r1   r2   	<genexpr>  s    z4_get_hf_base_chat_template_params.<locals>.<genexpr>)r)   r    r   	signatureapply_chat_template	frozenset
parametersvalues)r    base_sigr1   r1   r2   !_get_hf_base_chat_template_params~  s
   r   Tchat_template_kwargsraise_on_unexpectedc           	         sp   ddh}|r||  @  }rtd| fdd|D }t|}t }||B |B |   fdd| D S )Nr$   tokenizez4Found unexpected chat template kwargs from request: c                    s    h | ]}t  j|d dr|qS )F)allow_var_kwargs)r   r   )rc   k)r   r1   r2   	<setcomp>  s    z/resolve_chat_template_kwargs.<locals>.<setcomp>c                    s   i | ]\}}| v r||qS r1   r1   )rc   r   v)accept_varsr1   r2   
<dictcomp>  s    z0resolve_chat_template_kwargs.<locals>.<dictcomp>)keys
ValueError$_cached_resolve_chat_template_kwargsr   items)	r   r$   r   r   unexpected_varsunexpected_in_kwargsfn_kwr   hf_base_paramsr1   )r   r   r2   resolve_chat_template_kwargs  s    
r   )r4   r$   r   conversationr   c          	   
   K   s|   t |||| d}|d u rtdt|||d}z|jd||||d|W S  ty= } ztd tt||d }~ww )Nr   zAs of transformers v4.44, default chat template is no longer allowed, so you must provide a chat template if the tokenizer does not define one.)r   r$   r   )r   r4   r$   r   z@An error occurred in `transformers` while applying chat templater1   )	r=   r   r   r   r,   r-   rx   r   r   )	r5   r   r   r4   r$   r   kwargsresolved_kwargser1   r1   r2   safe_apply_chat_template  s>   
	r   c                
       s   e Zd Zededeeef ddfddZdedeeef ddf fdd	Z	e
dedB fd
dZdefddZ	ddee dedeee eeB f fddZ	ddee dedeee eeB f fddZ  ZS )
HfRendererconfigtokenizer_kwargsr   r   c                 C   s
   | ||S rP   r1   )clsr   r   r1   r1   r2   from_config  s   
zHfRenderer.from_configNc                    s>   t    || _|jrd }ntttddti|}|| _d S )Ntokenizer_clsr1   )	super__init__r   skip_tokenizer_initr   r   r   r   
_tokenizer)r   r   r   r   	__class__r1   r2   r     s   

zHfRenderer.__init__c                 C   s   | j S rP   )r   )r   r1   r1   r2   r     s   zHfRenderer.tokenizerc                 C   s   | j }|d u rtd|S )Nz7Tokenizer not available when `skip_tokenizer_init=True`)r   r   )r   r   r1   r1   r2   get_tokenizer  s   zHfRenderer.get_tokenizerr   rg   chat_template_content_formatc              
      sJ  | j }|  }t||t|d|d|||dd\}}}t|||fi |}	t|jddr|d ur|d urt||}t|jdd }
|
rt	|	t
rt||	|
 t td krud	 fd
dttD }	|	 d 7 }	ntdt d t t	|	t
rt|	dnt|	d}|d ur||d< |d ur||d< ||fS )Nr$   r4   r$   r4   r   r   r5   content_formatuse_unified_vision_chunkFvideo_placeholderr    c                       g | ]
} | |  qS r1   r1   rc   iprompt_raw_partsvideo_promptsr1   r2   re   <      z.HfRenderer.render_messages.<locals>.<listcomp>VNumber of video placeholders (%d) does not match number of videos (%d) in the request.promptprompt_token_idsmulti_modal_datamulti_modal_uuids)r   r   r   r   getr   getattrr9   r   r*   r   r   splitlenjoinranger-   r   r   r   r   rg   r   r   r5   r   r   mm_datamm_uuids
prompt_rawr   r   r1   r   r2   render_messages  sh   




	zHfRenderer.render_messagesc              
      sR  | j }|  }t||t|d|d|||ddI d H \}}}t|||fi |}	t|jddr|d ur|d urt||}t|jdd }
|
rt	|	t
rt||	|
 t td kryd	 fd
dttD }	|	 d 7 }	ntdt d t t	|	t
rt|	dnt|	d}|d ur||d< |d ur||d< ||fS )Nr$   r4   r   r   r   Fr   r   r   c                    r   r1   r1   r   r   r1   r2   re     r   z4HfRenderer.render_messages_async.<locals>.<listcomp>r   r   r   r   r   r   )r   r   r   r   r   r   r   r9   r   r*   r   r   r   r   r   r  r-   r   r   r   r  r1   r   r2   render_messages_asyncV  sj   




	z HfRenderer.render_messages_async)r   )r   r   r   classmethodr   dictr   r   r   r   propertyr   r   r   listr   r
   tupler   r   r   r  r  __classcell__r1   r1   r   r2   r     sF    



Mr   rP   )T)Rr   collectionsr   collections.abcr   	functoolsr   typingr   r   rA   
jinja2.extjinja2.metajinja2.nodesjinja2.parserjinja2.sandboxvllm.configr   vllm.entrypoints.chat_utilsr   r	   r
   r   r   r   r   r   r   r   vllm.inputsr   r   vllm.loggerr   vllm.tokenizersr   vllm.tokenizers.hfr   r   &vllm.transformers_utils.chat_templatesr   !vllm.transformers_utils.processorr   vllm.utils.func_utilsr   protocolr   r   r-   r	  r  r   boolr(   r3   r  r=   rB   r   rF   rO   rR   r`   rn   rq   Templater{   r   r   r   r   r   	Extensionr   r   r   r   r   r   intr   r   r1   r1   r1   r2   <module>   s  0
+
2





$
	
0