
    dh8                     N   % S SK r S SKJrJrJrJrJrJrJrJ	r	J
r
Jr  S SKJr  S SKJr  S SKJrJrJrJrJrJr  S SKJrJrJr  S SKJr  S SKJrJrJ r   S S	K!J"r"  S S
K#J$r$  S SK%J&r&J'r'J(r(  / SQr)\\*   \+S'    " S S\,5      r-S\S\.4S jr/S\*S\\\*      S\*4S jr0 " S S\5      r1g)    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                       \ rS rSrSrSrg)ChatSnowflakeCortexError+   zError with Snowpark client. N)__name__
__module____qualname____firstlineno____doc____static_attributes__r(       a/var/www/html/shao/venv/lib/python3.13/site-packages/langchain_community/chat_models/snowflake.pyr&   r&   +   s    %r/   r&   messagereturnc                 V   SU R                   0n[        U [        5      (       a%  U R                  [        ;   a  U R                  US'   U$ [        U [
        5      (       a  SUS'   U$ [        U [        5      (       a  SUS'   U$ [        U [        5      (       a  SUS'   U$ [        SU  35      e)zvConvert a LangChain message to a dictionary.

Args:
    message: The LangChain message.

Returns:
    The dictionary.
contentroler!   r"   r#   zGot unknown type )	r4   
isinstancer   r5   r$   r   r   r   	TypeError)r1   message_dicts     r0   _convert_message_to_dictr9   /   s     	7??$L
 ';''GLLO,K&||V  
G]	+	+'V  
G\	*	*%V
 	 
GY	'	'*V  +G9566r/   textstopc                 ^    Uc  U $ U H!  nU R                  U5      nUS:w  d  M  U SU n M#     U $ )z0Truncates text at the earliest stop token found.N)find)r:   r;   
stop_tokenstop_token_idxs       r0   _truncate_at_stop_tokensrA   J   sA    
 |
:.R(D  Kr/   c                       \ rS rSr% Sr\" \S9r\\	\
\\	\4   \\\4   4   \S'   Sr\\S'    Sr\	\S'    S	r\	\S
'    Sr\\S'    Sr\\   \S'    Sr\\   \S'    \" SSS9r\\	   \S'    \" SSS9r\\   \S'    \" SSS9r\\	   \S'    \" SSS9r\\	   \S'    \" SSS9r\\	   \S'    \" SSS9r\\	   \S'    \" SSS9r \\	   \S'    SS.S \!\
\\	\4   \\\4      S!\\
\\	\"S"   \#4      S#\S$S 4S% jjr$\%" S&S'9\&S(\\	\4   S$\4S) j5       5       r'\%" S&S'9S(\S$\4S* j5       r(S5S+ jr)\*S$\	4S, j5       r+  S6S-\,\-   S.\\,\	      S/\\.   S#\S$\/4
S0 jjr0S1\	S.\\,\	      S$\1\2   4S2 jr3  S6S-\,\-   S.\\,\	      S/\\.   S#\S$\1\2   4
S3 jjr4S4r5g)7ChatSnowflakeCortexY   a  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_warehouser5   snowflake_roleauto)tool_choicetoolsr^   )r]   anynonekwargsr2   c                    U Vs/ sH  n[        U5      PM     nnU Vs0 sH  nSU;   d  M  US   U_M     nnU R                  R                  U5        U $ s  snf s  snf )zUBind tool-like objects to this chat model, ensuring they conform to
expected formats.name)r   rF   update)selfr_   r^   rb   toolformatted_toolsformatted_tools_dicts          r0   
bind_toolsChatSnowflakeCortex.bind_tools   su     EJJED1$7EJ ,; 
+:4fnDL$? 	  
 	34 K 
s   A	A
Abefore)modevaluesc                 2    [        U 5      n[        X5      nU$ )z>Build extra kwargs from additional params that were passed in.)r   r   )clsrn   all_required_field_namess      r0   build_extraChatSnowflakeCortex.build_extra   s     $<C#@ $VFr/   c           	      .    SSK Jn  [        USS5      US'   [	        [        USS5      5      US'   [        USS	5      US'   [        US
S5      US
'   [        USS5      US'   [        USS5      US'   [        USS5      US'   US   US   US   R                  5       US
   US   US   US   SS.n UR                  R                  U5      R                  5       US'   U$ ! [         a    [        S5      ef = f! [         a  n[        SU 35      eS nAff = f)Nr   )Sessionz`snowflake-snowpark-python` package not found, please install:
                `pip install snowflake-snowpark-python`
                rQ   SNOWFLAKE_USERNAMErS   SNOWFLAKE_PASSWORDrU   SNOWFLAKE_ACCOUNTrW   SNOWFLAKE_DATABASErY   SNOWFLAKE_SCHEMAr[   SNOWFLAKE_WAREHOUSEr\   SNOWFLAKE_ROLETrue)rT   r"   rR   rV   rX   rZ   r5   client_session_keep_aliverG   zFailed to create session: )snowflake.snowparkru   ImportErrorr   r   get_secret_valuebuilderconfigscreate	Exceptionr&   )rp   rn   ru   connection_paramses        r0   validate_environment(ChatSnowflakeCortex.validate_environment   s   	2 (<(*>(
#$ (= )=?ST(
#$ ';')<'
"# (<(*>(
#$ &:&(:&
!" )=)+@)
$% $8$&6$
 
 12/034EEG34/0 56+,)/	
	M ' 7 78I J Q Q SF9 [  	 	T  	M*-Gs+KLL	Ms#   C 0,C7 C47
