o
    ]۷i                     @   s   zd dl mZ d dlmZ W n ey   edw d dlZd dlmZmZm	Z	m
Z
mZ d dlmZ G dd dejZeG d	d
 d
ZdS )    )	component)	Componentzihaystack is not installed. Please install it with "pip install farm-haystack" or "pip install haystack-aiN)AnyCallableDictListOptional)CharacterLevelParserc                   @   s   e Zd ZdZdS )
_ModelTypeHuggingFaceLocalGeneratorN)__name__
__module____qualname__HUGGINGFACE r   r   ^/home/ubuntu/vllm_env/lib/python3.10/site-packages/lmformatenforcer/integrations/haystackv2.pyr
      s    r
   c                	   @   s   e Zd ZdZddedee fddZej	e
e ddded	eeeef  fd
dZdd Zdee fddZdefddZdd Zdd ZdS )LMFormatEnforcerLocalGeneratorzA generator component for Haystack V2 API that activates the LMFormatEnforcer on the generated text. 
    It wraps a local generator, and should be added to the pipeline instead of itNmodel_componentcharacter_level_parserc                 C   s    || _ || _|  | _d| _dS )zInitialize the generator component
        :param model_component: A local generator component to wrap
        :param character_level_parser: A CharacterLevelParser that will be used to enforce the format of the generatedN)r   r   _resolve_model_type_model_typetoken_enforcer_fn)selfr   r   r   r   r   __init__   s   

z'LMFormatEnforcerLocalGenerator.__init__)repliespromptgeneration_kwargsc                 C   sB   z|    i }|r||d< | jj|fi |W |   S |   w )Nr   )_inject_enforcer_into_modelr   run_release_model_injection)r   r   r   kwargsr   r   r   r      s   z"LMFormatEnforcerLocalGenerator.runc                 C   s$   t | jdr| j  |  | _d S )Nwarm_up)hasattrr   r!   _prepare_token_enforcer_fnr   r   r   r   r   r!   (   s   
z&LMFormatEnforcerLocalGenerator.warm_upreturnc                 C   sJ   | j sd S | jtjkr| jjj}ddlm} ||| j S t	d| jj
 )Nr   )+build_transformers_prefix_allowed_tokens_fnz.Token enforcer not implemented for model type )r   r   r
   r   r   pipeline	tokenizer*lmformatenforcer.integrations.transformersr&   NotImplementedErrorname)r   r(   r&   r   r   r   r#   -   s   
z9LMFormatEnforcerLocalGenerator._prepare_token_enforcer_fnc                 C   sL   | j jj}zt|W S  ty%   ddd tD }td| d| w )N,c                 s   s    | ]}t |jV  qd S N)strr+   ).0tr   r   r   	<genexpr>;   s    zELMFormatEnforcerLocalGenerator._resolve_model_type.<locals>.<genexpr>z-Unsupported local generator component layer: z. Must be one of )r   	__class__r   r
   
ValueErrorjoin)r   generator_component_namesupported_stringsr   r   r   r   6   s   


z2LMFormatEnforcerLocalGenerator._resolve_model_typec                 C   s,   | j sd S | jtjkr| j | jjd< d S d S Nprefix_allowed_tokens_fnr   r   r
   r   r   r   r$   r   r   r   r   ?   s
   z:LMFormatEnforcerLocalGenerator._inject_enforcer_into_modelc                 C   s(   | j sd S | jtjkr| jjd= d S d S r7   r9   r$   r   r   r   r   F   s
   z7LMFormatEnforcerLocalGenerator._release_model_injectionr-   )r   r   r   __doc__r   r   r	   r   r   output_typesr   r.   r   r   r   r!   r   r#   r
   r   r   r   r   r   r   r   r      s    	"
		r   )haystackr   canalsr   ImportErrorenumtypingr   r   r   r   r   lmformatenforcerr	   Enumr
   r   r   r   r   r   <module>   s    