
    Ig                         U d dl 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mZmZmZmZ d dl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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Z% G d de	      Z&y)    N)AnyDictListOptional)CallbackManagerForLLMRun)BaseChatModel)	AIMessageBaseMessageChatMessageHumanMessageSystemMessage)ChatGeneration
ChatResult)convert_to_secret_strget_from_dict_or_envget_pydantic_field_namespre_init)_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__     f/var/www/html/answerous/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 )	r(   
isinstancer   r)   r   r   r   r	   	TypeError)r%   message_dicts     r$   _convert_message_to_dictr-   "   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)r.   r/   
stop_tokenstop_token_idxs       r$   _truncate_at_stop_tokensr5   =   sF    
 | )
:.R(D) Kr#   c                   6   e Zd ZU dZ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<   	  ed      edeeef   defd              Zededefd        Zd(d!Ze defd"       Z!	 	 d)d#e"e#   d$ee"e      d%ee$   d&ede%f
d'Z&y)*ChatSnowflakeCortexa  Snowflake Cortex based Chat model

    To use 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()
    N_sp_sessionzsnowflake-arcticmodelcompletecortex_functiongffffff?temperature
max_tokenstop_pusername)defaultaliassnowflake_usernamepasswordsnowflake_passwordaccountsnowflake_accountdatabasesnowflake_databaseschemasnowflake_schema	warehousesnowflake_warehouser)   snowflake_rolebefore)modevaluesr&   c                 4    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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}	 |j                  j                  |      j                         |d<   |S # t        $ r t        d      w xY w# t        $ r}t        d|       d }~ww xY w)Nr   )Sessionzm`snowflake-snowpark-python` package not found, please install it with `pip install snowflake-snowpark-python`rB   SNOWFLAKE_USERNAMErD   SNOWFLAKE_PASSWORDrF   SNOWFLAKE_ACCOUNTrH   SNOWFLAKE_DATABASErJ   SNOWFLAKE_SCHEMArL   SNOWFLAKE_WAREHOUSErM   SNOWFLAKE_ROLE)rE   r   rC   rG   rI   rK   r)   r8   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 (<(*>(
#$ (= )=?ST(
#$ ';')<'
"# (<(*>(
#$ &:&(:&
!" )=)+@)
$% $8$&6$
 
 12/034EEG34/0 56+,
	M$+OO$;$;<M$N$U$U$WF=! W  	: 	P  	M*-Gs+KLL	Ms#   C /,C5 C25	D>DDc                 T    t        | dd       | j                  j                          y y )Nr8   )getattrr8   closeselfs    r$   __del__zChatSnowflakeCortex.__del__   s(    4-9""$ :r#   c                      d| j                    S )z7Get the type of language model used by this chat model.zsnowflake-cortex-)r9   rk   s    r$   	_llm_typezChatSnowflakeCortex._llm_type   s     #4::,//r#   messagesr/   run_managerkwargsc           	      ~   |D cg c]  }t        |       }}t        |      }d| j                  i}| j                  | j                  |d<   | j                  | j                  |d<   t        |      }	d| j
                   d| j                   d| d|	 d	}
	 | j                  j                  |
      j                         }t        j                  |d
   d         }|d   d
   d   }t        ||      }t        ||d         }t!        |      }t#        |g      S c c}w # t        $ r}t        d	|       d }~ww xY w)Nr<   r>   r=   z%
            select snowflake.cortex.z(
                'z'
                ,,z) as llm_response;z=Error while making request to Snowflake Cortex via Snowpark: r   LLM_RESPONSEchoicesrp   usage)r(   response_metadata)r%   )generations)r-   strr<   r>   r=   r;   r9   r8   sqlcollectrd   r   jsonloadsr5   r	   r   r   )rl   rp   r/   rq   rr   mmessage_dictsmessage_stroptionsoptions_strsql_stmtl_rowsrf   responseai_message_contentr(   r%   
generations                     r$   	_generatezChatSnowflakeCortex._generate   sh    ?GG1!4GG-( $"2"23::!#zzGG??&$(OOGL!'l%%)%9%9$: ;** a},>B
	%%))(3;;=F ::fQi78%i03J?*+=tD&w/
 $G4
zl33; H  	*OPQsS 	s   D)D   	D<)D77D<)r&   N)NN)'r   r   r    r!   r8   r   __annotations__r9   rz   r;   r<   floatr=   r   intr>   r   rB   rD   r   rF   rH   rJ   rL   rM   r   classmethodr   rT   r   rg   rm   propertyro   r   r
   r   r   r   r"   r#   r$   r7   r7   L   s    K"#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(#c3h C   $ .$ .4 . .`% 03 0 0 %):>	$4{#$4 tCy!$4 67	$4
 $4 
$4r#   r7   )'r}   typingr   r   r   r    langchain_core.callbacks.managerr   langchain_core.language_modelsr   langchain_core.messagesr	   r
   r   r   r   langchain_core.outputsr   r   langchain_core.utilsr   r   r   r   langchain_core.utils.utilsr   pydanticr   r   r   r   rz   r   rd   r   dictr-   r5   r7   r"   r#   r$   <module>r      s     , , E 8  >  ; 6 6c &y &k d 6

49
 	[4- [4r#   