
    Ig                         d Z ddlmZmZmZmZ ddlmZmZ ddl	m
Z
 ddlmZmZmZmZmZ ddlmZmZmZmZ ddlmZ dZ G d	 d
e
      Zy)zMLX Chat Wrapper.    )AnyIteratorListOptional)AsyncCallbackManagerForLLMRunCallbackManagerForLLMRun)BaseChatModel)	AIMessageAIMessageChunkBaseMessageHumanMessageSystemMessage)ChatGenerationChatGenerationChunk
ChatResult	LLMResult)MLXPipelinez4You are a helpful, respectful, and honest assistant.c                   |    e Zd ZU dZeed<    ee      Zeed<   dZ	e
ed<   de
f fdZ	 	 dd	ee   d
eee      dee   de
def
dZ	 	 dd	ee   d
eee      dee   de
def
dZ	 	 dd	ee   dedee   defdZdedefdZededefd       Zedefd       Z	 	 dd	ee   d
eee      dee   de
dee   f
dZ  xZ!S )ChatMLXa  MLX chat models.

    Works with `MLXPipeline` LLM.

    To use, you should have the ``mlx-lm`` python package installed.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import chatMLX
            from langchain_community.llms import MLXPipeline

            llm = MLXPipeline.from_model_id(
                model_id="mlx-community/quantized-gemma-2b-it",
            )
            chat = chatMLX(llm=llm)

    llmcontentsystem_messageN	tokenizerkwargsc                 Z    t        |   di | | j                  j                  | _        y )N )super__init__r   r   )selfr   	__class__s     `/var/www/html/answerous/venv/lib/python3.12/site-packages/langchain_community/chat_models/mlx.pyr   zChatMLX.__init__5   s$    "6"++    messagesstoprun_managerreturnc                     | j                  |      } | j                  j                  d|g||d|}| j                  |      S N)promptsr%   r&   r   )_to_chat_promptr   	_generate_to_chat_resultr    r$   r%   r&   r   	llm_input
llm_results          r"   r,   zChatMLX._generate9   sS     ((2	'TXX'' 
Kd
GM

 ##J//r#   c                    K   | j                  |      } | j                  j                  d|g||d| d {   }| j                  |      S 7 wr)   )r+   r   
_agenerater-   r.   s          r"   r2   zChatMLX._agenerateF   sa      ((2	.488.. 
Kd
GM
 

 ##J//
s   6AAAtokenizereturn_tensorsc                     |st        d      t        |d   t              st        d      |D cg c]  }| j                  |       }}| j                  j                  ||d|      S c c}w )zHConvert a list of messages into a prompt format expected by wrapped LLM.z+At least one HumanMessage must be provided!z$Last message must be a HumanMessage!T)r3   add_generation_promptr4   )
ValueError
isinstancer   _to_chatml_formatr   apply_chat_template)r    r$   r3   r4   mmessages_dictss         r"   r+   zChatMLX._to_chat_promptS   sy     JKK(2,5CDD=EF$003FF~~11"&)	 2 
 	
 Gs   A)messagec                     t        |t              rd}n=t        |t              rd}n*t        |t              rd}nt	        dt        |             ||j                  dS )z+Convert LangChain message to ChatML format.system	assistantuserzUnknown message type: )roler   )r9   r   r
   r   r8   typer   )r    r>   rC   s      r"   r:   zChatMLX._to_chatml_formati   sW     g}-D+D.D5d7m_EFF99r#   r0   c                     g }| j                   d   D ]>  }t        t        |j                        |j                        }|j                  |       @ t        || j                        S )Nr   r   )r>   generation_info)generations
llm_output)rG   r   r
   textrF   appendr   rH   )r0   chat_generationsgchat_generations       r"   r-   zChatMLX._to_chat_resultw   sj    ''* 	5A,!!&&11CTCTO ##O4		5 (Z5J5J
 	
r#   c                      y)Nzmlx-chat-wrapperr   )r    s    r"   	_llm_typezChatMLX._llm_type   s    !r#   c           	   +     K   dd l m} ddlm} 	 dd l m} ddlm} |j                  d| j                  j                        }|j                  dd      }|j                  dd      }	|j                  d	d       }
|j                  d
d       }| j                  |dd      }|j                  |d         }| j                  j                  }t         ||| j                  j                  ||
|      t        |	            D ]r  \  \  }}}d }| j                  j                  |j!                               }|r/t#        t%        |            }|r|j'                  ||       | ||k(  s|m||v sr y  y # t        $ r t	        d      w xY ww)Nr   )generate_stepzTCould not import mlx_lm python package. Please install it with `pip install mlx_lm`.model_kwargstempg        
max_tokensd   repetition_penaltyrepetition_context_sizeTnp)r3   r4   r   )r>   )chunk)mlx.corecoremlx_lm.utilsrQ   ImportErrorgetr   pipeline_kwargsr+   arrayr   eos_token_idzipmodelrangedecodeitemr   r   on_llm_new_token)r    r$   r%   r&   r   mxrQ   rR   rS   max_new_tokensrV   rW   r/   prompt_tokensra   tokenprobnrI   rY   s                       r"   _streamzChatMLX._stream   s     	.	!2 zz.$((2J2JK"&&vs3*..|SA.:.>.> $/
 2>1A1A%t2
 ((DQU(V	1.~~22 #"' .!	!
 	MUD1 #'D>>((6D +N44PQ00U0C $)9ddl/	+  	? 	s(   F	E1 EF	(F	-F	1FF	)NN)FN)"__name__
__module____qualname____doc__r   __annotations__r   DEFAULT_SYSTEM_PROMPTr   r   r   r   r   r   r   strr   r   r,   r   r2   boolr+   dictr:   staticmethodr   r-   propertyrO   r   r   rn   __classcell__)r!   s   @r"   r   r      s   & 
$1:O$PNMPIs, , %):>	0{#0 tCy!0 67	0
 0 
0  %)?C	0{#0 tCy!0 ;<	0
 0 
0  (,	
{#
 
 !	

 

,: : : 
I 
* 
 
 "3 " " %):>	:{#: tCy!: 67	:
 : 
%	&:r#   r   N)rr   typingr   r   r   r    langchain_core.callbacks.managerr   r   *langchain_core.language_models.chat_modelsr	   langchain_core.messagesr
   r   r   r   r   langchain_core.outputsr   r   r   r   %langchain_community.llms.mlx_pipeliner   rt   r   r   r#   r"   <module>r      sF     0 0 E   >R fm fr#   