o
    i0                     @   s  d dl Z d dlmZmZ d dlmZmZ d dlZd dlZ	d dl
mZ d dlm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mZ erOd dlZned
e dZeeZeG dd deZeG dd deZ h dZ!de"e#ef de$fddZ%deddfddZ&dS )    N)	dataclassfield)TYPE_CHECKINGAny)init_logger)SamplingParams)MistralTokenizer)
LazyLoader)StructuredOutputBackendStructuredOutputGrammarStructuredOutputOptions)choice_as_grammarconvert_lark_to_ebnfgrammar_is_likely_larkxgrxgrammarc                   @   s@   e Zd Zdd ZdededefddZdefd	d
Z	dd Z
dS )XgrammarBackendc                 C   s   | j jj| _t| jtr0| jjg}t| jj| _	t
j| jj| jjr%t
jjnt
jj| j	|dd}n
t
jj| j| j	d}t
j|ddtjjd d d| _d| _| j jd ur[| j jj| _d S d S )NT)encoded_vocab
vocab_type
vocab_sizestop_token_idsadd_prefix_space)r      i   )max_threadscache_enabledcache_limit_bytesr   )vllm_configstructured_outputs_configdisable_any_whitespace
isinstance	tokenizerr   eos_token_idlenvocabr   r   TokenizerInfo	is_tekken	VocabTypeRAWBYTE_FALLBACKfrom_huggingfaceGrammarCompilervllmenvsVLLM_XGRAMMAR_CACHE_MBcompilernum_speculative_tokensspeculative_config)selfr   tokenizer_info r3   `/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/v1/structured_output/backend_xgrammar.py__post_init__$   s:   

zXgrammarBackend.__post_init__request_typegrammar_specreturnc                 C   s   |t jkr| jj|| j d}n]|t jkr | jjd| j d}nM|t jkr,| j|}nA|t jkr8| j	|}n5|t j
kr`t|}d|v rYdd |d D }| j||d }n| j|}ntd td|d	ttj|| jd
| j|dS )N)any_whitespacez{"type": "object"}
structuresc                 S   .   g | ]}t j|d  t|d |d dqS beginschemaend)r=   r>   r?   r   StructuralTagItemjsondumps.0sr3   r3   r4   
<listcomp>`       z3XgrammarBackend.compile_grammar.<locals>.<listcomp>triggersz>Validation should have already occurred. Please file an issue.z*grammar is not of valid supported types. ())max_rollback_tokens)matcherr   ctx)r   JSONr.   compile_json_schemar   JSON_OBJECTGRAMMARcompile_grammarREGEXcompile_regexSTRUCTURAL_TAGrB   loadscompile_structural_tagloggererror
ValueErrorXgrammarGrammarr   GrammarMatcherr/   r   )r1   r6   r7   rM   s_tagtagsr3   r3   r4   rR   M   sD   






zXgrammarBackend.compile_grammarmax_num_seqsc                 C   s   t || jS N)r   allocate_token_bitmaskr   )r1   r_   r3   r3   r4   ra   |   s   z&XgrammarBackend.allocate_token_bitmaskc                 C   s   | ` d S r`   )r.   r1   r3   r3   r4   destroy   s   zXgrammarBackend.destroyN)__name__
__module____qualname__r5   r   strr   rR   intra   rc   r3   r3   r3   r4   r   "   s    )
/r   c                   @   s   e Zd ZU eed< eddZejed< eddZ	ej
ed< edd ddddZeed	< edddd
Zeed< dedee defddZdee dee fddZdeddfddZdejdeddfddZdefddZdd ZdS )r[   r   F)hashrL   rM   c                   C   s   dS Nr   r3   r3   r3   r3   r4   <lambda>   s    zXgrammarGrammar.<lambda>)default_factoryreprri   initnum_processed_tokens)defaultrm   ri   _is_terminated
request_idtokensr8   c                 C   sR   | j rdS |D ]}| j|std||  dS |  jd7  _q| j | _ dS )zAccepts a list of tokens and advances the FSM.

        Returns True if the FSM was advanced successfully.
        Returns False if the FSM failed to advance.
        FzIFailed to advance FSM for request %s for tokens %s. Please file an issue.   T)rq   rL   accept_tokenrX   rY   ro   is_terminated)r1   rr   rs   tokenr3   r3   r4   accept_tokens   s   zXgrammarGrammar.accept_tokensc                 C   sF   g }|D ]}| j |r|| q t|dkr!| j t| |S )zChecks if the list of tokens are accepted by the FSM in sequence.
        Will not advance the FSM.

        Returns the prefix list of tokens that are accepted by the FSM.
        r   )rL   ru   appendr"   rollback)r1   rs   accepted_tokensrw   r3   r3   r4   validate_tokens   s   zXgrammarGrammar.validate_tokens
num_tokensNc                 C   s*   | j | |  j|8  _| j  | _d S r`   )rL   rz   ro   rv   rq   )r1   r}   r3   r3   r4   rz      s   zXgrammarGrammar.rollbackbitmaskidxc                 C   s   | j || d S r`   )rL   fill_next_token_bitmask)r1   r~   r   r3   r3   r4   fill_bitmask   s   zXgrammarGrammar.fill_bitmaskc                 C   s   | j S r`   )rq   rb   r3   r3   r4   rv      s   zXgrammarGrammar.is_terminatedc                 C   s   d| _ | j  d S rj   )ro   rL   resetrb   r3   r3   r4   r      s   zXgrammarGrammar.reset)rd   re   rf   rh   __annotations__r   rL   r   r\   rM   CompiledGrammarro   rq   boolrg   listrx   r|   rz   torchTensorr   rv   r   r3   r3   r3   r4   r[      s   
 	r[   >   	date-timejson-pointeruri-templateuri-referencerelative-json-pointeruridateipv4ipv6timeuuidemaildurationhostnamer>   r8   c                    s&   dt ttf dtf fdd  | S )z?Check if JSON schema contains features unsupported by xgrammar.objr8   c                    s   t  tsdS  ddv rd v rdS  ddkr(t fddd	D r(dS  dd
kr;d v r; d tvr;dS  ddkrOt fdddD rOdS   D ]&}t |trb|ra dS qSt |try|D ]}t |trx|rx  dS qiqSdS )NFtype)integernumber
multipleOfTarrayc                 3       | ]}| v V  qd S r`   r3   rE   keyr   r3   r4   	<genexpr>   s
    
zOhas_xgrammar_unsupported_json_features.<locals>.check_object.<locals>.<genexpr>)uniqueItemscontainsminContainsmaxContainsstringformatobjectc                 3   r   r`   r3   r   r   r3   r4   r      s    
)patternPropertiespropertyNames)r   dictgetanySTRING_SUPPORTED_FORMATSvaluesr   )r   valueitemcheck_objectr   r4   r      s6   


