From fa0618883493cf6a1447a73b66cd10c0f028e09b Mon Sep 17 00:00:00 2001 From: Bagatur <22008038+baskaryan@users.noreply.github.com> Date: Thu, 12 Dec 2024 19:16:03 -0800 Subject: [PATCH] community[patch]: fix QuerySQLDatabaseTool name (#28659) Co-authored-by: Chester Curme --- .../integrations/tools/sql_database.ipynb | 52 ++++++++--------- docs/docs/tutorials/sql_qa.ipynb | 58 +++++++++---------- .../agent_toolkits/sql/toolkit.py | 7 ++- .../langchain_community/tools/__init__.py | 6 +- .../tools/sql_database/tool.py | 22 +++++-- .../tests/unit_tests/tools/test_exported.py | 3 +- .../tests/unit_tests/tools/test_imports.py | 1 + 7 files changed, 84 insertions(+), 65 deletions(-) diff --git a/docs/docs/integrations/tools/sql_database.ipynb b/docs/docs/integrations/tools/sql_database.ipynb index 0582040343746..cc95f06063669 100644 --- a/docs/docs/integrations/tools/sql_database.ipynb +++ b/docs/docs/integrations/tools/sql_database.ipynb @@ -192,10 +192,10 @@ { "data": { "text/plain": [ - "[QuerySQLDataBaseTool(description=\"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 sql_db_schema to query the correct table fields.\", db=),\n", - " InfoSQLDatabaseTool(description='Input 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 sql_db_list_tables first! Example Input: table1, table2, table3', db=),\n", - " ListSQLDatabaseTool(db=),\n", - " QuerySQLCheckerTool(description='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!', db=, llm=ChatOpenAI(client=, async_client=, temperature=0.0, openai_api_key=SecretStr('**********'), openai_proxy=''), llm_chain=LLMChain(prompt=PromptTemplate(input_variables=['dialect', 'query'], template='\\n{query}\\nDouble check the {dialect} query above for common mistakes, including:\\n- Using NOT IN with NULL values\\n- Using UNION when UNION ALL should have been used\\n- Using BETWEEN for exclusive ranges\\n- Data type mismatch in predicates\\n- Properly quoting identifiers\\n- Using the correct number of arguments for functions\\n- Casting to the correct data type\\n- Using the proper columns for joins\\n\\nIf there are any of the above mistakes, rewrite the query. If there are no mistakes, just reproduce the original query.\\n\\nOutput the final SQL query only.\\n\\nSQL Query: '), llm=ChatOpenAI(client=, async_client=, temperature=0.0, openai_api_key=SecretStr('**********'), openai_proxy='')))]" + "[QuerySQLDatabaseTool(description=\"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 sql_db_schema to query the correct table fields.\", db=),\n", + " InfoSQLDatabaseTool(description='Input 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 sql_db_list_tables first! Example Input: table1, table2, table3', db=),\n", + " ListSQLDatabaseTool(db=),\n", + " QuerySQLCheckerTool(description='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!', db=, llm=ChatOpenAI(client=, async_client=, root_client=, root_async_client=, temperature=0.0, model_kwargs={}, openai_api_key=SecretStr('**********')), llm_chain=LLMChain(verbose=False, prompt=PromptTemplate(input_variables=['dialect', 'query'], input_types={}, partial_variables={}, template='\\n{query}\\nDouble check the {dialect} query above for common mistakes, including:\\n- Using NOT IN with NULL values\\n- Using UNION when UNION ALL should have been used\\n- Using BETWEEN for exclusive ranges\\n- Data type mismatch in predicates\\n- Properly quoting identifiers\\n- Using the correct number of arguments for functions\\n- Casting to the correct data type\\n- Using the proper columns for joins\\n\\nIf there are any of the above mistakes, rewrite the query. If there are no mistakes, just reproduce the original query.\\n\\nOutput the final SQL query only.\\n\\nSQL Query: '), llm=ChatOpenAI(client=, async_client=, root_client=, root_async_client=, temperature=0.0, model_kwargs={}, openai_api_key=SecretStr('**********')), output_parser=StrOutputParser(), llm_kwargs={}))]" ] }, "execution_count": 4, @@ -226,7 +226,7 @@ " InfoSQLDatabaseTool,\n", " ListSQLDatabaseTool,\n", " QuerySQLCheckerTool,\n", - " QuerySQLDataBaseTool,\n", + " QuerySQLDatabaseTool,\n", ")" ] }, @@ -242,7 +242,7 @@ }, { "cell_type": "code", - "execution_count": 5, + "execution_count": 6, "id": "eda12f8b-be90-4697-ac84-2ece9e2d1708", "metadata": {}, "outputs": [ @@ -265,7 +265,7 @@ }, { "cell_type": "code", - "execution_count": 6, + "execution_count": 7, "id": "3470ae96-e5e5-4717-a6d6-d7d28c7b7347", "metadata": {}, "outputs": [], @@ -283,7 +283,7 @@ }, { "cell_type": "code", - "execution_count": 7, + "execution_count": 8, "id": "48bca92c-9b4b-4d5c-bcce-1b239c9e901c", "metadata": {}, "outputs": [], @@ -305,7 +305,7 @@ }, { "cell_type": "code", - "execution_count": 8, + "execution_count": 9, "id": "39e6d2bf-3194-4aba-854b-63faf919157b", "metadata": {}, "outputs": [ @@ -318,8 +318,8 @@ "Which country's customers spent the most?\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_list_tables (call_eiheSxiL0s90KE50XyBnBtJY)\n", - " Call ID: call_eiheSxiL0s90KE50XyBnBtJY\n", + " sql_db_list_tables (call_EBPjyfzqXzFutDn8BklYACLj)\n", + " Call ID: call_EBPjyfzqXzFutDn8BklYACLj\n", " Args:\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", "Name: sql_db_list_tables\n", @@ -327,8 +327,8 @@ "Album, Artist, Customer, Employee, Genre, Invoice, InvoiceLine, MediaType, Playlist, PlaylistTrack, Track\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_schema (call_YKwGWt4UUVmxxY7vjjBDzFLJ)\n", - " Call ID: call_YKwGWt4UUVmxxY7vjjBDzFLJ\n", + " sql_db_schema (call_kGcnKpxRVFIY8dPjYIJbRoVU)\n", + " Call ID: call_kGcnKpxRVFIY8dPjYIJbRoVU\n", " Args:\n", " table_names: Customer, Invoice, InvoiceLine\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", @@ -405,14 +405,14 @@ "*/\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_query (call_7WBDcMxl1h7MnI05njx1q8V9)\n", - " Call ID: call_7WBDcMxl1h7MnI05njx1q8V9\n", + " sql_db_query (call_cTfI7OrY64FzJaDd49ILFWw7)\n", + " Call ID: call_cTfI7OrY64FzJaDd49ILFWw7\n", " Args:\n", " query: SELECT c.Country, SUM(i.Total) AS TotalSpent FROM Customer c JOIN Invoice i ON c.CustomerId = i.CustomerId GROUP BY c.Country ORDER BY TotalSpent DESC LIMIT 1\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", "Name: sql_db_query\n", "\n", - "[('USA', 523.0600000000003)]\n", + "[('USA', 523.06)]\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", "Customers from the USA spent the most, with a total amount spent of $523.06.\n" @@ -440,7 +440,7 @@ }, { "cell_type": "code", - "execution_count": 9, + "execution_count": 10, "id": "23c1235c-6d18-43e4-98ab-85b426b53d94", "metadata": {}, "outputs": [ @@ -453,8 +453,8 @@ "Who are the top 3 best selling artists?\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_query (call_9F6Bp2vwsDkeLW6FsJFqLiet)\n", - " Call ID: call_9F6Bp2vwsDkeLW6FsJFqLiet\n", + " sql_db_query (call_xAkvYiRFM7nCMKXsDNvk1OMx)\n", + " Call ID: call_xAkvYiRFM7nCMKXsDNvk1OMx\n", " Args:\n", " query: SELECT artist_name, SUM(quantity) AS total_sold FROM sales GROUP BY artist_name ORDER BY total_sold DESC LIMIT 3\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", @@ -465,8 +465,8 @@ "(Background on this error at: https://sqlalche.me/e/20/e3q8)\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_list_tables (call_Gx5adzWnrBDIIxzUDzsn83zO)\n", - " Call ID: call_Gx5adzWnrBDIIxzUDzsn83zO\n", + " sql_db_list_tables (call_K4Zvbowsq7XPgGFepbvc5G7i)\n", + " Call ID: call_K4Zvbowsq7XPgGFepbvc5G7i\n", " Args:\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", "Name: sql_db_list_tables\n", @@ -474,8 +474,8 @@ "Album, Artist, Customer, Employee, Genre, Invoice, InvoiceLine, MediaType, Playlist, PlaylistTrack, Track\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_schema (call_ftywrZgEgGWLrnk9dYC0xtZv)\n", - " Call ID: call_ftywrZgEgGWLrnk9dYC0xtZv\n", + " sql_db_schema (call_tUztueSK7VO2klZ99xT4ZVhM)\n", + " Call ID: call_tUztueSK7VO2klZ99xT4ZVhM\n", " Args:\n", " table_names: Artist, Album, InvoiceLine\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", @@ -534,8 +534,8 @@ "*/\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_query (call_i6n3lmS7E2ZivN758VOayTiy)\n", - " Call ID: call_i6n3lmS7E2ZivN758VOayTiy\n", + " sql_db_query (call_tVtLQIRPmCM6pukgpHFfq86A)\n", + " Call ID: call_tVtLQIRPmCM6pukgpHFfq86A\n", " Args:\n", " query: SELECT Artist.Name AS artist_name, SUM(InvoiceLine.Quantity) AS total_sold FROM Artist JOIN Album ON Artist.ArtistId = Album.ArtistId JOIN Track ON Album.AlbumId = Track.AlbumId JOIN InvoiceLine ON Track.TrackId = InvoiceLine.TrackId GROUP BY Artist.Name ORDER BY total_sold DESC LIMIT 3\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", @@ -614,7 +614,7 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.10.12" + "version": "3.10.4" } }, "nbformat": 4, diff --git a/docs/docs/tutorials/sql_qa.ipynb b/docs/docs/tutorials/sql_qa.ipynb index efd996ef238af..4f67b1624ae05 100644 --- a/docs/docs/tutorials/sql_qa.ipynb +++ b/docs/docs/tutorials/sql_qa.ipynb @@ -305,12 +305,12 @@ "metadata": {}, "outputs": [], "source": [ - "from langchain_community.tools.sql_database.tool import QuerySQLDataBaseTool\n", + "from langchain_community.tools.sql_database.tool import QuerySQLDatabaseTool\n", "\n", "\n", "def execute_query(state: State):\n", " \"\"\"Execute SQL query.\"\"\"\n", - " execute_query_tool = QuerySQLDataBaseTool(db=db)\n", + " execute_query_tool = QuerySQLDatabaseTool(db=db)\n", " return {\"result\": execute_query_tool.invoke(state[\"query\"])}" ] }, @@ -407,7 +407,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] @@ -490,7 +490,7 @@ "outputs": [ { "data": { - "image/png": "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", + "image/png": "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", "text/plain": [ "" ] @@ -519,7 +519,7 @@ "name": "stdout", "output_type": "stream", "text": [ - "{'write_query': {'query': 'SELECT COUNT(EmployeeId) AS NumberOfEmployees FROM Employee;'}}\n", + "{'write_query': {'query': 'SELECT COUNT(EmployeeId) AS EmployeeCount FROM Employee;'}}\n", "{'__interrupt__': ()}\n" ] }, @@ -617,10 +617,10 @@ { "data": { "text/plain": [ - "[QuerySQLDataBaseTool(description=\"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 sql_db_schema to query the correct table fields.\", db=),\n", - " InfoSQLDatabaseTool(description='Input 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 sql_db_list_tables first! Example Input: table1, table2, table3', db=),\n", - " ListSQLDatabaseTool(db=),\n", - " QuerySQLCheckerTool(description='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!', db=, llm=ChatOpenAI(client=, async_client=, root_client=, root_async_client=, model_name='gpt-4o', temperature=0.0, model_kwargs={}, openai_api_key=SecretStr('**********')), llm_chain=LLMChain(verbose=False, prompt=PromptTemplate(input_variables=['dialect', 'query'], input_types={}, partial_variables={}, template='\\n{query}\\nDouble check the {dialect} query above for common mistakes, including:\\n- Using NOT IN with NULL values\\n- Using UNION when UNION ALL should have been used\\n- Using BETWEEN for exclusive ranges\\n- Data type mismatch in predicates\\n- Properly quoting identifiers\\n- Using the correct number of arguments for functions\\n- Casting to the correct data type\\n- Using the proper columns for joins\\n\\nIf there are any of the above mistakes, rewrite the query. If there are no mistakes, just reproduce the original query.\\n\\nOutput the final SQL query only.\\n\\nSQL Query: '), llm=ChatOpenAI(client=, async_client=, root_client=, root_async_client=, model_name='gpt-4o', temperature=0.0, model_kwargs={}, openai_api_key=SecretStr('**********')), output_parser=StrOutputParser(), llm_kwargs={}))]" + "[QuerySQLDatabaseTool(description=\"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 sql_db_schema to query the correct table fields.\", db=),\n", + " InfoSQLDatabaseTool(description='Input 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 sql_db_list_tables first! Example Input: table1, table2, table3', db=),\n", + " ListSQLDatabaseTool(db=),\n", + " QuerySQLCheckerTool(description='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!', db=, llm=ChatOpenAI(client=, async_client=, root_client=, root_async_client=, model_name='gpt-4o', temperature=0.0, model_kwargs={}, openai_api_key=SecretStr('**********')), llm_chain=LLMChain(verbose=False, prompt=PromptTemplate(input_variables=['dialect', 'query'], input_types={}, partial_variables={}, template='\\n{query}\\nDouble check the {dialect} query above for common mistakes, including:\\n- Using NOT IN with NULL values\\n- Using UNION when UNION ALL should have been used\\n- Using BETWEEN for exclusive ranges\\n- Data type mismatch in predicates\\n- Properly quoting identifiers\\n- Using the correct number of arguments for functions\\n- Casting to the correct data type\\n- Using the proper columns for joins\\n\\nIf there are any of the above mistakes, rewrite the query. If there are no mistakes, just reproduce the original query.\\n\\nOutput the final SQL query only.\\n\\nSQL Query: '), llm=ChatOpenAI(client=, async_client=, root_client=, root_async_client=, model_name='gpt-4o', temperature=0.0, model_kwargs={}, openai_api_key=SecretStr('**********')), output_parser=StrOutputParser(), llm_kwargs={}))]" ] }, "execution_count": 17, @@ -693,7 +693,7 @@ }, { "cell_type": "code", - "execution_count": 20, + "execution_count": 19, "metadata": {}, "outputs": [], "source": [ @@ -711,7 +711,7 @@ }, { "cell_type": "code", - "execution_count": 21, + "execution_count": 20, "metadata": {}, "outputs": [], "source": [ @@ -730,7 +730,7 @@ }, { "cell_type": "code", - "execution_count": 22, + "execution_count": 21, "metadata": {}, "outputs": [ { @@ -742,8 +742,8 @@ "Which country's customers spent the most?\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_list_tables (call_J7Cj6d9gqkaOwiB99fv8y6uh)\n", - " Call ID: call_J7Cj6d9gqkaOwiB99fv8y6uh\n", + " sql_db_list_tables (call_tFp7HYD6sAAmCShgeqkVZH6Q)\n", + " Call ID: call_tFp7HYD6sAAmCShgeqkVZH6Q\n", " Args:\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", "Name: sql_db_list_tables\n", @@ -751,8 +751,8 @@ "Album, Artist, Customer, Employee, Genre, Invoice, InvoiceLine, MediaType, Playlist, PlaylistTrack, Track\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_schema (call_zF4O1BfsAfEfQP85vvHPu6Kp)\n", - " Call ID: call_zF4O1BfsAfEfQP85vvHPu6Kp\n", + " sql_db_schema (call_KJZ1Jx6JazyDdJa0uH1UeiOz)\n", + " Call ID: call_KJZ1Jx6JazyDdJa0uH1UeiOz\n", " Args:\n", " table_names: Customer, Invoice\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", @@ -809,8 +809,8 @@ "*/\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_query_checker (call_YkdCcgJOzVUc4IsI3ytLPf0x)\n", - " Call ID: call_YkdCcgJOzVUc4IsI3ytLPf0x\n", + " sql_db_query_checker (call_AQuTGbgH63u4gPgyV723yrjX)\n", + " Call ID: call_AQuTGbgH63u4gPgyV723yrjX\n", " Args:\n", " query: SELECT c.Country, SUM(i.Total) as TotalSpent FROM Customer c JOIN Invoice i ON c.CustomerId = i.CustomerId GROUP BY c.Country ORDER BY TotalSpent DESC LIMIT 1;\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", @@ -821,8 +821,8 @@ "```\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_query (call_cojsHW4TTadu9fe6oooMr4Y9)\n", - " Call ID: call_cojsHW4TTadu9fe6oooMr4Y9\n", + " sql_db_query (call_B88EwU44nwwpQL5M9nlcemSU)\n", + " Call ID: call_B88EwU44nwwpQL5M9nlcemSU\n", " Args:\n", " query: SELECT c.Country, SUM(i.Total) as TotalSpent FROM Customer c JOIN Invoice i ON c.CustomerId = i.CustomerId GROUP BY c.Country ORDER BY TotalSpent DESC LIMIT 1;\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", @@ -863,7 +863,7 @@ }, { "cell_type": "code", - "execution_count": 23, + "execution_count": 22, "metadata": {}, "outputs": [ { @@ -875,8 +875,8 @@ "Describe the playlisttrack table\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_list_tables (call_7o2lQBlRAoqGtbF17AW3b4RV)\n", - " Call ID: call_7o2lQBlRAoqGtbF17AW3b4RV\n", + " sql_db_list_tables (call_fMF8eTmX5TJDJjc3Mhdg52TI)\n", + " Call ID: call_fMF8eTmX5TJDJjc3Mhdg52TI\n", " Args:\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", "Name: sql_db_list_tables\n", @@ -884,8 +884,8 @@ "Album, Artist, Customer, Employee, Genre, Invoice, InvoiceLine, MediaType, Playlist, PlaylistTrack, Track\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "Tool Calls:\n", - " sql_db_schema (call_xZx5tqzBAlPNiktWsuoafd4t)\n", - " Call ID: call_xZx5tqzBAlPNiktWsuoafd4t\n", + " sql_db_schema (call_W8Vkk4NEodkAAIg8nexAszUH)\n", + " Call ID: call_W8Vkk4NEodkAAIg8nexAszUH\n", " Args:\n", " table_names: PlaylistTrack\n", "=================================\u001b[1m Tool Message \u001b[0m=================================\n", @@ -909,12 +909,12 @@ "*/\n", "==================================\u001b[1m Ai Message \u001b[0m==================================\n", "\n", - "The `PlaylistTrack` table is a junction table that connects playlists and tracks. It has the following columns:\n", + "The `PlaylistTrack` table is designed to associate tracks with playlists. It has the following structure:\n", "\n", - "- `PlaylistId`: An integer that references the `PlaylistId` in the `Playlist` table. It is part of the composite primary key.\n", - "- `TrackId`: An integer that references the `TrackId` in the `Track` table. It is also part of the composite primary key.\n", + "- **PlaylistId**: An integer that serves as a foreign key referencing the `Playlist` table. It is part of the composite primary key.\n", + "- **TrackId**: An integer that serves as a foreign key referencing the `Track` table. It is also part of the composite primary key.\n", "\n", - "The primary key for this table is a combination of `PlaylistId` and `TrackId`, ensuring that each track can only appear once in a specific playlist. The table also enforces foreign key constraints to maintain referential integrity with the `Playlist` and `Track` tables.\n" + "The primary key for this table is a composite key consisting of both `PlaylistId` and `TrackId`, ensuring that each track can be uniquely associated with a playlist. The table enforces referential integrity by linking to the `Track` and `Playlist` tables through foreign keys.\n" ] } ], diff --git a/libs/community/langchain_community/agent_toolkits/sql/toolkit.py b/libs/community/langchain_community/agent_toolkits/sql/toolkit.py index 75566c96b9307..aa4df2663f2f4 100644 --- a/libs/community/langchain_community/agent_toolkits/sql/toolkit.py +++ b/libs/community/langchain_community/agent_toolkits/sql/toolkit.py @@ -13,7 +13,10 @@ InfoSQLDatabaseTool, ListSQLDatabaseTool, QuerySQLCheckerTool, - QuerySQLDataBaseTool, + QuerySQLDatabaseTool, +) +from langchain_community.tools.sql_database.tool import ( + QuerySQLDataBaseTool as QuerySQLDataBaseTool, # keep import for backwards compat. ) from langchain_community.utilities.sql_database import SQLDatabase @@ -110,7 +113,7 @@ def get_tools(self) -> List[BaseTool]: f"'xxxx' in 'field list', use {info_sql_database_tool.name} " "to query the correct table fields." ) - query_sql_database_tool = QuerySQLDataBaseTool( + query_sql_database_tool = QuerySQLDatabaseTool( db=self.db, description=query_sql_database_tool_description ) query_sql_checker_tool_description = ( diff --git a/libs/community/langchain_community/tools/__init__.py b/libs/community/langchain_community/tools/__init__.py index 5b4677f53dc2e..de486cfbb3f87 100644 --- a/libs/community/langchain_community/tools/__init__.py +++ b/libs/community/langchain_community/tools/__init__.py @@ -302,6 +302,7 @@ ListSQLDatabaseTool, QuerySQLCheckerTool, QuerySQLDataBaseTool, + QuerySQLDatabaseTool, ) from langchain_community.tools.stackexchange.tool import ( StackExchangeTool, @@ -453,7 +454,8 @@ "QueryCheckerTool", "QueryPowerBITool", "QuerySQLCheckerTool", - "QuerySQLDataBaseTool", + "QuerySQLDatabaseTool", + "QuerySQLDataBaseTool", # Legacy, kept for backwards compatibility. "QuerySparkSQLTool", "ReadFileTool", "RedditSearchRun", @@ -606,6 +608,8 @@ "QueryCheckerTool": "langchain_community.tools.spark_sql.tool", "QueryPowerBITool": "langchain_community.tools.powerbi.tool", "QuerySQLCheckerTool": "langchain_community.tools.sql_database.tool", + "QuerySQLDatabaseTool": "langchain_community.tools.sql_database.tool", + # Legacy, kept for backwards compatibility. "QuerySQLDataBaseTool": "langchain_community.tools.sql_database.tool", "QuerySparkSQLTool": "langchain_community.tools.spark_sql.tool", "ReadFileTool": "langchain_community.tools.file_management", diff --git a/libs/community/langchain_community/tools/sql_database/tool.py b/libs/community/langchain_community/tools/sql_database/tool.py index 42cee9e7ed8af..1c72b6e99132b 100644 --- a/libs/community/langchain_community/tools/sql_database/tool.py +++ b/libs/community/langchain_community/tools/sql_database/tool.py @@ -28,12 +28,18 @@ class BaseSQLDatabaseTool(BaseModel): ) -class _QuerySQLDataBaseToolInput(BaseModel): +class _QuerySQLDatabaseToolInput(BaseModel): query: str = Field(..., description="A detailed and correct SQL query.") -class QuerySQLDataBaseTool(BaseSQLDatabaseTool, BaseTool): # type: ignore[override, override] - """Tool for querying a SQL database.""" +class QuerySQLDatabaseTool(BaseSQLDatabaseTool, BaseTool): # type: ignore[override, override] + """Tool for querying a SQL database. + + .. versionchanged:: 0.3.12 + + Renamed from QuerySQLDataBaseTool to QuerySQLDatabaseTool. + Legacy name still works for backwards compatibility. + """ name: str = "sql_db_query" description: str = """ @@ -41,7 +47,7 @@ class QuerySQLDataBaseTool(BaseSQLDatabaseTool, BaseTool): # type: ignore[overr 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. """ - args_schema: Type[BaseModel] = _QuerySQLDataBaseToolInput + args_schema: Type[BaseModel] = _QuerySQLDatabaseToolInput def _run( self, @@ -52,6 +58,10 @@ def _run( return self.db.run_no_throw(query) +# Backwards compatibility. +QuerySQLDataBaseTool = QuerySQLDatabaseTool + + class _InfoSQLDatabaseToolInput(BaseModel): table_names: str = Field( ..., @@ -80,7 +90,7 @@ def _run( ) -class _ListSQLDataBaseToolInput(BaseModel): +class _ListSQLDatabaseToolInput(BaseModel): tool_input: str = Field("", description="An empty string") @@ -89,7 +99,7 @@ class ListSQLDatabaseTool(BaseSQLDatabaseTool, BaseTool): # type: ignore[overri name: str = "sql_db_list_tables" description: str = "Input is an empty string, output is a comma-separated list of tables in the database." - args_schema: Type[BaseModel] = _ListSQLDataBaseToolInput + args_schema: Type[BaseModel] = _ListSQLDatabaseToolInput def _run( self, diff --git a/libs/community/tests/unit_tests/tools/test_exported.py b/libs/community/tests/unit_tests/tools/test_exported.py index e5503369873ed..6e004f1bac6bb 100644 --- a/libs/community/tests/unit_tests/tools/test_exported.py +++ b/libs/community/tests/unit_tests/tools/test_exported.py @@ -41,4 +41,5 @@ def test_tool_names_unique() -> None: tool_classes = _get_tool_classes(skip_tools_without_default_names=True) names = sorted([tool_cls.model_fields["name"].default for tool_cls in tool_classes]) duplicated_names = [name for name in names if names.count(name) > 1] - assert not duplicated_names + # only one duplicate currently exists + assert duplicated_names == ["sql_db_query", "sql_db_query"] diff --git a/libs/community/tests/unit_tests/tools/test_imports.py b/libs/community/tests/unit_tests/tools/test_imports.py index 0af4f3ab7ce48..e93d224c27876 100644 --- a/libs/community/tests/unit_tests/tools/test_imports.py +++ b/libs/community/tests/unit_tests/tools/test_imports.py @@ -105,6 +105,7 @@ "QueryCheckerTool", "QueryPowerBITool", "QuerySQLCheckerTool", + "QuerySQLDatabaseTool", "QuerySQLDataBaseTool", "QuerySparkSQLTool", "ReadFileTool",