
    7|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      Z1y)    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y)ChatSnowflakeCortexErrorzError with Snowpark client.N)__name__
__module____qualname____doc__     h/var/www/html/test/engine/venv/lib/python3.12/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<   |S t        | t
              rd|d<   |S t        | t              rd|d<   |S t        | t              rd|d<   |S t        d|        )zConvert a LangChain message to a dictionary.

    Args:
        message: The LangChain message.

    Returns:
        The dictionary.
    contentroler!   r"   r#   zGot unknown type )	r1   
isinstancer   r2   r$   r   r   r   	TypeError)r.   message_dicts     r-   _convert_message_to_dictr6   /   s     	7??$L
 ';'GLLO,K&||V  
G]	+'V  
G\	*%V
 	 
GY	'*V  +G9566r,   textstopc                 T    || S |D ]  }| j                  |      }|dk7  s| d| }   | S )z0Truncates text at the earliest stop token found.N)find)r7   r8   
stop_tokenstop_token_idxs       r-   _truncate_at_stop_tokensr>   J   sF    
 | )
:.R(D) Kr,   c                   >   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Z3y)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_warehouser2   snowflake_roleauto)tool_choicetoolsrZ   )rY   anynonekwargsr/   c                    |D cg c]  }t        |       }}|D ci c]  }d|v s|d   | }}| j                  j                  |       | S c c}w c c}w )z]Bind tool-like objects to this chat model, ensuring they conform to
        expected formats.name)r   rB   update)selfr[   rZ   r^   toolformatted_toolsformatted_tools_dicts          r-   
bind_toolszChatSnowflakeCortex.bind_tools   sp     EJJD1$7JJ ,; 
#'fnDL$ 
  
 	34 K 
s   A	AAbefore)modevaluesc                 4    t        |       }t        ||      }|S )z>Build extra kwargs from additional params that were passed in.)r   r   )clsri   all_required_field_namess      r-   build_extrazChatSnowflakeCortex.build_extra   s!     $<C#@ $V-EFr,   c           	      *   	 ddl m} 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   j                         |d
   |d   |d   |d   dd}	 |j                  j                  |      j                         |d<   |S # t        $ r t        d      w xY w# t        $ r}t        d|       d }~ww xY w)Nr   )Sessionz`snowflake-snowpark-python` package not found, please install:
                `pip install snowflake-snowpark-python`
                rM   SNOWFLAKE_USERNAMErO   SNOWFLAKE_PASSWORDrQ   SNOWFLAKE_ACCOUNTrS   SNOWFLAKE_DATABASErU   SNOWFLAKE_SCHEMArW   SNOWFLAKE_WAREHOUSErX   SNOWFLAKE_ROLETrue)rP   r"   rN   rR   rT   rV   r2   client_session_keep_aliverC   zFailed to create session: )snowflake.snowparkro   ImportErrorr   r   get_secret_valuebuilderconfigscreate	Exceptionr&   )rk   ri   ro   connection_paramses        r-   validate_environmentz(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,C6 C36	D?DDc                 T    t        | dd       | j                  j                          y y )NrC   )getattrrC   closerb   s    r-   __del__zChatSnowflakeCortex.__del__   s&    4D)5LL  6r,   c                      d| j                    S )z7Get the type of language model used by this chat model.zsnowflake-cortex-)rD   r   s    r-   	_llm_typezChatSnowflakeCortex._llm_type   s     #4::,//r,   messagesr8   run_managerc           	         |D cg c]  }t        |       }}d }|D ]  }t        |j                  t              st        |t              s/d|j                  v s>t        j                  |j                  j                  d            }	|	j                  d      }
|
| j                  v s|	j                  di       } | j                  |
   di |} n |r|j                  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"                  j%                  d| j"                  j'                          d      j)                          | j"                  j%                  |      j)                         }t        j                  |d   d         }|d   d   d   }t/        ||      }t1        ||d         }t3        |      }t5        |g      S c c}w # t*        $ r}t-        d|       d }~ww xY w)Ninvoke_tool	tool_nameargstool_output      ?   rG   rI   rH   %
            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)r1   response_metadatar.   )generationsr+   )r6   r3   r1   dictr   jsonloadsgetrB   appendstrdumpsrG   rI   rH   rF   rD   rC   sqlget_current_warehousecollectr   r&   r>   r   r   r   )rb   r   r8   r   r^   mmessage_dictsr   r.   	tool_infor   	tool_argsmessage_jsonoptionsoptions_jsonsql_stmtl_rowsr   responseai_message_contentr1   
generations                         r-   	_generatezChatSnowflakeCortex._generate   s\    ?GG1!4GG  	G7??D1w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 	I)I$$I)r1   c              #      K   d}t        ||      }t        dt        |      |      D ]"  }||||z    }t        t	        |             $ yw)zY
        Stream the output of the model in chunks to return ChatGenerationChunk.
        2   r   )r1   r   N)r>   rangelenr   r   )rb   r1   r8   
chunk_sizetruncated_contentichunk_contents          r-   _stream_contentz#ChatSnowflakeCortex._stream_content3  s\      
4WdCq#/0*= 	UA-a!j.AM &n].STT		Us   AAc           	   +     K   |D cg c]  }t        |       }}|D ]  }t        |t              st        |t              s%d|j                  v s4t        j                  |j                        }|j                  dg       }	|	D ]%  }
|
j                  d      }|
j                  di       }' | j                  v s|j                  di       } | j                  |   di |}d|i}|j                  |        t        j                  |      }| j                  | j                  | j                  nd| j                  | j                  ndd	}t        j                  |      }d
| j                   d| j                   d| d| d	}	 | j                   j#                  d| j                   j%                          d      j'                          | j                   j#                  |      j'                         }|D ]@  }t        j                  |d         }|d   d   d   }| j)                  ||      D ]  }|  B yc c}w # t*        $ r}t-        d|       d}~ww xY ww)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+   )r6   r3   r   r   r1   r   r   r   rB   r   r   rG   rI   rH   rF   rD   rC   r   r   r   r   r   r&   )rb   r   r8   r   r^   r   r   r.   r   	tool_listrc   r   r   tool_resultadditional_contextr   r   r   r   resultrowr   r   chunkr   s                            r-   _streamzChatSnowflakeCortex._streamB  sj     ?GG1!4GG   	G7C(w6!W__4 JJw7	%MM."=	% 5D $ 5I $ 4I5 / )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K  EK  e Ht  	*I!M 	sM   IH;IIIA)I;CIB3I  :I 	I	III)r/   N)NN)4r'   r(   r)   r*   r   r   rB   r   r   r   r   r   r   r   __annotations__rC   rD   rF   rG   floatrH   r	   intrI   rM   rO   r   rQ   rS   rU   rW   rX   r
   r   boolrf   r    classmethodrm   r   r   propertyr   r   r   r   r   r   r   r   r   r   r+   r,   r-   r@   r@   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r,   r@   )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   r6   r>   r@   r+   r,   r-   <module>r      s       F 8  S R ) 
 I : 6 6c &y &k d 6

49
 	n- nr,   