
    7|hD                        d dl Z d dlZd dlmZmZ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 d dl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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( d d	l)m*Z*m+Z+ d d
l,m-Z-m.Z.m/Z/ d dl0m1Z1m2Z2 d dl3m4Z4 d dl5m6Z6 d dl7m8Z8m9Z9m:Z:  ejv                  e<      Z= G d de      Z>de$de?fdZ@de!de?fdZAy)    N)AnyCallableDictIteratorListLiteralMappingOptionalSequenceTypeUnioncast)urlparse)CallbackManagerForLLMRun)BaseChatModel)LanguageModelInput)	AIMessageAIMessageChunkBaseMessageBaseMessageChunkChatMessageChatMessageChunkFunctionMessageHumanMessageHumanMessageChunkInvalidToolCallSystemMessageSystemMessageChunkToolCallToolMessageToolMessageChunk)tool_call_chunk)make_invalid_tool_callparse_tool_call)ChatGenerationChatGenerationChunk
ChatResult)RunnableRunnableConfig)BaseTool)convert_to_openai_tool)	BaseModelFieldPrivateAttrc                   j    e Zd ZU dZeed<   	 eed<   	 dZeed<   	 dZe	ed<   	 dZ
eee      ed	<   	 dZee	   ed
<   	  ee      Zeed<   	  e       Zeed<   def fdZedefd       Zd.dZedeeef   fd       Z	 d/dee   d	eee      dedeeef   fdZ	 	 d0dee   d	eee      dee   dedef
dZ	 d/dddedee    d	eee      dede!e"   f
 fdZ#	 	 d0dee   d	eee      dee   dede!e$   f
dZ%edeeef   fd       Z&	 d/d	eee      dedeeef   f fdZ'edefd       Z(e)d e*eef   defd!       Z+e)d e*eef   d"ede"fd#       Z,e)d.d$       Z-e)d%edefd&       Z.e)d'e*eef   defd(       Z/dd)d*e0e1eeef   e2e3   e4e5f      d+ee1eee6d,   e7f      dede8eef   f fd-Z9 xZ:S )1
ChatMlflowa  `MLflow` chat models API.

    To use, you should have the `mlflow[genai]` python package installed.
    For more information, see https://mlflow.org/docs/latest/llms/deployments.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatMlflow

            chat = ChatMlflow(
                target_uri="http://localhost:5000",
                endpoint="chat",
                temperature=0.1,
            )
    endpoint
target_urig        temperature   nNstop
max_tokens)default_factoryextra_params_clientkwargsc                     t        |   di | | j                          	 ddlm}  || j
                        | _        y # t        $ r}t        d| j                   d      |d }~ww xY w)Nr   )get_deploy_clientz;Failed to create the client. Please run `pip install mlflowz#` to install required dependencies. )	super__init___validate_urimlflow.deploymentsr=   r2   r:   ImportError_mlflow_extras)selfr;   r=   e	__class__s       e/var/www/html/test/engine/venv/lib/python3.12/site-packages/langchain_community/chat_models/mlflow.pyr@   zChatMlflow.__init__[   su    "6"		<,T__=DL 	1151D1D0E F)) 		s   A   	A(	A##A(returnc                      y)Nz[genai]r>   rE   s    rH   rD   zChatMlflow._mlflow_extrasi   s        c                     | j                   dk(  ry g d}t        | j                         j                  |vrt        d| j                    d| d      y )N
