
    hh8                     j   U 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 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 d dlmZmZmZ d dlmZ d dlmZmZm Z  d d	l!m"Z" d d
l#m$Z$ d dl%m&Z&m'Z'm(Z( g dZ)ee*         e+d<    G d de,          Z-dede.fdZ/de*deee*                  de*fdZ0 G d de          Z1dS )    N)
AnyCallableDictIteratorListLiteralOptionalSequenceTypeUnion)CallbackManagerForLLMRun)BaseChatModel)	AIMessageAIMessageChunkBaseMessageChatMessageHumanMessageSystemMessage)ChatGenerationChatGenerationChunk
ChatResult)BaseTool)convert_to_secret_strget_from_dict_or_envget_pydantic_field_namesconvert_to_openai_tool)_build_model_kwargs)Field	SecretStrmodel_validator)systemuser	assistantSUPPORTED_ROLESc                       e Zd ZdZdS )ChatSnowflakeCortexErrorzError with Snowpark client.N)__name__
__module____qualname____doc__     f/var/www/FlaskApp/flask-venv/lib/python3.11/site-packages/langchain_community/chat_models/snowflake.pyr'   r'   +   s        %%%%r-   r'   messagereturnc                 :   d| j         i}t          | t                    r| j        t          v r| j        |d<   nct          | t
                    rd|d<   nHt          | t                    rd|d<   n-t          | t                    rd|d<   nt          d|            |S )zConvert a LangChain message to a dictionary.

    Args:
        message: The LangChain message.

    Returns:
        The dictionary.
    contentroler"   r#   r$   zGot unknown type )	r2   
isinstancer   r3   r%   r   r   r   	TypeError)r/   message_dicts     r.   _convert_message_to_dictr7   /   s     	7?$L
 ';'' 	7GLO,K,K&|V	G]	+	+ 7'V	G\	*	* 7%V	GY	'	' 7*V5G55666r-   textstopc                 b    || S |D ]'}|                      |          }|dk    r
| d|         } (| S )z0Truncates text at the earliest stop token found.N)find)r8   r9   
stop_tokenstop_token_idxs       r.   _truncate_at_stop_tokensr?   J   sM    
 | ) )
:..R(DKr-   c                   N   e Zd ZU dZ ee          Zeee	eee
f         eeef         f         ed<   dZe
ed<   	 dZeed<   	 dZeed	<   	 d
Zeed<   	 dZee         ed<   	 d
Zee         ed<   	  edd          Zee         ed<   	  edd          Zee         ed<   	  edd          Zee         ed<   	  edd          Zee         ed<   	  edd          Zee         ed<   	  edd          Zee         ed<   	  edd          Zee         ed<   	 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#d fd$Z# e$d%&          e%d'eee
f         d#e
fd(                        Z& e$d%&          d'ed#efd)            Z'd3d*Z(e)d#efd+            Z*	 	 d4d,e+e,         d-ee+e                  d.ee-         d"e
d#e.f
d/Z/d0ed-ee+e                  d#e0e1         fd1Z2	 	 d4d,e+e,         d-ee+e                  d.ee-         d"e
d#e0e1         f
d2Z3dS )5ChatSnowflakeCortexa  Snowflake Cortex based Chat model

    To use the chat model, you must have the ``snowflake-snowpark-python`` Python
    package installed and either:

        1. environment variables set with your snowflake credentials or
        2. directly passed in as kwargs to the ChatSnowflakeCortex constructor.

    Example:
        .. code-block:: python

            from langchain_community.chat_models import ChatSnowflakeCortex
            chat = ChatSnowflakeCortex()
    )default_factory
test_toolsNsessionzmistral-largemodelcompletecortex_functionr   temperature
max_tokenstop_pusername)defaultaliassnowflake_usernamepasswordsnowflake_passwordaccountsnowflake_accountdatabasesnowflake_databaseschemasnowflake_schema	warehousesnowflake_warehouser3   snowflake_roleauto)tool_choicetoolsr[   )rZ   anynonekwargsr0   c                j    d |D             }d |D             }| j                             |           | S )z]Bind tool-like objects to this chat model, ensuring they conform to
        expected formats.c                 ,    g | ]}t          |          S r,   r   .0tools     r.   
<listcomp>z2ChatSnowflakeCortex.bind_tools.<locals>.<listcomp>   s!    JJJD1$77JJJr-   c                 (    i | ]}d |v |d          |S )namer,   rb   s     r.   
<dictcomp>z2ChatSnowflakeCortex.bind_tools.<locals>.<dictcomp>   s*      
  
  
#'fnnDL$nnnr-   )rC   update)selfr\   r[   r_   formatted_toolsformatted_tools_dicts         r.   
bind_toolszChatSnowflakeCortex.bind_tools   sU     KJEJJJ 
  
