§
    šŠtjèN  ã                   óv  — d Z ddlZddlZddlZddl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mZ ddlmZ e
rddlZddlmZ ddl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" ddl#m$Z$m%Z%m&Z&  ej'        e(¦  «        Z) G d„ de$¦  «        Z* G d„ de$¦  «        Z+ G d„ de$¦  «        Z, G d„ de$¦  «        Z- G d„ de$¦  «        Z. G d„ de$¦  «        Z/ G d„ de$¦  «        Z0 G d„ de$¦  «        Z1 G d„ d¦  «        Z2 G d„ d ¦  «        Z3 G d!„ d"e¦  «        Z4 G d#„ d$e$¦  «        Z5 G d%„ d&ee5         ¦  «        Z6dS )'z Kinetica SQL generation LLM API.é    N)Úversion)ÚPath)ÚTYPE_CHECKINGÚAnyÚDictÚListÚOptionalÚPatternÚcast)Úpre_init)ÚCallbackManagerForLLMRun)ÚBaseChatModel)Ú	AIMessageÚBaseMessageÚHumanMessageÚSystemMessage)ÚBaseOutputParser)ÚChatGenerationÚ
ChatResultÚ
Generation)Ú	BaseModelÚ
ConfigDictÚFieldc                   ó  — e Zd ZU dZ edd¬¦  «        Zee         ed<    edd¬¦  «        Z	ee         ed<    eg d¬¦  «        Z
ee         ed	<    edd
¬¦  «        Zeee                  ed<    edd¬¦  «        Zee         ed<   defd„ZdS )Ú_KdtSuggestContextúpydantic API request typeNzName of table©ÚdefaultÚtitleÚtablezTable descriptionÚdescriptionzTable columns listÚcolumnszRules that apply to the table.Úrulesz)Samples that apply to the entire context.ÚsamplesÚreturnc                 ó   — g }|                      d| j        › d�¦  «         |                      d¦  «         | j        rt          | j        ¦  «        dk    rt	          d¦  «         g }| j        D ]B}|                     dd¦  «                             ¦   «         }|                      d|› �¦  «         ŒC|                      d	                     |¦  «        ¦  «         |                      d
¦  «         | j        r&|                      d| j        › d| j        › d�¦  «         | j	        rXt          | j	        ¦  «        dk    r@|                      d| j        › d�¦  «         | j	        D ]}|                      d|› �¦  «         Œd                     |¦  «        }|S )NzCREATE TABLE z ASú(r   zcolumns list can't be null.ú"Ú z   z,
z);zCOMMENT ON TABLE z IS 'z';z-- When querying table z the following rules apply:z-- * ú
)
Úappendr    r"   ÚlenÚ
ValueErrorÚreplaceÚstripÚjoinr!   r#   )ÚselfÚlinesr"   ÚcolumnÚruleÚresults         úf/var/www/html/CA-Chatbot/venv/lib/python3.11/site-packages/langchain_community/chat_models/kinetica.pyÚto_system_strz _KdtSuggestContext.to_system_str1   s£  € ØˆØ�ŠÐ4 T¤ZÐ4Ð4Ð4Ñ5Ô5Ð5Ø�Š�SÑÔÐàŒ|ð 	6�s 4¤<Ñ0Ô0°AÒ5Ð5ÝÐ4Ñ5Ô5Ð5àˆØ”lð 	+ð 	+ˆFØ—^’^ C¨Ñ,Ô,×2Ò2Ñ4Ô4ˆFØ�NŠN˜> ˜>˜>Ñ*Ô*Ð*Ð*Ø�Š�U—Z’Z Ñ(Ô(Ñ)Ô)Ð)Ø�Š�TÑÔÐàÔð 	TØ�LŠLÐR¨T¬ZÐRÐR¸dÔ>NÐRÐRÐRÑSÔSÐSàŒ:ð 	-�#˜dœj™/œ/¨AÒ-Ð-Ø�LŠLØQ¨$¬*ÐQÐQÐQñô ð ð œ
ð -ð -�Ø—’˜^ T˜^˜^Ñ,Ô,Ð,Ð,à—’˜5Ñ!Ô!ˆØˆó    )Ú__name__Ú
__module__Ú__qualname__Ú__doc__r   r    r	   ÚstrÚ__annotations__r!   r"   r   r#   r$   r   r7   © r8   r6   r   r   $   s  € € € € € € Ø#Ð#à ˜5¨°_ÐEÑEÔE€Eˆ8�CŒ=ÐEÐEÑEØ!& ¨tÐ;NÐ!OÑ!OÔ!O€K�˜#”ÐOÐOÑOØ˜ rÐ1EÐFÑFÔF€GˆT�#ŒYÐFÐFÑFØ!& ØÐ<ð"ñ "ô "€Eˆ8�D˜”IÔð ð ñ ð $˜eØÐGðñ ô €GˆX�dŒ^ð ð ñ ð˜sð ð ð ð ð ð r8   r   c                   ót   — e Zd ZU dZdZee         ed<   ee	         ed<   defd„Z
dee         fd„Zdefd„ZdS )	Ú_KdtSuggestPayloadr   NÚquestionÚcontextr%   c                 ó¦   — g }| j         D ]3}|j        €Œ
|                     ¦   «         }|                     |¦  «         Œ4d                     |¦  «        S )Nz

)rC   r    r7   r+   r0   )r1   r2   Útable_contextÚcontext_strs       r6   Úget_system_strz!_KdtSuggestPayload.get_system_strT   s\   € ØˆØ!œ\ð 	&ð 	&ˆMØÔ"Ð*ØØ'×5Ò5Ñ7Ô7ˆKØ�LŠL˜Ñ%Ô%Ð%Ð%Ø�{Š{˜5Ñ!Ô!Ð!r8   c                 ó,  — g }| j         D ]‰}|j        €Œ
|j                             ¦   «         D ]e\  }}|                     dd¦  «        }|                     t          d|pd¬¦  «        ¦  «         |                     t          d|¬¦  «        ¦  «         ŒfŒŠ|S )Nz''ú'Úuserr)   ©ÚroleÚcontentÚ	assistant)rC   r$   Úitemsr.   r+   Údict)r1   ÚmessagesrC   rB   Úanswers        r6   Úget_messagesz_KdtSuggestPayload.get_messages]   s®   € ØˆØ”|ð 	Hð 	HˆGØŒÐ&ØØ$+¤O×$9Ò$9Ñ$;Ô$;ð Hð HÑ �˜&àŸš¨¨cÑ2Ô2�à—’¥¨&¸(¸.ÀbÐ IÑ IÔ IÑJÔJÐJØ—’¥¨+¸vÐ FÑ FÔ FÑGÔGÐGÐGðHð ˆr8   c                 ó:  — g }|                      t          d|                      ¦   «         ¬¦  «        ¦  «         |                     |                      ¦   «         ¦  «         |                      t          d| j        pd¬¦  «        ¦  «         t          |¬¦  «        }|S )NÚsystemrK   rJ   r)   ©rQ   )r+   rP   rG   ÚextendrS   rB   )r1   rQ   Úresponses      r6   Úto_completionz _KdtSuggestPayload.to_completionj   s‹   € ØˆØ�Š� (°D×4GÒ4GÑ4IÔ4IÐJÑJÔJÑKÔKÐKØ�Š˜×)Ò)Ñ+Ô+Ñ,Ô,Ð,Ø�Š� &°$´-Ð2EÀ2ÐFÑFÔFÑGÔGÐGÝ Ð*Ñ*Ô*ˆØˆr8   )r9   r:   r;   r<   rB   r	   r=   r>   r   r   rG   r   rS   rY   r?   r8   r6   rA   rA   N   s—   € € € € € € Ø#Ð#à"€Hˆh�sŒmÐ"Ð"Ñ"ØÐ$Ô%Ð%Ð%Ñ%ð" ð "ð "ð "ð "ð˜d 4œjð ð ð ð ð˜tð ð ð ð ð ð r8   rA   c                   ó   — e Zd ZU dZeed<   dS )Ú_KdtoSuggestRequestr   ÚpayloadN)r9   r:   r;   r<   rA   r>   r?   r8   r6   r[   r[   s   s$   € € € € € € Ø#Ð#àÐÐÑÐÐr8   r[   c                   óB   — e Zd ZU dZ edd¬¦  «        Zeed<   eed<   dS )Ú_KdtMessageúpydantic API response typer)   zOne of [user|assistant|system]r   rL   rM   N)r9   r:   r;   r<   r   rL   r=   r>   r?   r8   r6   r^   r^   y   s?   € € € € € € Ø$Ð$à�˜bÐ(HÐIÑIÔI€Dˆ#ÐIÐIÑIØ€L€L�L€L€Lr8   r^   c                   óX   — e Zd ZU dZeed<    edd¬¦  «        Zee	         ed<   e
ed<   dS )Ú
_KdtChoicer_   ÚindexNzThe generated SQLr   ÚmessageÚfinish_reason)r9   r:   r;   r<   Úintr>   r   rc   r	   r^   r=   r?   r8   r6   ra   ra   €   sR   € € € € € € Ø$Ð$à€J€J�JØ%* U°4Ð?RÐ%SÑ%SÔ%S€GˆX�kÔ"ÐSÐSÑSØÐÐÑÐÐr8   ra   c                   ó2   — e Zd ZU dZeed<   eed<   eed<   dS )Ú	_KdtUsager_   Úprompt_tokensÚcompletion_tokensÚtotal_tokensN)r9   r:   r;   r<   re   r>   r?   r8   r6   rg   rg   ˆ   s<   € € € € € € Ø$Ð$àÐÐÑØÐÐÑØÐÐÑÐÐr8   rg   c                   ó€   — e Zd ZU dZeed<   eed<   eed<   eed<   ee         ed<   e	ed<    e
dd	¬
¦  «        Zeed<   dS )Ú_KdtSqlResponser_   ÚidÚobjectÚcreatedÚmodelÚchoicesÚusager)   zThe input questionr   ÚpromptN)r9   r:   r;   r<   r=   r>   re   r   ra   rg   r   rs   r?   r8   r6   rl   rl   �   sy   € € € € € € Ø$Ð$à€G€G�GØ€K€K�KØ€L€L�LØ€J€J�JØ�*ÔÐÐÑØÐÐÑØ�% Ð*>Ð?Ñ?Ô?€FˆCÐ?Ð?Ñ?Ð?Ð?r8   rl   c                   ó(   — e Zd ZU dZeed<   eed<   dS )Ú_KdtCompletionResponser_   ÚstatusÚdataN)r9   r:   r;   r<   r=   r>   rl   r?   r8   r6   ru   ru   œ   s-   € € € € € € Ø$Ð$à€K€K�KØ
ÐÐÑÐÐr8   ru   c                   ó¼   — e Zd ZU dZ ej        dej        ¦  «        Zee	d<   e
dededefd„¦   «         Ze
dej        defd	„¦   «         Ze
ded
edefd„¦   «         ZdS )Ú_KineticaLlmFileContextParserz*Parser for Kinetica LLM context datafiles.z'^<\|(?P<role>\w+)\|>\W*(?P<content>.*)$ÚPARSERÚtextÚsuffixr%   c                 ód   — |r-|                      |¦  «        r|d t          |¦  «         …         S |S )N)Úendswithr,   )Úclsr{   r|   s      r6   Ú_removesuffixz+_KineticaLlmFileContextParser._removesuffix©   s9   € àð 	(�d—m’m FÑ+Ô+ð 	(Ø˜�3˜v™;œ;˜,˜Ô'Ð'Øˆr8   Ú
input_filec                 óÄ   — t          |¦  «        }|                      |j        d¦  «        }t          |¦  «                             ¦   «         }|                      ||¦  «        S )Nz.txt)r   r€   ÚnameÚopenÚreadÚparse_dialogue)r   r�   ÚpathÚschemar2   s        r6   Úparse_dialogue_filez1_KineticaLlmFileContextParser.parse_dialogue_file¯   sU   € å�JÑÔˆà×"Ò" 4¤9¨fÑ5Ô5ˆå�ZÑ Ô ×%Ò%Ñ'Ô'ˆØ×!Ò! %¨Ñ0Ô0Ð0r8   rˆ   c                 ó„  — g }d }|                      d¦  «        }d }t          |¦  «        D �]\  }}|                     ¦   «         }t          |¦  «        dk    rŒ.| j                             |¦  «        }	|	€t          d|› �¦  «        ‚|	                     ¦   «         }
|
d         }|dk    r|�t          d|› �¦  «        ‚|
d         }Œ›|dk    r|�t          d	|› �¦  «        ‚|
}Œ¸|d
k    rA|€t          d|› �¦  «        ‚| 	                    |¦  «         | 	                    |
¦  «         d }Œÿt          d|› �¦  «        ‚|||dœS )Nz<|end|>r   z"Could not find starting token in: rL   rU   z"Only one system token allowed in: rM   rJ   z*Found user token without assistant token: rN   z*Found assistant token without user token: zUnknown token: )rˆ   rU   rQ   )
ÚsplitÚ	enumerater/   r,   rz   Úmatchr-   Ú	groupdictÚ	Exceptionr+   )r   r{   rˆ   rQ   rU   r2   Úuser_messageÚidxÚliner�   rŽ   rL   s               r6   r†   z,_KineticaLlmFileContextParser.parse_dialogue¸   sŠ  € àˆØˆà—
’
˜9Ñ%Ô%ˆØˆå" 5Ñ)Ô)ð 	;ñ 	;‰IˆC�Ø—:’:‘<”<ˆDå�4‰yŒy˜AŠ~ˆ~Øà”J×$Ò$ TÑ*Ô*ˆEØˆ}Ý Ð!LÀdÐ!LÐ!LÑMÔMÐMàŸšÑ)Ô)ˆIØ˜VÔ$ˆDà�xÒÐØÐ%Ý$Ð%PÈ$Ð%PÐ%PÑQÔQÐQØ" 9Ô-��Ø˜’�ØÐ+Ý$ØKÀTÐKÐKñô ð ð  )��Ø˜Ò$Ð$ØÐ'Ý#Ð$WÐQUÐ$WÐ$WÑXÔXÐXØ—’ Ñ-Ô-Ð-Ø—’ 	Ñ*Ô*Ð*Ø#��å Ð!9°4Ð!9Ð!9Ñ:Ô:Ð:à ¨FÀÐIÐIÐIr8   N)r9   r:   r;   r<   ÚreÚcompileÚDOTALLrz   r
   r>   Úclassmethodr=   r€   ÚosÚPathLiker   r‰   r†   r?   r8   r6   ry   ry   £   sà   € € € € € € Ø4Ð4ð !�b”jÐ!KÈRÌYÑWÔW€FˆGÐWÐWÑWàð ð ¨cð °cð ð ð ñ „[ðð
 ð1¨R¬[ð 1¸Tð 1ð 1ð 1ñ „[ð1ð ð'J #ð 'J¨sð 'J°tð 'Jð 'Jð 'Jñ „[ð'Jð 'Jð 'Jr8   ry   c            
       ó–   — e Zd ZdZe	 	 	 ddee         dee         dee         ddfd„¦   «         Zed	ed
ee         defd„¦   «         ZdS )ÚKineticaUtilzKinetica utility functions.NÚurlrJ   Úpasswdr%   zgpudb.GPUdbc                 ó  — 	 ddl }n# t          $ r t          d¦  «        ‚w xY w|                      d|¦  «        }|                      d|¦  «        }|                      d|¦  «        }|j                             ¦   «         }||_        ||_        d|_        d|_	        d|_
         |j        ||¬	¦  «        }t                               d
                     |                     ¦   «         t          d¦  «        |j        ¦  «        ¦  «         |S )aþ  Create a connectica connection object and verify connectivity.

        If None is passed for one or more of the parameters then an attempt will be made
        to retrieve the value from the related environment variable.

        Args:
            url: The Kinetica URL or ``KINETICA_URL`` if None.
            user: The Kinetica user or ``KINETICA_USER`` if None.
            passwd: The Kinetica password or ``KINETICA_PASSWD`` if None.

        Returns:
            The Kinetica connection object.
        r   NzUCould not import Kinetica python package. Please install it with `pip install gpudb`.ÚKINETICA_URLÚKINETICA_USERÚKINETICA_PASSWDTÚINFO)ÚhostÚoptionsz.Connected to Kinetica: {}. (api={}, server={})Úgpudb)r¤   ÚModuleNotFoundErrorÚImportErrorÚ_get_envÚGPUdbÚOptionsÚusernameÚpasswordÚskip_ssl_cert_verificationÚdisable_failoverÚlogging_levelÚLOGÚinfoÚformatÚget_urlr   Úserver_version)r   r›   rJ   rœ   r¤   r£   Úkdbcs          r6   Úcreate_kdbczKineticaUtil.create_kdbcæ   s  € ð*	ØˆLˆLˆLˆLøÝ"ð 	ð 	ð 	Ýð>ñô ð ð	øøøð �lŠl˜>¨3Ñ/Ô/ˆØ�|Š|˜O¨TÑ2Ô2ˆØ—’Ð/°Ñ8Ô8ˆà”+×%Ò%Ñ'Ô'ˆØˆÔØ!ˆÔØ-1ˆÔ*Ø#'ˆÔ Ø &ˆÔØˆuŒ{ ¨WÐ5Ñ5Ô5ˆå�ŠØ<×CÒCØ—’‘”¥¨Ñ 0Ô 0°$Ô2Eñô ñ	
