
    Ng                        d Z ddlmZmZmZmZmZ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 ddlmZmZ ddlmZ ddlmZ dd	lmZ dd
lmZ  G d de          Z G d de          Z G d dee          Z G d de          Z  G d dee          Z! G d de          Z" G d dee          Z# G d de          Z$ G d dee          Z%dS )z*Tools for interacting with a SQL database.    )AnyDictOptionalSequenceTypeUnion)Result)	BaseModelFieldroot_validatormodel_validator
ConfigDict)BaseLanguageModel)AsyncCallbackManagerForToolRunCallbackManagerForToolRun)PromptTemplate)SQLDatabase)BaseTool)QUERY_CHECKERc                   N    e Zd ZU dZ ed          Zeed<    ed          Z	dS )BaseSQLDatabaseToolz.Base tool for interacting with a SQL database.T)excludedb)arbitrary_types_allowedN)
__name__
__module____qualname____doc__r   r   r   __annotations__r   model_config     g/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/tools/sql_database/tool.pyr   r      sL         88eD)))B))): $  LLLr"   r   c                   4    e Zd ZU  edd          Zeed<   dS )_QuerySQLDataBaseToolInput.z!A detailed and correct SQL query.descriptionqueryNr   r   r   r   r(   strr   r!   r"   r#   r%   r%      s2         s(KLLLE3LLLLLr"   r%   c                       e Zd ZU dZdZeed<   dZeed<   eZ	e
e         ed<   	 dded	ee         d
eeeeeef                  ef         fdZdS )QuerySQLDataBaseToolz!Tool for querying a SQL database.sql_db_querynamez
    Execute a SQL query against the database and get back the result..
    If the query is not correct, an error message will be returned.
    If an error is returned, rewrite the query, check the query, and try again.
    r'   args_schemaNr(   run_managerreturnc                 6    | j                             |          S )z:Execute the query, return the results or an error message.)r   run_no_throwselfr(   r0   s      r#   _runzQuerySQLDataBaseTool._run.   s     w##E***r"   N)r   r   r   r   r.   r*   r   r'   r%   r/   r   r
   r   r   r   r   r   r   r	   r6   r!   r"   r#   r,   r,   #   s         ++D#K   
 $>Ki===
 <@+ ++ 78+ 
sHT#s(^,f4	5	+ + + + + +r"   r,   c                   4    e Zd ZU  edd          Zeed<   dS )_InfoSQLDatabaseToolInput.zqA comma-separated list of the table names for which to return the schema. Example input: 'table1, table2, table3'r&   table_namesN)r   r   r   r   r:   r*   r   r!   r"   r#   r9   r9   7   sE         u6  K     r"   r9   c                   n    e Zd ZU dZdZeed<   dZeed<   eZ	e
e         ed<   	 dded	ee         d
efdZdS )InfoSQLDatabaseToolz/Tool for getting metadata about a SQL database.sql_db_schemar.   z<Get the schema and sample rows for the specified SQL tables.r'   r/   Nr:   r0   r1   c                 p    | j                             d |                    d          D                       S )z4Get the schema for tables in a comma-separated list.c                 6    g | ]}|                                 S r!   )strip).0ts     r#   
<listcomp>z,InfoSQLDatabaseTool._run.<locals>.<listcomp>O   s     7771QWWYY777r"   ,)r   get_table_info_no_throwsplit)r5   r:   r0   s      r#   r6   zInfoSQLDatabaseTool._runH   s=     w..77 1 1# 6 6777
 
 	
r"   r7   )r   r   r   r   r.   r*   r   r'   r9   r/   r   r
   r   r   r6   r!   r"   r#   r<   r<   A   s         99D#UKUUU#<Ki<<<
 <@
 

 78
 
	
 
 
 
 
 