databricks)httphttpsrN   zInvalid target URI: z. The scheme must be one of .)r2   r   scheme
ValueError)rE   alloweds     rH   rA   zChatMlflow._validate_urim   s\    ??l*1DOO$++7:&t&7 8--4IQ8  ;rL   c                     | j                   | j                  | j                  | j                  | j                  | j
                  | j                  d}|S )Nr2   r1   r3   r5   r6   r7   r9   rV   )rE   paramss     rH   _default_paramszChatMlflow._default_paramsw   sG     //++II// --"
 rL   messagesc                    |D cg c]  }t         j                  |       }}|| j                  | j                  d| j                  |}| j
                  xs |x}r||d<   | j                  | j                  |d<   |S c c}w )N)rY   r3   r5   r6   r7   )r0   _convert_message_to_dictr3   r5   r9   r6   r7   )rE   rY   r6   r;   messagemessage_dictsdatas          rH   _prepare_inputszChatMlflow._prepare_inputs   s     IQ
=DJ//8
 
 &++ 
 	 

  
 99$$4$DL??&!%D
s   A?run_managerc                      | j                   ||fi |}| j                  j                  | j                  |      }t        j                  |      S )Nr1   inputs)r_   r:   predictr1   r0   _create_chat_result)rE   rY   r6   r`   r;   r^   resps          rH   	_generatezChatMlflow._generate   sV     $t##
 

 ||##T]]4#H--d33rL   )r6   inputconfigc          	   +      K   t        | j                  d      s't        t         | j                  |f||d|       y t        |   ||fd|i|E d {    y 7 w)Npredict_stream)ri   r6   r6   )hasattrr:   r   r   invoker?   stream)rE   rh   ri   r6   r;   rG   s        rH   rn   zChatMlflow.stream   sd      t||%56  +$++e"XF"XQW"X  w~eVI$I&IIIs   AAAAc              +     K    | j                   ||fi |}| j                  j                  | j                  |      }d }|D ]  }|d   r|d   d   }	|	d   }
||
j	                  d      }t
        j                  |
|      }i }|	j	                  d      x}r||d<   |	j	                  d      x}r||d<   t        ||xs d       }|r|j                  |j                  ||	       |  y w)
Nrb   choicesr   deltarolefinish_reasonlogprobsr\   generation_info)chunkrt   )
r_   r:   rk   r1   getr0   _convert_delta_to_message_chunkr&   on_llm_new_tokentext)rE   rY   r6   r`   r;   r^   
chunk_iterfirst_chunk_rolerw   choicechunk_deltachunk_messagerv   rs   rt   s                  rH   _streamzChatMlflow._stream   s0     $t##
 
 \\00$--PT0U
 	EYy)!,$Wo#+'2v'>$ * J J!1! #%$*JJ$??=?7DOO4%zz*55852:OJ/+)?;Rd 00

%( 1   =	s   C)C+c                     | j                   S N)rX   rK   s    rH   _identifying_paramszChatMlflow._identifying_params   s    ###rL   c                 B    i | j                   t        |   dd|i|S )z>Get the parameters used to invoke the model FOR THE CALLBACKS.r6   r>   )rX   r?   _get_invocation_params)rE   r6   r;   rG   s      rH   r   z!ChatMlflow._get_invocation_params   s5    
""
g,A$A&A
 	