ô 	
ð 	
ð ˆs   ‚ ‡!rƒ   r   c                 ó^   — |�|S t          j        |¦  «        }|�|S t          d|› �¦  «        ‚)z-Get an environment variable or use a default.Nz;Parameter was not passed and not found in the environment: )r—   Úgetenvr-   )r   rƒ   r   r5   s       r6   r§   zKineticaUtil._get_env  sD   € ð ÐØˆNå”˜4‘”ˆØÐØˆMåØPÈ$ÐPÐPñ
ô 
ð 	
r8   )NNN)	r9   r:   r;   r<   r–   r	   r=   rµ   r§   r?   r8   r6   rš   rš   ã   s´   € € € € € Ø%Ð%àð "Ø"Ø $ð	.ð .à�cŒ]ð.ð �sŒmð.ð ˜”ð	.ð
 
ð.ð .ð .ñ „[ð.ð` ð
˜Cð 
¨(°3¬-ð 
¸Cð 
ð 
ð 
ñ „[ð
ð 
ð 
r8   rš   c                   óÆ  — e Zd ZU dZ ed¬¦  «        Zeed<   	 ede	de	fd„¦   «         Z
edefd„¦   «         Zede	eef         fd	„¦   «         Z	 	 ddee         deee                  dee         dedef
d„Zdedefd„Zdee	         defd„Zdede	fd„Zededee         fd„¦   «         Zedede	fd„¦   «         Zede	defd„¦   «         Zede	dee         fd„¦   «         Zd
S )ÚChatKineticaaK  Kinetica LLM Chat Model API.

    Prerequisites for using this API:

    * The ``gpudb`` and ``typeguard`` packages installed.
    * A Kinetica DB instance.
    * Kinetica host specified in ``KINETICA_URL``
    * Kinetica login specified ``KINETICA_USER``, and ``KINETICA_PASSWD``.
    * An LLM context that specifies the tables and samples to use for inferencing.

    This API is intended to interact with the Kinetica SqlAssist LLM that supports
    generation of SQL from natural language.

    In the Kinetica LLM workflow you create an LLM context in the database that provides
    information needed for infefencing that includes tables, annotations, rules, and
    samples. Invoking ``load_messages_from_context()`` will retrieve the contxt
    information from the database so that it can be used to create a chat prompt.

    The chat prompt consists of a ``SystemMessage`` and pairs of
    ``HumanMessage``/``AIMessage`` that contain the samples which are question/SQL
    pairs. You can append pairs samples to this list but it is not intended to
    facilitate a typical natural language conversation.

    When you create a chain from the chat prompt and execute it, the Kinetica LLM will
    generate SQL from the input. Optionally you can use ``KineticaSqlOutputParser`` to
    execute the SQL and return the result as a dataframe.

    The following example creates an LLM using the environment variables for the
    Kinetica connection. This will fail if the API is unable to connect to the database.

    Example:
        .. code-block:: python

            from langchain_community.chat_models.kinetica import KineticaChatLLM
            kinetica_llm = KineticaChatLLM()

    If you prefer to pass connection information directly then you can create a
    connection using ``KineticaUtil.create_kdbc()``.

    Example:
        .. code-block:: python

            from langchain_community.chat_models.kinetica import (
                KineticaChatLLM, KineticaUtil)
            kdbc = KineticaUtil._create_kdbc(url=url, user=user, passwd=passwd)
            kinetica_llm = KineticaChatLLM(kdbc=kdbc)
    T©Úexcluder´   Úvaluesr%   c                 ór   — |                      dd¦  «        }|€t                               ¦   «         }||d<   |S )zPydantic object validator.r´   N)Úgetrš   rµ   )r   r¼   r´   s      r6   Úvalidate_environmentz!ChatKinetica.validate_environmentZ  s;   € ð �zŠz˜& $Ñ'Ô'ˆØˆ<Ý×+Ò+Ñ-Ô-ˆDØ!ˆF�6‰NØˆr8   c                 ó   — dS )Nzkinetica-sqlassistr?   ©r1   s    r6   Ú	_llm_typezChatKinetica._llm_typed  s   € à#Ð#r8   c                 ól   — t          t          | j        j        ¦  «        t	          d¦  «        ¬¦  «        S )Nr¤   )Úkinetica_versionÚapi_version)rP   r=   r´   r³   r   rÁ   s    r6   Ú_identifying_paramsz ChatKinetica._identifying_paramsh  s4   € åÝ  ¤Ô!9Ñ:Ô:ÍÐPWÑHXÔHXð
ñ 
ô 
ð 	
r8   NrQ   ÚstopÚrun_managerÚkwargsc                 óž  ‡ — |�t          d¦  «        ‚ˆ fd„|D ¦   «         }‰                      |¦  «        }t          t          |j        d         j        ¦  «        }|                     ¦   «         }‰                      |¦  «        }	t          |j	        j
        |j	        j        |j        ¬¦  «        }
t          t          |	¬¦  «        g|
¬¦  «        S )Nzstop kwargs are not permitted.c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r?   )Ú_convert_message_to_dict©Ú.0Úmr1   s     €r6   ú
<listcomp>z*ChatKinetica._generate.<locals>.<listcomp>x  s'   ø€ ÐLÐLÐL¸a˜×6Ò6°qÑ9Ô9ÐLÐLÐLr8   r   )Úinput_tokensÚoutput_tokensÚ
model_name)rc   )ÚgenerationsÚ
llm_output)r-   Ú_submit_completionr   r^   rq   rc   Ú
model_dumpÚ_convert_message_from_dictrP   rr   rh   ri   rp   r   r   )r1   rQ   rÇ   rÈ   rÉ   Údict_messagesÚsql_responseÚresponse_messageÚgenerated_dictÚgenerated_messagerÕ   s   `          r6   Ú	_generatezChatKinetica._generaten  sà   ø€ ð ÐÝÐ=Ñ>Ô>Ð>àLÐLÐLÐLÀ8ÐLÑLÔLˆØ×.Ò.¨}Ñ=Ô=ˆå¥¨\Ô-AÀ!Ô-DÔ-LÑMÔMÐØ)×4Ò4Ñ6Ô6ˆà ×;Ò;¸NÑKÔKÐåØ%Ô+Ô9Ø&Ô,Ô>Ø#Ô)ð
ñ 
ô 
ˆ
õ
 Ý'Ð0AÐBÑBÔBÐCØ!ð
