Ë
    µŒj§%  ã                   óÞ   — 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'y)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                   óà  ‡ — 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                 óZ   •— t        ‰| �  di |¤Ž | j                  j                  | _        y )N© )ÚsuperÚ__init__r    r$   )Úselfr%   Ú	__class__s     €úm/var/www/html/Fitness-lenito-AI-main/venv/lib/python3.12/site-packages/langchain_community/chat_models/mlx.pyr)   zChatMLX.__init__D   s$   ø€ Ü‰ÑÑ"˜6Ò"ØŸ™×+Ñ+ˆ�ó    ÚmessagesÚstopÚrun_managerÚreturnc                 óˆ   — | j                  |«      } | j                  j                  d|g||dœ|¤Ž}| j                  |«      S ©N)Úpromptsr/   r0   r'   )Ú_to_chat_promptr    Ú	_generateÚ_to_chat_result©r*   r.   r/   r0   r%   Ú	llm_inputÚ
llm_results          r,   r6   zChatMLX._generateH   sS   € ð ×(Ñ(¨Ó2ˆ	Ø'�T—X‘X×'Ñ'ð 
Ø�K d¸ñ
ØGMñ
ˆ
ð ×#Ñ# JÓ/Ð/r-   c              ‹   ó¤   K  — | j                  |«      } | j                  j                  d|g||dœ|¤Žƒ d {  –—† }| j                  |«      S 7 Œ­wr3   )r5   r    Ú
_agenerater7   r8   s          r,   r<   zChatMLX._agenerateU   sa   è ø€ ð ×(Ñ(¨Ó2ˆ	Ø.˜4Ÿ8™8×.Ñ.ð 
Ø�K d¸ñ
Ø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)r=   Úadd_generation_promptr>   )Ú
ValueErrorÚ
isinstancer   Ú_to_chatml_formatr$   Úapply_chat_template)r*   r.   r=   r>   ÚmÚmessages_dictss         r,   r5   zChatMLX._to_chat_promptb   sz   € ñ ÜÐJÓKÐKä˜( 2™,¬Ô5ÜÐCÓDÐDá=EÓF¹X¸˜$×0Ñ0°Õ3¸XˆÐ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"   )rC   r   r   r   rB   Útyper"   )r*   rH   rM   s      r,   rD   zChatMLX._to_chatml_formatw   sW   € ô �gœ}Ô-Ø‰DÜ˜¤Ô+Ø‰DÜ˜¤Ô.Ø‰DäÐ5´d¸7³m°_ÐEÓFÐFà¨¯©Ñ9Ð9r-   r:   c                 óÔ   — g }| j                   d   D ]>  }t        t        |j                  ¬«      |j                  ¬«      }|j                  |«       Œ@ t        || j                  ¬«      S )Nr   r!   )rH   Úgeneration_info)ÚgenerationsÚ
llm_output)rQ   r   r   ÚtextrP   Úappendr   rR   )r:   Úchat_generationsÚgÚchat_generations       r,   r7   zChatMLX._to_chat_result…   se   € àÐà×'Ñ'¨Ô*ˆAÜ,Ü!¨!¯&©&Ô1À1×CTÑCTôˆOð ×#Ñ# OÕ4ð	 +ô Ø(°Z×5JÑ5Jô
ð 	
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}m} ddlm} |j                  d| j                  j                  «      xs i }	|	j                  dd«      }
|	j                  dd	«      }|	j                  d
d «      }|	j                  dd «      }|	j                  dd«      }|	j                  dd«      }|	j                  dd«      }| j                  |dd¬«      }|j                  |d   «      }| j                  j                  } ||
xs d|||«      } |d ||«      }t         ||| j                  j                   ||¬«      t#        |«      «      D ]ž  \  \  }}}d }t%        |t&        «      s*| j                  j)                  |j+                  «       «      }n| j                  j)                  |«      }|r/t-        t/        |¬«      ¬«      }|r|j1                  ||¬«       |–— ||k(  s|€Œ™||v sŒž y  y # t        $ r t        d«      ‚w xY w­w)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!   )rH   )Úchunk)Úmlx.coreÚcoreÚmlx_lm.utilsr[   Úmlx_lm.sample_utilsr\   r]   ÚImportErrorÚgetr    Úpipeline_kwargsr5   Úarrayr$   Úeos_token_idÚzipÚmodelÚrangerC   ÚintÚdecodeÚitemr   r   Úon_llm_new_token)r*   r.   r/   r0   r%   Úmxr[   r\   r]   r^   r_   Úmax_new_tokensrb   rc   rd   re   rf   r9   Úprompt_tokensrt   ri   rj   ÚtokenÚprobÚnrS   rk   s                              r,   Ú_streamzChatMLX._stream—   s  è ø€ õ 	Ý.ð		Ý!ßPÝ2ð —z‘z .°$·(±(×2JÑ2JÓKÒQÈrˆØ"×&Ñ& v¨sÓ3ˆØ*×.Ñ.¨|¸SÓAˆØ.:×.>Ñ.>Ø  $ó/
Ðð 2>×1AÑ1AØ% tó2
Ðð $×'Ñ'¨°Ó5ˆØ#×'Ñ'¨°Ó5ˆØ".×"2Ñ"2Ð3GÈÓ"KÐà×(Ñ(¨¸DÐQUÐ(ÓVˆ	àŸ™ ¨1¡Ó.ˆà—~‘~×2Ñ2ˆá˜tš{ s¨E°5Ð:LÓMˆá2ØÐ$Ð&=ó
Ðô !$ÙØØ—‘—‘ØØ"3ô	ô �.Ó!ö!
Ñ‰MˆU�D˜1ð #'ˆDÜ˜e¤SÔ)Ø—~‘~×,Ñ,¨U¯Z©Z«\Ó:‘à—~‘~×,Ñ,¨UÓ3�ñ Ü+´NÈ4Ô4PÔQ�ÙØ×0Ñ0°¸UÐ0ÔCØ’ð ˜Ò$¨Ñ)9¸dÀdºlÙñ3!
øô= ò 	Üð?óð ð	üs(   ‚H�G8 ¤G
HÇ/HÇ4HÇ8HÈH)Útool_choiceÚtoolsrƒ   ©ÚautoÚnonec                ó¼  •— |D �cg c]  }t        |«      ‘Œ }}|�¬|rªt        |«      dk7  rt        dt        |«      › d�«      ‚t        |t        «      r|dvrkdd|idœ}nct        |t
        «      r|d   }nMt        |t        «      r/|d   d   d   |d   d   k7  r)t        d	|› d