r"   r<   c                   4    e Zd ZU  edd          Zeed<   dS )_ListSQLDataBaseToolInput zAn empty stringr&   
tool_inputN)r   r   r   r   rJ   r*   r   r!   r"   r#   rH   rH   S   s2         eB,=>>>J>>>>>r"   rH   c                   p    e Zd ZU dZdZeed<   dZeed<   eZ	e
e         ed<   	 	 dd	ed
ee         defdZdS )ListSQLDatabaseToolzTool for getting tables names.sql_db_list_tablesr.   zUInput is an empty string, output is a comma-separated list of tables in the database.r'   r/   rI   NrJ   r0   r1   c                 Z    d                     | j                                                  S )z*Get a comma-separated list of table names.z, )joinr   get_usable_table_names)r5   rJ   r0   s      r#   r6   zListSQLDatabaseTool._run^   s$     yy7799:::r"   )rI   N)r   r   r   r   r.   r*   r   r'   rH   r/   r   r
   r   r   r6   r!   r"   r#   rL   rL   W   s         (($D#$$$nKnnn#<Ki<<< ;?; ;; 78; 
	; ; ; ; ; ;r"   rL   c                   4    e Zd ZU  edd          Zeed<   dS )_QuerySQLCheckerToolInput.z'A detailed and SQL query to be checked.r&   r(   Nr)   r!   r"   r#   rR   rR   g   s2         s(QRRRE3RRRRRr"   rR   c                       e Zd ZU dZeZeed<   eed<    e	d          Z
eed<   dZeed<   d	Zeed
<   eZee         ed<    ed          edeeef         defd                        Z	 ddedee         defdZ	 ddedee         defdZdS )QuerySQLCheckerToolzUse an LLM to check if a query is correct.
    Adapted from https://www.patterns.app/blog/2023/01/18/crunchbot-sql-analyst-gpt/templatellmF)init	llm_chainsql_db_query_checkerr.   z
    Use this tool to double check if your query is correct before executing it.
    Always use this tool before executing a query with sql_db_query!
    r'   r/   before)modevaluesr1   c                     d|vr?ddl m}  ||                    d          t          t          ddg                    |d<   |d         j        j        ddgk    rt          d	          |S )
NrX   r   )LLMChainrV   dialectr(   )rU   input_variables)rV   promptzMLLM chain for QueryCheckerTool must have input variables ['query', 'dialect'])langchain.chains.llmr^   getr   r   ra   r`   
ValueError)clsr\   r^   s      r#   initialize_llm_chainz(QuerySQLCheckerTool.initialize_llm_chainy   s     f$$555555"*(JJu%%%*Y<P  # # #F; +%5)W9MMM_   r"   Nr(   r0   c                 |    | j                             || j        j        |r|                                nd          S )zUse the LLM to check the query.Nr(   r_   	callbacks)rX   predictr   r_   	get_childr4   s      r#   r6   zQuerySQLCheckerTool._run   sF     ~%%GO1<Fk++---$ & 
 
 	
r"   c                    K   | j                             || j        j        |r|                                nd            d {V S )Nrh   )rX   apredictr   r_   rk   r4   s      r#   _arunzQuerySQLCheckerTool._arun   sh      
 ^,,GO1<Fk++---$ - 
 
 
 
 
 
 
 
 	
r"   r7   )r   r   r   r   r   rU   r*   r   r   r   rX   r   r.   r'   rR   r/   r   r
   r   classmethodr   rf   r   r   r6   r   rn   r!   r"   r#   rT   rT   k   sj        X X "Hc!!!	U&&&Is&&&&D#&&&K    $=Ki<<<_(###$sCx. S    [ $#* <@

 



 78

 
	

 

 

 

 AE	
 	
	
 <=	
 
		
 	
 	
 	
 	
 	
r"   rT   N)&r   typingr   r   r   r   r   r   sqlalchemy.enginer	   pydanticr
   r   r   r   r   langchain_core.language_modelsr   langchain_core.callbacksr   r   langchain_core.promptsr   *langchain_community.utilities.sql_databaser   langchain_core.toolsr   -langchain_community.tools.sql_database.promptr   r   r%   r,   r9   r<   rH   rL   rR   rT   r!   r"   r#   <module>ry      s   0 0 = = = = = = = = = = = = = = = = $ $ $ $ $ $ R R R R R R R R R R R R R R < < < < < <        2 1 1 1 1 1 B B B B B B ) ) ) ) ) ) G G G G G G    )   M M M M M M M M+ + + + +. + + +(    	   
 
 
 
 
-x 
 
 
$? ? ? ? ?	 ? ? ?; ; ; ; ;-x ; ; ; S S S S S	 S S S7
 7
 7
 7
 7
-x 7
 7
 7
 7
 7
r"   