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   g/home/ubuntu/veenaModal/venv/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| j| _d S r#   )	vllm_configstructured_outputs_configdisable_any_whitespacedisable_additional_propertiesllguidance_hffrom_tokenizer	tokenizer
vocab_size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_matcherr3   r2   )serialize_guidance_grammarr-   r.   serialized_grammarr   	LLMatcherr3   intosenvirongetGuidanceGrammarr2   check_error)r5   r7   r8   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_bitmaskr3   r2   )r5   rH   r   r   r   rJ   |   s   z&GuidanceBackend.allocate_token_bitmaskc                 C   s   d S r#   r   r4   r   r   r   destroy   s   zGuidanceBackend.destroyN)__name__
__module____qualname__r6   r
   r   r	   rG   r@   rJ   rK   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 )rD   r<   r3   r2   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)rO   r<   	get_errorloggerwarning)r5   errr   r   r   rE      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)r3   	eos_tokenr<   
is_stoppedrP   rQ   consume_tokensrE   )r5   rV   rW   rF   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)lenr<   rZ   validate_tokensrE   )r5   rW   
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<   rollbackrQ   rP   rE   )r5   r_   r   r   r   r`      s   zGuidanceGrammar.rollbackbitmaskidxc                 C   s   t | j|| |   d S r#   )rI   fill_next_token_bitmaskr<   rE   )r5   ra   rb   r   r   r   fill_bitmask   s   zGuidanceGrammar.fill_bitmaskc                 C   s   | j S r#   )rP   r4   r   r   r   is_terminated   s   zGuidanceGrammar.is_terminatedc                 C   s   | j   d S r#   )r<   resetr4   r   r   r   rf      s   zGuidanceGrammar.reset)rL   rM   rN   r   r?   __annotations__LLTokenizerr@   rO   r    rP   rQ   rE   r   r   r\   r^   r`   torchTensorrd   re   rf   r   r   r   r   rD      s   
 

rD   Fr7   r8   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 )Nr8   r   c                    s"    rt | } tjj| d idS )Nwhitespace_flexibledefaults)r)   r   r?   grammar_from_json_schema)r8   )r.   r-   r   r   _process_schema   s   z3serialize_guidance_grammar.<locals>._process_schemaz{"type": "object"}rk   rl   regexgrammarchoicetriggers
structuresbeginc                 3   s    | ]
}  |r|V  qd S r#   )
startswith).0t)ru   r   r   	<genexpr>  s    z-serialize_guidance_grammar.<locals>.<genexpr>zTrigger z not found in triggers r   end)triggerru   rq   rz   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   r?   rn   REGEXGRAMMARCHOICESTRUCTURAL_TAGr   r$   r%   next
ValueErrorappend	StructTag
to_grammarrS   errorgrammar_from)r7   r8   r-   r.   ro   tps_tagrs   tagsstrigr   )ru   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   r?   validate_grammarr   )r   r1   r   grmguidance_grmrU   r   r   r   validate_guidance_grammar  s   

r   )FFr#   )*r&   r$   rA   dataclassesr   typingr   r   ri   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.torchrI   globalsrL   rS   objectr   r   r   r    r!   r)   r*   rD   r=   rh   r   r   r   r   r   <module>   sf   

/T
F