ñ 
ô 
ð 	
r8   Úcontext_namec                 ó’  ‡ — d|› d�}‰                       |¦  «        }|d         }t          j        |¦  «        }t                               |¦  «        }|j        }g }|                     t          d|                     ¦   «         ¬¦  «        ¦  «         | 	                    | 
                    ¦   «         ¦  «         ˆ fd„|D ¦   «         }	|	S )aR  Load a lanchain prompt from a Kinetica context.

        A Kinetica Context is an object created with the Kinetica Workbench UI or with
        SQL syntax. This function will convert the data in the context to a list of
        messages that can be used as a prompt. The messages will contain a
        ``SystemMessage`` followed by pairs of ``HumanMessage``/``AIMessage`` that
        contain the samples.

        Args:
            context_name: The name of an LLM context in the database.

        Returns:
            A list of messages containing the information from the context.
        z/GENERATE PROMPT WITH OPTIONS (CONTEXT_NAMES = 'z')ÚPromptrU   rK   c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r?   ©rØ   rÍ   s     €r6   rÐ   z;ChatKinetica.load_messages_from_context.<locals>.<listcomp>«  s'   ø€ ÐNÐNÐN¸1�D×3Ò3°AÑ6Ô6ÐNÐNÐNr8   )Ú_execute_sqlÚjsonÚloadsr[   Úmodel_validater\   r+   rP   rG   rW   rS   )