+: 
  
  
 	3444r-   before)modevaluesc                 D    t          |           }t          ||          }|S )z>Build extra kwargs from additional params that were passed in.)r   r   )clsrp   all_required_field_namess      r.   build_extrazChatSnowflakeCortex.build_extra   s'     $<C#@#@ $V-EFFr-   c           	         	 ddl m} n# t          $ r t          d          w xY wt          |dd          |d<   t	          t          |dd                    |d<   t          |dd	          |d<   t          |d
d          |d
<   t          |dd          |d<   t          |dd          |d<   t          |dd          |d<   |d         |d         |d                                         |d
         |d         |d         |d         dd}	 |j                            |                                          |d<   n$# t          $ r}t          d|           d }~ww xY w|S )Nr   )Sessionz`snowflake-snowpark-python` package not found, please install:
                `pip install snowflake-snowpark-python`
                rN   SNOWFLAKE_USERNAMErP   SNOWFLAKE_PASSWORDrR   SNOWFLAKE_ACCOUNTrT   SNOWFLAKE_DATABASErV   SNOWFLAKE_SCHEMArX   SNOWFLAKE_WAREHOUSErY   SNOWFLAKE_ROLETrue)rQ   r#   rO   rS   rU   rW   r3   client_session_keep_aliverD   zFailed to create session: )snowflake.snowparkrv   ImportErrorr   r   get_secret_valuebuilderconfigscreate	Exceptionr'   )rr   rp   rv   connection_paramses        r.   validate_environmentz(ChatSnowflakeCortex.validate_environment   s   	2222222 	 	 	  	 (<(*>(
 (
#$ (= )=?STT(
 (
#$ ';')<'
 '
"# (<(*>(
 (
#$ &:&(:&
 &
!" )=)+@)
 )
$% $8$&6$
 $
 
 12/034EEGG34/0 56+,)/	
 	
	M ' 7 78I J J Q Q S SF9 	M 	M 	M*+K+K+KLLL	M s    	 #/D7 7
EEEc                 ^    t          | dd           | j                                         d S d S )NrD   )getattrrD   closerj   s    r.   __del__zChatSnowflakeCortex.__del__   s6    4D))5L      65r-   c                     d| j          S )z7Get the type of language model used by this chat model.zsnowflake-cortex-)rE   r   s    r.   	_llm_typezChatSnowflakeCortex._llm_type   s     04:///r-   messagesr9   run_managerc           	         d |D             }d }|D ]}t          |j        t                    rt          |t                    r~d|j        v rut	          j        |j                            d                    }|                    d          }	|	| j        v r+|                    di           }
 | j        |	         di |
} n|r$|                    dt          |          i           t	          j
        |          }| j        | j        | j        nd| j        | j        ndd}t	          j
        |          }d	| j         d
| j         d| d| d	}	 | j                            d| j                                         d                                           | j                            |                                          }n$# t(          $ r}t+          d|           d }~ww xY wt	          j        |d         d                   }|d         d         d         }t-          ||          }t/          ||d                   }t1          |          }t3          |g          S )Nc                 ,    g | ]}t          |          S r,   r7   rc   ms     r.   re   z1ChatSnowflakeCortex._generate.<locals>.<listcomp>   !    GGG1!44GGGr-   invoke_tool	tool_nameargstool_output      ?   rH   rJ   rI   %
            select snowflake.cortex.(
                '',
                parse_json(' '),
                parse_json('z*')
            ) as llm_response;
        USE WAREHOUSE ;z0Error while making request to Snowflake Cortex: r   LLM_RESPONSEchoicesr   usage)r2   response_metadatar/   )generationsr,   )r4   r2   dictr   jsonloadsgetrC   appendstrdumpsrH   rJ   rI   rG   rE   rD   sqlget_current_warehousecollectr   r'   r?   r   r   r   )rj   r   r9   r   r_   message_dictsr   r/   	tool_infor   	tool_argsmessage_jsonoptionsoptions_jsonsql_stmtl_rowsr   responseai_message_contentr2   
generations                        r.   	_generatezChatSnowflakeCortex._generate   s    HGhGGG  	 	G7?D11
w66
 "W_44 Jw':':='I'IJJ	%MM+66	// )fb 9 9I"<$/)"<"I"Iy"I"IKE  	  K 0 01  
 z-00+#':#9TZZs-1_-H$//d
 

 z'**%)%9 *  *  *	  		LH!C!C!E!EHHH giii\%%h//7799FF 	 	 	*F1FF  	
 :fQi788%i03J?*+=tDD&w/
 
 
 $G444