rL   c                      y)zReturn type of chat model.zmlflow-chatr>   rK   s    rH   	_llm_typezChatMlflow._llm_type   s     rL   _dictc           
         | d   }t        t        | j                  d            }|dk(  rt        |      S |dk(  rg|xs d}i }g }g }| j                  d      x}r)||d<   |D ]  }	 |j	                  t        |d	             ! t        ||| j                  d
      ||      S |dk(  rt        |      S t        ||      S # t        $ r.}|j	                  t        |t        |                   Y d }~d }~ww xY w)Nrr   contentuserr   	assistant 
tool_callsT)	return_idid)r   additional_kwargsr   r   invalid_tool_callssystemr   rr   )r   strrx   r   appendr$   	Exceptionr#   r   r   r   )	r   rr   r   r   r   r   raw_tool_callsraw_tool_callrF   s	            rH   _convert_dict_to_messagez#ChatMlflow._convert_dict_to_message   s   V}sEIIi016>00[ mG&(J!#!&<!88~82@!,/%3 M"))+MTJ "399T?%#5  X 11wT:: % *112=#a&I s   %C  	C7	$C22C7default_rolec           
      D   | j                  d|      }| j                  d      xs d}|dk(  rt        |      S |dk(  ri }g }| j                  d      x}rX||d<   	 |D cg c]G  }t        |d   j                  d	      |d   j                  d
      |j                  d      |d         I }}t	        ||| j                  d      |      S |dk(  rt        |      S |dk(  r t        || d   | j                  d            S t        ||      S c c}w # t        $ r Y qw xY w)Nrr   r   r   r   r   r   r   functionname	argumentsr   index)r   argsr   r   )r   r   r   tool_call_chunksr   tooltool_call_id)r   r   r   r   )rx   r   r"   KeyErrorr   r   r!   r   )r   r   rr   r   r   r   r   rtcs           rH   ry   z*ChatMlflow._convert_delta_to_message_chunk   sW    yy.))I&,"6>$W55[ &(!!&<!88~82@!,/ $2(   (!$Z!4!4V!<!$Z!4!4[!A"wwt}"%g,	($ ( ""399T?!1	  X%g66V^#eN.C		RV  $G$??1(   s%   D AD+D D 	DDc                      t        d      )N~Function messages are not supported by Databricks. Please create a feature request at https://github.com/mlflow/mlflow/issues.)rS   r>   rL   rH   _raise_functions_not_supportedz)ChatMlflow._raise_functions_not_supportedH  s    T
 	
rL   r\   c                 n   d| j                   i}| j                  xs | j                  j                  d      x}||d<   t	        | t
              r| j                  |d<   nt	        | t              rd|d<   nt	        | t              rd|d<   | j                  s| j                  rK| j                  D cg c]  }t        |       c}| j                  D cg c]  }t        |       c}z   |d<   nfd| j                  v rW| j                  d   |d<   h d}|d   D cg c]*  }|j                         D ci c]  \  }}||v r|| c}}, c}}}|d<   n	 d|v r|d   xs d |d<   nt	        | t              rd|d<   nzt	        | t              rAd	|d<   | j                   |d
<   h d}|j                         D ci c]  \  }}||v s|| }}}n)t	        | t"              rt%        d      t%        d|        d| j                  v rt&        j)                          |S c c}w c c}w c c}}w c c}}}w c c}}w )Nr   r   rr   r   r   r   >   r   typer   r   r   r   >   rr   r   r   r   zGot unknown message type: function_call)r   r   r   rx   
isinstancer   rr   r   r   r   r   !_lc_tool_call_to_openai_tool_call)_lc_invalid_tool_call_to_openai_tool_callitemsr   r    r   r   rS   r0   r   )	r\   message_dictr   tctool_call_supported_props	tool_callkvsupported_propss	            rH   r[   z#ChatMlflow._convert_message_to_dictO  s]   !7??3LLIG$=$=$A$A&$IIDV#'L g{+#*<<L .#)L +#.L !!W%?%?DKDVDV.>@5b9. &88 >bA.\* !:!::-4-F-F|-T\*,F) &2,%?. . " %.OO$5 Aq 99 1.\* |+*6y*A*ITY'/#+L -#)L +2+?+?L(AO!-!3!3!5Ao9M1L  1X 
 9'CDDg777557S..&s0   2HHH*4H$H*7H1H1$H*responsec                     g }| d   D ]J  }t         j                  |d         }|j                  di       }t        ||      }|j	                  |       L | j                  di       }t        ||      S )Nrp   r\   usageru   )generations
llm_output)r0   r   rx   r%   r   r'   )r   r   r~   r\   r   gens         rH   re   zChatMlflow._create_chat_result  s    y) 	$F 99&:KLGJJw+E  %C s#	$ Wb)keDDrL   )tool_choicetoolsr   )autononerequiredanyc                d   |D cg c]  }t        |       }}rzt        t              rdvraddidnYt        t              r;|D cg c]
  }|d   d    }}t	        fd|D              s t        d d| d      t        d	       |d
