From df63b1659b29353bf045fdb4e01efb51cac70d22 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 9 Jan 2025 13:51:11 -0800 Subject: [PATCH 01/15] chore(deps): bump jinja2 from 3.1.4 to 3.1.5 in /.kokoro (#248) Bumps [jinja2](https://github.com/pallets/jinja) from 3.1.4 to 3.1.5. - [Release notes](https://github.com/pallets/jinja/releases) - [Changelog](https://github.com/pallets/jinja/blob/main/CHANGES.rst) - [Commits](https://github.com/pallets/jinja/compare/3.1.4...3.1.5) --- updated-dependencies: - dependency-name: jinja2 dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- .kokoro/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 6602ee12..431b590b 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -276,9 +276,9 @@ jeepney==0.8.0 \ # via # keyring # secretstorage -jinja2==3.1.4 \ - --hash=sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369 \ - --hash=sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d +jinja2==3.1.5 \ + --hash=sha256:8fefff8dc3034e27bb80d67c671eb8a9bc424c0ef4c0826edbff304cceff43bb \ + --hash=sha256:aba0f4dc9ed8013c424088f68a5c226f7d6097ed89b246d7749c2ec4175c6adb # via gcp-releasetool keyring==24.3.1 \ --hash=sha256:c3327b6ffafc0e8befbdb597cacdb4928ffe5c1212f7645f186e6d9957a898db \ From 07a89dec2106373896581254a1363ed2575535a8 Mon Sep 17 00:00:00 2001 From: Vishwaraj Anand Date: Tue, 14 Jan 2025 02:58:44 +0530 Subject: [PATCH 02/15] chore: add drop index statements to avoid conflict (#249) --- tests/test_async_vectorstore_index.py | 3 +++ tests/test_vectorstore_index.py | 6 ++++++ 2 files changed, 9 insertions(+) diff --git a/tests/test_async_vectorstore_index.py b/tests/test_async_vectorstore_index.py index a3ff8c12..68bc4e72 100644 --- a/tests/test_async_vectorstore_index.py +++ b/tests/test_async_vectorstore_index.py @@ -109,6 +109,7 @@ async def test_aapply_vector_index(self, vs): index = HNSWIndex() await vs.aapply_vector_index(index) assert await vs.is_valid_index(DEFAULT_INDEX_NAME) + await vs.adrop_vector_index() async def test_areindex(self, vs): if not await vs.is_valid_index(DEFAULT_INDEX_NAME): @@ -117,6 +118,7 @@ async def test_areindex(self, vs): await vs.areindex() await vs.areindex(DEFAULT_INDEX_NAME) assert await vs.is_valid_index(DEFAULT_INDEX_NAME) + await vs.adrop_vector_index() async def test_dropindex(self, vs): await vs.adrop_vector_index() @@ -134,6 +136,7 @@ async def test_aapply_vector_index_ivfflat(self, vs): await vs.aapply_vector_index(index) assert await vs.is_valid_index("secondindex") await vs.adrop_vector_index("secondindex") + await vs.adrop_vector_index() async def test_is_valid_index(self, vs): is_valid = await vs.is_valid_index("invalid_index") diff --git a/tests/test_vectorstore_index.py b/tests/test_vectorstore_index.py index a6b5af92..cb797219 100644 --- a/tests/test_vectorstore_index.py +++ b/tests/test_vectorstore_index.py @@ -114,6 +114,7 @@ async def test_apply_vector_index(self, vs): index = HNSWIndex() vs.apply_vector_index(index) assert vs.is_valid_index(DEFAULT_INDEX_NAME) + vs.drop_vector_index() async def test_areindex(self, vs): if not vs.is_valid_index(DEFAULT_INDEX_NAME): @@ -122,6 +123,7 @@ async def test_areindex(self, vs): vs.reindex() vs.reindex(DEFAULT_INDEX_NAME) assert vs.is_valid_index(DEFAULT_INDEX_NAME) + vs.drop_vector_index(DEFAULT_INDEX_NAME) async def test_dropindex(self, vs): vs.drop_vector_index() @@ -139,6 +141,7 @@ async def test_apply_vector_index_ivfflat(self, vs): vs.apply_vector_index(index) assert vs.is_valid_index("secondindex") vs.drop_vector_index("secondindex") + vs.drop_vector_index() async def test_is_valid_index(self, vs): is_valid = vs.is_valid_index("invalid_index") @@ -192,6 +195,7 @@ async def test_aapply_vector_index(self, vs): index = HNSWIndex() await vs.aapply_vector_index(index) assert await vs.ais_valid_index(DEFAULT_INDEX_NAME) + await vs.adrop_vector_index() async def test_areindex(self, vs): if not await vs.ais_valid_index(DEFAULT_INDEX_NAME): @@ -200,6 +204,7 @@ async def test_areindex(self, vs): await vs.areindex() await vs.areindex(DEFAULT_INDEX_NAME) assert await vs.ais_valid_index(DEFAULT_INDEX_NAME) + await vs.adrop_vector_index(DEFAULT_INDEX_NAME) async def test_dropindex(self, vs): await vs.adrop_vector_index() @@ -217,6 +222,7 @@ async def test_aapply_vector_index_ivfflat(self, vs): await vs.aapply_vector_index(index) assert await vs.ais_valid_index("secondindex") await vs.adrop_vector_index("secondindex") + await vs.adrop_vector_index() async def test_is_valid_index(self, vs): is_valid = await vs.ais_valid_index("invalid_index") From 702154f3a40e9a9e49276bfd3943e9e830bb85b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Mon, 13 Jan 2025 13:31:55 -0800 Subject: [PATCH 03/15] chore(deps): bump virtualenv from 20.25.1 to 20.26.6 in /.kokoro (#250) Bumps [virtualenv](https://github.com/pypa/virtualenv) from 20.25.1 to 20.26.6. - [Release notes](https://github.com/pypa/virtualenv/releases) - [Changelog](https://github.com/pypa/virtualenv/blob/main/docs/changelog.rst) - [Commits](https://github.com/pypa/virtualenv/compare/20.25.1...20.26.6) --- updated-dependencies: - dependency-name: virtualenv dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> Co-authored-by: Averi Kitsch --- .kokoro/requirements.txt | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 431b590b..cd183f45 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -508,9 +508,9 @@ urllib3==2.2.2 \ # via # requests # twine -virtualenv==20.25.1 \ - --hash=sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a \ - --hash=sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197 +virtualenv==20.26.6 \ + --hash=sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48 \ + --hash=sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2 # via nox wheel==0.43.0 \ --hash=sha256:465ef92c69fa5c5da2d1cf8ac40559a8c940886afcef87dcf14b9470862f1d85 \ From a8cc5a20bb3bdcac1109b61ac0d86b341f2ae84d Mon Sep 17 00:00:00 2001 From: dishaprakash <57954147+dishaprakash@users.noreply.github.com> Date: Thu, 16 Jan 2025 21:37:38 +0000 Subject: [PATCH 04/15] fix: query and return only selected metadata columns (#253) --- .../async_vectorstore.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/src/langchain_google_cloud_sql_pg/async_vectorstore.py b/src/langchain_google_cloud_sql_pg/async_vectorstore.py index a3258c85..a0e96ee9 100644 --- a/src/langchain_google_cloud_sql_pg/async_vectorstore.py +++ b/src/langchain_google_cloud_sql_pg/async_vectorstore.py @@ -485,8 +485,18 @@ async def __query_collection( operator = self.distance_strategy.operator search_function = self.distance_strategy.search_function + columns = self.metadata_columns + [ + self.id_column, + self.content_column, + self.embedding_column, + ] + if self.metadata_json_column: + columns.append(self.metadata_json_column) + + column_names = ", ".join(f'"{col}"' for col in columns) + filter = f"WHERE {filter}" if filter else "" - stmt = f"SELECT *, {search_function}({self.embedding_column}, '{embedding}') as distance FROM \"{self.schema_name}\".\"{self.table_name}\" {filter} ORDER BY {self.embedding_column} {operator} '{embedding}' LIMIT {k};" + stmt = f"SELECT {column_names}, {search_function}({self.embedding_column}, '{embedding}') as distance FROM \"{self.schema_name}\".\"{self.table_name}\" {filter} ORDER BY {self.embedding_column} {operator} '{embedding}' LIMIT {k};" if self.index_query_options: async with self.pool.connect() as conn: await conn.execute( From 78c0ce012340b7af7488627b3898ca22d55c5f55 Mon Sep 17 00:00:00 2001 From: dishaprakash <57954147+dishaprakash@users.noreply.github.com> Date: Thu, 16 Jan 2025 21:43:30 +0000 Subject: [PATCH 05/15] chore(docs): Highlight the usage of query to filter data in Document Loader. (#252) * docs: Highlight the usage of query to filter data in Document Loader. * remove blank block * Minor change --------- Co-authored-by: Averi Kitsch --- docs/document_loader.ipynb | 132 ++++++++++++++++++++++++------------- docs/vector_store.ipynb | 31 +++++++++ 2 files changed, 118 insertions(+), 45 deletions(-) diff --git a/docs/document_loader.ipynb b/docs/document_loader.ipynb index 7be30a9b..a098657d 100644 --- a/docs/document_loader.ipynb +++ b/docs/document_loader.ipynb @@ -229,34 +229,6 @@ ")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Create a table (if not already exists)" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_google_cloud_sql_pg import Column\n", - "\n", - "await engine.ainit_document_table(\n", - " table_name=TABLE_NAME,\n", - " content_column=\"product_name\",\n", - " metadata_columns=[\n", - " Column(\"id\", \"SERIAL\", nullable=False),\n", - " Column(\"content\", \"VARCHAR\", nullable=False),\n", - " Column(\"description\", \"VARCHAR\", nullable=False),\n", - " ],\n", - " metadata_json_column=\"metadata\",\n", - " store_metadata=True,\n", - ")" - ] - }, { "cell_type": "markdown", "metadata": {}, @@ -286,21 +258,20 @@ ] }, { - "cell_type": "code", - "execution_count": null, - "metadata": { - "id": "z-AZyzAQ7bsf" - }, - "outputs": [], + "cell_type": "markdown", + "metadata": {}, "source": [ - "from langchain_google_cloud_sql_pg import PostgresLoader\n", - "\n", - "# Creating a basic PostgreSQL object\n", - "loader = await PostgresLoader.create(\n", - " engine,\n", - " table_name=TABLE_NAME,\n", - " # schema_name=SCHEMA_NAME,\n", - ")" + "When creating an `PostgresLoader` for fetching data from Cloud SQL PG, you have two main options to specify the data you want to load:\n", + "* using the table_name argument - When you specify the table_name argument, you're telling the loader to fetch all the data from the given table.\n", + "* using the query argument - When you specify the query argument, you can provide a custom SQL query to fetch the data. This allows you to have full control over the SQL query, including selecting specific columns, applying filters, sorting, joining tables, etc.\n", + "\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load Documents using the `table_name` argument" ] }, { @@ -309,7 +280,7 @@ "id": "PeOMpftjc9_e" }, "source": [ - "### Load Documents via default table\n", + "#### Load Documents via default table\n", "The loader returns a list of Documents from the table using the first column as page_content and all other columns as metadata. The default table will have the first column as\n", "page_content and the second column as metadata (JSON). Each row becomes a document. \n", "\n", @@ -343,7 +314,7 @@ "id": "kSkL9l1Hc9_e" }, "source": [ - "### Load documents via custom table/metadata or custom page content columns" + "#### Load documents via custom table/metadata or custom page content columns" ] }, { @@ -363,6 +334,42 @@ "print(docs)" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load Documents using a SQL query\n", + "The query parameter allows users to specify a custom SQL query which can include filters to load specific documents from a database." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "table_name = \"products\"\n", + "content_columns = [\"product_name\", \"description\"]\n", + "metadata_columns = [\"id\", \"content\"]\n", + "\n", + "loader = PostgresLoader.create(\n", + " engine=engine,\n", + " query=f\"SELECT * FROM {table_name};\",\n", + " content_columns=content_columns,\n", + " metadata_columns=metadata_columns,\n", + ")\n", + "\n", + "docs = await loader.aload()\n", + "print(docs)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Note**: If the `content_columns` and `metadata_columns` are not specified, the loader will automatically treat the first returned column as the document’s `page_content` and all subsequent columns as `metadata`." + ] + }, { "cell_type": "markdown", "metadata": { @@ -396,10 +403,45 @@ "cell_type": "markdown", "metadata": {}, "source": [ - "### Create PostgresSaver\n", + "## Create PostgresSaver\n", "The `PostgresSaver` allows for saving of pre-processed documents to the table using the first column as page_content and all other columns as metadata. This table can easily be loaded via a Document Loader or updated to be a VectorStore. The default table will have the first column as page_content and the second column as metadata (JSON)." ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create a table (if not already exists)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_google_cloud_sql_pg import Column\n", + "\n", + "await engine.ainit_document_table(\n", + " table_name=TABLE_NAME,\n", + " content_column=\"product_name\",\n", + " metadata_columns=[\n", + " Column(\"id\", \"SERIAL\", nullable=False),\n", + " Column(\"content\", \"VARCHAR\", nullable=False),\n", + " Column(\"description\", \"VARCHAR\", nullable=False),\n", + " ],\n", + " metadata_json_column=\"metadata\",\n", + " store_metadata=True,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Create PostgresSaver" + ] + }, { "cell_type": "code", "execution_count": null, diff --git a/docs/vector_store.ipynb b/docs/vector_store.ipynb index a253b3a6..4071dbdf 100644 --- a/docs/vector_store.ipynb +++ b/docs/vector_store.ipynb @@ -586,6 +586,37 @@ "\n", "print(docs)" ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Search for documents without Vector Store.\n", + "You may want to search documents based on Document metadata as a tool or as a part of an exploratory workflow. The Document Loader can be used to customize the search and load data in the form of Documents from your database. Learn how to ['Load Documents using a SQL query'](https://github.com/googleapis/langchain-google-cloud-sql-pg-python/blob/main/docs/document_loader.ipynb)\n" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_google_cloud_sql_pg import PostgresLoader\n", + "\n", + "table_name = \"products\"\n", + "content_columns = [\"product_name\", \"description\"]\n", + "metadata_columns = [\"id\", \"content\"]\n", + "\n", + "loader = PostgresLoader.create(\n", + " engine=engine,\n", + " query=f\"SELECT * FROM {table_name};\",\n", + " content_columns=content_columns,\n", + " metadata_columns=metadata_columns,\n", + ")\n", + "\n", + "docs = await loader.aload()\n", + "print(docs)" + ] } ], "metadata": { From a4f506777bfb811eaf1e7bf5cdb06c92871a71b4 Mon Sep 17 00:00:00 2001 From: dishaprakash <57954147+dishaprakash@users.noreply.github.com> Date: Mon, 27 Jan 2025 17:25:56 +0000 Subject: [PATCH 06/15] chore(docs): Reorder markdown in Document Loader Notebook (#257) --- docs/document_loader.ipynb | 38 +++++++++++++++++++------------------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/docs/document_loader.ipynb b/docs/document_loader.ipynb index a098657d..c0b59a09 100644 --- a/docs/document_loader.ipynb +++ b/docs/document_loader.ipynb @@ -229,25 +229,6 @@ ")" ] }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Optional Tip: 💡\n", - "You can also specify a schema name by passing `schema_name` wherever you pass `table_name`. Eg:\n", - "\n", - "```python\n", - "SCHEMA_NAME=\"my_schema\"\n", - "\n", - "await engine.ainit_document_table(\n", - " table_name=TABLE_NAME,\n", - " schema_name=SCHEMA_NAME # Default: \"public\"\n", - " \n", - " ...\n", - ")\n", - "```" - ] - }, { "cell_type": "markdown", "metadata": { @@ -435,6 +416,25 @@ ")" ] }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Optional Tip: 💡\n", + "You can also specify a schema name by passing `schema_name` wherever you pass `table_name`. Eg:\n", + "\n", + "```python\n", + "SCHEMA_NAME=\"my_schema\"\n", + "\n", + "await engine.ainit_document_table(\n", + " table_name=TABLE_NAME,\n", + " schema_name=SCHEMA_NAME # Default: \"public\"\n", + " \n", + " ...\n", + ")\n", + "```" + ] + }, { "cell_type": "markdown", "metadata": {}, From 9866b523a895faff075dd18d73558337252a40e3 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 30 Jan 2025 20:14:06 +0100 Subject: [PATCH 07/15] chore(deps): update dependency black to v25 (#260) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index ce86aa38..9461f1db 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -39,7 +39,7 @@ Changelog = "https://github.com/googleapis/langchain-google-cloud-sql-pg-python/ [project.optional-dependencies] test = [ - "black[jupyter]==24.8.0", + "black[jupyter]==25.1.0", "isort==5.13.2", "mypy==1.11.2", "pytest-asyncio==0.24.0", From 7ee7a5c0c61efd89ae085fafe6b2abe00b5ba754 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 30 Jan 2025 20:30:28 +0100 Subject: [PATCH 08/15] chore(deps): update dependency isort to v6 (#258) --- pyproject.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index 9461f1db..318e0441 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -40,7 +40,7 @@ Changelog = "https://github.com/googleapis/langchain-google-cloud-sql-pg-python/ [project.optional-dependencies] test = [ "black[jupyter]==25.1.0", - "isort==5.13.2", + "isort==6.0.0", "mypy==1.11.2", "pytest-asyncio==0.24.0", "pytest==8.3.3", From 4cc6cedddb119c1d85549f5ea934f6cc46c2876d Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 31 Jan 2025 01:38:59 +0530 Subject: [PATCH 09/15] chore(deps): bump virtualenv in /.kokoro/docker/docs (#261) --- .kokoro/docker/docs/requirements.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/.kokoro/docker/docs/requirements.txt b/.kokoro/docker/docs/requirements.txt index 177d79b4..4b170c0a 100644 --- a/.kokoro/docker/docs/requirements.txt +++ b/.kokoro/docker/docs/requirements.txt @@ -32,7 +32,7 @@ platformdirs==4.2.0 \ --hash=sha256:0614df2a2f37e1a662acbd8e2b25b92ccf8632929bc6d43467e17fe89c75e068 \ --hash=sha256:ef0cc731df711022c174543cb70a9b5bd22e5a9337c8624ef2c2ceb8ddad8768 # via virtualenv -virtualenv==20.25.1 \ - --hash=sha256:961c026ac520bac5f69acb8ea063e8a4f071bcc9457b9c1f28f6b085c511583a \ - --hash=sha256:e08e13ecdca7a0bd53798f356d5831434afa5b07b93f0abdf0797b7a06ffe197 - # via nox \ No newline at end of file +virtualenv==20.26.6 \ + --hash=sha256:280aede09a2a5c317e409a00102e7077c6432c5a38f0ef938e643805a7ad2c48 \ + --hash=sha256:7345cc5b25405607a624d8418154577459c3e0277f5466dd79c49d5e492995f2 + # via nox From 381c5e8cfe251df7b5c2cbe4686a1b3cf2e293bb Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Thu, 30 Jan 2025 21:45:40 +0100 Subject: [PATCH 10/15] chore(deps): update dependency langchain-google-vertexai to v2 (#212) --- samples/index_tuning_sample/requirements.txt | 4 ++-- samples/langchain_on_vertexai/requirements.txt | 8 ++++---- samples/requirements.txt | 8 ++++---- 3 files changed, 10 insertions(+), 10 deletions(-) diff --git a/samples/index_tuning_sample/requirements.txt b/samples/index_tuning_sample/requirements.txt index 0f055624..23fa9646 100644 --- a/samples/index_tuning_sample/requirements.txt +++ b/samples/index_tuning_sample/requirements.txt @@ -1,3 +1,3 @@ -langchain-community==0.2.19 +langchain-community==0.3.16 langchain-google-cloud-sql-pg==0.10.0 -langchain-google-vertexai==2.0.0 +langchain-google-vertexai==2.0.12 diff --git a/samples/langchain_on_vertexai/requirements.txt b/samples/langchain_on_vertexai/requirements.txt index 001d3bbe..ad908ae6 100644 --- a/samples/langchain_on_vertexai/requirements.txt +++ b/samples/langchain_on_vertexai/requirements.txt @@ -1,5 +1,5 @@ -google-cloud-aiplatform[reasoningengine,langchain]==1.69.0 -google-cloud-resource-manager==1.12.5 -langchain-community==0.2.19 +google-cloud-aiplatform[reasoningengine,langchain]==1.79.0 +google-cloud-resource-manager==1.14.0 +langchain-community==0.3.16 langchain-google-cloud-sql-pg==0.10.0 -langchain-google-vertexai==1.0.10 +langchain-google-vertexai==2.0.12 diff --git a/samples/requirements.txt b/samples/requirements.txt index 001d3bbe..ad908ae6 100644 --- a/samples/requirements.txt +++ b/samples/requirements.txt @@ -1,5 +1,5 @@ -google-cloud-aiplatform[reasoningengine,langchain]==1.69.0 -google-cloud-resource-manager==1.12.5 -langchain-community==0.2.19 +google-cloud-aiplatform[reasoningengine,langchain]==1.79.0 +google-cloud-resource-manager==1.14.0 +langchain-community==0.3.16 langchain-google-cloud-sql-pg==0.10.0 -langchain-google-vertexai==1.0.10 +langchain-google-vertexai==2.0.12 From 0f690921c95cfe1123f9a7bae6b88ce8748b4a34 Mon Sep 17 00:00:00 2001 From: Vishwaraj Anand Date: Fri, 7 Feb 2025 22:52:20 +0530 Subject: [PATCH 11/15] fix: add write messages to Chat History (#265) * fix: add write definition for messages property in Chat History * chore: add test for setting messages property in Chat History * chore: lint fix --- .../chat_message_history.py | 10 ++++++++-- tests/test_chatmessagehistory.py | 14 ++++++++++++++ 2 files changed, 22 insertions(+), 2 deletions(-) diff --git a/src/langchain_google_cloud_sql_pg/chat_message_history.py b/src/langchain_google_cloud_sql_pg/chat_message_history.py index 10f3540d..e4b6fb8d 100644 --- a/src/langchain_google_cloud_sql_pg/chat_message_history.py +++ b/src/langchain_google_cloud_sql_pg/chat_message_history.py @@ -106,11 +106,17 @@ def create_sync( history = engine._run_as_sync(coro) return cls(cls.__create_key, engine, history) - @property # type: ignore[override] + @property def messages(self) -> list[BaseMessage]: - """The abstraction required a property.""" + """Fetches all messages stored in AlloyDB.""" return self._engine._run_as_sync(self._history._aget_messages()) + @messages.setter + def messages(self, value: list[BaseMessage]) -> None: + """Clear the stored messages and appends a list of messages to the record in AlloyDB.""" + self.clear() + self.add_messages(value) + async def aadd_message(self, message: BaseMessage) -> None: """Append the message to the record in PostgreSQL""" await self._engine._run_as_async(self._history.aadd_message(message)) diff --git a/tests/test_chatmessagehistory.py b/tests/test_chatmessagehistory.py index 5ccedd39..206e9c3f 100644 --- a/tests/test_chatmessagehistory.py +++ b/tests/test_chatmessagehistory.py @@ -163,6 +163,20 @@ async def test_chat_message_history_sync_messages( assert len(history2.messages) == 0 +@pytest.mark.asyncio +async def test_chat_message_history_set_messages( + async_engine: PostgresEngine, +) -> None: + history = await PostgresChatMessageHistory.create( + engine=async_engine, session_id="test", table_name=table_name_async + ) + msg1 = HumanMessage(content="hi!") + msg2 = AIMessage(content="bye -_-") + # verify setting messages property adds to message history + history.messages = [msg1, msg2] + assert len(history.messages) == 2 + + @pytest.mark.asyncio async def test_chat_table_async(async_engine): with pytest.raises(ValueError): From ef632262781453601364610e39aeac643c94efa1 Mon Sep 17 00:00:00 2001 From: dishaprakash <57954147+dishaprakash@users.noreply.github.com> Date: Tue, 11 Feb 2025 08:05:50 +0000 Subject: [PATCH 12/15] fix: Enquote column names to not match reserved keywords. (#267) * chore: Enquote column names to not match reserved keywords. * Linter fix --- src/langchain_google_cloud_sql_pg/async_vectorstore.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/langchain_google_cloud_sql_pg/async_vectorstore.py b/src/langchain_google_cloud_sql_pg/async_vectorstore.py index a0e96ee9..9d08ae86 100644 --- a/src/langchain_google_cloud_sql_pg/async_vectorstore.py +++ b/src/langchain_google_cloud_sql_pg/async_vectorstore.py @@ -241,11 +241,11 @@ async def __aadd_embeddings( # Insert embeddings for id, content, embedding, metadata in zip(ids, texts, embeddings, metadatas): metadata_col_names = ( - ", " + ", ".join(self.metadata_columns) + ", " + ", ".join(f'"{col}"' for col in self.metadata_columns) if len(self.metadata_columns) > 0 else "" ) - insert_stmt = f'INSERT INTO "{self.schema_name}"."{self.table_name}"({self.id_column}, {self.content_column}, {self.embedding_column}{metadata_col_names}' + insert_stmt = f'INSERT INTO "{self.schema_name}"."{self.table_name}"("{self.id_column}", "{self.content_column}", "{self.embedding_column}"{metadata_col_names}' values = {"id": id, "content": content, "embedding": str(embedding)} values_stmt = "VALUES (:id, :content, :embedding" @@ -261,7 +261,9 @@ async def __aadd_embeddings( # Add JSON column and/or close statement insert_stmt += ( - f", {self.metadata_json_column})" if self.metadata_json_column else ")" + f""", "{self.metadata_json_column}")""" + if self.metadata_json_column + else ")" ) if self.metadata_json_column: values_stmt += ", :extra)" From 81ec76d49f668e97fd010c9060f739fae79756c0 Mon Sep 17 00:00:00 2001 From: Mend Renovate Date: Tue, 11 Feb 2025 17:38:58 +0100 Subject: [PATCH 13/15] chore(deps): update python-nonmajor (#231) * chore(deps): update python-nonmajor * fix tests --------- Co-authored-by: Averi Kitsch Co-authored-by: Vishwaraj Anand Co-authored-by: Vishwaraj Anand --- pyproject.toml | 4 ++-- requirements.txt | 8 ++++---- samples/index_tuning_sample/requirements.txt | 2 +- samples/langchain_on_vertexai/requirements.txt | 2 +- samples/requirements.txt | 2 +- tests/test_async_vectorstore_search.py | 4 +++- tests/test_vectorstore_search.py | 4 +++- 7 files changed, 15 insertions(+), 11 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 318e0441..5bce61ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -41,9 +41,9 @@ Changelog = "https://github.com/googleapis/langchain-google-cloud-sql-pg-python/ test = [ "black[jupyter]==25.1.0", "isort==6.0.0", - "mypy==1.11.2", + "mypy==1.13.0", "pytest-asyncio==0.24.0", - "pytest==8.3.3", + "pytest==8.3.4", "pytest-cov==6.0.0" ] diff --git a/requirements.txt b/requirements.txt index 2433a992..79e8db67 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ -cloud-sql-python-connector[asyncpg]==1.12.1 -langchain-core==0.3.8 +cloud-sql-python-connector[asyncpg]==1.14.0 +langchain-core==0.3.22 numpy==1.26.4 -pgvector==0.3.4 -SQLAlchemy[asyncio]==2.0.35 +pgvector==0.3.6 +SQLAlchemy[asyncio]==2.0.36 diff --git a/samples/index_tuning_sample/requirements.txt b/samples/index_tuning_sample/requirements.txt index 23fa9646..9351541e 100644 --- a/samples/index_tuning_sample/requirements.txt +++ b/samples/index_tuning_sample/requirements.txt @@ -1,3 +1,3 @@ langchain-community==0.3.16 -langchain-google-cloud-sql-pg==0.10.0 +langchain-google-cloud-sql-pg==0.11.1 langchain-google-vertexai==2.0.12 diff --git a/samples/langchain_on_vertexai/requirements.txt b/samples/langchain_on_vertexai/requirements.txt index ad908ae6..090f6c2e 100644 --- a/samples/langchain_on_vertexai/requirements.txt +++ b/samples/langchain_on_vertexai/requirements.txt @@ -1,5 +1,5 @@ google-cloud-aiplatform[reasoningengine,langchain]==1.79.0 google-cloud-resource-manager==1.14.0 langchain-community==0.3.16 -langchain-google-cloud-sql-pg==0.10.0 +langchain-google-cloud-sql-pg==0.11.1 langchain-google-vertexai==2.0.12 diff --git a/samples/requirements.txt b/samples/requirements.txt index ad908ae6..090f6c2e 100644 --- a/samples/requirements.txt +++ b/samples/requirements.txt @@ -1,5 +1,5 @@ google-cloud-aiplatform[reasoningengine,langchain]==1.79.0 google-cloud-resource-manager==1.14.0 langchain-community==0.3.16 -langchain-google-cloud-sql-pg==0.10.0 +langchain-google-cloud-sql-pg==0.11.1 langchain-google-vertexai==2.0.12 diff --git a/tests/test_async_vectorstore_search.py b/tests/test_async_vectorstore_search.py index d918415a..2d808dad 100644 --- a/tests/test_async_vectorstore_search.py +++ b/tests/test_async_vectorstore_search.py @@ -156,7 +156,9 @@ async def test_similarity_search_with_relevance_scores_threshold_cosine(self, vs results = await vs.asimilarity_search_with_relevance_scores( "foo", **score_threshold ) - assert len(results) == 4 + # Note: Since tests use FakeEmbeddings which are non-normalized vectors, results might have scores beyond the range [0,1]. + # For a normalized embedding service, a threshold of zero will yield all matched documents. + assert len(results) == 2 score_threshold = {"score_threshold": 0.02} results = await vs.asimilarity_search_with_relevance_scores( diff --git a/tests/test_vectorstore_search.py b/tests/test_vectorstore_search.py index f2c1cb17..3a0ca81a 100644 --- a/tests/test_vectorstore_search.py +++ b/tests/test_vectorstore_search.py @@ -170,7 +170,9 @@ async def test_similarity_search_with_relevance_scores_threshold_cosine(self, vs results = await vs.asimilarity_search_with_relevance_scores( "foo", **score_threshold ) - assert len(results) == 4 + # Note: Since tests use FakeEmbeddings which are non-normalized vectors, results might have scores beyond the range [0,1]. + # For a normalized embedding service, a threshold of zero will yield all matched documents. + assert len(results) == 2 score_threshold = {"score_threshold": 0.02} results = await vs.asimilarity_search_with_relevance_scores( From 3aae0c69eaeb9f2781436363a788a3765d294923 Mon Sep 17 00:00:00 2001 From: dishaprakash <57954147+dishaprakash@users.noreply.github.com> Date: Wed, 12 Feb 2025 06:12:31 +0000 Subject: [PATCH 14/15] chore: update gh workflow permissions (#268) --- .github/header-checker-lint.yml | 1 + .github/workflows/docs.yml | 40 +++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 .github/workflows/docs.yml diff --git a/.github/header-checker-lint.yml b/.github/header-checker-lint.yml index 448c4c2e..670299df 100644 --- a/.github/header-checker-lint.yml +++ b/.github/header-checker-lint.yml @@ -16,6 +16,7 @@ ignoreFiles: - ".github/release-trigger.yml" - ".github/header-checker-lint.yml" - ".github/sync-repo-settings.yaml" + - ".github/workflows/docs.yml" - ".kokoro/**" - "**/requirements.txt" - "**/requirements*.txt" diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 00000000..f4ec740f --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,40 @@ +on: + pull_request: + branches: + - main +name: docs +permissions: + contents: read # This applies to all jobs +jobs: + docs: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - name: Setup Python + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5 + with: + python-version: "3.10" + - name: Install nox + run: | + python -m pip install --upgrade setuptools pip wheel + python -m pip install nox + - name: Run docs + run: | + nox -s docs + docfx: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4 + - name: Setup Python + uses: actions/setup-python@42375524e23c412d93fb67b49958b491fce71c38 # v5 + with: + python-version: "3.10" + - name: Install nox + run: | + python -m pip install --upgrade setuptools pip wheel + python -m pip install nox + - name: Run docfx + run: | + nox -s docfx From 106aa3677efada95a392d60dd90a49239d45fa52 Mon Sep 17 00:00:00 2001 From: "release-please[bot]" <55107282+release-please[bot]@users.noreply.github.com> Date: Wed, 12 Feb 2025 10:57:52 -0800 Subject: [PATCH 15/15] chore(main): release 0.12.1 (#254) Co-authored-by: release-please[bot] <55107282+release-please[bot]@users.noreply.github.com> --- CHANGELOG.md | 9 +++++++++ src/langchain_google_cloud_sql_pg/version.py | 2 +- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 3ac84353..d62a32e6 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,14 @@ # Changelog +## [0.12.1](https://github.com/googleapis/langchain-google-cloud-sql-pg-python/compare/v0.12.0...v0.12.1) (2025-02-12) + + +### Bug Fixes + +* Add write messages to Chat History ([#265](https://github.com/googleapis/langchain-google-cloud-sql-pg-python/issues/265)) ([0f69092](https://github.com/googleapis/langchain-google-cloud-sql-pg-python/commit/0f690921c95cfe1123f9a7bae6b88ce8748b4a34)) +* Enquote column names to not match reserved keywords. ([#267](https://github.com/googleapis/langchain-google-cloud-sql-pg-python/issues/267)) ([ef63226](https://github.com/googleapis/langchain-google-cloud-sql-pg-python/commit/ef632262781453601364610e39aeac643c94efa1)) +* Query and return only selected metadata columns ([#253](https://github.com/googleapis/langchain-google-cloud-sql-pg-python/issues/253)) ([a8cc5a2](https://github.com/googleapis/langchain-google-cloud-sql-pg-python/commit/a8cc5a20bb3bdcac1109b61ac0d86b341f2ae84d)) + ## [0.12.0](https://github.com/googleapis/langchain-google-cloud-sql-pg-python/compare/v0.11.1...v0.12.0) (2025-01-06) diff --git a/src/langchain_google_cloud_sql_pg/version.py b/src/langchain_google_cloud_sql_pg/version.py index bc0bc4ca..c832cc68 100644 --- a/src/langchain_google_cloud_sql_pg/version.py +++ b/src/langchain_google_cloud_sql_pg/version.py @@ -13,4 +13,4 @@ # See the License for the specific language governing permissions and # limitations under the License. # -__version__ = "0.12.0" +__version__ = "0.12.1"