From 59c427ba0ec14b9b6d8fcc40681bf0bdac0338b2 Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Wed, 22 Nov 2023 12:09:44 +0100 Subject: [PATCH 1/4] feat(Qdrant): Add Connect to client --- Qdrant/Qdrant_Connect_to_client.ipynb | 241 ++++++++++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 Qdrant/Qdrant_Connect_to_client.ipynb diff --git a/Qdrant/Qdrant_Connect_to_client.ipynb b/Qdrant/Qdrant_Connect_to_client.ipynb new file mode 100644 index 0000000000..4580e7c71f --- /dev/null +++ b/Qdrant/Qdrant_Connect_to_client.ipynb @@ -0,0 +1,241 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f27ab203-2993-4ff2-8934-800db3ce9ed5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"Naas\"" + ] + }, + { + "cell_type": "markdown", + "id": "6917dad4-d28c-4375-b28f-b1c44f0a9d8f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Qdrant - Connect to client" + ] + }, + { + "cell_type": "markdown", + "id": "e45809ab-2124-4175-a9e6-3bb96e70d45b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #qdrant #connect #client #api #credentials #authentication" + ] + }, + { + "cell_type": "markdown", + "id": "635b9f7f-56aa-41be-a200-9cc250459b1f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel/)" + ] + }, + { + "cell_type": "markdown", + "id": "18558e1b-f098-49ec-9de3-4ee9602df6f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-22 (Created: 2023-11-22)" + ] + }, + { + "cell_type": "markdown", + "id": "1a195260-4370-4e3c-8cf8-f9d01a42ab62", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook will show how to connect to a client using Qdrant API and authentication credentials. It is usefull for organizations to securely connect to their clients." + ] + }, + { + "cell_type": "markdown", + "id": "88a3b288-ea82-4c30-9971-c336164cf1f2", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n- [Qdrant Documentation](https://docs.qdrant.com/)\n- [Qdrant Authentication](https://docs.qdrant.com/authentication/)" + ] + }, + { + "cell_type": "markdown", + "id": "1a3ad3d5-a113-44db-b4e0-bfc885a6f2c9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "709b99a2-bcca-49b4-b4da-8dac55e926d5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "550d3dad-a09a-46f7-89cf-18998cc74208", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": "import qdrant", + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "315fb5b5-f33a-46a7-9d8e-0836c2fbe678", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Setup variables\n- **client_id**: Client ID provided by Qdrant\n- **client_secret**: Client Secret provided by Qdrant\n- **token**: Token provided by Qdrant" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "305be68f-6026-43fb-8335-3b2df51a2001", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": "client_id = \"123456789\"\nclient_secret = \"abcdefghijklmnopqrstuvwxyz\"\ntoken = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"", + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "28b9cf85-0c1f-428a-9008-cadc65ce21c1", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "37ffd794-a50f-4e6e-b5a7-45e8e2ac63ab", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Connect to client" + ] + }, + { + "cell_type": "markdown", + "id": "8f98ba51-ab92-4098-b840-7b8bedb3599d", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "This function will connect to the client using the provided credentials." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "01f2e58f-08ba-49ff-96aa-a25e30ca1c05", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": "qdrant.connect(client_id, client_secret, token)", + "outputs": [] + }, + { + "cell_type": "markdown", + "id": "3f4d742f-88e7-45b5-a291-c649014030cc", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "5065f5a5-9112-416d-a56d-5eab22db1e91", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e87aaf74-7f7f-4793-93f4-fe18666c5392", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": "print(\"Connected to client\")", + "outputs": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.6" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} \ No newline at end of file From 2012cc62e49c9b74efed24e2ef33af051469ea0c Mon Sep 17 00:00:00 2001 From: Florent Ravenel Date: Wed, 22 Nov 2023 12:48:39 +0100 Subject: [PATCH 2/4] feat: add Qdrant templates --- ...nt.ipynb => Qdrant_Connect_to_cloud.ipynb} | 73 +++-- Qdrant/Qdrant_Delete_collection.ipynb | 251 +++++++++++++++ Qdrant/Qdrant_Get_collection.ipynb | 285 ++++++++++++++++++ Qdrant/Qdrant_Get_collections.ipynb | 283 +++++++++++++++++ Qdrant/Qdrant_Setup_connection.ipynb | 281 +++++++++++++++++ 5 files changed, 1147 insertions(+), 26 deletions(-) rename Qdrant/{Qdrant_Connect_to_client.ipynb => Qdrant_Connect_to_cloud.ipynb} (74%) create mode 100644 Qdrant/Qdrant_Delete_collection.ipynb create mode 100644 Qdrant/Qdrant_Get_collection.ipynb create mode 100644 Qdrant/Qdrant_Get_collections.ipynb create mode 100644 Qdrant/Qdrant_Setup_connection.ipynb diff --git a/Qdrant/Qdrant_Connect_to_client.ipynb b/Qdrant/Qdrant_Connect_to_cloud.ipynb similarity index 74% rename from Qdrant/Qdrant_Connect_to_client.ipynb rename to Qdrant/Qdrant_Connect_to_cloud.ipynb index 4580e7c71f..4bc0f2d0a9 100644 --- a/Qdrant/Qdrant_Connect_to_client.ipynb +++ b/Qdrant/Qdrant_Connect_to_cloud.ipynb @@ -19,7 +19,7 @@ "tags": [] }, "source": [ - "# Qdrant - Connect to client" + "# Qdrant - Connect to cloud" ] }, { @@ -30,7 +30,7 @@ "tags": [] }, "source": [ - "**Tags:** #qdrant #connect #client #api #credentials #authentication" + "**Tags:** #qdrant #connect #cloud #api #credentials #authentication #snippet" ] }, { @@ -63,7 +63,7 @@ "tags": [] }, "source": [ - "**Description:** This notebook will show how to connect to a client using Qdrant API and authentication credentials. It is usefull for organizations to securely connect to their clients." + "**Description:** This notebook will show how to connect to Qdrant cloud." ] }, { @@ -74,7 +74,10 @@ "tags": [] }, "source": [ - "**References:**\n- [Qdrant Documentation](https://docs.qdrant.com/)\n- [Qdrant Authentication](https://docs.qdrant.com/authentication/)" + "**References:**\n", + "- [Qdrant Documentation](https://qdrant.tech/documentation/)\n", + "- [Qdrant API](https://qdrant.github.io/qdrant/redoc/index.html)\n", + "- [Get your Qdrant Cluster URL and API Key](https://cloud.qdrant.io/accounts)" ] }, { @@ -107,8 +110,15 @@ "papermill": {}, "tags": [] }, - "source": "import qdrant", - "outputs": [] + "outputs": [], + "source": [ + "import naas\n", + "try:\n", + " from qdrant_client import QdrantClient\n", + "except:\n", + " !pip install qdrant-client --user\n", + " from qdrant_client import QdrantClient" + ] }, { "cell_type": "markdown", @@ -118,7 +128,10 @@ "tags": [] }, "source": [ - "### Setup variables\n- **client_id**: Client ID provided by Qdrant\n- **client_secret**: Client Secret provided by Qdrant\n- **token**: Token provided by Qdrant" + "### Setup variables\n", + "[Get your Qdrant Cluster URL and API Key](https://cloud.qdrant.io/accounts)\n", + "- `url`: Qdrant cluster URL\n", + "- `api_key`: Qdrant API key" ] }, { @@ -129,8 +142,11 @@ "papermill": {}, "tags": [] }, - "source": "client_id = \"123456789\"\nclient_secret = \"abcdefghijklmnopqrstuvwxyz\"\ntoken = \"ABCDEFGHIJKLMNOPQRSTUVWXYZ\"", - "outputs": [] + "outputs": [], + "source": [ + "url = naas.secret.get(\"QDRANT_CLUSER_URL\")\n", + "api_key = naas.secret.get(\"QDRANT_API_KEY\")" + ] }, { "cell_type": "markdown", @@ -151,18 +167,7 @@ "tags": [] }, "source": [ - "### Connect to client" - ] - }, - { - "cell_type": "markdown", - "id": "8f98ba51-ab92-4098-b840-7b8bedb3599d", - "metadata": { - "papermill": {}, - "tags": [] - }, - "source": [ - "This function will connect to the client using the provided credentials." + "### Connect to Qdrant cloud" ] }, { @@ -173,8 +178,14 @@ "papermill": {}, "tags": [] }, - "source": "qdrant.connect(client_id, client_secret, token)", - "outputs": [] + "outputs": [], + "source": [ + "qdrant_client = QdrantClient(\n", + " url=url, \n", + " api_key=api_key,\n", + ")\n", + "qdrant_client" + ] }, { "cell_type": "markdown", @@ -206,8 +217,18 @@ "papermill": {}, "tags": [] }, - "source": "print(\"Connected to client\")", - "outputs": [] + "outputs": [], + "source": [ + "qdrant_client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56aad6a8-deec-4be3-882c-73e3e7b89ed2", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { @@ -238,4 +259,4 @@ }, "nbformat": 4, "nbformat_minor": 5 -} \ No newline at end of file +} diff --git a/Qdrant/Qdrant_Delete_collection.ipynb b/Qdrant/Qdrant_Delete_collection.ipynb new file mode 100644 index 0000000000..93c29175ac --- /dev/null +++ b/Qdrant/Qdrant_Delete_collection.ipynb @@ -0,0 +1,251 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f27ab203-2993-4ff2-8934-800db3ce9ed5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"Naas\"" + ] + }, + { + "cell_type": "markdown", + "id": "6917dad4-d28c-4375-b28f-b1c44f0a9d8f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Qdrant - Delete collection" + ] + }, + { + "cell_type": "markdown", + "id": "e45809ab-2124-4175-a9e6-3bb96e70d45b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #qdrant #delete #collection #api #snippet" + ] + }, + { + "cell_type": "markdown", + "id": "635b9f7f-56aa-41be-a200-9cc250459b1f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel/)" + ] + }, + { + "cell_type": "markdown", + "id": "18558e1b-f098-49ec-9de3-4ee9602df6f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-22 (Created: 2023-11-22)" + ] + }, + { + "cell_type": "markdown", + "id": "1a195260-4370-4e3c-8cf8-f9d01a42ab62", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook will show how to removes collection and all it's data using Qdrant cloud client." + ] + }, + { + "cell_type": "markdown", + "id": "88a3b288-ea82-4c30-9971-c336164cf1f2", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [GitHub - Qdrant client](https://github.com/qdrant/qdrant-client/blob/master/qdrant_client/qdrant_client.py#L1336)\n", + "- [Get your Qdrant Cluster URL and API Key](https://cloud.qdrant.io/accounts)" + ] + }, + { + "cell_type": "markdown", + "id": "1a3ad3d5-a113-44db-b4e0-bfc885a6f2c9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "709b99a2-bcca-49b4-b4da-8dac55e926d5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "550d3dad-a09a-46f7-89cf-18998cc74208", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas\n", + "try:\n", + " from qdrant_client import QdrantClient\n", + "except:\n", + " !pip install qdrant-client --user\n", + " from qdrant_client import QdrantClient" + ] + }, + { + "cell_type": "markdown", + "id": "315fb5b5-f33a-46a7-9d8e-0836c2fbe678", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Setup variables\n", + "[Get your Qdrant Cluster URL and API Key](https://cloud.qdrant.io/accounts)\n", + "- `url`: Qdrant cluster URL\n", + "- `api_key`: Qdrant API key\n", + "- `collection_name`: Name of the collection" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "305be68f-6026-43fb-8335-3b2df51a2001", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "url = naas.secret.get(\"QDRANT_CLUSER_URL\")\n", + "api_key = naas.secret.get(\"QDRANT_API_KEY\")\n", + "collection_name = \"workspace\"" + ] + }, + { + "cell_type": "markdown", + "id": "28b9cf85-0c1f-428a-9008-cadc65ce21c1", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "37ffd794-a50f-4e6e-b5a7-45e8e2ac63ab", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Connect to client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "01f2e58f-08ba-49ff-96aa-a25e30ca1c05", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "qdrant_client = QdrantClient(\n", + " url=url, \n", + " api_key=api_key,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "3f4d742f-88e7-45b5-a291-c649014030cc", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "d720895c-42d9-4879-833e-219644301308", + "metadata": {}, + "source": [ + "### Delete collection" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8575d81-a945-4ddf-b2ce-e1edccf661b4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "collection = qdrant_client.delete_collection(collection_name)\n", + "collection" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.6" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Qdrant/Qdrant_Get_collection.ipynb b/Qdrant/Qdrant_Get_collection.ipynb new file mode 100644 index 0000000000..051b408031 --- /dev/null +++ b/Qdrant/Qdrant_Get_collection.ipynb @@ -0,0 +1,285 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f27ab203-2993-4ff2-8934-800db3ce9ed5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"Naas\"" + ] + }, + { + "cell_type": "markdown", + "id": "6917dad4-d28c-4375-b28f-b1c44f0a9d8f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Qdrant - Get collection" + ] + }, + { + "cell_type": "markdown", + "id": "e45809ab-2124-4175-a9e6-3bb96e70d45b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #qdrant #get #collection #api #snippet" + ] + }, + { + "cell_type": "markdown", + "id": "635b9f7f-56aa-41be-a200-9cc250459b1f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel/)" + ] + }, + { + "cell_type": "markdown", + "id": "18558e1b-f098-49ec-9de3-4ee9602df6f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-22 (Created: 2023-11-22)" + ] + }, + { + "cell_type": "markdown", + "id": "1a195260-4370-4e3c-8cf8-f9d01a42ab62", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook will show how to get detailed information about specified existing collection using Qdrant cloud client." + ] + }, + { + "cell_type": "markdown", + "id": "88a3b288-ea82-4c30-9971-c336164cf1f2", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [GitHub - Qdrant client](https://github.com/qdrant/qdrant-client/blob/master/qdrant_client/qdrant_client.py#L1276)\n", + "- [Get your Qdrant Cluster URL and API Key](https://cloud.qdrant.io/accounts)" + ] + }, + { + "cell_type": "markdown", + "id": "1a3ad3d5-a113-44db-b4e0-bfc885a6f2c9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "709b99a2-bcca-49b4-b4da-8dac55e926d5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "550d3dad-a09a-46f7-89cf-18998cc74208", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas\n", + "try:\n", + " from qdrant_client import QdrantClient\n", + "except:\n", + " !pip install qdrant-client --user\n", + " from qdrant_client import QdrantClient" + ] + }, + { + "cell_type": "markdown", + "id": "315fb5b5-f33a-46a7-9d8e-0836c2fbe678", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Setup variables\n", + "[Get your Qdrant Cluster URL and API Key](https://cloud.qdrant.io/accounts)\n", + "- `url`: Qdrant cluster URL\n", + "- `api_key`: Qdrant API key\n", + "- `collection_name`: Name of the collection" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "305be68f-6026-43fb-8335-3b2df51a2001", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "url = naas.secret.get(\"QDRANT_CLUSER_URL\")\n", + "api_key = naas.secret.get(\"QDRANT_API_KEY\")\n", + "collection_name = \"workspace\"" + ] + }, + { + "cell_type": "markdown", + "id": "28b9cf85-0c1f-428a-9008-cadc65ce21c1", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "37ffd794-a50f-4e6e-b5a7-45e8e2ac63ab", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Connect to client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "01f2e58f-08ba-49ff-96aa-a25e30ca1c05", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "qdrant_client = QdrantClient(\n", + " url=url, \n", + " api_key=api_key,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d720895c-42d9-4879-833e-219644301308", + "metadata": {}, + "source": [ + "### Get collection" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8575d81-a945-4ddf-b2ce-e1edccf661b4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "collection = qdrant_client.get_collection(collection_name)\n", + "collection" + ] + }, + { + "cell_type": "markdown", + "id": "3f4d742f-88e7-45b5-a291-c649014030cc", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "5065f5a5-9112-416d-a56d-5eab22db1e91", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e87aaf74-7f7f-4793-93f4-fe18666c5392", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Print the collections\n", + "for c in collection:\n", + " print(c)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56aad6a8-deec-4be3-882c-73e3e7b89ed2", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.6" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Qdrant/Qdrant_Get_collections.ipynb b/Qdrant/Qdrant_Get_collections.ipynb new file mode 100644 index 0000000000..91e33818de --- /dev/null +++ b/Qdrant/Qdrant_Get_collections.ipynb @@ -0,0 +1,283 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "f27ab203-2993-4ff2-8934-800db3ce9ed5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "\"Naas\"" + ] + }, + { + "cell_type": "markdown", + "id": "6917dad4-d28c-4375-b28f-b1c44f0a9d8f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Qdrant - Get collections" + ] + }, + { + "cell_type": "markdown", + "id": "e45809ab-2124-4175-a9e6-3bb96e70d45b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #qdrant #get #collections #api #snippet" + ] + }, + { + "cell_type": "markdown", + "id": "635b9f7f-56aa-41be-a200-9cc250459b1f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel/)" + ] + }, + { + "cell_type": "markdown", + "id": "18558e1b-f098-49ec-9de3-4ee9602df6f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-22 (Created: 2023-11-22)" + ] + }, + { + "cell_type": "markdown", + "id": "1a195260-4370-4e3c-8cf8-f9d01a42ab62", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook will show how to get list name of all existing collections using Qdrant cloud client." + ] + }, + { + "cell_type": "markdown", + "id": "88a3b288-ea82-4c30-9971-c336164cf1f2", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [GitHub - Qdrant client](https://github.com/qdrant/qdrant-client/blob/master/qdrant_client/qdrant_client.py#L1266)\n", + "- [Get your Qdrant Cluster URL and API Key](https://cloud.qdrant.io/accounts)" + ] + }, + { + "cell_type": "markdown", + "id": "1a3ad3d5-a113-44db-b4e0-bfc885a6f2c9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "709b99a2-bcca-49b4-b4da-8dac55e926d5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "550d3dad-a09a-46f7-89cf-18998cc74208", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas\n", + "try:\n", + " from qdrant_client import QdrantClient\n", + "except:\n", + " !pip install qdrant-client --user\n", + " from qdrant_client import QdrantClient" + ] + }, + { + "cell_type": "markdown", + "id": "315fb5b5-f33a-46a7-9d8e-0836c2fbe678", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Setup variables\n", + "[Get your Qdrant Cluster URL and API Key](https://cloud.qdrant.io/accounts)\n", + "- `url`: Qdrant cluster URL\n", + "- `api_key`: Qdrant API key" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "305be68f-6026-43fb-8335-3b2df51a2001", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "url = naas.secret.get(\"QDRANT_CLUSER_URL\")\n", + "api_key = naas.secret.get(\"QDRANT_API_KEY\")" + ] + }, + { + "cell_type": "markdown", + "id": "28b9cf85-0c1f-428a-9008-cadc65ce21c1", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "37ffd794-a50f-4e6e-b5a7-45e8e2ac63ab", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Connect to client" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "01f2e58f-08ba-49ff-96aa-a25e30ca1c05", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "qdrant_client = QdrantClient(\n", + " url=url, \n", + " api_key=api_key,\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "d720895c-42d9-4879-833e-219644301308", + "metadata": {}, + "source": [ + "### Get collections" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "b8575d81-a945-4ddf-b2ce-e1edccf661b4", + "metadata": { + "tags": [] + }, + "outputs": [], + "source": [ + "collections = qdrant_client.get_collections()\n", + "collections" + ] + }, + { + "cell_type": "markdown", + "id": "3f4d742f-88e7-45b5-a291-c649014030cc", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "5065f5a5-9112-416d-a56d-5eab22db1e91", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e87aaf74-7f7f-4793-93f4-fe18666c5392", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "# Print the collections\n", + "for collection in collections.collections:\n", + " print(collection.name)" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "56aad6a8-deec-4be3-882c-73e3e7b89ed2", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.6" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/Qdrant/Qdrant_Setup_connection.ipynb b/Qdrant/Qdrant_Setup_connection.ipynb new file mode 100644 index 0000000000..18b41cea79 --- /dev/null +++ b/Qdrant/Qdrant_Setup_connection.ipynb @@ -0,0 +1,281 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "be5dd6e3-f6cd-4c02-a6aa-722079e94fdd", + "metadata": { + "execution": { + "iopub.execute_input": "2021-02-23T14:22:16.610471Z", + "iopub.status.busy": "2021-02-23T14:22:16.610129Z", + "iopub.status.idle": "2021-02-23T14:22:16.627784Z", + "shell.execute_reply": "2021-02-23T14:22:16.626866Z", + "shell.execute_reply.started": "2021-02-23T14:22:16.610384Z" + }, + "papermill": {}, + "tags": [] + }, + "source": [ + "\"OpenAI.png\"" + ] + }, + { + "cell_type": "markdown", + "id": "a5b2c509-2c29-49e8-af91-4f3f1e386da3", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "# Qdrant - Setup connection\n", + "

Give Feedback | Bug report" + ] + }, + { + "cell_type": "markdown", + "id": "d77fe283-4edd-42d3-a909-8e207d4b842f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Tags:** #qdrant #naas #secret #connection #setup" + ] + }, + { + "cell_type": "markdown", + "id": "b90f2d91-c886-4e36-8265-b09d06bb1c7f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Author:** [Florent Ravenel](https://www.linkedin.com/in/florent-ravenel)" + ] + }, + { + "cell_type": "markdown", + "id": "6bbf7807-dda4-4b8a-b016-fe258a0fa33f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Last update:** 2023-11-22 (Created: 2023-11-22)" + ] + }, + { + "cell_type": "markdown", + "id": "214749fe-7f0b-4755-b7ea-1d200c234cc6", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**Description:** This notebook help you setup your connection with Qdrant and add required credentials to Naas secret. You will be able to establish a seamless connection to Qdrant without the need to repeatedly redefine your credentials in variables by using `naas.secret.get()` in your notebook." + ] + }, + { + "cell_type": "markdown", + "id": "a1329bea-ad80-4981-874c-8776b11f89a8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "**References:**\n", + "- [Get your Qdrant Cluster URL and API Key](https://cloud.qdrant.io/accounts)\n", + "- [Naas Secret Documentation](https://site.naas.ai/docs/developers/jobs/secret)" + ] + }, + { + "cell_type": "markdown", + "id": "cff349c8-2816-4ae4-9229-027c068eeb51", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Input" + ] + }, + { + "cell_type": "markdown", + "id": "80266a9e-fe54-4f3e-aeb2-01483bbc53f9", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Import libraries" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "cc038b10-2679-42bc-909e-09a298339df4", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "import naas" + ] + }, + { + "cell_type": "markdown", + "id": "30127040-e487-4115-8317-5084823b3a6f", + "metadata": { + "papermill": {}, + "tags": [ + "variables" + ] + }, + "source": [ + "### Setup variables\n", + "**Mandatory**\n", + "- `url`: Qdrant cluster URL. This value will be stored under the secret 'QDRANT_CLUSER_URL'.\n", + "- `api_key`: Qdrant API key. This value will be stored under the secret 'QDRANT_API_KEY'.\n", + "\n", + "**Optional**\n", + "- `secrets`: Dict to add secrets to naas" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "8d86b8fb-2576-426d-a305-50043c24c23e", + "metadata": { + "papermill": {}, + "tags": [ + "parameters" + ] + }, + "outputs": [], + "source": [ + "# Mandatory\n", + "url = None\n", + "api_key = None\n", + "\n", + "# Optional\n", + "secrets = {\n", + " \"QDRANT_CLUSER_URL\": url,\n", + " \"QDRANT_API_KEY\": api_key,\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "1b0ae044-cac2-479f-b1fc-a3318696adf5", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Model" + ] + }, + { + "cell_type": "markdown", + "id": "3aadae7f-fbe5-4f97-a6a9-6efe9dd1a42f", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Add secret" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "e235794a-6907-4f0e-ab2b-5aa6668a8d3b", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "for secret in secrets:\n", + " new_value = secrets.get(secret)\n", + " if new_value:\n", + " naas.secret.add(secret, secrets.get(secret))" + ] + }, + { + "cell_type": "markdown", + "id": "7c97931b-4ce8-46f9-a70c-45393c5669ee", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "## Output" + ] + }, + { + "cell_type": "markdown", + "id": "760ec150-d79a-4208-adfe-d0336d443dc8", + "metadata": { + "papermill": {}, + "tags": [] + }, + "source": [ + "### Display result" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "4005faa2-a781-4805-9c08-74951e900d12", + "metadata": { + "papermill": {}, + "tags": [] + }, + "outputs": [], + "source": [ + "df = naas.secret.list()\n", + "df = df[df[\"name\"].isin(secrets.keys())]\n", + "df" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.6" + }, + "naas": { + "notebook_id": "3a9b0b5281032399d79196d4dc442bbaa86480c0f1a67a059f517daec95f977a", + "notebook_path": "OpenAI/OpenAI_Setup_connection.ipynb" + }, + "papermill": { + "default_parameters": {}, + "environment_variables": {}, + "parameters": {}, + "version": "2.4.0" + }, + "widgets": { + "application/vnd.jupyter.widget-state+json": { + "state": {}, + "version_major": 2, + "version_minor": 0 + } + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} From e0c1a6073cd804758094e22393a745bfeef9dce9 Mon Sep 17 00:00:00 2001 From: FlorentLvr <48032461+FlorentLvr@users.noreply.github.com> Date: Wed, 22 Nov 2023 12:49:58 +0100 Subject: [PATCH 3/4] feat: add Qdrant logo --- .github/assets/logos/Qdrant.jpeg | Bin 0 -> 12209 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/assets/logos/Qdrant.jpeg diff --git a/.github/assets/logos/Qdrant.jpeg b/.github/assets/logos/Qdrant.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..728d99e2342d89dc5d6714cf31c660d63116f61e GIT binary patch literal 12209 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 literal 0 HcmV?d00001 From 10b35a51f83dcc2bf70debeb4b03e53fb7f8be0b Mon Sep 17 00:00:00 2001 From: FlorentLvr <48032461+FlorentLvr@users.noreply.github.com> Date: Wed, 22 Nov 2023 12:50:57 +0100 Subject: [PATCH 4/4] feat: add worldometer logo --- .github/assets/logos/Worldometer.jpg | Bin 0 -> 5701 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 .github/assets/logos/Worldometer.jpg diff --git a/.github/assets/logos/Worldometer.jpg b/.github/assets/logos/Worldometer.jpg new file mode 100644 index 0000000000000000000000000000000000000000..4a431effc900ff7566df912e9f5602557f90103d GIT binary patch literal 5701 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 s7s%@$_>yc|#%Oj>