<   t        |   dd|i|S c c}w 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.
                Can be  a dictionary, pydantic model, callable, or BaseTool. Pydantic
                models, callables, and BaseTools will be automatically converted to
                their schema dictionary representation.
            tool_choice: Which tool to require the model to call.
                Options are:
                name of the tool (str): calls corresponding tool;
                "auto": automatically selects a tool (including no tool);
                "none": model does not generate any tool calls and instead must
                    generate a standard assistant message;
                "required": the model picks the most relevant tool in tools and
                    must generate a tool call;

                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.
        )r   r   r   r   r   )r   r   c              3   4   K   | ]  }|d    d   k(    yw)r   r   Nr>   ).0	tool_namer   s     rH   	<genexpr>z(ChatMlflow.bind_tools.<locals>.<genexpr>  s(      ! Z!8!@@s   zTool choice z1 was specified, but the only provided tools were rQ   zEUnrecognized tool_choice type. Expected str, bool or dict. Received: r   r   r>   )r+   r   r   dictr   rS   r?   bind)	rE   r   r   r;   r   formatted_toolsformatted_tool
tool_namesrG   s	     `     rH   
bind_toolszChatMlflow.bind_tools  s   @ EJJD1$7JJ+s+&BB *%+[$9#K K. +:& #:.v6
   %/  %&{m 4//9l!= 
 !!!,/  %0F=!w|</<V<<9 Ks   B(B-)rI   Nr   )NN);__name__
__module____qualname____doc__r   __annotations__r3   floatr5   intr6   r
   r   r7   r-   r   r9   r.   r:   r   r@   propertyrD   rA   r   rX   r   r_   r   r'   rg   r   r)   r   r   rn   r&   r   r   r   r   staticmethodr	   r   ry   r   r[   re   r   r   r   r,   r   r*   r   boolr(   r   __classcell__)rG   s   @rH   r0   r0   9   s   " MO K#AsJ7 $D(49
$ $J$3t4L$47=GS      
c3h 
 
 %){# tCy! 	
 
c3h4 %):>	4{#4 tCy!4 67	4
 4 
4$ ,0J
 %)J!J (J
 tCy!J J 
"	#J, %):>	-{#- tCy!- 67	-
 - 
%	&-^ $T#s(^ $ $ +/
T#Y'
:=
	c3h
 3   ;S(9 ;k ; ;B %@sCx %@03%@	%@ %@N 
 
 4+ 4$ 4 4l Egc3h&7 EJ E E( <=d38nd9oxQRS<= $W%FGMN
	<= <= 
$k1	2<= <=rL   r0   r   rI   c                 L    d| d   | d   t        j                  | d         ddS Nr   r   r   r   )r   r   )r   r   r   )jsondumps)r   s    rH   r   r     s4    of%If$56
 rL   invalid_tool_callc                 &    d| d   | d   | d   ddS r   r>   )r   s    rH   r   r     s.     %%f-*62
 rL   )Br   loggingtypingr   r   r   r   r   r   r	   r
   r   r   r   r   urllib.parser   langchain_core.callbacksr   langchain_core.language_modelsr   #langchain_core.language_models.baser   langchain_core.messagesr   r   r   r   r   r   r   r   r   r   r   r   r   r    r!   langchain_core.messages.toolr"   *langchain_core.output_parsers.openai_toolsr#   r$   langchain_core.outputsr%   r&   r'   langchain_core.runnablesr(   r)   langchain_core.toolsr*   %langchain_core.utils.function_callingr+   pydanticr,   r-   r.   	getLoggerr   loggerr0   r   r   r   r>   rL   rH   <module>r      s         " = 8 B    " 9 S R = ) H  
		8	$X= X=v d 
&
	
rL   