o
    i'                     @   s  d dl Z d dlZd dlZd dlmZ d dlmZm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mZmZ d dlmZ erSd dlZd dlmZ d dlmZ ned	e d	Zed
e d
Zede dZe
eZdefddZde e!ef de"fddZ#de!e e!ef B de e!ef fddZ$eG dd deZ%eG dd deZ&		d%dede!e e!ef B de"de"de!f
dd Z'	d&d!ed"ej(dB ddfd#d$Z)dS )'    N)	dataclass)TYPE_CHECKINGAny)init_logger)SamplingParams)
LazyLoader)StructuredOutputBackendStructuredOutputGrammarStructuredOutputOptions)get_structured_output_key
llguidancezllguidance.hfzllguidance.torchdatac                 C   sp   t | tr&|  D ]}t| q	d| vr"d| v sd| v r$d| d< d S d S d S t | tr4| D ]}t| q-d S d S )NadditionalProperties
propertiespatternPropertiesF)
isinstancedictvalues$_walk_json_for_additional_propertieslist)r   valueitem r   `/home/ubuntu/vllm_env/lib/python3.10/site-packages/vllm/v1/structured_output/backend_guidance.pyr   "   s   



r   schemareturnc                    s&   dt ttf dtf fdd  | S )zJCheck if JSON schema contains features unsupported by guidance/llguidance.objr   c                    st   t | tsdS d| v rdS |  D ]&}t |tr  |r dS qt |tr7|D ]}t |tr6 |r6  dS q'qdS )NFr   T)r   r   r   r   )r   r   r   check_objectr   r   r   2   s   


z<has_guidance_unsupported_json_features.<locals>.check_object)r   strr   bool)r   r   r   r   &has_guidance_unsupported_json_features/   s   r!   
guide_jsonc                 C   s,   t | trt| }nt| }t| |S N)r   r   jsonloadscopydeepcopyr   )r"   guide_json_objr   r   r   !process_for_additional_propertiesI   s
   

r)   c                   @   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 )GuidanceBackendc                 C   s:   | j jj| _| j jj| _t| jt| jt	| j| _
d S r#   )vllm_configstructured_outputs_configdisable_any_whitespacedisable_additional_propertiesllguidance_hffrom_tokenizer	tokenizermax
vocab_sizelenll_tokenizerselfr   r   r   __post_init__W   s   
zGuidanceBackend.__post_init__request_typegrammar_specr   c                 C   sT   t ||| j| j| _tj| j| jttj	
ddd}t|| j| jd}|  |S )NLLGUIDANCE_LOG_LEVEL1)	log_level)
ll_matcherr5   r3   )serialize_guidance_grammarr-   r.   serialized_grammarr   	LLMatcherr5   intosenvirongetGuidanceGrammarr3   check_error)r7   r9   r:   r>   rr   r   r   compile_grammarc   s$   zGuidanceBackend.compile_grammarmax_num_seqsc                 C   s   t || jjS r#   )llguidance_torchallocate_token_bitmaskr5   r3   )r7   rJ   r   r   r   rL   |   s   z&GuidanceBackend.allocate_token_bitmaskc                 C   s   d S r#   r   r6   r   r   r   destroy   s   zGuidanceBackend.destroyN)__name__
__module____qualname__r8   r
   r   r	   rI   rB   rL   rM   r   r   r   r   r*   U   s    
r*   c                   @   s   e Zd ZU ejed< ejed< eed< dZe	ed< dZ
e	ed< dZeed< d	d
 Z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 )rF   r>   r5   r3   Fprinted_error
terminatedr   rollback_lagc                 C   s2   | j s| j }|rd| _ td| d S d S d S )NTzLLMatcher error: %s)rQ   r>   	get_errorloggerwarning)r7   errr   r   r   rG      s   
zGuidanceGrammar.check_error
request_idtokensr   c                 C   sN   | j j|v r| j r| jsd| _d| _| j rdS | j|}|   |S )zAccepts a list of tokens and advances the parser.

        Returns True if the parser was advanced successfully.
        Returns False if the parser failed to advance.
           T)r5   	eos_tokenr>   
is_stoppedrR   rS   consume_tokensrG   )r7   rX   rY   rH   r   r   r   accept_tokens   s   
	zGuidanceGrammar.accept_tokensc                 C   s>   t |dkrg S | j rg S | j|}|   |d| S )zChecks if the list of tokens are accepted by the parser in sequence.
        Will not advance the parser.

        Returns the prefix list of tokens that are accepted by the parser.
        r   N)r4   r>   r\   validate_tokensrG   )r7   rY   
num_tokensr   r   r   r_      s   
zGuidanceGrammar.validate_tokensr`   Nc                 C   s6   |dkr| j || j  d| _d| _|   d S d S )Nr   F)r>   rollbackrS   rR   rG   )r7   r`   r   r   r   ra      s   zGuidanceGrammar.rollbackbitmaskidxc                 C   s   t | j|| |   d S r#   )rK   fill_next_token_bitmaskr>   rG   )r7   rb   rc   r   r   r   fill_bitmask   s   zGuidanceGrammar.fill_bitmaskc                 C   s   | j S r#   )rR   r6   r   r   r   is_terminated   s   zGuidanceGrammar.is_terminatedc                 C   s   | j   d S r#   )r>   resetr6   r   r   r   rg      s   zGuidanceGrammar.reset)rN   rO   rP   r   rA   __annotations__LLTokenizerrB   rQ   r    rR   rS   rG   r   r   r^   r_   ra   torchTensorre   rf   rg   r   r   r   r   rF      s   
 

rF   Fr9   r:   r-   r.   c              	      sf  dt tt tf B dt ffdd}| tjkr||S | tjkr+tjjdd idS | tj	kr3d}nz| tj
kr;d	}nr| tjkrCd
}nj| tjkrt|t rSt|}n|}|d }g }|d D ]4}	|	d  t fdd|D d }
|
d u rtd  d| |tj|
|	d ||	d |	d d q_|stdtj|S td td| dt||S )Nr:   r   c                    s"    rt | } tjj| d idS )Nwhitespace_flexibledefaults)r)   r   rA   grammar_from_json_schema)r:   )r.   r-   r   r   _process_schema   s   z3serialize_guidance_grammar.<locals>._process_schemaz{"type": "object"}rl   rm   regexgrammarchoicetriggers
structuresbeginc                 3   s    | ]
}  |r|V  qd S r#   )
startswith).0t)rv   r   r   	<genexpr>  s    z-serialize_guidance_grammar.<locals>.<genexpr>zTrigger z not found in triggers r   end)triggerrv   rr   r{   z-No structural tags found in the grammar spec.z>Validation should have already occurred. Please file an issue.z*grammar is not of valid supported types. ())r   r   r   r
   JSONJSON_OBJECTr   rA   ro   REGEXGRAMMARCHOICESTRUCTURAL_TAGr   r$   r%   next
ValueErrorappend	StructTag
to_grammarrU   errorgrammar_from)r9   r:   r-   r.   rp   tps_tagrt   tagsstrigr   )rv   r.   r-   r   r?      sd   








r?   sampling_paramsr1   c                 C   sJ   | j d u rd S t| j \}}t||}tj||}|r#td| d S )NzGrammar error: )structured_outputsr   r?   r   rA   validate_grammarr   )r   r1   r   grmguidance_grmrW   r   r   r   validate_guidance_grammar  s   

r   )FFr#   )*r&   r$   rC   dataclassesr   typingr   r   rj   vllm.loggerr   vllm.sampling_paramsr   vllm.utils.import_utilsr   'vllm.v1.structured_output.backend_typesr   r	   r
   !vllm.v1.structured_output.requestr   r   llguidance.hfhfr/   llguidance.torchrK   globalsrN   rU   objectr   r   r   r    r!   r)   r*   rF   r?   ri   r   r   r   r   r   <module>   sf   

/T
F