o
    :/i`                     @   s  d dl Z d dl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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mZ d dlmZmZmZmZ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' d dl(m)Z) d dl*m+Z+ d dl,m-Z- ddl.m/Z/ ddl0m1Z1 ddl2m3Z3 ddl4m5Z5 e
rd dl6m7Z7m8Z8 ne9e:ef Z7e9e:ef Z8e"e;Z<e9e=e:e>f e:dB f  Z?	 de'de>de:dB fddZ@de'de:dB deAe9e:ef  dB ddde:dB f
ddZBdejCjDd e:de>fd!d"ZEdejCjDd e:d#e:de>fd$d%ZF	d`dejCjDd e:d#e:dB de>fd&d'ZGd(ejCjDd e:fd)d*ZHd(ejCjDfd+d,ZId(ejCjDfd-d.ZJde:dejCjKdB fd/d0ZLed1d2de:d3edefd4d5ZMde:dB deAe9e:ef  dB de'dddef
d6d7ZNede:dB d8ed9efd:d;ZOde:dB deAe9e:ef  dB d8ede'dddefd<d=ZPG d>d? d?ejQjRZSde:dee: fd@dAZTeeTZUedeVe: fdBdCZW	Ddade'de:dEe9e:ef dFe>de9e:ef f
dGdHZXedIdIdIdJddde'dKeAe deAe9e:ef  dB de:dB dLedD deAeY fdMdNZZedIdIdIdJddde'dKeAe deAe9e:ef  dB de:dB dLedO de:fdPdNZZdddDdJddde'dKeAe deAe9e:ef  dB de:dB dLe>de:eAeY B fdQdNZZ	R	S	T	U		SdbdVdWZ[dTdUdeAe: fdXdYZ\dZe:eAeY B dTdUd[e:dB de:eAeY B fd\d]Z]G d^d_ d_e/e' Z^dS )c    N)defaultdictdeque)Set)	lru_cache)TYPE_CHECKINGAnyLiteralcastoverload)ModelConfig
VllmConfig)ChatCompletionMessageParamChatTemplateContentFormatChatTemplateContentFormatOptionChatTemplateResolutionErrorConversationMessageload_chat_templateparse_chat_messagesparse_chat_messages_async)init_logger)cached_get_tokenizer)CachedHfTokenizerHfTokenizer)get_chat_template_fallback_path)cached_get_processor)supports_kw   )BaseRenderer)
DictPrompt)parse_dec_only_prompt)
ChatParams)MultiModalDataDictMultiModalUUIDDict	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*    r7   ^/lsinfo/ai/hellotax_ai/llm_service/venv_vllm/lib/python3.10/site-packages/vllm/renderers/hf.py _try_get_processor_chat_template;   s<   


r9   r*   toolsmodel_configr   c                C   s   |d ur| j ||dS |d u rt| |jd}|d ur|S z| j ||dW S  ty6   tjd| jdd Y nw t|jj	| jd}|d urQt
d| j t|}|S td| j |S )	N)r:   )r$   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)get_chat_templater9   r$   r2   r3   r4   r-   r   	hf_configr<   	info_oncer   
debug_once)r#   r*   r:   r;   pathr7   r7   r8   resolve_chat_templatef   sB   
rC   nodevarnamec                 C   s&   t | tjjr| jdko| j|kS dS )NloadF)r0   jinja2nodesNamectxname)rD   rE   r7   r7   r8   _is_var_access   s   rL   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)r0   rG   rH   GetitemrL   rD   argConstvalueGetattrattrrD   rE   rM   r7   r7   r8   _is_attr_access   s   
rU   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)r0   rG   rH   FilterrD   _is_var_or_elems_accessTestrN   rO   SlicerU   rL   rT   r7   r7   r8   rX      s   
rX   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 rV   )r   popleftfind_allrG   rH   AssigntargetrD   rX   r0   rI   rK   append)r[   rE   related_varnamesrelated_varname
assign_astlhsrhsr7   r7   r8   _iter_nodes_assign_var_or_elems   s   



rf   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 r7   r7   .0_rE   r7   r7   r8   
<listcomp>       z4_iter_nodes_assign_messages_item.<locals>.<listcomp>messages)rf   r]   rG   rH   Foriterr_   rX   r0   rI   rK   )r[   messages_varnamesloop_ast	loop_iterloop_targetrE   r7   r7   r8    _iter_nodes_assign_messages_item   s   
rt   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   rg   r7   r7   rh   r7   r7   r8   rk      rl   z3_iter_nodes_assign_content_item.<locals>.<listcomp>content)rt   r]   rG   rH   rn   ro   r_   rX   r0   rI   rK   )r[   message_varnamesrq   rr   rs   rE   r7   r7   r8   _iter_nodes_assign_content_item   s   rw   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parser2   r3   	exception)r*   hf_chat_utilsjinja_compiledr7   r7   r8   _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   nextrw   StopIterationr2   r3   r~   )r*   r   	jinja_astr7   r7   r8   _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*   r:   r;   T)
is_literalr   )r   )rC   r0   strr   r   )r*   r:   r#   r;   resolved_chat_template
jinja_textdetected_formatr7   r7   r8   %_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)r3   infowarning)r*   r   r   r7   r7   r8   !_log_chat_template_content_format:  s   r   c                C   s.   |dkr|S t | |||d}t| ||d |S )Nr   )r;   )r   r   )r   r   )r*   r:   r   r#   r;   r   r7   r7   r8   $resolve_chat_template_content_formatR  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_methodrG   rH   	CallBlock
set_lineno)selfr   r   bodycall
call_blockr7   r7   r8   r}   r  s
   

