o
    Zh8                     @   s:  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 de,Z-dede.fddZ/de*deee*  de*fddZ0G d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                   @   s   e Zd ZdZdS )ChatSnowflakeCortexErrorzError with Snowpark client.N)__name__
__module____qualname____doc__ r*   r*   `/var/www/html/lang_env/lib/python3.10/site-packages/langchain_community/chat_models/snowflake.pyr%   +   s    r%   messagereturnc                 C   s|   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r7d|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,   Zmessage_dictr*   r*   r+   _convert_message_to_dict/   s   

	


r2   textstopc                 C   s8   |du r| S |D ]}|  |}|dkr| d| } q| S )z0Truncates text at the earliest stop token found.N)find)r3   r4   Z
stop_tokenZstop_token_idxr*   r*   r+   _truncate_at_stop_tokensJ   s   
r7   c                   @   s  e Zd ZU dZeed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dZee ed< 	 edddZee ed< 	 edddZee ed< 	 edddZee ed< 	 edddZee ed< 	 edddZee ed< 	 ed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$d%Z#e$d&d'e%d(eee
f d#e
fd)d*Z&e$d&d'd(ed#efd+d,Z'd;d-d.Z(e)d#efd/d0Z*		d<d1e+e, d2ee+e  d3ee- d"e
d#e.f
d4d5Z/d6ed2ee+e  d#e0e1 fd7d8Z2		d<d1e+e, d2ee+e  d3ee- d"e
d#e0e1 f
d9d:Z3dS )=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modelZ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_warehouser/   snowflake_roleauto)tool_choicetoolsrQ   )rP   anynonekwargsr-   c                K   s,   dd |D }dd |D }| j | | S )z]Bind tool-like objects to this chat model, ensuring they conform to
        expected formats.c                 S      g | ]}t |qS r*   r   .0toolr*   r*   r+   
<listcomp>       z2ChatSnowflakeCortex.bind_tools.<locals>.<listcomp>c                 S   s   i | ]}d |v r|d  |qS )namer*   rW   r*   r*   r+   
<dictcomp>   s    z2ChatSnowflakeCortex.bind_tools.<locals>.<dictcomp>)r:   update)selfrR   rQ   rU   Zformatted_toolsZformatted_tools_dictr*   r*   r+   
bind_tools   s   zChatSnowflakeCortex.bind_toolsbefore)modevaluesc                 C   s   t | }t||}|S )z>Build extra kwargs from additional params that were passed in.)r   r   )clsrc   Zall_required_field_namesr*   r*   r+   build_extra   s   
zChatSnowflakeCortex.build_extrac              
   C   s  zddl m} W n ty   td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}z|j| |d< W |S  t	y } zt
d| d }~ww )Nr   )Sessionz`snowflake-snowpark-python` package not found, please install:
                `pip install snowflake-snowpark-python`
                rD   ZSNOWFLAKE_USERNAMErF   ZSNOWFLAKE_PASSWORDrH   ZSNOWFLAKE_ACCOUNTrJ   ZSNOWFLAKE_DATABASErL   ZSNOWFLAKE_SCHEMArN   ZSNOWFLAKE_WAREHOUSErO   ZSNOWFLAKE_ROLETrue)rG   r"   rE   rI   rK   rM   r/   Zclient_session_keep_aliver;   zFailed to create session: )Zsnowflake.snowparkrf   ImportErrorr   r   Zget_secret_valuebuilderZconfigscreate	Exceptionr%   )rd   rc   rf   Zconnection_paramser*   r*   r+   validate_environment   sX   

z(ChatSnowflakeCortex.validate_environmentc                 C   s"   t | dd d ur| j  d S d S )Nr;   )getattrr;   closer_   r*   r*   r+   __del__   s   zChatSnowflakeCortex.__del__c                 C   s   d| j  S )z7Get the type of language model used by this chat model.zsnowflake-cortex-)r<   rp   r*   r*   r+   	_llm_type   s   zChatSnowflakeCortex._llm_typemessagesr4   run_managerc              
   K   s  dd |D }d }|D ]7}t |jtrBt |trBd|jv rBt|jd}|d}	|	| jv rB|di }
| j|	 di |
} nq|rN|dt	|i t
|}| j| jd ur]| jnd| jd urf| jndd	}t
|}d
| j d| j d| d| d	}z| jd| j  d  | j| }W n ty } ztd| d }~ww t|d d }|d d d }t||}t||d d}t|d}t|gdS )Nc                 S   rV   r*   r2   rX   mr*   r*   r+   rZ      r[   z1ChatSnowflakeCortex._generate.<locals>.<listcomp>invoke_tool	tool_nameargstool_output      ?   r>   r@   r?   %
            select snowflake.cortex.(
                '',
                parse_json(' '),
                parse_json('z*')
            ) as llm_response;
        USE WAREHOUSE ;z0Error while making request to Snowflake Cortex: r   ZLLM_RESPONSEchoicesrs   usage)r.   Zresponse_metadatar,   )Zgenerationsr*   )r0   r.   dictr   jsonloadsgetr:   appendstrdumpsr>   r@   r?   r=   r<   r;   sqlget_current_warehousecollectrk   r%   r7   r   r   r   )r_   rs   r4   rt   rU   message_dictsr{   r,   	tool_infory   	tool_argsmessage_jsonoptionsoptions_jsonsql_stmtZl_rowsrl   responseai_message_contentr.   Z
generationr*   r*   r+   	_generate   sn   








zChatSnowflakeCortex._generater.   c                 c   sL    d}t ||}tdt||D ]}||||  }tt|ddV  qdS )zY
        Stream the output of the model in chunks to return ChatGenerationChunk.
        2   r   )r.   r   N)r7   rangelenr   r   )r_   r.   r4   
chunk_sizeZtruncated_contentiZchunk_contentr*   r*   r+   _stream_content3  s   
z#ChatSnowflakeCortex._stream_contentc              
   k   s   dd |D }|D ]K}t |trUt |trUd|jv rUt|j}|dg }|D ]}	|	d}
|	di }q)|
| jv rU|di }| j|
 di |}d|i}|| q
t	|}| j
| jdure| jnd	| jdurn| jnd
d}t	|}d| j d| j d| d| d	}z:| jd| j  d  | j| }|D ]}t|d }|d d d }| ||D ]}|V  qqW dS  ty } ztd| d}~ww )zGStream the output of the model in chunks to return ChatGenerationChunk.c                 S   rV   r*   ru   rv   r*   r*   r+   rZ   J  r[   z/ChatSnowflakeCortex._stream.<locals>.<listcomp>rx   Zinvoke_toolsry   rz   r{   Nr|   r}   r~   r   r   r   r   z1')
            ) as llm_stream_response;
        r   r   ZLLM_STREAM_RESPONSEr   r   rs   z7Error while making request to Snowflake Cortex stream: r*   )r0   r   r   r.   r   r   r   r:   r   r   r>   r@   r?   r=   r<   r;   r   r   r   r   rk   r%   )r_   rs   r4   rt   rU   r   r,   r   Z	tool_listrY   ry   r   Ztool_resultZadditional_contextr   r   r   r   resultrowr   r   chunkrl   r*   r*   r+   _streamB  sn   




zChatSnowflakeCortex._stream)r-   N)NN)4r&   r'   r(   r)   r   r   r:   r   r   r   r   r
   r   r   __annotations__r;   r<   r=   r>   floatr?   r   intr@   rD   rF   r   rH   rJ   rL   rN   rO   r	   r   boolr`   r    classmethodre   rm   rq   propertyrr   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   r8   Y   s   
 *

2

F


r8   )2r   typingr   r   r   r   r   r   r   r	   r
   r   Z langchain_core.callbacks.managerr   Zlangchain_core.language_modelsr   Zlangchain_core.messagesr   r   r   r   r   r   Zlangchain_core.outputsr   r   r   Zlangchain_core.toolsr   Zlangchain_core.utilsr   r   r   Z%langchain_core.utils.function_callingr   Zlangchain_core.utils.utilsr   Zpydanticr   r   r    r$   r   r   rk   r%   r   r2   r7   r8   r*   r*   r*   r+   <module>   s,   
 0 

