diff --git a/.github/header-checker-lint.yml b/.github/header-checker-lint.yml index 6fe78aa..1743b48 100644 --- a/.github/header-checker-lint.yml +++ b/.github/header-checker-lint.yml @@ -1,15 +1,21 @@ -{"allowedCopyrightHolders": ["Google LLC"], - "allowedLicenses": ["Apache-2.0", "MIT", "BSD-3"], - "ignoreFiles": ["**/requirements.txt", "**/requirements-test.txt", "**/__init__.py", "samples/**/constraints.txt", "samples/**/constraints-test.txt"], - "sourceFileExtensions": [ - "ts", - "js", - "java", - "sh", - "Dockerfile", - "yaml", - "py", - "html", - "txt" - ] -} \ No newline at end of file +allowedCopyrightHolders: + - "Google LLC" +allowedLicenses: + - "Apache-2.0" +sourceFileExtensions: + - "yaml" + - "yml" + - "sh" + - "proto" + - "Dockerfile" + - "py" + - "html" + - "text" +ignoreFiles: + - ".github/release-please.yml" + - ".github/release-trigger.yml" + - ".github/header-checker-lint.yml" + - ".github/sync-repo-settings.yaml" + - ".kokoro/**" + - "**/requirements.txt" + - "**/requirements-test.txt" diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 9b16c1c..2352d4b 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -15,12 +15,16 @@ name: Lint on: pull_request: - paths-ignore: + paths-ignore: # Changes to the paths list need to be reflected in lint_fallback.yml - "*.md" + - ".kokoro/**" + - ".github/**" pull_request_target: types: [labeled] paths-ignore: - "*.md" + - ".kokoro/**" + - ".github/**" jobs: lint: @@ -53,6 +57,10 @@ jobs: - name: Checkout Repository uses: actions/checkout@v3 + with: + ref: ${{ github.event.pull_request.head.sha }} + repository: ${{ github.event.pull_request.head.repo.full_name }} + token: ${{ secrets.GITHUB_TOKEN }} - name: Setup Python uses: actions/setup-python@0a5c61591373683505ea898e09a3ea4f39ef2b9c # v5.0.0 diff --git a/.github/workflows/lint_fallback.yml b/.github/workflows/lint_fallback.yml new file mode 100644 index 0000000..04841b9 --- /dev/null +++ b/.github/workflows/lint_fallback.yml @@ -0,0 +1,30 @@ +# Copyright 2024 Google LLC +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +name: Lint +on: + pull_request: + paths: # These paths are the inverse of lint.yml + - "*.md" + - ".kokoro/**" + - ".github/**" + +jobs: + lint: + runs-on: ubuntu-latest + permissions: + contents: none + + steps: + - run: echo "No tests required." diff --git a/.kokoro/requirements.txt b/.kokoro/requirements.txt index 908ab45..9c05aeb 100644 --- a/.kokoro/requirements.txt +++ b/.kokoro/requirements.txt @@ -97,39 +97,39 @@ colorlog==6.7.0 \ # via # gcp-docuploader # nox -cryptography==42.0.0 \ - --hash=sha256:0a68bfcf57a6887818307600c3c0ebc3f62fbb6ccad2240aa21887cda1f8df1b \ - --hash=sha256:146e971e92a6dd042214b537a726c9750496128453146ab0ee8971a0299dc9bd \ - --hash=sha256:14e4b909373bc5bf1095311fa0f7fcabf2d1a160ca13f1e9e467be1ac4cbdf94 \ - --hash=sha256:206aaf42e031b93f86ad60f9f5d9da1b09164f25488238ac1dc488334eb5e221 \ - --hash=sha256:3005166a39b70c8b94455fdbe78d87a444da31ff70de3331cdec2c568cf25b7e \ - --hash=sha256:324721d93b998cb7367f1e6897370644751e5580ff9b370c0a50dc60a2003513 \ - --hash=sha256:33588310b5c886dfb87dba5f013b8d27df7ffd31dc753775342a1e5ab139e59d \ - --hash=sha256:35cf6ed4c38f054478a9df14f03c1169bb14bd98f0b1705751079b25e1cb58bc \ - --hash=sha256:3ca482ea80626048975360c8e62be3ceb0f11803180b73163acd24bf014133a0 \ - --hash=sha256:56ce0c106d5c3fec1038c3cca3d55ac320a5be1b44bf15116732d0bc716979a2 \ - --hash=sha256:5a217bca51f3b91971400890905a9323ad805838ca3fa1e202a01844f485ee87 \ - --hash=sha256:678cfa0d1e72ef41d48993a7be75a76b0725d29b820ff3cfd606a5b2b33fda01 \ - --hash=sha256:69fd009a325cad6fbfd5b04c711a4da563c6c4854fc4c9544bff3088387c77c0 \ - --hash=sha256:6cf9b76d6e93c62114bd19485e5cb003115c134cf9ce91f8ac924c44f8c8c3f4 \ - --hash=sha256:74f18a4c8ca04134d2052a140322002fef535c99cdbc2a6afc18a8024d5c9d5b \ - --hash=sha256:85f759ed59ffd1d0baad296e72780aa62ff8a71f94dc1ab340386a1207d0ea81 \ - --hash=sha256:87086eae86a700307b544625e3ba11cc600c3c0ef8ab97b0fda0705d6db3d4e3 \ - --hash=sha256:8814722cffcfd1fbd91edd9f3451b88a8f26a5fd41b28c1c9193949d1c689dc4 \ - --hash=sha256:8fedec73d590fd30c4e3f0d0f4bc961aeca8390c72f3eaa1a0874d180e868ddf \ - --hash=sha256:9515ea7f596c8092fdc9902627e51b23a75daa2c7815ed5aa8cf4f07469212ec \ - --hash=sha256:988b738f56c665366b1e4bfd9045c3efae89ee366ca3839cd5af53eaa1401bce \ - --hash=sha256:a2a8d873667e4fd2f34aedab02ba500b824692c6542e017075a2efc38f60a4c0 \ - --hash=sha256:bd7cf7a8d9f34cc67220f1195884151426ce616fdc8285df9054bfa10135925f \ - --hash=sha256:bdce70e562c69bb089523e75ef1d9625b7417c6297a76ac27b1b8b1eb51b7d0f \ - --hash=sha256:be14b31eb3a293fc6e6aa2807c8a3224c71426f7c4e3639ccf1a2f3ffd6df8c3 \ - --hash=sha256:be41b0c7366e5549265adf2145135dca107718fa44b6e418dc7499cfff6b4689 \ - --hash=sha256:c310767268d88803b653fffe6d6f2f17bb9d49ffceb8d70aed50ad45ea49ab08 \ - --hash=sha256:c58115384bdcfe9c7f644c72f10f6f42bed7cf59f7b52fe1bf7ae0a622b3a139 \ - --hash=sha256:c640b0ef54138fde761ec99a6c7dc4ce05e80420262c20fa239e694ca371d434 \ - --hash=sha256:ca20550bb590db16223eb9ccc5852335b48b8f597e2f6f0878bbfd9e7314eb17 \ - --hash=sha256:d97aae66b7de41cdf5b12087b5509e4e9805ed6f562406dfcf60e8481a9a28f8 \ - --hash=sha256:e9326ca78111e4c645f7e49cbce4ed2f3f85e17b61a563328c85a5208cf34440 +cryptography==42.0.4 \ + --hash=sha256:01911714117642a3f1792c7f376db572aadadbafcd8d75bb527166009c9f1d1b \ + --hash=sha256:0e89f7b84f421c56e7ff69f11c441ebda73b8a8e6488d322ef71746224c20fce \ + --hash=sha256:12d341bd42cdb7d4937b0cabbdf2a94f949413ac4504904d0cdbdce4a22cbf88 \ + --hash=sha256:15a1fb843c48b4a604663fa30af60818cd28f895572386e5f9b8a665874c26e7 \ + --hash=sha256:1cdcdbd117681c88d717437ada72bdd5be9de117f96e3f4d50dab3f59fd9ab20 \ + --hash=sha256:1df6fcbf60560d2113b5ed90f072dc0b108d64750d4cbd46a21ec882c7aefce9 \ + --hash=sha256:3c6048f217533d89f2f8f4f0fe3044bf0b2090453b7b73d0b77db47b80af8dff \ + --hash=sha256:3e970a2119507d0b104f0a8e281521ad28fc26f2820687b3436b8c9a5fcf20d1 \ + --hash=sha256:44a64043f743485925d3bcac548d05df0f9bb445c5fcca6681889c7c3ab12764 \ + --hash=sha256:4e36685cb634af55e0677d435d425043967ac2f3790ec652b2b88ad03b85c27b \ + --hash=sha256:5f8907fcf57392cd917892ae83708761c6ff3c37a8e835d7246ff0ad251d9298 \ + --hash=sha256:69b22ab6506a3fe483d67d1ed878e1602bdd5912a134e6202c1ec672233241c1 \ + --hash=sha256:6bfadd884e7280df24d26f2186e4e07556a05d37393b0f220a840b083dc6a824 \ + --hash=sha256:6d0fbe73728c44ca3a241eff9aefe6496ab2656d6e7a4ea2459865f2e8613257 \ + --hash=sha256:6ffb03d419edcab93b4b19c22ee80c007fb2d708429cecebf1dd3258956a563a \ + --hash=sha256:810bcf151caefc03e51a3d61e53335cd5c7316c0a105cc695f0959f2c638b129 \ + --hash=sha256:831a4b37accef30cccd34fcb916a5d7b5be3cbbe27268a02832c3e450aea39cb \ + --hash=sha256:887623fe0d70f48ab3f5e4dbf234986b1329a64c066d719432d0698522749929 \ + --hash=sha256:a0298bdc6e98ca21382afe914c642620370ce0470a01e1bef6dd9b5354c36854 \ + --hash=sha256:a1327f280c824ff7885bdeef8578f74690e9079267c1c8bd7dc5cc5aa065ae52 \ + --hash=sha256:c1f25b252d2c87088abc8bbc4f1ecbf7c919e05508a7e8628e6875c40bc70923 \ + --hash=sha256:c3a5cbc620e1e17009f30dd34cb0d85c987afd21c41a74352d1719be33380885 \ + --hash=sha256:ce8613beaffc7c14f091497346ef117c1798c202b01153a8cc7b8e2ebaaf41c0 \ + --hash=sha256:d2a27aca5597c8a71abbe10209184e1a8e91c1fd470b5070a2ea60cafec35bcd \ + --hash=sha256:dad9c385ba8ee025bb0d856714f71d7840020fe176ae0229de618f14dae7a6e2 \ + --hash=sha256:db4b65b02f59035037fde0998974d84244a64c3265bdef32a827ab9b63d61b18 \ + --hash=sha256:e09469a2cec88fb7b078e16d4adec594414397e8879a4341c6ace96013463d5b \ + --hash=sha256:e53dc41cda40b248ebc40b83b31516487f7db95ab8ceac1f042626bc43a2f992 \ + --hash=sha256:f1e85a178384bf19e36779d91ff35c7617c885da487d689b05c1366f9933ad74 \ + --hash=sha256:f47be41843200f7faec0683ad751e5ef11b9a56a220d57f300376cd8aba81660 \ + --hash=sha256:fb0cef872d8193e487fc6bdb08559c3aa41b659a7d9be48b2e10747f47863925 \ + --hash=sha256:ffc73996c4fca3d2b6c1c8c12bfd3ad00def8621da24f547626bf06441400449 # via # gcp-releasetool # secretstorage @@ -273,7 +273,9 @@ jaraco-classes==3.3.0 \ jeepney==0.8.0 \ --hash=sha256:5efe48d255973902f6badc3ce55e2aa6c5c3b3bc642059ef3a91247bcfcc5806 \ --hash=sha256:c0a454ad016ca575060802ee4d590dd912e35c122fa04e70306de3d076cce755 - # via secretstorage + # via + # keyring + # secretstorage jinja2==3.1.3 \ --hash=sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa \ --hash=sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90 @@ -490,7 +492,9 @@ rsa==4.9 \ secretstorage==3.3.3 \ --hash=sha256:2403533ef369eca6d2ba81718576c5e0f564d5cca1b58f73a8b23e7d4eeebd77 \ --hash=sha256:f356e6628222568e3af06f2eba8df495efa13b3b63081dafd4f7d9a7b7bc9f99 - # via -r requirements.in + # via + # -r requirements.in + # keyring six==1.16.0 \ --hash=sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926 \ --hash=sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254 diff --git a/CHANGELOG.md b/CHANGELOG.md index 4fea1c6..2142d88 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,18 @@ # Changelog +## [0.1.1](https://github.com/googleapis/langchain-google-datastore-python/compare/v0.1.0...v0.1.1) (2024-03-06) + + +### Bug Fixes + +* Remove unused enum at document_converter ([#25](https://github.com/googleapis/langchain-google-datastore-python/issues/25)) ([a3b7b2f](https://github.com/googleapis/langchain-google-datastore-python/commit/a3b7b2f44a1a44586a50bcb035a21f314efa66e6)) +* Update user agent ([#27](https://github.com/googleapis/langchain-google-datastore-python/issues/27)) ([3eb7b8b](https://github.com/googleapis/langchain-google-datastore-python/commit/3eb7b8bea0c01dc183708cceddf42b0aee40253f)) + + +### Documentation + +* Fix docs ([#18](https://github.com/googleapis/langchain-google-datastore-python/issues/18)) ([a6cdaa0](https://github.com/googleapis/langchain-google-datastore-python/commit/a6cdaa0ac6f9b865e950ec637417eab6ff067933)) + ## 0.1.0 (2024-02-26) @@ -7,4 +20,3 @@ * Chat Message History. ([#8](https://github.com/googleapis/langchain-google-datastore-python/issues/8)) ([e8663dd](https://github.com/googleapis/langchain-google-datastore-python/commit/e8663dd803369c8032e8063338022e28e936eb98)) * Document Loader for Datastore. ([#7](https://github.com/googleapis/langchain-google-datastore-python/issues/7)) ([28a9c01](https://github.com/googleapis/langchain-google-datastore-python/commit/28a9c018aca5215fcf78632634f8bfb2ed9dd7ab)) - diff --git a/docs/chat_message_history.ipynb b/docs/chat_message_history.ipynb index 9cd77a1..a69f4bb 100644 --- a/docs/chat_message_history.ipynb +++ b/docs/chat_message_history.ipynb @@ -1,241 +1,241 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Cloud Firestore in Datastore Mode\n", - "\n", - "> [Cloud Firestore in Datastore Mode](https://cloud.google.com/datastore) is a NoSQL document database build for automatic scaling, high performance and ease of application development. Extend your database application to build AI-powered experiences leveraging Datastore's Langchain integrations.\n", - "\n", - "This notebook goes over how to use [Cloud Firestore in Datastore Mode](https://cloud.google.com/datastore) to save chat messages into `Firestore` in Datastore Mode.\n", - "\n", - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/googleapis/langchain-google-datastore-python/blob/main/docs/chat_message_history.ipynb)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Before You Begin\n", - "\n", - "To run this notebook, you will need to do the following:\n", - "* [Create a Google Cloud Project](https://developers.google.com/workspace/guides/create-project)\n", - "* [Create a Firestore in Datastore Mode database](https://cloud.google.com/datastore/docs/manage-databases)\n", - "\n", - "After confirmed access to database in the runtime environment of this notebook, filling the following values and run the cell before running example scripts." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 🦜🔗 Library Installation\n", - "\n", - "The integration lives in its own `langchain-google-datastore` package, so we need to install it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "%pip install -upgrade --quiet langchain-google-datastore" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Colab only**: Uncomment the following cell to restart the kernel or use the button to restart the kernel. For Vertex AI Workbench you can restart the terminal using the button on top." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# # Automatically restart kernel after installs so that your environment can access the new packages\n", - "# import IPython\n", - "\n", - "# app = IPython.Application.instance()\n", - "# app.kernel.do_shutdown(True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ☁ Set Your Google Cloud Project\n", - "Set your Google Cloud project so that you can leverage Google Cloud resources within this notebook.\n", - "\n", - "If you don't know your project ID, try the following:\n", - "\n", - "* Run `gcloud config list`.\n", - "* Run `gcloud projects list`.\n", - "* See the support page: [Locate the project ID](https://support.google.com/googleapi/answer/7014113)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# @markdown Please fill in the value below with your Google Cloud project ID and then run the cell.\n", - "\n", - "PROJECT_ID = \"my-project-id\" # @param {type:\"string\"}\n", - "\n", - "# Set the project id\n", - "!gcloud config set project {PROJECT_ID}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 🔐 Authentication\n", - "\n", - "Authenticate to Google Cloud as the IAM user logged into this notebook in order to access your Google Cloud Project.\n", - "\n", - "- If you are using Colab to run this notebook, use the cell below and continue.\n", - "- If you are using Vertex AI Workbench, check out the setup instructions [here](https://github.com/GoogleCloudPlatform/generative-ai/tree/main/setup-env)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from google.colab import auth\n", - "\n", - "auth.authenticate_user()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Basic Usage" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### DatastoreChatMessageHistory\n", - "\n", - "To initialize the `DatastoreChatMessageHistory` class you need to provide only 2 things:\n", - "\n", - "1. `session_id` - A unique identifier string that specifies an id for the session.\n", - "1. `kind` : The name of the Datastore kind to write into. This is an optional value and by default it will use `ChatHistory` as the kind." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_google_datastore import DatastoreChatMessageHistory\n", - "\n", - "chat_history = DatastoreChatMessageHistory(\n", - " session_id=\"user-session-id\", kind=\"HistoryMessages\"\n", - ")\n", - "\n", - "chat_history.add_user_message(\"Hi!\")\n", - "chat_history.add_ai_message(\"How can I help you?\")" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "chat_history.messages" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Cleanup\n", - "\n", - "When the history of a specific session is obsolete and can be deleted from the database and memory, it can be done the following way.\n", - "\n", - "**Note:** Once deleted, the data is no longer stored in Datastore and is gone forever." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "chat_history.clear()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Custom Client\n", - "\n", - "The client is created by default using the available environment variables. A [custom client](https://cloud.google.com/python/docs/reference/datastore/latest/client) can be passed to the constructor." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from google.auth import compute_engine\n", - "from google.cloud import datastore\n", - "\n", - "client = datastore.Client(\n", - " project=\"project-custom\",\n", - " database=\"non-default-database\",\n", - " credentials=compute_engine.Credentials(),\n", - ")\n", - "\n", - "history = DatastoreChatMessageHistory(\n", - " session_id=\"session-id\", kind=\"History\", client=client\n", - ")\n", - "\n", - "history.add_user_message(\"New message\")\n", - "\n", - "history.messages\n", - "\n", - "history.clear()" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Firestore in Datastore Mode\n", + "\n", + "> [Firestore in Datastore Mode](https://cloud.google.com/datastore) is a NoSQL document database build for automatic scaling, high performance and ease of application development. Extend your database application to build AI-powered experiences leveraging Datastore's Langchain integrations.\n", + "\n", + "This notebook goes over how to use [Firestore in Datastore Mode](https://cloud.google.com/datastore) to save chat messages into `Firestore` in Datastore Mode.\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/googleapis/langchain-google-datastore-python/blob/main/docs/chat_message_history.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Before You Begin\n", + "\n", + "To run this notebook, you will need to do the following:\n", + "* [Create a Google Cloud Project](https://developers.google.com/workspace/guides/create-project)\n", + "* [Create a Firestore in Datastore Mode database](https://cloud.google.com/datastore/docs/manage-databases)\n", + "\n", + "After confirmed access to database in the runtime environment of this notebook, filling the following values and run the cell before running example scripts." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 🦜🔗 Library Installation\n", + "\n", + "The integration lives in its own `langchain-google-datastore` package, so we need to install it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%pip install -upgrade --quiet langchain-google-datastore" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Colab only**: Uncomment the following cell to restart the kernel or use the button to restart the kernel. For Vertex AI Workbench you can restart the terminal using the button on top." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# # Automatically restart kernel after installs so that your environment can access the new packages\n", + "# import IPython\n", + "\n", + "# app = IPython.Application.instance()\n", + "# app.kernel.do_shutdown(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ☁ Set Your Google Cloud Project\n", + "Set your Google Cloud project so that you can leverage Google Cloud resources within this notebook.\n", + "\n", + "If you don't know your project ID, try the following:\n", + "\n", + "* Run `gcloud config list`.\n", + "* Run `gcloud projects list`.\n", + "* See the support page: [Locate the project ID](https://support.google.com/googleapi/answer/7014113)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# @markdown Please fill in the value below with your Google Cloud project ID and then run the cell.\n", + "\n", + "PROJECT_ID = \"my-project-id\" # @param {type:\"string\"}\n", + "\n", + "# Set the project id\n", + "!gcloud config set project {PROJECT_ID}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 🔐 Authentication\n", + "\n", + "Authenticate to Google Cloud as the IAM user logged into this notebook in order to access your Google Cloud Project.\n", + "\n", + "- If you are using Colab to run this notebook, use the cell below and continue.\n", + "- If you are using Vertex AI Workbench, check out the setup instructions [here](https://github.com/GoogleCloudPlatform/generative-ai/tree/main/setup-env)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from google.colab import auth\n", + "\n", + "auth.authenticate_user()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Basic Usage" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### DatastoreChatMessageHistory\n", + "\n", + "To initialize the `DatastoreChatMessageHistory` class you need to provide only 2 things:\n", + "\n", + "1. `session_id` - A unique identifier string that specifies an id for the session.\n", + "1. `kind` : The name of the Datastore kind to write into. This is an optional value and by default it will use `ChatHistory` as the kind." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_google_datastore import DatastoreChatMessageHistory\n", + "\n", + "chat_history = DatastoreChatMessageHistory(\n", + " session_id=\"user-session-id\", kind=\"HistoryMessages\"\n", + ")\n", + "\n", + "chat_history.add_user_message(\"Hi!\")\n", + "chat_history.add_ai_message(\"How can I help you?\")" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "chat_history.messages" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Cleanup\n", + "\n", + "When the history of a specific session is obsolete and can be deleted from the database and memory, it can be done the following way.\n", + "\n", + "**Note:** Once deleted, the data is no longer stored in Datastore and is gone forever." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "chat_history.clear()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Custom Client\n", + "\n", + "The client is created by default using the available environment variables. A [custom client](https://cloud.google.com/python/docs/reference/datastore/latest/client) can be passed to the constructor." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from google.auth import compute_engine\n", + "from google.cloud import datastore\n", + "\n", + "client = datastore.Client(\n", + " project=\"project-custom\",\n", + " database=\"non-default-database\",\n", + " credentials=compute_engine.Credentials(),\n", + ")\n", + "\n", + "history = DatastoreChatMessageHistory(\n", + " session_id=\"session-id\", kind=\"History\", client=client\n", + ")\n", + "\n", + "history.add_user_message(\"New message\")\n", + "\n", + "history.messages\n", + "\n", + "history.clear()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file diff --git a/docs/document_loader.ipynb b/docs/document_loader.ipynb index 646b23b..36a4de9 100644 --- a/docs/document_loader.ipynb +++ b/docs/document_loader.ipynb @@ -1,329 +1,332 @@ { - "cells": [ - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "# Cloud Firestore in Datastore Mode\n", - "\n", - "> [Cloud Firestore in Datastore Mode](https://cloud.google.com/datastore) is a NoSQL document database built for automatic scaling, high performance and ease of application development. Extend your database application to build AI-powered experiences leveraging Datastore's Langchain integrations.\n", - "\n", - "This notebook goes over how to use [Cloud Firestore in Datastore Mode](https://cloud.google.com/datastore) to [save, load and delete langchain documents](https://python.langchain.com/docs/modules/data_connection/document_loaders/) with `DatastoreLoader` and `DatastoreSaver`.\n", - "\n", - "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/googleapis/langchain-google-datastore-python/blob/main/docs/document_loader.ipynb)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Before You Begin\n", - "\n", - "To run this notebook, you will need to do the following:\n", - "* [Create a Google Cloud Project](https://developers.google.com/workspace/guides/create-project)\n", - "* [Create a Firestore in Datastore Mode database](https://cloud.google.com/datastore/docs/manage-databases)\n", - "\n", - "After confirmed access to database in the runtime environment of this notebook, filling the following values and run the cell before running example scripts." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 🦜🔗 Library Installation\n", - "\n", - "The integration lives in its own `langchain-google-datastore` package, so we need to install it." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": { - "tags": [] - }, - "outputs": [], - "source": [ - "%pip install -upgrade --quiet langchain-google-datastore" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "**Colab only**: Uncomment the following cell to restart the kernel or use the button to restart the kernel. For Vertex AI Workbench you can restart the terminal using the button on top." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# # Automatically restart kernel after installs so that your environment can access the new packages\n", - "# import IPython\n", - "\n", - "# app = IPython.Application.instance()\n", - "# app.kernel.do_shutdown(True)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### ☁ Set Your Google Cloud Project\n", - "Set your Google Cloud project so that you can leverage Google Cloud resources within this notebook.\n", - "\n", - "If you don't know your project ID, try the following:\n", - "\n", - "* Run `gcloud config list`.\n", - "* Run `gcloud projects list`.\n", - "* See the support page: [Locate the project ID](https://support.google.com/googleapi/answer/7014113)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "# @markdown Please fill in the value below with your Google Cloud project ID and then run the cell.\n", - "\n", - "PROJECT_ID = \"my-project-id\" # @param {type:\"string\"}\n", - "\n", - "# Set the project id\n", - "!gcloud config set project {PROJECT_ID}" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### 🔐 Authentication\n", - "\n", - "Authenticate to Google Cloud as the IAM user logged into this notebook in order to access your Google Cloud Project.\n", - "\n", - "- If you are using Colab to run this notebook, use the cell below and continue.\n", - "- If you are using Vertex AI Workbench, check out the setup instructions [here](https://github.com/GoogleCloudPlatform/generative-ai/tree/main/setup-env)." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from google.colab import auth\n", - "\n", - "auth.authenticate_user()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Basic Usage" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Save documents\n", - "\n", - "Save langchain documents with `DatastoreSaver.upsert_documents()`. By default it will try to extract the entity key from the `key` in the Document metadata." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_google_datastore import DatastoreSaver\n", - "\n", - "saver = DatastoreSaver()\n", - "saver.upsert_documents(data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "#### Save documents without key\n", - "\n", - "If a `kind` is specified the documents will be stored with an auto generated id." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "saver = DatastoreSaver(\"MyKind\")\n", - "\n", - "saver.upsert_documents(data)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Load documents via Kind\n", - "\n", - "Load langchain documents with `DatastoreLoader.load()` or `DatastoreLoader.lazy_load()`. `lazy_load` returns a generator that only queries database during the iteration. To initialize `DatastoreLoader` class you need to provide:\n", - "1. `source` - The source to load the documents. It can be an instance of Query or the name of the Datastore kind to read from." - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "from langchain_google_datastore import DatastoreLoader\n", - "\n", - "loader = DatastoreLoader(\"MyKind\")\n", - "data = loader.load()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Load documents via query\n", - "\n", - "Other than loading documents from kind, we can also choose to load documents from query. For example:" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from google.cloud import datastore\n", - "\n", - "client = datastore.Client(database=\"non-default-db\", namespace=\"custom_namespace\")\n", - "query_load = client.query(kind=\"MyKind\")\n", - "query_load.add_filter(\"region\", \"=\", \"west_coast\")\n", - "\n", - "loader_document = DatastoreLoader(query_load)\n", - "\n", - "data = loader_document.load()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Delete documents\n", - "\n", - "Delete a list of langchain documents from Datastore with DatastoreSaver.delete_documents()`." - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "saver = DatastoreSaver()\n", - "\n", - "saver.delete_documents(data)\n", - "\n", - "keys_to_delete = [\n", - " [\"Kind1\", \"identifier\"],\n", - " [\"Kind2\", 123],\n", - " [\"Kind3\", \"identifier\", \"NestedKind\", 456],\n", - "]\n", - "# The Documents will be ignored and only the document ids will be used.\n", - "saver.delete_documents(data, keys_to_delete)" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "## Advanced Usage" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Load documents with customized document page content & metadata\n", - "\n", - "The arguments of `page_content_properties` and `metadata_properties` will specify the Entity properties to be written into LangChain Document `page_content` and `metadata`." - ] - }, - { - "cell_type": "code", - "execution_count": 8, - "metadata": {}, - "outputs": [], - "source": [ - "loader = DatastoreLoader(\n", - " source=\"MyKind\",\n", - " page_content_fields=[\"data_field\"],\n", - " metadata_fields=[\"metadata_field\"],\n", - ")\n", - "\n", - "data = loader.load()" - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Customize Page Content Format\n", - "\n", - "When the `page_content` contains only one field the information will be the field value only. Otherwise the `page_content` will be in JSON format." - ] - }, - { - "cell_type": "markdown", - "metadata": {}, - "source": [ - "### Customize Connection & Authentication" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [ - "from google.auth import compute_engine\n", - "from google.cloud.firestore import Client\n", - "\n", - "client = Client(database=\"non-default-db\", creds=compute_engine.Credentials())\n", - "loader = DatastoreLoader(\n", - " source=\"foo\",\n", - " client=client,\n", - ")" - ] - } - ], - "metadata": { - "kernelspec": { - "display_name": "Python 3 (ipykernel)", - "language": "python", - "name": "python3" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.10.6" - } - }, - "nbformat": 4, - "nbformat_minor": 4 -} + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Firestore in Datastore Mode\n", + "\n", + "> [Firestore in Datastore Mode](https://cloud.google.com/datastore) is a NoSQL document database built for automatic scaling, high performance and ease of application development. Extend your database application to build AI-powered experiences leveraging Datastore's Langchain integrations.\n", + "\n", + "This notebook goes over how to use [Firestore in Datastore Mode](https://cloud.google.com/datastore) to [save, load and delete langchain documents](https://python.langchain.com/docs/modules/data_connection/document_loaders/) with `DatastoreLoader` and `DatastoreSaver`.\n", + "\n", + "[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/googleapis/langchain-google-datastore-python/blob/main/docs/document_loader.ipynb)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Before You Begin\n", + "\n", + "To run this notebook, you will need to do the following:\n", + "* [Create a Google Cloud Project](https://developers.google.com/workspace/guides/create-project)\n", + "* [Create a Firestore in Datastore Mode database](https://cloud.google.com/datastore/docs/manage-databases)\n", + "\n", + "After confirmed access to database in the runtime environment of this notebook, filling the following values and run the cell before running example scripts." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 🦜🔗 Library Installation\n", + "\n", + "The integration lives in its own `langchain-google-datastore` package, so we need to install it." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "%pip install -upgrade --quiet langchain-google-datastore" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "**Colab only**: Uncomment the following cell to restart the kernel or use the button to restart the kernel. For Vertex AI Workbench you can restart the terminal using the button on top." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# # Automatically restart kernel after installs so that your environment can access the new packages\n", + "# import IPython\n", + "\n", + "# app = IPython.Application.instance()\n", + "# app.kernel.do_shutdown(True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### ☁ Set Your Google Cloud Project\n", + "Set your Google Cloud project so that you can leverage Google Cloud resources within this notebook.\n", + "\n", + "If you don't know your project ID, try the following:\n", + "\n", + "* Run `gcloud config list`.\n", + "* Run `gcloud projects list`.\n", + "* See the support page: [Locate the project ID](https://support.google.com/googleapi/answer/7014113)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "# @markdown Please fill in the value below with your Google Cloud project ID and then run the cell.\n", + "\n", + "PROJECT_ID = \"my-project-id\" # @param {type:\"string\"}\n", + "\n", + "# Set the project id\n", + "!gcloud config set project {PROJECT_ID}" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### 🔐 Authentication\n", + "\n", + "Authenticate to Google Cloud as the IAM user logged into this notebook in order to access your Google Cloud Project.\n", + "\n", + "- If you are using Colab to run this notebook, use the cell below and continue.\n", + "- If you are using Vertex AI Workbench, check out the setup instructions [here](https://github.com/GoogleCloudPlatform/generative-ai/tree/main/setup-env)." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from google.colab import auth\n", + "\n", + "auth.authenticate_user()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Basic Usage" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Save documents\n", + "\n", + "Save langchain documents with `DatastoreSaver.upsert_documents()`. By default it will try to extract the entity key from the `key` in the Document metadata." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_core.documents.base import Document\n", + "from langchain_google_datastore import DatastoreSaver\n", + "\n", + "saver = DatastoreSaver()\n", + "\n", + "data = [Document(page_content=\"Hello, World!\")]\n", + "saver.upsert_documents(data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "#### Save documents without key\n", + "\n", + "If a `kind` is specified the documents will be stored with an auto generated id." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "saver = DatastoreSaver(\"MyKind\")\n", + "\n", + "saver.upsert_documents(data)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load documents via Kind\n", + "\n", + "Load langchain documents with `DatastoreLoader.load()` or `DatastoreLoader.lazy_load()`. `lazy_load` returns a generator that only queries database during the iteration. To initialize `DatastoreLoader` class you need to provide:\n", + "1. `source` - The source to load the documents. It can be an instance of Query or the name of the Datastore kind to read from." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [], + "source": [ + "from langchain_google_datastore import DatastoreLoader\n", + "\n", + "loader = DatastoreLoader(\"MyKind\")\n", + "data = loader.load()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load documents via query\n", + "\n", + "Other than loading documents from kind, we can also choose to load documents from query. For example:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from google.cloud import datastore\n", + "\n", + "client = datastore.Client(database=\"non-default-db\", namespace=\"custom_namespace\")\n", + "query_load = client.query(kind=\"MyKind\")\n", + "query_load.add_filter(\"region\", \"=\", \"west_coast\")\n", + "\n", + "loader_document = DatastoreLoader(query_load)\n", + "\n", + "data = loader_document.load()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Delete documents\n", + "\n", + "Delete a list of langchain documents from Datastore with DatastoreSaver.delete_documents()`." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "saver = DatastoreSaver()\n", + "\n", + "saver.delete_documents(data)\n", + "\n", + "keys_to_delete = [\n", + " [\"Kind1\", \"identifier\"],\n", + " [\"Kind2\", 123],\n", + " [\"Kind3\", \"identifier\", \"NestedKind\", 456],\n", + "]\n", + "# The Documents will be ignored and only the document ids will be used.\n", + "saver.delete_documents(data, keys_to_delete)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Advanced Usage" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Load documents with customized document page content & metadata\n", + "\n", + "The arguments of `page_content_properties` and `metadata_properties` will specify the Entity properties to be written into LangChain Document `page_content` and `metadata`." + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [], + "source": [ + "loader = DatastoreLoader(\n", + " source=\"MyKind\",\n", + " page_content_fields=[\"data_field\"],\n", + " metadata_fields=[\"metadata_field\"],\n", + ")\n", + "\n", + "data = loader.load()" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Customize Page Content Format\n", + "\n", + "When the `page_content` contains only one field the information will be the field value only. Otherwise the `page_content` will be in JSON format." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Customize Connection & Authentication" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "from google.auth import compute_engine\n", + "from google.cloud.firestore import Client\n", + "\n", + "client = Client(database=\"non-default-db\", creds=compute_engine.Credentials())\n", + "loader = DatastoreLoader(\n", + " source=\"foo\",\n", + " client=client,\n", + ")" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} \ No newline at end of file diff --git a/src/langchain_google_datastore/chat_message_history.py b/src/langchain_google_datastore/chat_message_history.py index 220d077..12d2e5c 100644 --- a/src/langchain_google_datastore/chat_message_history.py +++ b/src/langchain_google_datastore/chat_message_history.py @@ -23,7 +23,7 @@ from .version import __version__ -USER_AGENT = "langchain-google-datastore-python:chat_history" + __version__ +USER_AGENT = "langchain-google-datastore-python:chat_history/" + __version__ DEFAULT_KIND = "ChatHistory" if TYPE_CHECKING: diff --git a/src/langchain_google_datastore/document_converter.py b/src/langchain_google_datastore/document_converter.py index 3c8fc75..802cb5d 100644 --- a/src/langchain_google_datastore/document_converter.py +++ b/src/langchain_google_datastore/document_converter.py @@ -16,7 +16,6 @@ import itertools import json -from enum import StrEnum from typing import TYPE_CHECKING, Any, Dict, List import more_itertools diff --git a/src/langchain_google_datastore/document_loader.py b/src/langchain_google_datastore/document_loader.py index 222eae6..f385ea8 100644 --- a/src/langchain_google_datastore/document_loader.py +++ b/src/langchain_google_datastore/document_loader.py @@ -30,8 +30,8 @@ ) from .version import __version__ -USER_AGENT_LOADER = "langchain-google-datastore-python:document_loader" + __version__ -USER_AGENT_SAVER = "langchain-google-datastore-python:document_saver" + __version__ +USER_AGENT_LOADER = "langchain-google-datastore-python:document_loader/" + __version__ +USER_AGENT_SAVER = "langchain-google-datastore-python:document_saver/" + __version__ WRITE_BATCH_SIZE = 500 if TYPE_CHECKING: diff --git a/src/langchain_google_datastore/version.py b/src/langchain_google_datastore/version.py index c1c8212..4d1a8ee 100644 --- a/src/langchain_google_datastore/version.py +++ b/src/langchain_google_datastore/version.py @@ -12,4 +12,4 @@ # See the License for the specific language governing permissions and # limitations under the License. -__version__ = "0.1.0" +__version__ = "0.1.1"