§
    šŠtj¥%  ã                   óæ   — d Z ddlmZmZmZmZmZmZ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 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d	l m!Z! dd
l"m#Z# ddl$m%Z% dZ& G d„ de¦  «        Z'dS )zMLX Chat Wrapper.é    )
ÚAnyÚCallableÚDictÚIteratorÚListÚLiteralÚOptionalÚSequenceÚTypeÚUnion)ÚAsyncCallbackManagerForLLMRunÚCallbackManagerForLLMRun)ÚLanguageModelInput)ÚBaseChatModel)Ú	AIMessageÚAIMessageChunkÚBaseMessageÚHumanMessageÚSystemMessage)ÚChatGenerationÚChatGenerationChunkÚ
ChatResultÚ	LLMResult)ÚRunnable)ÚBaseTool©Úconvert_to_openai_tool)ÚMLXPipelinez4You are a helpful, respectful, and honest assistant.c                   óv  ‡ — 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 ddœde!e"e#ee
f         e$e%e&f                  dee"eee'd         ef                  de
de(e)e*f         fˆ 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     €úa/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/chat_models/mlx.pyr*   zChatMLX.__init__D   s0   ø€ Ø�‰ŒÔÐ"Ð"˜6Ð"Ð"Ð"ØœÔ+ˆŒˆˆó    ÚmessagesÚstopÚrun_managerÚreturnc                 ó„   — |                       |¦  «        } | j        j        d|g||dœ|¤Ž}|                      |¦  «        S ©N)Úpromptsr0   r1   r(   )Ú_to_chat_promptr!   Ú	_generateÚ_to_chat_result©r+   r/   r0   r1   r&   Ú	llm_inputÚ
llm_results          r-   r7   zChatMLX._generateH   s^   € ð ×(Ò(¨Ñ2Ô2ˆ	Ø'�T”XÔ'ð 
Ø�K d¸ð
ð 
ØGMð
ð 
ˆ
ð ×#Ò# JÑ/Ô/Ð/r.   c              ‹   ó”   K  — |                       |¦  «        } | j        j        d|g||dœ|¤Žƒ d {V —†}|                      |¦  «        S r4   )r6   r!   Ú
_agenerater8   r9   s          r-   r=   zChatMLX._agenerateU   s€   è è € ð ×(Ò(¨Ñ2Ô2ˆ	Ø.˜4œ8Ô.ð 
Ø�K d¸ð
ð 
Ø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>o   s'   ø€ ÐFÐFÐF¸˜$×0Ò0°Ñ3Ô3ÐFÐFÐFr.   T)r>   Úadd_generation_promptr?   )Ú
ValueErrorÚ
isinstancer   r%   Úapply_chat_template)r+   r/   r>   r?   Úmessages_dictss   `    r-   r6   zChatMLX._to_chat_promptb   s‡   ø€ ð ð 	LÝÐJÑKÔKÐKå˜( 2œ,­Ñ5Ô5ð 	EÝÐCÑDÔDÐDàFÐFÐFÐF¸XÐ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#   )rI   r   r   r   rH   Útyper#   )r+   rL   rQ   s      r-   rC   zChatMLX._to_chatml_formatw   s   € õ �g�}Ñ-Ô-ð 	GØˆDˆDÝ˜¥Ñ+Ô+ð 	GØˆDˆDÝ˜¥Ñ.Ô.ð 	GØˆDˆDåÐEµd¸7±m´mÐEÐEÑFÔFÐFà¨¬Ð9Ð9Ð9r.   r;   c                 óÎ   — g }| j         d         D ]@}t          t          |j        ¬¦  «        |j        ¬¦  «        }|                     |¦  «         ŒAt          || j        ¬¦  «        S )Nr   r"   )rL   Úgeneration_info)ÚgenerationsÚ
llm_output)rU   r   r   ÚtextrT   Úappendr   rV   )r;   Úchat_generationsÚgÚchat_generations       r-   r8   zChatMLX._to_chat_result…   s€   € àÐàÔ'¨Ô*ð 	5ð 	5ˆAÝ,Ý!¨!¬&Ð1Ñ1Ô1À1ÔCTðñ ô ˆOð ×#Ò# OÑ4Ô4Ð4Ð4åØ(°ZÔ5Jð
ñ 
ô 
ð 	
r.   c                 ó   — dS )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}m} ddlm} n# t          $ r t          d¦  «        ‚w xY w|                     d| j	        j
        ¦  «        pi }	|	                     dd¦  «        }
|	                     dd	¦  «        }|	                     d
d ¦  «        }|	                     dd ¦  «        }|	                     dd¦  «        }|	                     dd¦  «        }|	                     dd¦  «        }|                      |dd¬¦  «        }|                     |d         ¦  «        }| j        j        } ||
pd|||¦  «        } |d ||¦  «        }t           ||| j	        j        ||¬¦  «        t#          |¦  «        ¦  «        D ]²\  \  }}}d }t%          |t&          ¦  «        s-| j                             |                     ¦   «         ¦  «        }n| j                             |¦  «        }|r;t-          t/          |¬¦  «        ¬¦  «        }|r|                     ||¬¦  «         |V — ||k    s|�||v r d S Œ³d S )Nr   )Úgenerate_step)Úmake_logits_processorsÚmake_samplerzTCould not import mlx_lm python package. Please install it with `pip install mlx_lm`.Úmodel_kwargsÚtempg        Ú
max_tokenséd   Úrepetition_penaltyÚrepetition_context_sizeÚtop_pg      ð?Úmin_pÚmin_tokens_to_keepé   TÚnp)r>   r?   )ÚsamplerÚlogits_processorsr"   )rL   )Úchunk)Úmlx.coreÚcoreÚmlx_lm.utilsr_   Úmlx_lm.sample_utilsr`   ra   ÚImportErrorÚgetr!   Úpipeline_kwargsr6   Úarrayr%   Úeos_token_idÚzipÚmodelÚrangerI   ÚintÚdecodeÚitemr   r   Úon_llm_new_token)r+   r/   r0   r1   r&   Úmxr_   r`   ra   rb   rc   Úmax_new_tokensrf   rg   rh   ri   rj   r:   Úprompt_tokensrx   rm   rn   ÚtokenÚprobÚnrW   ro   s                              r-   Ú_streamzChatMLX._stream—   sô  è è € ð 	ÐÐÐÐÐØ.Ð.Ð.Ð.Ð.Ð.ð		Ø!Ð!Ð!Ð!Ð!Ð!ØPÐPÐPÐPÐPÐPÐPÐPØ2Ð2Ð2Ð2Ð2Ð2Ð2øåð 	ð 	ð 	Ýð?ñô ð ð	øøøð
 —z’z .°$´(Ô2JÑKÔKÐQÈrˆØ"×&Ò& v¨sÑ3Ô3ˆØ*×.Ò.¨|¸SÑAÔAˆØ.:×.>Ò.>Ø  $ñ/
ô /
Ðð 2>×1AÒ1AØ% tñ2
ô 2
Ðð $×'Ò'¨°Ñ5Ô5ˆØ#×'Ò'¨°Ñ5Ô5ˆØ".×"2Ò"2Ð3GÈÑ"KÔ"KÐà×(Ò(¨¸DÐQUÐ(ÑVÔVˆ	àŸš ¨1¤Ñ.Ô.ˆà”~Ô2ˆà�,˜t˜{ s¨E°5Ð:LÑMÔMˆà2Ð2ØÐ$Ð&=ñ
ô 
Ðõ !$ØˆMØØ””ØØ"3ð	ñ ô õ �.Ñ!Ô!ñ!
ô !
ð 	ð 	Ñ‰MˆU�D˜1ð #'ˆDÝ˜e¥SÑ)Ô)ð 4Ø”~×,Ò,¨U¯ZªZ©\¬\Ñ:Ô:��à”~×,Ò,¨UÑ3Ô3�ð ð Ý+µNÈ4Ð4PÑ4PÔ4PÐQÑQÔQ�Øð DØ×0Ò0°¸UÐ0ÑCÔCÐCØ���ð ˜Ò$Ð$¨Ð)9¸dÀd¸l¸lØ��øð3	ð 	s   �% ¥?)Útool_choiceÚtoolsr‡   ©ÚautoÚnonec                ó0  •— d„ |D ¦   «         }|�í|rët          |¦  «        dk    r t          dt          |¦  «        › d�¦  «        ‚t          |t          ¦  «        r|dvrdd|id	œ}n’t          |t          ¦  «        r	|d
         }ntt          |t
          ¦  «        rM|d
         d         d         |d         d         k    r(t          d|› d|d
         d         d         › d�¦  «        ‚nt          d|› �¦  «        ‚||d<    t          ¦   «         j        dd|i|¤ŽS )a*  Bind tool-like objects to this chat model.

        Assumes model is compatible with OpenAI tool-calling API.

        Args:
            tools: A list of tool definitions to bind to this chat model.
                Supports any tool definition handled by
                :meth:`langchain_core.utils.function_calling.convert_to_openai_tool`.
            tool_choice: Which tool to require the model to call.
                Must be the name of the single provided function or
                "auto" to automatically determine which function to call
                (if any), or a dict of the form:
                {"type": "function", "function": {"name": <<tool_name>>}}.
            **kwargs: Any additional parameters to pass to the
                :class:`~langchain.runnable.Runnable` constructor.
        c                 ó,   — g | ]}t          |¦  «        ‘ŒS r(   r   )rD   Útools     r-   rF   z&ChatMLX.bind_tools.<locals>.<listcomp>÷   s!   € ÐJÐJÐJ¸DÕ1°$Ñ7Ô7ÐJÐJÐJr.   Nrk   zKWhen specifying `tool_choice`, you must provide exactly one tool. Received z tools.r‰   ÚfunctionÚname)rR   r�   r   zTool choice z/ was specified, but the only provided tool was ú.zEUnrecognized tool_choice type. Expected str, bool or dict. Received: r‡   rˆ   r(   )ÚlenrH   rI   ÚstrÚboolÚdictr)   Úbind)r+   rˆ   r‡   r&   Úformatted_toolsr,   s        €r-   Ú
bind_toolszChatMLX.bind_toolsß   s£  ø€ ð0 KÐJÀEÐJÑJÔJˆØÐ" {Ð"Ý�?Ñ#Ô# qÒ(Ð(Ý ðDÝ&)¨/Ñ&:Ô&:ðDð Dð Dñô ð õ ˜+¥sÑ+Ô+ð ØÐ&6Ð6Ð6à *Ø%+¨[Ð$9ð#ð #�Køõ ˜K­Ñ.Ô.ð Ø-¨aÔ0��Ý˜K­Ñ.Ô.ð à# AÔ& zÔ2°6Ô:Ø" :Ô.¨vÔ6ò7ð 7õ %ðW {ð Wð WØ-<¸QÔ-?À
Ô-KÈFÔ-SðWð Wð Wñô ð ð7õ !ð/Ø!,ð/ð /ñô ð ð %0ˆF�=Ñ!Ø�u‰wŒwŒ|Ð<Ð< /Ð<°VÐ<Ð<Ð<r.   )NN)FN)-Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   ÚDEFAULT_SYSTEM_PROMPTr$   r%   r   r*   r   r   r	   r“   r   r   r7   r   r=   r”   r6   r•   rC   Ústaticmethodr   r8   Úpropertyr]   r   r   r†   r
   r   r   r   r   r   r   r   r   r   r˜   Ú__classcell__)r,   s   @r-   r    r    ,   s&  ø€ € € € € € ðð ð& 
ÐÐÑØ$1 MÐ:OÐ$PÑ$PÔ$P€N�MÐPÐPÑPØ€IˆsÐÐÑð, ð ,ð ,ð ,ð ,ð ,ð ,ð %)Ø:>ð	0ð 0à�{Ô#ð0ð �t˜C”yÔ!ð0ð Ð6Ô7ð	0ð
 ð0ð 
ð0ð 0ð 0ð 0ð  %)Ø?Cð	0ð 0à�{Ô#ð0ð �t˜C”yÔ!ð0ð Ð;Ô<ð	0ð
 ð0ð 
ð0ð 0ð 0ð 0ð  Ø(,ð	
ð 
à�{Ô#ð
ð ð
ð ! œð	
ð
 
ð
ð 
ð 
ð 
ð*:¨ð :¸ð :ð :ð :ð :ð ð
 Ið 
°*ð 
ð 
ð 
ñ „\ð
ð ð"˜3ð "ð "ð "ñ „Xð"ð %)Ø:>ð	Fð Fà�{Ô#ðFð �t˜C”yÔ!ðFð Ð6Ô7ð	Fð
 ðFð 
Ð%Ô	&ðFð Fð Fð FðX RVð	6=ð 6=ð 6=à˜˜d 3¨ 8œn¨d°H¸hÐFÔGÔHð6=ð ˜e D¨#¨w°~Ô/FÈÐ$LÔMÔNð	6=ð
 ð6=ð 
Ð$ iÐ/Ô	0ð6=ð 6=ð 6=ð 6=ð 6=ð 6=ð 6=ð 6=ð 6=ð 6=r.   r    N)(rœ   Útypingr   r   r   r   r   r   r	   r
   r   r   Ú langchain_core.callbacks.managerr   r   Úlangchain_core.language_modelsr   Ú*langchain_core.language_models.chat_modelsr   Úlangchain_core.messagesr   r   r   r   r   Úlangchain_core.outputsr   r   r   r   Úlangchain_core.runnablesr   Úlangchain_core.toolsr   Ú%langchain_core.utils.function_callingr   Ú%langchain_community.llms.mlx_pipeliner   rž   r    r(   r.   r-   ú<module>r¬      sá  ðØ Ð ðð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð >Ð =Ð =Ð =Ð =Ð =Ø DÐ DÐ DÐ DÐ DÐ Dðð ð ð ð ð ð ð ð ð ð ð ð ð ðð ð ð ð ð ð ð ð ð ð ð ð .Ð -Ð -Ð -Ð -Ð -Ø )Ð )Ð )Ð )Ð )Ð )Ø HÐ HÐ HÐ HÐ HÐ Hà =Ð =Ð =Ð =Ð =Ð =àRÐ ði=ð i=ð i=ð i=ð i=ˆmñ i=ô i=ð i=ð i=ð i=r.   