zAssistantTracker.parseN)
__name__
__module____qualname__tagsrG   r   ParserrH   Noder}   r7   r7   r7   r8   r   o  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)	rG   sandboxImmutableSandboxedEnvironmentr   extloopcontrolsr}   metafind_undeclared_variables)r*   envparsed_contenttemplate_varsr7   r7   r8   _resolve_chat_template_kwargsz  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 rV   )kindinspect	ParameterVAR_KEYWORDVAR_POSITIONALrK   )ri   pr7   r7   r8   	<genexpr>  s    z4_get_hf_base_chat_template_params.<locals>.<genexpr>)r/   r&   r   	signatureapply_chat_template	frozenset
parametersvalues)r&   base_sigr7   r7   r8   !_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   )ri   k)r#   r7   r8   	<setcomp>  s    z/resolve_chat_template_kwargs.<locals>.<setcomp>c                    s   i | ]\}}| v r||qS r7   r7   )ri   r   v)accept_varsr7   r8   
<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_paramsr7   )r   r#   r8   resolve_chat_template_kwargs  s    
r   .)r:   r*   r   conversationr   c                K      d S rV   r7   r;   r#   r   r:   r*   r   kwargsr7   r7   r8   safe_apply_chat_template     
r   Fc                K   r   rV   r7   r   r7   r7   r8   r     r   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   r:   r*   r   z@An error occurred in `transformers` while applying chat templater7   )	rC   r   r   r   r2   r3   r~   r   r   )	r;   r#   r   r:   r*   r   r   resolved_kwargser7   r7   r8   r     s>   
	mm_uuidsr"   mm_datar!   c                    sp   | d}|du r| S tdd |D sJ dtttttf  |} fdd|D }|r6t| } || d< | S )as  Rebuild mm_uuids after vision_chunk processing.

    When videos are split into chunks, the original UUIDs need to be updated
    to reflect the new UUIDs generated for each chunk.

    Args:
        mm_uuids: Original UUIDs dictionary
        mm_data: Processed multimodal data with vision_chunk items

    Returns:
        Updated UUIDs dictionary with chunk UUIDs
    vision_chunkNc                 s   s    | ]}t |tV  qd S rV   )r0   dictri   itemr7   r7   r8   r     s    z0rebuild_mm_uuids_from_mm_data.<locals>.<genexpr>z+Expected all vision_chunk items to be dictsc                    s"   g | ]}| d   dur qS )uuidN)getr   uuid_valr7   r8   rk     s    z1rebuild_mm_uuids_from_mm_data.<locals>.<listcomp>)r   allr	   listr   r   r   )r   r   vision_chunksvision_chunk_uuidsr7   r   r8   rebuild_mm_uuids_from_mm_data  s   

