mirror of
https://github.com/langchain-ai/langchain.git
synced 2026-10-05 09:25:14 +03:00
community[patch]: fix QuerySQLDatabaseTool name (#28659)
Co-authored-by: Chester Curme <chester.curme@gmail.com>
This commit is contained in:
1 parent
94c22c3f48
commit
fa06188834
7 files changed
+84
-65
No files matched your search
@@ -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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x105e02860>),\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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x105e02860>),\n",
|
||||
" ListSQLDatabaseTool(db=<langchain_community.utilities.sql_database.SQLDatabase object at 0x105e02860>),\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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x105e02860>, llm=ChatOpenAI(client=<openai.resources.chat.completions.Completions object at 0x1148a97b0>, async_client=<openai.resources.chat.completions.AsyncCompletions object at 0x1148aaec0>, 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=<openai.resources.chat.completions.Completions object at 0x1148a97b0>, async_client=<openai.resources.chat.completions.AsyncCompletions object at 0x1148aaec0>, 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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x103d5fa60>),\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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x103d5fa60>),\n",
|
||||
" ListSQLDatabaseTool(db=<langchain_community.utilities.sql_database.SQLDatabase object at 0x103d5fa60>),\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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x103d5fa60>, llm=ChatOpenAI(client=<openai.resources.chat.completions.Completions object at 0x10742d720>, async_client=<openai.resources.chat.completions.AsyncCompletions object at 0x10742f7f0>, root_client=<openai.OpenAI object at 0x103d5fac0>, root_async_client=<openai.AsyncOpenAI object at 0x10742d780>, 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=<openai.resources.chat.completions.Completions object at 0x10742d720>, async_client=<openai.resources.chat.completions.AsyncCompletions object at 0x10742f7f0>, root_client=<openai.OpenAI object at 0x103d5fac0>, root_async_client=<openai.AsyncOpenAI object at 0x10742d780>, 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,
|
||||
|
||||
@@ -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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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<IPython.core.display.Image object>"
|
||||
]
|
||||
@@ -490,7 +490,7 @@
|
||||
"outputs": [
|
||||
{
|
||||
"data": {
|
||||
"image/png": "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 truncated
|
||||
"image/png": "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 truncated
|
||||
"text/plain": [
|
||||
"<IPython.core.display.Image object>"
|
||||
]
|
||||
@@ -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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x114414d00>),\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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x114414d00>),\n",
|
||||
" ListSQLDatabaseTool(db=<langchain_community.utilities.sql_database.SQLDatabase object at 0x114414d00>),\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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x114414d00>, llm=ChatOpenAI(client=<openai.resources.chat.completions.Completions object at 0x120110d00>, async_client=<openai.resources.chat.completions.AsyncCompletions object at 0x120112e00>, root_client=<openai.OpenAI object at 0x107a58370>, root_async_client=<openai.AsyncOpenAI object at 0x120110d60>, 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=<openai.resources.chat.completions.Completions object at 0x120110d00>, async_client=<openai.resources.chat.completions.AsyncCompletions object at 0x120112e00>, root_client=<openai.OpenAI object at 0x107a58370>, root_async_client=<openai.AsyncOpenAI object at 0x120110d60>, 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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x10d5f9120>),\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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x10d5f9120>),\n",
|
||||
" ListSQLDatabaseTool(db=<langchain_community.utilities.sql_database.SQLDatabase object at 0x10d5f9120>),\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=<langchain_community.utilities.sql_database.SQLDatabase object at 0x10d5f9120>, llm=ChatOpenAI(client=<openai.resources.chat.completions.Completions object at 0x119315480>, async_client=<openai.resources.chat.completions.AsyncCompletions object at 0x119317550>, root_client=<openai.OpenAI object at 0x10d5f8df0>, root_async_client=<openai.AsyncOpenAI object at 0x1193154e0>, 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=<openai.resources.chat.completions.Completions object at 0x119315480>, async_client=<openai.resources.chat.completions.AsyncCompletions object at 0x119317550>, root_client=<openai.OpenAI object at 0x10d5f8df0>, root_async_client=<openai.AsyncOpenAI object at 0x1193154e0>, 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"
|
||||
]
|
||||
}
|
||||
],
|
||||
|
||||
@@ -13,7 +13,10 @@ from langchain_community.tools.sql_database.tool import (
|
||||
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 @@ class SQLDatabaseToolkit(BaseToolkit):
|
||||
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 = (
|
||||
|
||||
@@ -302,6 +302,7 @@ if TYPE_CHECKING:
|
||||
ListSQLDatabaseTool,
|
||||
QuerySQLCheckerTool,
|
||||
QuerySQLDataBaseTool,
|
||||
QuerySQLDatabaseTool,
|
||||
)
|
||||
from langchain_community.tools.stackexchange.tool import (
|
||||
StackExchangeTool,
|
||||
@@ -453,7 +454,8 @@ __all__ = [
|
||||
"QueryCheckerTool",
|
||||
"QueryPowerBITool",
|
||||
"QuerySQLCheckerTool",
|
||||
"QuerySQLDataBaseTool",
|
||||
"QuerySQLDatabaseTool",
|
||||
"QuerySQLDataBaseTool", # Legacy, kept for backwards compatibility.
|
||||
"QuerySparkSQLTool",
|
||||
"ReadFileTool",
|
||||
"RedditSearchRun",
|
||||
@@ -606,6 +608,8 @@ _module_lookup = {
|
||||
"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",
|
||||
|
||||
@@ -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 @@ class QuerySQLDataBaseTool(BaseSQLDatabaseTool, BaseTool): # type: ignore[overr
|
||||
return self.db.run_no_throw(query)
|
||||
|
||||
|
||||
# Backwards compatibility.
|
||||
QuerySQLDataBaseTool = QuerySQLDatabaseTool
|
||||
|
||||
|
||||
class _InfoSQLDatabaseToolInput(BaseModel):
|
||||
table_names: str = Field(
|
||||
...,
|
||||
@@ -80,7 +90,7 @@ class InfoSQLDatabaseTool(BaseSQLDatabaseTool, BaseTool): # type: ignore[overri
|
||||
)
|
||||
|
||||
|
||||
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,
|
||||
|
||||
@@ -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"]
|
||||
@@ -105,6 +105,7 @@ EXPECTED_ALL = [
|
||||
"QueryCheckerTool",
|
||||
"QueryPowerBITool",
|
||||
"QuerySQLCheckerTool",
|
||||
"QuerySQLDatabaseTool",
|
||||
"QuerySQLDataBaseTool",
|
||||
"QuerySparkSQLTool",
|
||||
"ReadFileTool",
|
||||
|
||||
Reference in new issue
Block a user