z<has_xgrammar_unsupported_json_features.<locals>.check_object)r   rg   r   r   )r>   r3   r   r4   &has_xgrammar_unsupported_json_features   s   )r   sampling_paramsc              
   C   sH  | j du rdS | j }|jr+z	tj|j W n ty* } ztd| |d}~ww |jrUt|j}ztj	| W n tyL } ztd|d}~ww d|_||_
dS |jrt|jtryzt|j}W n tjyx } ztd|d}~ww |j}ztj| W n ty } ztd| |d}~ww t|rtddS |j
rt|j
rzt|j
|_
W n ty } ztd|d}~ww z
tj	|j
 W dS  ty } ztd|d}~ww |jr"z*t|j}d	|v rd
d |d	 D }tj||d  W dS tj|j W dS  ty! } ztd|d}~ww dS )zyValidate that the request is supported by structured output.

    Raises ValueError if the request is not supported.
    Nz*Failed to transform regex into a grammar: z1Failed to transform choices into a grammar: {err}z#Invalid JSON grammar specification.z0Failed to transform json schema into a grammar: zEThe provided JSON schema contains features not supported by xgrammar.z1Failed to convert the grammar from Lark to EBNF. zInvalid grammar specification.r:   c                 S   r;   r<   r@   rD   r3   r3   r4   rG   X  rH   z-validate_xgrammar_grammar.<locals>.<listcomp>rI   z%Invalid structural tag specification.)structured_outputsregexr   Grammar
from_regex	ExceptionrZ   choicer   	from_ebnfgrammarrB   r   rg   rV   JSONDecodeErrorfrom_json_schemar   r   r   structural_tagfrom_structural_tag)r   	so_paramserrchoice_grammarr>   er]   r^   r3   r3   r4   validate_xgrammar_grammar  s   






r   )'rB   dataclassesr   r   typingr   r   r   	vllm.envsr+   vllm.loggerr   vllm.sampling_paramsr   vllm.tokenizers.mistralr   vllm.utils.import_utilsr	   'vllm.v1.structured_output.backend_typesr
   r   r   vllm.v1.structured_output.utilsr   r   r   r   r   globalsrd   rX   r   r[   r   r   rg   r   r   r   r3   r3   r3   r4   <module>   s,   
`G/