
    Ig                         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ee      Zi fd	eeeef      d
eeef   fdZej                  ej                   iZ G d d      Z G d d      ZdddZdddZy)    )deepcopy)Enum)DictListOptional)InferenceClient   )Pipelinec                   0    e Zd ZdZdZdZdZdZed        Z	y)MessageRoleuser	assistantsystemz	tool-callztool-responsec                 @    | D cg c]  }|j                    c}S c c}w N)value)clsrs     [/var/www/html/answerous/venv/lib/python3.12/site-packages/transformers/agents/llm_engine.pyroleszMessageRole.roles!   s    !$%A%%%s   N)
__name__
__module____qualname__USER	ASSISTANTSYSTEM	TOOL_CALLTOOL_RESPONSEclassmethodr        r   r   r      s-    DIFI#M& &r!   r   message_listrole_conversionsc                    g }t        |       } | D ]  }t        |j                               ddhk(  st        d      |d   }|t        j                         vr$t        d| dt        j                          d      ||v r||   |d<   t        |      dkD  r%|d   |d   d   k(  r|d   dxx   d	|d   z   z  cc<   |j                  |        |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#   final_message_listmessager%   s        r   get_clean_message_listr/   &   s     L)L /7<<>"vy&99UVVv{((**tfGK<M<M<O;PPghii##.t4GFO!"Q&76?>PQS>TU[>\+\r"9-AS1SS-%%g./ r!   c            	       X    e Zd ZdZd
defdZg dfdeeeef      dee   dee   defd	Z	y)HfApiEnginezkThis engine leverages Hugging Face's Inference API service, either serverless or with a dedicated endpoint.modelc                 J    || _         t        | j                   d      | _        y )Nx   )timeout)r2   r   client)selfr2   s     r   __init__zHfApiEngine.__init__I   s    
%djj#>r!   Nmessagesstop_sequencesgrammarreturnc                 @   t        |t              }| | j                  j                  ||d|      }n| j                  j                  ||d      }|j                  d   j
                  j                  }|D ]$  }|t        |       d  |k(  s|d t        |        }& |S )Nr#     )stop
max_tokensresponse_format)r@   rA   r   )r/   llama_role_conversionsr6   chat_completionchoicesr.   r&   r+   )r7   r9   r:   r;   responsestop_seqs         r   __call__zHfApiEngine.__call__M   s     *(E[\ {{22~$PW 3 H {{228.]a2bH##A&..66 ' 	6HX()X5#$4s8}n5	6 r!   )z%meta-llama/Meta-Llama-3.1-8B-Instruct)
r   r   r   __doc__strr8   r   r   r   rH   r    r!   r   r1   r1   F   sW    u?c ?
 KMgkT#s(^,>B3iW_`cWd	r!   r1   c            	       Z    e Zd ZdZdefdZ	 d
deeeef      de	ee      de	e   defd	Z
y)TransformersEnginezBThis engine uses a pre-initialized local text-generation pipeline.pipelinec                     || _         y r   )rM   )r7   rM   s     r   r8   zTransformersEngine.__init__g   s	     r!   Nr9   r:   r;   r<   c                     t        |t              }| j                  ||d| j                  j                        }|d   d   d   d   }|)|D ]$  }|t	        |       d  |k(  s|d t	        |        }& |S )Nr>   r?   )stop_strings
max_length	tokenizerr   generated_textr'   r&   )r/   rC   rM   rR   r+   )r7   r9   r:   r;   outputrF   rG   s          r   rH   zTransformersEngine.__call__j   s     *(E[\ 'mm--	  
 !9-.r29= %* :S]N,-9'(83x=.9H: r!   )NN)r   r   r   rI   r
   r8   r   r   rJ   r   rH   r    r!   r   rL   rL   d   sY    L! ! txT#s(^,>FtCy>Qcklocp	r!   rL   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   huggingface_hubr   pipelines.baser
   rJ   r   r/   r   r   rC   r1   rL   DEFAULT_JSONAGENT_REGEX_GRAMMARDEFAULT_CODEAGENT_REGEX_GRAMMARr    r!   r   <module>r^      s   "   ' ' + %	&#t 	& ce d38n)= QUVY[^V^Q_ 8 {// 
 < >  F#  W# r!   