U
    di                     @   s   d dl mZ d dlmZ d dlmZmZmZ d dlm	Z	 ddl
mZ G dd deeZi feeeef  eeef d	d
dZejejiZG dd dZG dd dZdddZdddZdS )    )deepcopy)Enum)DictListOptional)InferenceClient   )Pipelinec                   @   s,   e Zd ZdZdZdZdZdZedd Z	dS )	MessageRoleuserZ	assistantsystemz	tool-callztool-responsec                 C   s   dd | D S )Nc                 S   s   g | ]
}|j qS  )value).0rr   r   B/tmp/pip-unpacked-wheel-bm_b0l5e/transformers/agents/llm_engine.py
<listcomp>#   s     z%MessageRole.roles.<locals>.<listcomp>r   )clsr   r   r   roles!   s    zMessageRole.rolesN)
__name__
__module____qualname__USERZ	ASSISTANTZSYSTEMZ	TOOL_CALLTOOL_RESPONSEclassmethodr   r   r   r   r   r
      s   r
   )message_listrole_conversionsc                 C   s   g }t | } | D ]}t| ddhks0td|d }|t kr^td| dt  d||krr|| |d< t|dkr|d |d d kr|d d  d	|d  7  < q|| q|S )
z
    Subsequent messages with the same role will be concatenated to a single message.

    Args:
        message_list (`List[Dict[str, str]]`): List of chat messages.
    rolecontentz6Message should contain only 'role' and 'content' keys!zIncorrect role z, only z are supported for now.r   z	
=======
)r   setkeys
ValueErrorr
   r   lenappend)r   r   Zfinal_message_listmessager   r   r   r   get_clean_message_list&   s     r&   c                   @   sN   e Zd ZdZd
edddZg dfeeeef  ee ee eddd	Z	dS )HfApiEnginezkThis engine leverages Hugging Face's Inference API service, either serverless or with a dedicated endpoint.%meta-llama/Meta-Llama-3.1-8B-Instruct)modelc                 C   s   || _ t| j dd| _d S )Nx   )timeout)r)   r   client)selfr)   r   r   r   __init__I   s    zHfApiEngine.__init__Nmessagesstop_sequencesgrammarreturnc                 C   s   t |td}|d k	r*| jj||d|d}n| jj||dd}|jd jj}|D ],}|t| d  |krN|d t|  }qN|S )Nr     )stop
max_tokensZresponse_format)r6   r7   r   )r&   llama_role_conversionsr,   Zchat_completionchoicesr%   r   r#   )r-   r0   r1   r2   responsestop_seqr   r   r   __call__M   s       zHfApiEngine.__call__)r(   )
r   r   r   __doc__strr.   r   r   r   r<   r   r   r   r   r'   F   s      r'   c                   @   sL   e Zd ZdZedddZd	eeeef  e	ee  e	e edddZ
dS )
TransformersEnginezBThis engine uses a pre-initialized local text-generation pipeline.pipelinec                 C   s
   || _ d S )Nr@   )r-   rA   r   r   r   r.   g   s    zTransformersEngine.__init__Nr/   c                 C   st   t |td}| j||d| jjd}|d d d d }|d k	rp|D ],}|t| d  |krB|d t|  }qB|S )Nr4   r5   )Zstop_strings
max_length	tokenizerr   Zgenerated_textr   r   )r&   r8   rA   rC   r#   )r-   r0   r1   r2   outputr:   r;   r   r   r   r<   j   s    zTransformersEngine.__call__)NN)r   r   r   r=   r	   r.   r   r   r>   r   r<   r   r   r   r   r?   d   s       
 r?   regexzhThought: .+?\nAction:\n\{\n\s{4}"action":\s"[^"\n]+",\n\s{4}"action_input":\s"[^"\n]+"\n\}\n<end_action>)typer   zCThought: .+?\nCode:\n```(?:py|python)?\n(?:.|\s)+?\n```<end_action>N)copyr   enumr   typingr   r   r   Zhuggingface_hubr   Zpipelines.baser	   r>   r
   r&   r   r   r8   r'   r?   ZDEFAULT_JSONAGENT_REGEX_GRAMMARZDEFAULT_CODEAGENT_REGEX_GRAMMARr   r   r   r   <module>   s"   ( 