
     `i7              	          	 d dl mZmZ n# e$ r  ed          w xY wd dlmZmZmZmZ d dl	Z
d dlmZ d dlmZmZmZ dedeeeeef                  fdZdedefd	Z G d
 d          Zddeeef         dededefdZddgZdS )    )LlamaLogitsProcessorzXllama-cpp-python is not installed. Please install it with "pip install llama-cpp-python")CharacterLevelParserTokenEnforcerFormatEnforcerAnalyzerTokenEnforcerTokenizerDataN)TupleListUnionllmreturnc                 H   |                      d          d         }g }|                                 |                                 g}t          |                                           D ]}||v r	 |                     ||g                              d          dd          }|                     |g                              d          }t          |          t          |          k    }|                    |||f           #  |                    |ddf           Y xY w|S )N   0utf-8   u   �F)	tokenize	token_bos	token_eosrangen_vocab
detokenizedecodelenappend)r   token_0regular_tokensspecial_tokens	token_idxdecoded_after_0decoded_regularis_word_start_tokens           z/home/jaya/work/projects/VOICE-AGENT/VIET/agent-env/lib/python3.11/site-packages/lmformatenforcer/integrations/llamacpp.py_build_regular_tokens_listr$   
   s&   ll4  $GNmmoos}}7N3;;==)) = =	&&
	=!nngy-ABBII'RRSTSUSUVO!nni[99@@IIO"%o"6"6_9M9M"M!!9o?R"STTTT	=
 !!9eU";<<<<<s   /BDDc                      t                     }dt          t                   dt          f fdd}t	          |                                 |                                           S )Nsentr   c                     	                      |                               d          S #   | d d                   cY S xY w)Nr   r   )r   r   )r&   
decoder_fnr   s    r#   r(   z7build_token_enforcer_tokenizer_data.<locals>.decoder_fn#   sO    	)>>$''..w777	):d3B3i(((((s	   '+ AF)r$   r
   intstrr   r   r   )r   r   use_bitmaskr(   s   `  @r#   #build_token_enforcer_tokenizer_datar,       sy    /44N)c )s ) ) ) ) ) ) ) K%nj#--//S^`c`k`k`m`mnnn    c                       e Zd ZdefdZdej        ej                 dej        ej	                 dej        ej	                 fdZ
dS )LlamaCppLogitsProcessortoken_enforcerc                 R    || _         |rt          |          nd | _        d | _        d S )N)r0   r   analyzermask)selfr0   analyzes      r#   __init__z LlamaCppLogitsProcessor.__init__.   s/    ,BIS.~>>>t			r-   	input_idsscoresr   c                    |                                 }| j        r-| j                            ||                                            | j                            |          j        }| j        %t          j        |j	        t                    | _        n| j                            d           d| j        |<   t          d          || j        <   |S )NTFz-inf)tolistr2   report_raw_logitsr0   get_allowed_tokensallowed_tokensr3   nponesshapeboolfillfloat)r4   r7   r8   token_sequencer=   s        r#   __call__z LlamaCppLogitsProcessor.__call__3   s    "))++= 	MM++NFMMOOLLL,??OO^9d33DIIINN4   $)	.!!&MMtyr-   N)__name__
__module____qualname__r   r6   nptNDArrayr>   intcsinglerE    r-   r#   r/   r/   -   sw        }    
#+bg"6 BI@V [^[fgigp[q      r-   r/   Fcharacter_level_parserr5   c                     t          | t                    rt          |           } t          | |          }t	          ||          S )zBuild the logits processor function that llama.cpp will use to filter the tokens generated by the model. The result
    can be passed in the logits_processor list that is sent to the call or generate() method of llama.cpp models.)
isinstancer   r,   r   r/   )r   rN   r5   r0   s       r#   build_llamacpp_logits_processorrQ   A   sC     #u 71#66"3(>??N">7;;;r-   rQ   r,   )F)	llama_cppr   r   ImportErrorlmformatenforcerr   r   r   r   numpyr>   numpy.typingtypingrI   r	   r
   r   r)   r*   rA   r$   r,   r/   rQ   __all__rM   r-   r#   <module>rY      s  r000000000 r r r
+p
q
qqr t t t t t t t t t t t t           % % % % % % % % % %E d5c43H.I    ,
oU 
o7Q 
o 
o 
o 
o       (< <u6P/P)Q <k <  KO <  Zq < < < < -.S
Ts    