a
    bg8                     @   s4  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-ee.dddZ/e*eee*  e*d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*   w/var/www/html/cobodadashboardai.evdpl.com/venv/lib/python3.9/site-packages/langchain_community/chat_models/snowflake.pyr%   +   s   r%   )messagereturnc                 C   sx   d| j i}t| tr*| jtv r*| j|d< nJt| tr>d|d< n6t| trRd|d< n"t| trfd|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 )	r.   
isinstancer   r/   r$   r   r   r   	TypeError)r,   Zmessage_dictr*   r*   r+   _convert_message_to_dict/   s    






r2   )textstopr-   c                 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                   @   sP  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e e	eee
f eeef  ee	eee!d e"f  e
d d d!d"Z#e$d#d$e%eee
f e
d%d&d'Z&e$d#d$eed%d(d)Z'dd*d+d,Z(e)ed*d-d.Z*d7e+e, ee+e  ee- e
e.d/d0d1Z/eee+e  e0e1 d2d3d4Z2d8e+e, ee+e  ee- e
e0e1 d/d5d6Z3dS )9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)rP   anynone)toolsrQ   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   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*   rV   r*   r*   r+   
<dictcomp>   s   z2ChatSnowflakeCortex.bind_tools.<locals>.<dictcomp>)r:   update)selfrT   rQ   rU   Zformatted_toolsZformatted_tools_dictr*   r*   r+   
bind_tools   s    zChatSnowflakeCortex.bind_toolsbefore)mode)valuesr-   c                 C   s   t | }t||}|S )z>Build extra kwargs from additional params that were passed in.)r   r   )clsrb   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Y n0 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 n4 t	y" } zt
d| W Y d }~n
d }~0 0 |S )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.snowparkre   ImportErrorr   r   Zget_secret_valueZbuilderZconfigscreate	Exceptionr%   )rc   rb   re   Zconnection_paramser*   r*   r+   validate_environment   sR    


$z(ChatSnowflakeCortex.validate_environment)r-   c                 C   s   t | dd d ur| j  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<   rn   r*   r*   r+   	_llm_type   s    zChatSnowflakeCortex._llm_type)messagesr4   run_managerrU   r-   c              
   K   s  dd |D }d }|D ]n}t |jtrt |trd|jv rt|jd}|d}	|	| jv r|di }
| j|	 f i |
} qq|r|dt	|i t
|}| j| jd ur| jnd| jd ur| jndd	}t
|}d
| j d| j d| d| d	}z2| jd| j  d  | j| }W n4 tyf } ztd| W Y d }~n
d }~0 0 t|d d }|d d d }t||}t||d d}t|d}t|gdS )Nc                 S   s   g | ]}t |qS r*   r2   rW   mr*   r*   r+   rY      rZ   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choicesrq   usage)r.   Zresponse_metadatar,   )Zgenerations)r0   r.   dictr   jsonloadsgetr:   appendstrdumpsr>   r@   r?   r=   r<   r;   sqlget_current_warehousecollectri   r%   r7   r   r   r   )r^   rq   r4   rr   rU   message_dictsry   r,   	tool_inforw   	tool_argsmessage_jsonoptionsoptions_jsonsql_stmtZl_rowsrj   responseai_message_contentr.   Z
generationr*   r*   r+   	_generate   sh    







zChatSnowflakeCortex._generate)r.   r4   r-   c                 c   sJ   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 ]}t |trt |trd|jv rt|j}|dg }|D ]}	|	d}
|	di }qP|
| jv r|di }| j|
 f i |}d|i}|| qt	|}| j
| jdur| jnd	| jdur| jnd
d}t	|}d| j d| j d| d| d	}zv| jd| j  d  | j| }|D ]>}t|d }|d d d }| ||D ]}|V  qpqBW n4 ty } ztd| W Y d}~n
d}~0 0 dS )zGStream the output of the model in chunks to return ChatGenerationChunk.c                 S   s   g | ]}t |qS r*   rs   rt   r*   r*   r+   rY   J  rZ   z/ChatSnowflakeCortex._stream.<locals>.<listcomp>rv   Zinvoke_toolsrw   rx   ry   Nrz   r{   r|   r}   r~   r   r   z1')
            ) as llm_stream_response;
        r   r   ZLLM_STREAM_RESPONSEr   r   rq   z7Error while making request to Snowflake Cortex stream: )r0   r   r   r.   r   r   r   r:   r   r   r>   r@   r?   r=   r<   r;   r   r   r   r   ri   r%   )r^   rq   r4   rr   rU   r   r,   r   Z	tool_listrX   rw   r   Ztool_resultZadditional_contextr   r   r   r   resultrowr   r   chunkrj   r*   r*   r+   _streamB  sb    



zChatSnowflakeCortex._stream)NN)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    classmethodrd   rk   ro   propertyrp   r   r   r   r   r   r   r   r   r   r*   r*   r*   r+   r8   Y   sn   
*	2  
G  
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   ri   r%   r   r2   r7   r8   r*   r*   r*   r+   <module>   s$   
0 