DDDc                 V    [        U SS 5      b  U R                  R                  5         g g )NrG   )getattrrG   closerf   s    r0   __del__ChatSnowflakeCortex.__del__   s&    4D)5LL  6r/   c                      SU R                    3$ )z7Get the type of language model used by this chat model.zsnowflake-cortex-)rH   r   s    r0   	_llm_typeChatSnowflakeCortex._llm_type   s     #4::,//r/   messagesr;   run_managerc           	         U Vs/ sH  n[        U5      PM     nnS nU H  n[        UR                  [        5      (       d  M$  [        U[        5      (       d  M;  SUR                  ;   d  MM  [
        R                  " UR                  R                  S5      5      n	U	R                  S5      n
XR                  ;   d  M  U	R                  S0 5      nU R                  U
   " S0 UD6n  O   U(       a  UR                  S[        U5      05        [
        R                  " U5      nU R                  U R                  b  U R                  OSU R                  b  U R                  OSS.n[
        R                  " U5      nSU R                   S	U R                    S
U SU S3	n U R"                  R%                  SU R"                  R'                  5        S35      R)                  5         U R"                  R%                  U5      R)                  5       n[
        R                  " US   S   5      nUS   S   S   n[/        UU5      n[1        UUS   S9n[3        US9n[5        U/S9$ s  snf ! [*         a  n[-        SU 35      eS nAff = f)Ninvoke_tool	tool_nameargstool_output      ?   rK   rM   rL   %
            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)r4   response_metadatar1   )generationsr(   )r9   r6   r4   dictr   jsonloadsgetrF   appendstrdumpsrK   rM   rL   rJ   rH   rG   sqlget_current_warehousecollectr   r&   rA   r   r   r   )rf   r   r;   r   rb   mmessage_dictsr   r1   	tool_infor   	tool_argsmessage_jsonoptionsoptions_jsonsql_stmtl_rowsr   responseai_message_contentr4   
generations                         r0   	_generateChatSnowflakeCortex._generate   sZ    ?GGh1!4hG G7??D11w66!W__4 JJw':':='IJ	%MM+6	/ )fb 9I"&//)"<"Iy"IK     K 01
 zz-0++#'::#9TZZs-1__-H$//d

 zz'*%%)%9%9$: ;** )N +)N +				LL !C!C!E FaHgi\\%%h/779F ::fQi78%i03J?*+=tD&w/
 $G4