|d   d   d   › d�«      ‚t        d|› �«      ‚||d<   t        ‰| �   dd|i|¤ŽS c c}w )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.
        rg   zKWhen specifying `tool_choice`, you must provide exactly one tool. Received z tools.r…   ÚfunctionÚname)rN   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'   )	r   ÚlenrB   rC   ÚstrÚboolÚdictr(   Úbind)r*   r„   rƒ   r%   ÚtoolÚformatted_toolsr+   s         €r,   Ú
bind_toolszChatMLX.bind_toolsß   sF  ø€ ñ0 EJÓJÁE¸DÔ1°$Õ7ÀEˆÐJØÐ"¡{Ü�?Ó# qÒ(Ü ð&Ü&)¨/Ó&:Ð%;¸7ðDóð ô ˜+¤sÔ+ØÐ&6Ñ6à *Ø%+¨[Ð$9ñ#‘Kô ˜K¬Ô.Ø-¨aÑ0‘Ü˜K¬Ô.à# AÑ& zÑ2°6Ñ:Ø" :Ñ.¨vÑ6ò7ô %Ø& { mð 4-Ø-<¸QÑ-?À
Ñ-KÈFÑ-SÐ,TÐTUðWóð ô
 !ð!Ø!, ð/óð ð %0ˆF�=Ñ!Ü‰w‰|Ñ< /Ð<°VÑ<Ð<ùò= Ks   †C)NN)FN),Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   Ú__annotations__r   ÚDEFAULT_SYSTEM_PROMPTr#   r$   r   r)   r   r   r	   r�   r   r   r6   r   r<   rŽ   r5   r�   rD   Ústaticmethodr   r7   ÚpropertyrY   r   r   r‚   r
   r   r   r   r   r   r   r   r   r“   Ú__classcell__)r+   s   @r,   r   r   ,   s7  ø… ñð& 
ÓÙ$1Ð:OÔ$P€N�MÓPØ€IˆsÓð, õ ,ð %)Ø:>ñ	0à�{Ñ#ð0ð �t˜C‘yÑ!ð0ð Ð6Ñ7ð	0ð
 ð0ð 
ó0ð  %)Ø?Cñ	0à�{Ñ#ð0ð �t˜C‘yÑ!ð0ð Ð;Ñ<ð	0ð
 ð0ð 
ó0ð  Ø(,ñ	
à�{Ñ#ð
ð ð
ð ! ™ð	
ð
 
ó
ð*:¨ð :¸ó :ð ð
 Ið 
°*ò 
ó ð
ð ð"˜3ò "ó ð"ð %)Ø:>ñ	Fà�{Ñ#ðFð �t˜C‘yÑ!ðFð Ð6Ñ7ð	Fð
 ðFð 
Ð%Ñ	&óFðX RVò	6=à˜˜d 3¨ 8™n¨d°H¸hÐFÑGÑHð6=ð ˜e D¨#¨w°~Ñ/FÈÐ$LÑMÑNð	6=ð
 ð6=ð 
Ð$ kÐ1Ñ	2÷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§      sZ   ðÙ ÷÷ ÷ ÷õ >Ý D÷õ ÷ó õ .Ý )Ý Hå =àRÐ ôi=ˆmõ i=r-   