
    Ng                         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dS )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                 \     t                      j        di | | j        j        | _        d S )N )super__init__r   r   )selfr   	__class__s     _/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/chat_models/mlx.pyr   zChatMLX.__init__5   s0    ""6"""+    messagesstoprun_managerreturnc                     |                      |          } | j        j        d|g||d|}|                     |          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   s^     ((22	'TX' 
Kd
 
GM
 

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

 ##J///r#   Ftokenizereturn_tensorsc                      |st          d          t          |d         t                    st          d           fd|D             } j                            ||d|          S )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!c                 :    g | ]}                     |          S r   )_to_chatml_format).0mr    s     r"   
<listcomp>z+ChatMLX._to_chat_prompt.<locals>.<listcomp>`   s'    FFF$0033FFFr#   T)r3   add_generation_promptr4   )
ValueError
isinstancer   r   apply_chat_template)r    r$   r3   r4   messages_dictss   `    r"   r+   zChatMLX._to_chat_promptS   s      	LJKKK(2,55 	ECDDDFFFFXFFF~11"&)	 2 
 
 	
r#   messagec                     t          |t                    rd}nOt          |t                    rd}n7t          |t                    rd}nt	          dt          |                     ||j        dS )z+Convert LangChain message to ChatML format.system	assistantuserzUnknown message type: )roler   )r>   r   r
   r   r=   typer   )r    rA   rF   s      r"   r8   zChatMLX._to_chatml_formati   s     g}-- 	GDD++ 	GDD.. 	GDDEd7mmEEFFF999r#   r0   c                     g }| j         d         D ]@}t          t          |j                  |j                  }|                    |           At          || j                  S )Nr   r   )rA   generation_info)generations
llm_output)rJ   r   r
   textrI   appendr   rK   )r0   chat_generationsgchat_generations       r"   r-   zChatMLX._to_chat_resultw   s    '* 	5 	5A,!!&1111CT  O ##O4444(Z5J
 
 
 	
r#   c                     dS )Nzmlx-chat-wrapperr   )r    s    r"   	_llm_typezChatMLX._llm_type   s    !!r#   c           	   +   T  K   dd l m} ddlm} 	 dd l m} ddlm} n# t          $ r t	          d          w xY w|                    d| j        j                  }|                    dd          }|                    dd          }	|                    d	d           }
|                    d
d           }|                     |dd          }|	                    |d                   }| j
        j        }t           ||| j        j        ||
|          t          |	                    D ]\  \  }}}d }| j
                            |                                          }|r;t#          t%          |                    }|r|                    ||           |V  ||k    s|||v r d S d S )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   )rA   )chunk)mlx.corecoremlx_lm.utilsrT   ImportErrorgetr   pipeline_kwargsr+   arrayr   eos_token_idzipmodelrangedecodeitemr   r   on_llm_new_token)r    r$   r%   r&   r   mxrT   rU   rV   max_new_tokensrY   rZ   r/   prompt_tokensrd   tokenprobnrL   r\   s                       r"   _streamzChatMLX._stream   s3      	......	!!!!!!2222222 	 	 	?  	
 zz.$(2JKK"&&vs33*..|SAA.:.>.> $/
 /
 2>1A1A%t2
 2
 ((DQU(VV	1..~2 #M"'  .!!	!
 	!
 	 	MUD1 #'D>((66D  +N44P4P4PQQQ D00U0CCC $$)9ddll/	 	s    7)NN)FN)"__name__
__module____qualname____doc__r   __annotations__r   DEFAULT_SYSTEM_PROMPTr   r   r   r   r   r   r   strr   r   r,   r   r2   boolr+   dictr8   staticmethodr   r-   propertyrR   r   r   rq   __classcell__)r!   s   @r"   r   r      s         & 
$1M:O$P$P$PNMPPPIs, , , , , , , %):>	0 0{#0 tCy!0 67	0
 0 
0 0 0 0  %)?C	0 0{#0 tCy!0 ;<	0
 0 
0 0 0 0  (,	
 
{#
 
 !	

 

 
 
 
,: : : : : : 
I 
* 
 
 
 \
 "3 " " " X" %):>	: :{#: tCy!: 67	:
 : 
%	&: : : : : : : :r#   r   N)ru   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   rw   r   r   r#   r"   <module>r      sF     0 0 0 0 0 0 0 0 0 0 0 0        E D D D D D                         > = = = = =R f f f f fm f f f f fr#   