o
    .iR/                     @  sX  d dl m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
 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mZmZ e
r[d dlZd dlmZ ned
e dZede dZej dkrze!dZ"e"j#Z$e"j%Z&nd dl&Z&d dl$Z$eG dd deZ'eG dd deZ(d#ddZ)d$ddZ*d%ddZ+d&d!d"Z,dS )'    )annotationsN)	dataclassfield)TYPE_CHECKING)escape)SamplingParams)
LazyLoader)StructuredOutputBackendStructuredOutputGrammarStructuredOutputOptions)OutlinesVocabularyget_outlines_cacheget_outlines_vocabularyocoutlines_corejson_schemazoutlines_core.json_schema)      rec                   @  s:   e Zd Zdd Zdd	d
ZdddZdddZdd ZdS )OutlinesBackendc                 C  s   t | j| _t | _d S N)r   	tokenizer
vocabularyr   cacheself r   g/home/ubuntu/veenaModal/venv/lib/python3.10/site-packages/vllm/v1/structured_output/backend_outlines.py__post_init__4   s   zOutlinesBackend.__post_init__regex_stringstrr   r   returnoc.Indexc                 C  s@   |j  d| }|| jv r| j| S t||j}|| j|< |S )N_)_hashr   r   Indexinner)r   r   r   	cache_keyindexr   r   r   _compile_index8   s   


zOutlinesBackend._compile_indexrequest_typer   grammar_specr
   c                 C  s   |t jkrt|}n+|t jkr|}n#|t jkr.t|}dd |D }dd| d }nt	d|d| 
|| j}| jjd urH| jjjnd}t| jtj||dd	S )
Nc                 S  s   g | ]}t |qS r   )regex_escape).0cr   r   r   
<listcomp>M   s    z3OutlinesBackend.compile_grammar.<locals>.<listcomp>(|)z+Invalid request type for Outlines backend (r   )max_rollback)
vocab_sizeguide)r   JSONr   build_regex_from_schemaREGEXCHOICEastliteral_evaljoin
ValueErrorr)   r   vllm_configspeculative_confignum_speculative_tokensOutlinesGrammarr4   r   Guide)r   r*   r+   regexchoicesr(   max_rollback_tokensr   r   r   compile_grammarD   s(   





zOutlinesBackend.compile_grammarmax_num_seqsinttorch.Tensorc                 C  s(   t j|| jd d fdt jt j dS )N       )dtype
pin_memory)torchfullr4   int32cudais_available)r   rG   r   r   r   allocate_token_bitmask^   s   z&OutlinesBackend.allocate_token_bitmaskc                 C  s   d S r   r   r   r   r   r   destroyf   s   zOutlinesBackend.destroyN)r   r    r   r   r!   r"   )r*   r   r+   r    r!   r
   )rG   rH   r!   rI   )__name__
__module____qualname__r   r)   rF   rT   rU   r   r   r   r   r   2   s    


r   c                   @  s   e Zd ZU ded< eddZded< edd dddd	Zded
< edddddZded< d%ddZd&ddZ	d'ddZ
d(ddZd)d d!Zd"d# Zd$S )*rA   rH   r4   F)hashzoc.Guider5   c                   C  s   dS )Nr   r   r   r   r   r   <lambda>o   s    zOutlinesGrammar.<lambda>)default_factoryreprrY   initnum_processed_tokens)defaultr]   r\   rY   bool_prev_finished
request_idr    tokens	list[int]r!   c                 C  s8   | j |r|D ]}| j | |  jd7  _qdS 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.
           TF)r5   accepts_tokensadvancer^   )r   rb   rc   tr   r   r   accept_tokensv   s   zOutlinesGrammar.accept_tokens
num_tokensNonec                 C  s   | j | |  j|8  _d S r   )r5   rollback_stater^   )r   rj   r   r   r   rollback   s   zOutlinesGrammar.rollbackc                 C  s6   g }|D ]}| | | j|s|   |S q|S r   )appendr5   rf   pop)r   rc   acceptedtokr   r   r   validate_tokens   s   
zOutlinesGrammar.validate_tokensbitmaskrI   idxc                 C  s(   || }| j | | |  d S r   )r5   write_mask_intodata_ptrnumelelement_size)r   rs   rt   maskr   r   r   fill_bitmask   s    zOutlinesGrammar.fill_bitmaskc                 C  s   | j  }| j}|| _|S r   )r5   is_finishedra   )r   currprevr   r   r   is_terminated   s   
zOutlinesGrammar.is_terminatedc                 C  s   d| _ d| _| j  d S )Nr   F)r^   ra   r5   resetr   r   r   r   r      s   zOutlinesGrammar.resetN)rb   r    rc   rd   r!   r`   )rj   rH   r!   rk   )rc   rd   r!   rd   )rs   rI   rt   rH   r!   rk   r!   r`   )rV   rW   rX   __annotations__r   r5   r^   ra   ri   rm   rr   rz   r~   r   r   r   r   r   rA   j   s   
 



	
rA   paramsr   c              
   C  s  | j d u rd S | j }|jrt|j d S |jrct|jtr;zt|j |j}W n/ tjy: } ztd|d }~ww zt	|j}W n t
