
    Ng                         d Z ddlmZ ddlmZ ddlmZ ddlmZ ddl	m
Z
 ddl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  G d de          Ze                                 dS )z-Toolkit for interacting with an SQL database.    )List)	BaseCache)	Callbacks)BaseLanguageModel)BaseTool)BaseToolkit)
ConfigDictField)InfoSQLDatabaseToolListSQLDatabaseToolQuerySQLCheckerToolQuerySQLDataBaseTool)SQLDatabasec                       e Zd ZU dZ ed          Zeed<    ed          Ze	ed<   e
defd            Z ed          Zdee         fd	Zdefd
ZdS )SQLDatabaseToolkita  SQLDatabaseToolkit for interacting with SQL databases.

    Setup:
        Install ``langchain-community``.

        .. code-block:: bash

            pip install -U langchain-community

    Key init args:
        db: SQLDatabase
            The SQL database.
        llm: BaseLanguageModel
            The language model (for use with QuerySQLCheckerTool)

    Instantiate:
        .. code-block:: python

            from langchain_community.agent_toolkits.sql.toolkit import SQLDatabaseToolkit
            from langchain_community.utilities.sql_database import SQLDatabase
            from langchain_openai import ChatOpenAI

            db = SQLDatabase.from_uri("sqlite:///Chinook.db")
            llm = ChatOpenAI(temperature=0)

            toolkit = SQLDatabaseToolkit(db=db, llm=llm)

    Tools:
        .. code-block:: python

            toolkit.get_tools()

    Use within an agent:
        .. code-block:: python

            from langchain import hub
            from langgraph.prebuilt import create_react_agent

            # Pull prompt (or define your own)
            prompt_template = hub.pull("langchain-ai/sql-agent-system-prompt")
            system_message = prompt_template.format(dialect="SQLite", top_k=5)

            # Create agent
            agent_executor = create_react_agent(
                llm, toolkit.get_tools(), state_modifier=system_message
            )

            # Query agent
            example_query = "Which country's customers spent the most?"

            events = agent_executor.stream(
                {"messages": [("user", example_query)]},
                stream_mode="values",
            )
            for event in events:
                event["messages"][-1].pretty_print()
    T)excludedbllmreturnc                     | j         j        S )z3Return string representation of SQL dialect to use.)r   dialectselfs    j/var/www/html/ai-engine/env/lib/python3.11/site-packages/langchain_community/agent_toolkits/sql/toolkit.pyr   zSQLDatabaseToolkit.dialectS   s     w    )arbitrary_types_allowedc                 
   t          | j                  }d|j         d}t          | j        |          }d|j         d}t	          | j        |          }d|j         d}t          | j        | j        |	          }||||gS )
zGet the tools in the toolkit.)r   zInput to this tool is a comma-separated list of tables, output is the schema and sample rows for those tables. Be sure that the tables actually exist by calling z- first! Example Input: table1, table2, table3)r   descriptiona4  Input to this tool is a detailed and correct SQL query, output is a result from the database. 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. If you encounter an issue with Unknown column 'xxxx' in 'field list', use z# to query the correct table fields.zUse this tool to double check if your query is correct before executing it. Always use this tool before executing a query with !)r   r   r   )r   r   namer   r   r   r   )r   list_sql_database_tool"info_sql_database_tool_descriptioninfo_sql_database_tool#query_sql_database_tool_descriptionquery_sql_database_tool"query_sql_checker_tool_descriptionquery_sql_checker_tools           r   	get_toolszSQLDatabaseToolkit.get_tools\   s    !4!@!@!@4 &*4 4 4 	+ "5w$F"
 "
 "
1 ,B+F	1 1 1 	, #7w$G#
 #
 #
/&+/ / / 	+
 "5wDH2T"
 "
 "
 $"""	
 	
r   c                 4    | j                                         S )z4Return db context that you may want in agent prompt.)r   get_contextr   s    r   r*   zSQLDatabaseToolkit.get_context   s    w""$$$r   N)__name__
__module____qualname____doc__r
   r   r   __annotations__r   r   propertystrr   r	   model_configr   r   r(   dictr*    r   r   r   r      s         8 8t eD)))B)))"U4000C	000    X : $  L%
4> %
 %
 %
 %
N%T % % % % % %r   r   N)r.   typingr   langchain_core.cachesr   langchain_core.callbacksr   langchain_core.language_modelsr   langchain_core.toolsr   langchain_core.tools.baser   pydanticr	   r
   +langchain_community.tools.sql_database.toolr   r   r   r   *langchain_community.utilities.sql_databaser   r   model_rebuildr4   r   r   <module>r?      s-   3 3       8 8 8 8 8 8 ; ; ; ; ; ; < < < < < < ) ) ) ) ) ) 1 1 1 1 1 1 & & & & & & & &            C B B B B Bp% p% p% p% p% p% p% p%f      " " " " "r   