r   c                    s   |  d}|du rg S tt |D ]#}t|tsJ | ddkr4| dd}| dd} | | q fd	d
t  D }|S )a   Build video prompts from vision_chunk data.

    Collects prompts from video chunks and groups them by video_idx.

    Args:
        mm_data: Processed multimodal data with vision_chunk items

    Returns:
        List of video prompts, one per video.
    r   Ntypevideo_chunk	video_idxr   prompt c                    s   g | ]	}d   | qS )r   )join)ri   r   video_prompts_dictr7   r8   rk   B  s    z4build_video_prompts_from_mm_data.<locals>.<listcomp>)r   r   r   r0   r   r`   sortedr   )r   r   r   r   r   video_promptsr7   r   r8    build_video_prompts_from_mm_data%  s   


r   
prompt_rawvideo_placeholderc                 C   sz   |r;t | tr;t|}| |}t|t|d kr.dtjt	||} | |d 7 } | S t
dt|d t| | S )Nr   r   zVNumber of video placeholders (%d) does not match number of videos (%d) in the request.)r0   r   r   splitlenr   	itertoolschainfrom_iterablezipr3   r   )r   r   r   r   prompt_raw_partsr7   r7   r8   &replace_vision_chunk_video_placeholderJ  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	dB ddf fdd	Z
d
ee dedeee ef fddZd
ee dedeee ef fddZ  ZS )
HfRendererconfigtokenizer_kwargsr%   c                 C   s4   |j }|jr	d }ntttddti|}| ||S )Ntokenizer_clsr7   )r;   skip_tokenizer_initr	   r   r   r   )clsr  r	  r;   r#   r7   r7   r8   from_confige  s   
zHfRenderer.from_configr#   Nc                    s$   t  || t|jjdd| _d S )Nuse_unified_vision_chunkF)super__init__getattrr;   r?   r  )r   r  r#   	__class__r7   r8   r  y  s   

zHfRenderer.__init__rm   paramsc              
   C   s   | j }|  }t||t|j|jd|j||d|j|j	d\}}}t
|||fi | }| jrK|d urK|d urKt||}t|jdd }	t|||	}t|}
|d urW||
d< |d ur_||
d< ||
fS Nr:   )r*   r:   r   r#   r;   )content_formatmedia_io_kwargsmm_processor_kwargsr   multi_modal_datamulti_modal_uuids)r;   get_tokenizerr   r   r*   r   r   chat_template_content_formatr  r  r   get_apply_chat_template_kwargsr  r   r  r?   r  r   r   rm   r  r;   r#   r   r   r   r   r   r   r7   r7   r8   render_messages  sR   


zHfRenderer.render_messagesc              
      s   | j }|  }t||t|j|jd|j||d|j|j	dI d H \}}}t
|||fi | }| jrJ|d urJ|d urJt|jdd }	t|||	}t|}
|d urV||
d< |d ur^||
d< ||
fS r  )r;   r  r   r   r*   r   r   r  r  r  r   r  r  r  r?   r  r   r  r7   r7   r8   render_messages_async  sR   

z HfRenderer.render_messages_async)r   r   r   classmethodr   r   r   r   r  r   r  r   r   r    tupler   r   r  r   __classcell__r7   r7   r  r8   r  d  s<    

8r  rV   )T)r   r"   r   r!   r%   r"   )_r   r  collectionsr   r   collections.abcr   	functoolsr   typingr   r   r   r	   r
   rG   
jinja2.extjinja2.metajinja2.nodesjinja2.parserjinja2.sandboxvllm.configr   r   vllm.entrypoints.chat_utilsr   r   r   r   r   r   r   r   vllm.loggerr   vllm.tokenizersr   vllm.tokenizers.hfr   r   &vllm.transformers_utils.chat_templatesr   !vllm.transformers_utils.processorr   vllm.utils.func_utilsr   baser   inputsr   inputs.preprocessr   r  r    vllm.multimodal.inputsr!   r"   r   r   r   r3   r"  boolr.   r9   r   rC   rH   r   rL   rU   rX   rf   rt   rw   Templater   r   r   r   r   r   	Extensionr   r   r   r   r   r   intr   r   r   r  r  r7   r7   r7   r8   <module>   s  (

+
4





	
	
	
0
#
%