zl3333s   A3G 
G%G  G%r2   c              #      K   d}t          ||          }t          dt          |          |          D ]/}||||z            }t          t	          |                    V  0dS )zY
        Stream the output of the model in chunks to return ChatGenerationChunk.
        2   r   )r2   r   N)r?   rangelenr   r   )rj   r2   r9   
chunk_sizetruncated_contentichunk_contents          r.   _stream_contentz#ChatSnowflakeCortex._stream_content3  s       
4WdCCq#/00*== 	U 	UA-a!j..@AM &n].S.S.STTTTTTT		U 	Ur-   c           	   +     K   d |D             }|D ]}t          |t                    rt          |t                    rd|j        v rt	          j        |j                  }|                    dg           }|D ]-}	|	                    d          }
|	                    di           }.|
| j        v rB|                    di           } | j        |
         di |}d|i}|                    |           t	          j	        |          }| j
        | j        | j        nd| j        | j        nd	d
}t	          j	        |          }d| j         d| j         d| d| d	}	 | j                            d| j                                         d                                           | j                            |                                          }|D ]M}t	          j        |d                   }|d         d         d         }|                     ||          D ]}|V  NdS # t(          $ r}t+          d|           d}~ww xY w)zGStream the output of the model in chunks to return ChatGenerationChunk.c                 ,    g | ]}t          |          S r,   r   r   s     r.   re   z/ChatSnowflakeCortex._stream.<locals>.<listcomp>J  r   r-   r   invoke_toolsr   r   r   Nr   r   r   r   r   r   r   z1')
            ) as llm_stream_response;
        r   r   LLM_STREAM_RESPONSEr   r   r   z7Error while making request to Snowflake Cortex stream: r,   )r4   r   r   r2   r   r   r   rC   r   r   rH   rJ   rI   rG   rE   rD   r   r   r   r   r   r'   )rj   r   r9   r   r_   r   r/   r   	tool_listrd   r   r   tool_resultadditional_contextr   r   r   r   resultrowr   r   chunkr   s                           r.   _streamzChatSnowflakeCortex._streamB  s      HGhGGG   	 	G7C((w66 "W_44 Jw77	%MM."==	% 5 5D $ 5 5I $ 4 4II// )fb 9 9I"<$/)"<"I"Iy"I"IK*7)E&!((*  
 z-00+#':#9TZZs-1_-H$//d
 
 z'**%)%9 *  *  *	  	LH!C!C!E!EHHH giii\%%h//7799F     :c*?&@AA%-i%8%;J%G" "112DdKK    EKKKK      	 	 	*M!MM  	s   CH 
I )H;;I )r0   N)NN)4r(   r)   r*   r+   r   r   rC   r   r   r   r   r   r   r   __annotations__rD   rE   rG   rH   floatrI   r	   intrJ   rN   rP   r    rR   rT   rV   rX   rY   r
   r   boolrm   r!   classmethodrt   r   r   propertyr   r   r   r   r   r   r   r   r   r   r,   r-   r.   rA   rA   Y   sy           NSUN N NJS%S#Xh HIIJ    GS" E3    &OS%%%+ K< $J$$$>E8E? ).d*(M(M(MMMMS.3eD
.S.S.S+SSSS',uT'K'K'Kx}KKKR(-d*(M(M(MMMMS&+eD&I&I&IhsmIIIQ).t;)O)O)O#OOOT$)E$f$E$E$ENHSMEEEO   d38ndHhFGH $W%:;TAB
	  
   * _(###c3h C    [ $# _(###0$ 04 0 0 0 $#0d! ! ! ! 03 0 0 0 X0 %):>	D4 D4{#D4 tCy!D4 67	D4
 D4 
D4 D4 D4 D4LUU"*49"5U	%	&U U U U$ %):>	E E{#E tCy!E 67	E
 E 
%	&E E E E E Er-   rA   )2r   typingr   r   r   r   r   r   r	   r
   r   r    langchain_core.callbacks.managerr   langchain_core.language_modelsr   langchain_core.messagesr   r   r   r   r   r   langchain_core.outputsr   r   r   langchain_core.toolsr   langchain_core.utilsr   r   r   %langchain_core.utils.function_callingr   langchain_core.utils.utilsr   pydanticr   r    r!   r%   r   r   r   r'   r   r7   r?   rA   r,   r-   r.   <module>r      s                           F E E E E E 8 8 8 8 8 8                S R R R R R R R R R ) ) ) ) ) )         
 I H H H H H : : : : : : 6 6 6 6 6 6 6 6 6 6  c   & & & & &y & & &k d    6

49
 	   n n n n n- n n n n nr-   