zl33{ H^  	*B1#F 	s   IA.I# #
J -I;;J r4   c              #      #    Sn[        X5      n[        S[        U5      U5       H  nXEXS-    n[        [	        US9S9v   M     g7f)zI
Stream the output of the model in chunks to return ChatGenerationChunk.
2   r   )r4   r   N)rA   rangelenr   r   )rf   r4   r;   
chunk_sizetruncated_contentichunk_contents          r0   _stream_content#ChatSnowflakeCortex._stream_content3  sN      
4WCq#/0*=A-!.AM &n].STT	 >s   AAc           	   +     #    U Vs/ sH  n[        U5      PM     nnU H  n[        U[        5      (       d  M  [        U[        5      (       d  M1  SUR                  ;   d  MC  [
        R                  " UR                  5      nUR                  S/ 5      n	U	 H&  n
U
R                  S5      nU
R                  S0 5      nM(     WU R                  ;   d  M  UR                  S0 5      nU R                  U   " S0 UD6nSU0nUR                  U5        M     [
        R                  " U5      nU R                  U R                  b  U R                  OSU R                  b  U R                  OSS	.n[
        R                  " U5      nS
U R                   SU R                   SU SU S3	n U R                   R#                  SU R                   R%                  5        S35      R'                  5         U R                   R#                  U5      R'                  5       nU HD  n[
        R                  " US   5      nUS   S   S   nU R)                  UU5       H  nUv   M	     MF     gs  snf ! [*         a  n[-        SU 35      eSnAff = f7f)zGStream the output of the model in chunks to return ChatGenerationChunk.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(   )r9   r6   r   r   r4   r   r   r   rF   r   r   rK   rM   rL   rJ   rH   rG   r   r   r   r   r   r&   )rf   r   r;   r   rb   r   r   r1   r   	tool_listrg   r   r   tool_resultadditional_contextr   r   r   r   resultrowr   r   chunkr   s                            r0   _streamChatSnowflakeCortex._streamB  s[     ?GGh1!4hG  G7C((w66!W__4 JJw7	%MM."=	%D $ 5I $ 4I & / )fb 9I"&//)"<"Iy"IK*7)E&!((*!  * zz-0++#'::#9TZZs-1__-H$//d
 zz'*%%)%9%9$: ;** )N +)N +			LL !C!C!E FaHgi\\%%h/779F ::c*?&@A%-i%8%;J%G" "112DdKEK L e Ht  	*I!M 	sM   JIJJJ"A,JCJ$B8I" J"
I?,I::I??Jr(   )r2   N)NN)6r)   r*   r+   r,   r-   r   r   rF   r   r   r   r   r   r   r   __annotations__rG   rH   rJ   rK   floatrL   r	   intrM   rQ   rS   r   rU   rW   rY   r[   r\   r
   r   boolrj   r    classmethodrr   r   r   propertyr   r   r   r   r   r   r   r   r   r   r.   r(   r/   r0   rC   rC   Y   s$     NSNJS%S#Xh HIIJ  GS" E3  &OS%+ K< $J$>E8E? ).d*(MMS.3D
.S+SS',T'Kx}KR(-d*(MMS&+D&IhsmIQ).t;)O#OT$)$f$ENHSMEO d38ndHhFGH $W%:;TAB
	  
* (#c3h C   $ (#0$ 04 0 $0d! 03 0 0 %):>	D4{#D4 tCy!D4 67	D4
 D4 
D4LUU"*49"5U	%	&U$ %):>	E{#E tCy!E 67	E
 E 
%	&E Er/   rC   )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   r9   rA   rC   r(   r/   r0   <module>r      s       F 8  S R ) 
 I : 6 6c &y &k d 6

49
 	n- nr/   