yW } ztd| |d }~ww t|}t| d S |jr}dd |jD }dd| d }t| d S |jrtdd S )	Nz#Invalid JSON grammar specification.z1Error serializing structured outputs jsonschema: c                 S  s   g | ]}t t|qS r   )r,   r    )r-   choicer   r   r   r/      s    z?validate_structured_output_request_outlines.<locals>.<listcomp>r0   r1   r2   zKOutlines structured outputs backend does not support grammar specifications)structured_outputsrC   validate_regex_is_buildablejson
isinstancer    loadsJSONDecodeErrorr=   dumps	Exceptionr   r7   r   r<   grammar)r   	so_paramsschemaepatternrD   rC   r   r   r   +validate_structured_output_request_outlines   sF   



r   r!   r`   c                   s  d fdd t | dr| jn| }|D ]r\}}|tjks$|tjtjfv r' dS |tjkr?t|d r5 dS  |d r> dS q|tj	krad}|d	 D ]}t|rT  dS  |rZd}qJ|r` dS q|tj
tjtjfv rn dS |tjkrt|d
 r| dS  |d
 r dS qdS )z@Return True if there's a look-around/anchor before any consumer.r!   r`   c                   s   t | dr| jn| }|D ]M\}}|tjtjtjfv r dS |tjkr3|\}}}|dkr2 |r2 dS q|tjkrK|\}}t fdd|D rJ dS q|tj	krY |d rY dS qdS )z=Return True if subpattern can consume at least one character.dataTr   c                 3  s    | ]} |V  qd S r   r   )r-   brsubpattern_consumesr   r   	<genexpr>   s    zE_prefix_needs_context.<locals>.subpattern_consumes.<locals>.<genexpr>r   F)
hasattrr   	sre_parseLITERALINANY
MAX_REPEATBRANCHany
SUBPATTERN)parsedrc   ttypetvalr#   mxsubbranchesr   r   r   r      s$   


z2_prefix_needs_context.<locals>.subpattern_consumesr   Tr   Fre      Nr   )r   r   r   ATsre_constantsASSERT
ASSERT_NOTr   _prefix_needs_contextr   r   r   r   r   )r   rc   r   r   saw_consumerr   r   r   r   r      sD   


r   rk   c                 C  s   t | dr| jn| }|D ]J\}}|tjtjfv rtd|tjtjfv r(td|tj	kr:|tj
tjfv r9tdq|tjkrK|d D ]}t| qCq|tjkrVt|d  qdS )z6Check for regex features unsupported by regex-automatar   zBackreferences are unsupported.z&Look-Around assertion are unsupported.z(Unicode word boundaries are unsupported.re   r   N)r   r   r   GROUPREFGROUPREF_EXISTSr=   r   r   r   r   AT_BOUNDARYAT_NON_BOUNDARYr   _check_unsupportedr   )r   rc   r   r   branchr   r   r   r     s$   



r   r   r    c              
   C  s   zt | }W n tjy } ztd| |d}~ww zt| W n ty8 } z	td| d|d}~ww t|rDtd|  dS )a[  
    Validates that the input regex is not using unsupported features
    of the `regex-automata` crate (outlines_core regex engine) and has a
    universal start state.
    definition of universal start state used can be found at:
    https://docs.rs/regex-automata/latest/regex_automata/dfa/trait.Automaton.html#method.universal_start_state
    zError parsing regex: Nz7Regex uses unsupported feature for structured outputs: um   . Only basic matching constructs are supported—lookarounds, backreferences, and unicode boundaries are not.a<  Regex does not have a anchored universal start stateThis means that the Regex uses anchors (^) or look-arounds in a way which requires context before any token is matched.structured outputs needs regexes that can match without needing that context. Try rewriting the pattern without using these constructs. Pattern:
)r   parser   errorr=   r   r   )r   r   r   r   r   r   r   *  s.   
r   )r   r   r   )r!   rk   )r   r    r!   rk   )-
__future__r   r:   	importlibr   sysdataclassesr   r   typingr   rO   rC   r   r,   vllm.sampling_paramsr   vllm.utils.import_utilsr   'vllm.v1.structured_output.backend_typesr	   r
   r   vllm.v1.structured_output.utilsr   r   r   r   r   outlines_core.json_schemar   globalsversion_infoimport_module_re_parserr   
_constantsr   r   rA   r   r   r   r   r   r   r   r   <module>   s@   

7
;
$
E