r1   rß   Úsqlr5   rs   Úprompt_jsonÚrequestr\   rÙ   rQ   s
   `         r6   Úload_messages_from_contextz'ChatKinetica.load_messages_from_contextŠ  sÎ   ø€ ð" QÀÐPÐPÐPˆà×"Ò" 3Ñ'Ô'ˆØ˜Ô!ˆÝ”j Ñ(Ô(ˆõ
 &×4Ò4°[ÑAÔAˆØ”/ˆàˆØ×Ò�T x¸×9OÒ9OÑ9QÔ9QÐRÑRÔRÑSÔSÐSà×Ò˜W×1Ò1Ñ3Ô3Ñ4Ô4Ð4ØNÐNÐNÐNÀÐNÑNÔNˆØˆr8   c                 ó0  — t          |¬¦  «        }t          j        |¦  «        }| j                             d|¦  «        }t          j        |¦  «        }|d         }|dk    rs|d         }t          j        d¦  «        }|                     |¦  «        }	|	�1|	 	                    d¦  «        }
t          j        |
¦  «        }|d         }t          |¦  «        ‚|d	         }t                               |¦  «        }
|
j        dk    rt          d
¦  «        ‚|
j        S )z/Submit a /chat/completions request to Kinetica.rV   z/chat/completionsrv   ÚOKrc   zresponse:({.*})Né   rw   zSQL Generation failed)rP   rå   Údumpsr´   Ú_GPUdb__submit_request_jsonræ   r“   r”   ÚsearchÚgroupr-   ru   rç   rv   rw   )r1   rQ   rê   Úrequest_jsonÚresponse_rawÚresponse_jsonrv   rc   Ú
match_respr5   rX   rw   s               r6   rÖ   zChatKinetica._submit_completion®  s  € õ  Ð)Ñ)Ô)ˆÝ”z 'Ñ*Ô*ˆØ”y×<Ò<Ø ñ
ô 
ˆõ œ
 <Ñ0Ô0ˆà˜xÔ(ˆØ�TŠ>ˆ>Ø# IÔ.ˆGÝœÐ$6Ñ7Ô7ˆJØ×&Ò& wÑ/Ô/ˆFØÐ!Ø!Ÿ<š<¨™?œ?�Ý $¤
¨8Ñ 4Ô 4�Ø'¨	Ô2�Ý˜WÑ%Ô%Ð%à˜VÔ$ˆå)×8Ò8¸Ñ>Ô>ˆØŒ?˜dÒ"Ð"ÝÐ4Ñ5Ô5Ð5ØŒ}Ðr8   rè   c                 ó<  — | j                              |dd¬¦  «        }|d         }|d         dk    r|d         }t          |¦  «        ‚|d         }t          |¦  «        dk    rt          d	¦  «        ‚|d
         }i }|                     ¦   «         D ]
\  }}	|	||<   Œ|S )z+Execute an SQL query and return the result.rî   F)ÚlimitÚget_column_majorÚstatus_inforv   rí   rc   ÚrecordszNo records returned.r   )r´   Úexecute_sql_and_decoder-   r,   rO   )
r1   rè   rX   rú   rc   rû   ÚrecordÚresponse_dictÚcolÚvals
             r6   rä   zChatKinetica._execute_sqlÊ  sÁ   € ð ”9×3Ò3Ø�q¨5ð 4ñ 
ô 
ˆð ˜}Ô-ˆØ�xÔ  DÒ(Ð(Ø! )Ô,ˆGÝ˜WÑ%Ô%Ð%à˜9Ô%ˆÝˆw‰<Œ<˜1ÒÐÝÐ3Ñ4Ô4Ð4à˜”ˆØˆØŸš™œð 	%ð 	%‰HˆC�Ø!$ˆM˜#ÑÐØÐr8   Úsa_datafilec                 ód   — t                                |¦  «        }|                      |¦  «        }|S )z8Load a lanchain prompt from a Kinetica context datafile.)ry   r‰   Ú_convert_dict_to_messages)r   r  Údatafile_dictrQ   s       r6   Úload_messages_from_datafilez(ChatKinetica.load_messages_from_datafileà  s/   € õ 6×IÒIÈ+ÑVÔVˆØ×0Ò0°Ñ?Ô?ˆØˆr8   rc   c                 ó  — t          t          |j        ¦  «        }t          |t          ¦  «        rd}nBt          |t
          ¦  «        rd}n*t          |t          ¦  «        rd}nt          d|› �¦  «        ‚t          ||¬¦  «        }|S )z*Convert a single message to a BaseMessage.rJ   rN   rU   zGot unsupported message type: rK   )	r   r=   rM   Ú
isinstancer   r   r   r-   rP   )r   rc   rM   rL   Úresult_messages        r6   rÌ   z%ChatKinetica._convert_message_to_dictç  s’   € õ •s˜GœOÑ,Ô,ˆÝ�g�|Ñ,Ô,ð 	IØˆDˆDÝ˜¥Ñ+Ô+ð 	IØˆDˆDÝ˜¥Ñ/Ô/ð 	IØˆDˆDåÐG¸gÐGÐGÑHÔHÐHå 4°Ð9Ñ9Ô9ˆØÐr8   c                 óÊ   — |d         }|d         }|dk    rt          |¬¦  «        S |dk    rt          |¬¦  «        S |dk    rt          |¬¦  «        S t          d|› �¦  «        ‚)z,Convert a single message from a BaseMessage.rL   rM   rJ   ©rM   rN   rU   zGot unsupported role: )r   r   r   r-   )r   rc   rL   rM   s       r6   rØ   z'ChatKinetica._convert_message_from_dictø  s€   € ð �vŒˆØ˜)Ô$ˆØ�6Š>ˆ>Ý¨Ð0Ñ0Ô0Ð0Ø�[Ò Ð Ý WÐ-Ñ-Ô-Ð-Ø�XÒÐÝ ¨Ð1Ñ1Ô1Ð1åÐ<°dÐ<Ð<Ñ=Ô=Ð=r8   Úsa_datac                 óþ   ‡ — |d         }|d         }|d         }t                                d|› �¦  «         g }|                     t          |¬¦  «        ¦  «         |                     ˆ fd„|D ¦   «         ¦  «         |S )z)Convert a dict to a list of BaseMessages.rˆ   rU   rQ   zImporting prompt for schema: r
  c                 ó:   •— g | ]}‰                      |¦  «        ‘ŒS r?   rã   )rÎ   rÏ   r   s     €r6   rÐ   z:ChatKinetica._convert_dict_to_messages.<locals>.<listcomp>  s'   ø€ ÐPÐPÐPÀ!˜C×:Ò:¸1Ñ=Ô=ÐPÐPÐPr8   )r¯   r°   r+   r   rW   )r   r  rˆ   rU   rQ   Úresult_lists   `     r6   r  z&ChatKinetica._convert_dict_to_messages  s‘   ø€ ð ˜Ô"ˆØ˜Ô"ˆØ˜:Ô&ˆÝ�ŠÐ9°Ð9Ð9Ñ:Ô:Ð:à)+ˆØ×Ò�=°Ð8Ñ8Ô8Ñ9Ô9Ð9Ø×ÒÐPÐPÐPÐPÀxÐPÑPÔPÑQÔQÐQØÐr8   )NN)r9   r:   r;   r<   r   r´   r   r>   r   r   r¿   Úpropertyr=   rÂ   rÆ   r   r   r	   r   r   rÞ   rë   rl   rÖ   rä   r–   r   r  rÌ   rØ   r  r?   r8   r6   r¹   r¹   &  sW  € € € € € € ð.ð .ð` �˜dÐ#Ñ#Ô#€Dˆ#Ð#Ð#Ñ#Ø#àð¨$ð °4ð ð ð ñ „Xðð ð$˜3ð $ð $ð $ñ „Xð$ð ð
 T¨#¨s¨(¤^ð 
ð 
ð 
ñ „Xð
ð %)Ø:>ð	
ð 
à�{Ô#ð
ð �t˜C”yÔ!ð
ð Ð6Ô7ð	
ð
 ð
ð 
ð
ð 
ð 
ð 
ð8"°sð "¸tð "ð "ð "ð "ðH¨4°¬:ð ¸/ð ð ð ð ð8 ð ¨ð ð ð ð ð, ð°dð ¸tÀKÔ?Pð ð ð ñ „[ðð ð¨{ð ¸tð ð ð ñ „[ðð  ð>°ð >¸+ð >ð >ð >ñ „[ð>ð ð°ð ¸¸kÔ9Jð ð ð ñ „[ðð ð r8   r¹   c                   ót   — e Zd ZU dZ ed¬¦  «        Zeed<   	  ed¬¦  «        Ze	ed<   	  e
d¬¦  «        ZdS )	ÚKineticaSqlResponsezÙResponse containing SQL and the fetched data.

    This object is returned by a chain with ``KineticaSqlOutputParser`` and it contains
    the generated SQL and related Pandas Dataframe fetched from the database.
    r)   )r   rè   NÚ	dataframeT©Úarbitrary_types_allowed)r9   r:   r;   r<   r   rè   r=   r>   r  r   r   Úmodel_configr?   r8   r6   r  r    sw   € € € € € € ðð ð ˆu˜RÐ Ñ Ô €CˆÐ Ð Ñ Øð �U 4Ð(Ñ(Ô(€IˆsÐ(Ð(Ñ(Ø;à�:Ø $ðñ ô €L€L€Lr8   r  c                   ó¢   — e Zd ZU dZ ed¬¦  «        Zeed<   	  ed¬¦  «        Z	de
defd„Zd	d
œdee         dedefd„Zede
fd„¦   «         ZdS )ÚKineticaSqlOutputParseraÂ  Fetch and return data from the Kinetica LLM.

    This object is used as the last element of a chain to execute generated SQL and it
    will output a ``KineticaSqlResponse`` containing the SQL and a pandas dataframe with
    the fetched data.

    Example:
        .. code-block:: python

            from langchain_community.chat_models.kinetica import (
                KineticaChatLLM, KineticaSqlOutputParser)
            kinetica_llm = KineticaChatLLM()

            # create chain
            ctx_messages = kinetica_llm.load_messages_from_context(self.context_name)
            ctx_messages.append(("human", "{input}"))
            prompt_template = ChatPromptTemplate.from_messages(ctx_messages)
            chain = (
                prompt_template
                | kinetica_llm
                | KineticaSqlOutputParser(kdbc=kinetica_llm.kdbc)
            )
            sql_response: KineticaSqlResponse = chain.invoke(
                {"input": "What are the female users ordered by username?"}
            )

            assert isinstance(sql_response, KineticaSqlResponse)
            LOG.info(f"SQL Response: {sql_response.sql}")
            assert isinstance(sql_response.dataframe, pd.DataFrame)
    Trº   r´   r  r{   r%   c                 óX   — | j                              |¦  «        }t          ||¬¦  «        S )N)rè   r  )r´   Úto_dfr  )r1   r{   Údfs      r6   ÚparsezKineticaSqlOutputParser.parseP  s(   € ØŒY�_Š_˜TÑ"Ô"ˆÝ" t°rÐ:Ñ:Ô:Ð:r8   F)Úpartialr5   r  c                óB   — |                       |d         j        ¦  «        S )Nr   )r  r{   )r1   r5   r  s      r6   Úparse_resultz$KineticaSqlOutputParser.parse_resultT  s   € ð �zŠz˜& œ)œ.Ñ)Ô)Ð)r8   c                 ó   — dS )NÚkinetica_sql_output_parserr?   rÁ   s    r6   Ú_typezKineticaSqlOutputParser._typeY  s   € à+Ð+r8   N)r9   r:   r;   r<   r   r´   r   r>   r   r  r=   r  r  r   r   Úboolr  r  r!  r?   r8   r6   r  r  )  sæ   € € € € € € ðð ð> �˜dÐ#Ñ#Ô#€Dˆ#Ð#Ð#Ñ#Ø#à�:Ø $ðñ ô €Lð;˜#ð ;Ð"5ð ;ð ;ð ;ð ;ð
 <Að*ð *ð *Ø˜:Ô&ð*Ø48ð*à	ð*ð *ð *ð *ð
 ð,�sð ,ð ,ð ,ñ „Xð,ð ,ð ,r8   r  )7r<   rå   Úloggingr—   r“   Úimportlib.metadatar   Úpathlibr   Útypingr   r   r   r   r	   r
   r   Úlangchain_core.utilsr   r¤   Úlangchain_core.callbacksr   Ú*langchain_core.language_models.chat_modelsr   Úlangchain_core.messagesr   r   r   r   Ú'langchain_core.output_parsers.transformr   Úlangchain_core.outputsr   r   r   Úpydanticr   r   r   Ú	getLoggerr9   r¯   r   rA   r[   r^   ra   rg   rl   ru   ry   rš   r¹   r  r  r?   r8   r6   ú<module>r/     sÅ  ðð 'Ð &à €€€Ø €€€Ø 	€	€	€	Ø 	€	€	€	Ø &Ð &Ð &Ð &Ð &Ð &Ø Ð Ð Ð Ð Ð Ø JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ JÐ Jà )Ð )Ð )Ð )Ð )Ð )àð Ø€L€L€Là =Ð =Ð =Ð =Ð =Ð =Ø DÐ DÐ DÐ DÐ DÐ Dðð ð ð ð ð ð ð ð ð ð ð ð EÐ DÐ DÐ DÐ DÐ DØ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IÐ IØ 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1Ð 1à€gÔ˜Ñ!Ô!€ð
'ð 'ð 'ð 'ð '˜ñ 'ô 'ð 'ðT"ð "ð "ð "ð "˜ñ "ô "ð "ðJ ð  ð  ð  ð  ˜)ñ  ô  ð  ðð ð ð ð �)ñ ô ð ðð ð ð ð �ñ ô ð ðð ð ð ð �	ñ ô ð ð	@ð 	@ð 	@ð 	@ð 	@�iñ 	@ô 	@ð 	@ðð ð ð ð ˜Yñ ô ð ð=Jð =Jð =Jð =Jð =Jñ =Jô =Jð =Jð@@
ð @
ð @
ð @
ð @
ñ @
ô @
ð @
ðFmð mð mð mð m�=ñ mô mð mð`ð ð ð ð ˜)ñ ô ð ð&2,ð 2,ð 2,ð 2,ð 2,Ð.Ð/BÔCñ 2,ô 2,ð 2,ð 2,ð 2,r8   