o
    .i5                     @   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 d d	lmZmZmZ d d
lmZmZmZ erUd 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)DeepseekV32Tokenizer)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tr| j }tt|| jjd }| j	pJ|}dg| }| D ]\}}||k r`|||< qT| jjg}| jjj }	t
j|	}
t
j||
d |||
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   r   )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_FALLBACKr   	get_vocabmaxmax_token_iditemsbackend_tokenizerto_str_detect_metadata_from_hffrom_huggingfaceGrammarCompilervllmenvsVLLM_XGRAMMAR_CACHE_MBcompilernum_speculative_tokensspeculative_config)selfr   tokenizer_info
vocab_dicttokenizer_vocab_sizer   r   tokenidxbackend_strmetadata rC   g/home/ubuntu/veenaModal/venv/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)rM   rN   rO   r   StructuralTagItemjsondumps.0srC   rC   rD   
<listcomp>v       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   JSONr8   compile_json_schemar!   JSON_OBJECTGRAMMARcompile_grammarREGEXcompile_regexSTRUCTURAL_TAGrR   loadscompile_structural_tagloggererror
ValueErrorXgrammarGrammarr   GrammarMatcherr9   r   )r;   rF   rG   r]   s_tagtagsrC   rC   rD   rb   c   sD   






zXgrammarBackend.compile_grammarmax_num_seqsc                 C   s   t || jS N)r   allocate_token_bitmaskr   )r;   ro   rC   rC   rD   rq      s   z&XgrammarBackend.allocate_token_bitmaskc                 C   s   | ` d S rp   )r8   r;   rC   rC   rD   destroy   s   zXgrammarBackend.destroyN)__name__
__module____qualname__rE   r   strr   rb   intrq   rs   rC   rC   rC   rD   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 )rk   r   F)hashr\   r]   c                   C   s   dS Nr   rC   rC   rC   rC   rD   <lambda>   s    zXgrammarGrammar.<lambda>)default_factoryreprry   initnum_processed_tokens)defaultr}   ry   _is_terminated
request_idtokensrH   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.r   T)r   r\   accept_tokenrh   ri   r   is_terminated)r;   r   r   r?   rC   rC   rD   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   )r\   r   appendr%   rollback)r;   r   accepted_tokensr?   rC   rC   rD   validate_tokens   s   zXgrammarGrammar.validate_tokens
num_tokensNc                 C   s*   | j | |  j|8  _| j  | _d S rp   )r\   r   r   r   r   )r;   r   rC   rC   rD   r      s   zXgrammarGrammar.rollbackbitmaskr@   c                 C   s   | j || d S rp   )r\   fill_next_token_bitmask)r;   r   r@   rC   rC   rD   fill_bitmask   s   zXgrammarGrammar.fill_bitmaskc                 C   s   | j S rp   )r   rr   rC   rC   rD   r      s   zXgrammarGrammar.is_terminatedc                 C   s   d| _ | j  d S rz   )r   r\   resetrr   rC   rC   rD   r      s   zXgrammarGrammar.reset)rt   ru   rv   rx   __annotations__r   r\   r   rl   r]   CompiledGrammarr   r   boolrw   listr   r   r   torchTensorr   r   r   rC   rC   rC   rD   rk      s   
 	rk   >   	date-timejson-pointeruri-templateuri-referencerelative-json-pointeruridateipv4ipv6timeuuidemaildurationhostnamerN   rH   c                    s&   dt ttf dtf fdd  | S )z?Check if JSON schema contains features unsupported by xgrammar.objrH   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 rp   rC   rU   keyr   rC   rD   	<genexpr>   s
    
zOhas_xgrammar_unsupported_json_features.<locals>.check_object.<locals>.<genexpr>)uniqueItemscontainsminContainsmaxContainsstringformatobjectc                 3   r   rp   rC   r   r   rC   rD   r     s    
)patternPropertiespropertyNames)r"   dictgetanySTRING_SUPPORTED_FORMATSvaluesr   )r   valueitemcheck_objectr   rD   r      s6   


z<has_xgrammar_unsupported_json_features.<locals>.check_object)r   rw   r   r   )rN   rC   r   rD   &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.rJ   c                 S   rK   rL   rP   rT   rC   rC   rD   rW   n  rX   z-validate_xgrammar_grammar.<locals>.<listcomp>rY   z%Invalid structural tag specification.)structured_outputsregexr   Grammar
from_regex	Exceptionrj   choicer   	from_ebnfgrammarrR   r"   rw   rf   JSONDecodeErrorfrom_json_schemar   r   r   structural_tagfrom_structural_tag)r   	so_paramserrchoice_grammarrN   erm   rn   rC   rC   rD   validate_xgrammar_grammar"  s   






r   ))rR   dataclassesr   r   typingr   r   r   	vllm.envsr5   vllm.loggerr   vllm.sampling_paramsr   vllm.tokenizers.deepseek_v32r   vllm.tokenizers.mistralr	   vllm.utils.import_utilsr
   'vllm.v1.structured_output.backend_typesr   r   r   vllm.v1.structured_output.utilsr   r   r   r   r   globalsrt   rh   r   rk   r   r   rw   r   r   r   rC   rC   rC   rD   <module>   s.   
uG/