From e703970dc9279008325cf43d26cb5d0a5ade8996 Mon Sep 17 00:00:00 2001 From: tellet-q Date: Mon, 2 Dec 2024 10:12:45 +0100 Subject: [PATCH 1/7] feat: send client version in requests --- qdrant_client/async_qdrant_remote.py | 5 +++++ qdrant_client/qdrant_remote.py | 6 ++++++ 2 files changed, 11 insertions(+) diff --git a/qdrant_client/async_qdrant_remote.py b/qdrant_client/async_qdrant_remote.py index b67c3ccd..c43ef059 100644 --- a/qdrant_client/async_qdrant_remote.py +++ b/qdrant_client/async_qdrant_remote.py @@ -9,6 +9,7 @@ # # ****** WARNING: THIS FILE IS AUTOGENERATED ****** +import importlib.metadata import logging import math import warnings @@ -28,6 +29,7 @@ import httpx import numpy as np from grpc import Compression +from packaging import version from urllib3.util import Url, parse_url from qdrant_client import grpc as grpc from qdrant_client._pydantic_compat import construct @@ -116,6 +118,9 @@ def __init__( warnings.warn("Api key is used with an insecure connection.") self._rest_headers["api-key"] = api_key self._grpc_headers.append(("api-key", api_key)) + client_version = version.parse(importlib.metadata.version("qdrant-client")) + self._rest_headers["User-Agent"] = f"qdrant-client/{client_version}" + self._grpc_headers.append(("user-agent", f"qdrant-client/{client_version}")) grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None) if grpc_compression is not None and (not isinstance(grpc_compression, Compression)): raise TypeError( diff --git a/qdrant_client/qdrant_remote.py b/qdrant_client/qdrant_remote.py index e716ef7d..87b69515 100644 --- a/qdrant_client/qdrant_remote.py +++ b/qdrant_client/qdrant_remote.py @@ -1,4 +1,5 @@ import asyncio +import importlib.metadata import logging import math import warnings @@ -19,6 +20,7 @@ import httpx import numpy as np from grpc import Compression +from packaging import version from urllib3.util import Url, parse_url from qdrant_client import grpc as grpc @@ -133,6 +135,10 @@ def __init__( self._rest_headers["api-key"] = api_key self._grpc_headers.append(("api-key", api_key)) + client_version = version.parse(importlib.metadata.version("qdrant-client")) + self._rest_headers["User-Agent"] = f"qdrant-client/{client_version}" + self._grpc_headers.append(("user-agent", f"qdrant-client/{client_version}")) + # GRPC Channel-Level Compression grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None) if grpc_compression is not None and not isinstance(grpc_compression, Compression): From a50db90e51dcd9dc47fe28b324c15ae801fe73b8 Mon Sep 17 00:00:00 2001 From: tellet-q Date: Tue, 3 Dec 2024 11:19:43 +0100 Subject: [PATCH 2/7] Do not parse version string --- qdrant_client/async_qdrant_remote.py | 3 +-- qdrant_client/qdrant_remote.py | 3 +-- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/qdrant_client/async_qdrant_remote.py b/qdrant_client/async_qdrant_remote.py index c43ef059..4831649a 100644 --- a/qdrant_client/async_qdrant_remote.py +++ b/qdrant_client/async_qdrant_remote.py @@ -29,7 +29,6 @@ import httpx import numpy as np from grpc import Compression -from packaging import version from urllib3.util import Url, parse_url from qdrant_client import grpc as grpc from qdrant_client._pydantic_compat import construct @@ -118,7 +117,7 @@ def __init__( warnings.warn("Api key is used with an insecure connection.") self._rest_headers["api-key"] = api_key self._grpc_headers.append(("api-key", api_key)) - client_version = version.parse(importlib.metadata.version("qdrant-client")) + client_version = importlib.metadata.version("qdrant-client") self._rest_headers["User-Agent"] = f"qdrant-client/{client_version}" self._grpc_headers.append(("user-agent", f"qdrant-client/{client_version}")) grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None) diff --git a/qdrant_client/qdrant_remote.py b/qdrant_client/qdrant_remote.py index 87b69515..21c8f084 100644 --- a/qdrant_client/qdrant_remote.py +++ b/qdrant_client/qdrant_remote.py @@ -20,7 +20,6 @@ import httpx import numpy as np from grpc import Compression -from packaging import version from urllib3.util import Url, parse_url from qdrant_client import grpc as grpc @@ -135,7 +134,7 @@ def __init__( self._rest_headers["api-key"] = api_key self._grpc_headers.append(("api-key", api_key)) - client_version = version.parse(importlib.metadata.version("qdrant-client")) + client_version = importlib.metadata.version("qdrant-client") self._rest_headers["User-Agent"] = f"qdrant-client/{client_version}" self._grpc_headers.append(("user-agent", f"qdrant-client/{client_version}")) From a35518dbf2ccd4b13ddccc2a23ad89cbf8332c80 Mon Sep 17 00:00:00 2001 From: tellet-q Date: Wed, 4 Dec 2024 08:53:29 +0100 Subject: [PATCH 3/7] Add python version info into grpc header --- qdrant_client/async_qdrant_remote.py | 10 ++++++++-- qdrant_client/qdrant_remote.py | 10 ++++++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/qdrant_client/async_qdrant_remote.py b/qdrant_client/async_qdrant_remote.py index 4831649a..225d9295 100644 --- a/qdrant_client/async_qdrant_remote.py +++ b/qdrant_client/async_qdrant_remote.py @@ -12,6 +12,7 @@ import importlib.metadata import logging import math +import platform import warnings from multiprocessing import get_all_start_methods from typing import ( @@ -118,8 +119,13 @@ def __init__( self._rest_headers["api-key"] = api_key self._grpc_headers.append(("api-key", api_key)) client_version = importlib.metadata.version("qdrant-client") - self._rest_headers["User-Agent"] = f"qdrant-client/{client_version}" - self._grpc_headers.append(("user-agent", f"qdrant-client/{client_version}")) + user_agent = f"qdrant-client/{client_version}" + python_version = f"python{platform.python_version()}" + self._rest_headers["User-Agent"] = user_agent + if self._grpc_options is not None: + self._grpc_options["grpc.primary_user_agent"] = user_agent + else: + self._grpc_options = {"grpc.primary_user_agent": f"{user_agent} {python_version}"} grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None) if grpc_compression is not None and (not isinstance(grpc_compression, Compression)): raise TypeError( diff --git a/qdrant_client/qdrant_remote.py b/qdrant_client/qdrant_remote.py index 21c8f084..7de86527 100644 --- a/qdrant_client/qdrant_remote.py +++ b/qdrant_client/qdrant_remote.py @@ -2,6 +2,7 @@ import importlib.metadata import logging import math +import platform import warnings from multiprocessing import get_all_start_methods from typing import ( @@ -135,8 +136,13 @@ def __init__( self._grpc_headers.append(("api-key", api_key)) client_version = importlib.metadata.version("qdrant-client") - self._rest_headers["User-Agent"] = f"qdrant-client/{client_version}" - self._grpc_headers.append(("user-agent", f"qdrant-client/{client_version}")) + user_agent = f"qdrant-client/{client_version}" + python_version = f"python{platform.python_version()}" + self._rest_headers["User-Agent"] = user_agent + if self._grpc_options is not None: + self._grpc_options["grpc.primary_user_agent"] = user_agent + else: + self._grpc_options = {"grpc.primary_user_agent": f"{user_agent} {python_version}"} # GRPC Channel-Level Compression grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None) From c9f907cb3fcc3a8610f2518d546eb2e2bb88fe49 Mon Sep 17 00:00:00 2001 From: tellet-q Date: Wed, 4 Dec 2024 09:45:37 +0100 Subject: [PATCH 4/7] Provide python version and update test --- qdrant_client/async_qdrant_remote.py | 2 +- qdrant_client/qdrant_remote.py | 2 +- tests/test_qdrant_client.py | 15 +++++++++++++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/qdrant_client/async_qdrant_remote.py b/qdrant_client/async_qdrant_remote.py index 225d9295..8d6ff594 100644 --- a/qdrant_client/async_qdrant_remote.py +++ b/qdrant_client/async_qdrant_remote.py @@ -123,7 +123,7 @@ def __init__( python_version = f"python{platform.python_version()}" self._rest_headers["User-Agent"] = user_agent if self._grpc_options is not None: - self._grpc_options["grpc.primary_user_agent"] = user_agent + self._grpc_options["grpc.primary_user_agent"] = f"{user_agent} {python_version}" else: self._grpc_options = {"grpc.primary_user_agent": f"{user_agent} {python_version}"} grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None) diff --git a/qdrant_client/qdrant_remote.py b/qdrant_client/qdrant_remote.py index 7de86527..2e9fb810 100644 --- a/qdrant_client/qdrant_remote.py +++ b/qdrant_client/qdrant_remote.py @@ -140,7 +140,7 @@ def __init__( python_version = f"python{platform.python_version()}" self._rest_headers["User-Agent"] = user_agent if self._grpc_options is not None: - self._grpc_options["grpc.primary_user_agent"] = user_agent + self._grpc_options["grpc.primary_user_agent"] = f"{user_agent} {python_version}" else: self._grpc_options = {"grpc.primary_user_agent": f"{user_agent} {python_version}"} diff --git a/tests/test_qdrant_client.py b/tests/test_qdrant_client.py index 0afaa31f..06bc9bbb 100644 --- a/tests/test_qdrant_client.py +++ b/tests/test_qdrant_client.py @@ -1,5 +1,7 @@ import asyncio +import importlib.metadata import os +import platform import uuid from pprint import pprint from tempfile import mkdtemp @@ -1964,11 +1966,20 @@ def test_timeout_propagation(): def test_grpc_options(): + client_version = importlib.metadata.version("qdrant-client") + user_agent = f"qdrant-client/{client_version}" + python_version = f"python{platform.python_version()}" + client = QdrantClient(prefer_grpc=True) - assert client._client._grpc_options is None + assert client._client._grpc_options == { + "grpc.primary_user_agent": f"{user_agent} {python_version}" + } client = QdrantClient(prefer_grpc=True, grpc_options={"grpc.max_send_message_length": 3}) - assert client._client._grpc_options == {"grpc.max_send_message_length": 3} + assert client._client._grpc_options == { + "grpc.max_send_message_length": 3, + "grpc.primary_user_agent": f"{user_agent} {python_version}", + } with pytest.raises(RpcError): if not client.collection_exists("grpc_collection"): From 2dc7d9caf117d9ea4ecb457050466c5a25415b36 Mon Sep 17 00:00:00 2001 From: tellet-q Date: Wed, 4 Dec 2024 11:42:53 +0100 Subject: [PATCH 5/7] Add python version info to rest headers --- qdrant_client/async_qdrant_remote.py | 4 ++-- qdrant_client/qdrant_remote.py | 4 ++-- tests/test_qdrant_client.py | 2 +- 3 files changed, 5 insertions(+), 5 deletions(-) diff --git a/qdrant_client/async_qdrant_remote.py b/qdrant_client/async_qdrant_remote.py index 8d6ff594..cf183c77 100644 --- a/qdrant_client/async_qdrant_remote.py +++ b/qdrant_client/async_qdrant_remote.py @@ -120,8 +120,8 @@ def __init__( self._grpc_headers.append(("api-key", api_key)) client_version = importlib.metadata.version("qdrant-client") user_agent = f"qdrant-client/{client_version}" - python_version = f"python{platform.python_version()}" - self._rest_headers["User-Agent"] = user_agent + python_version = f"python/{platform.python_version()}" + self._rest_headers["User-Agent"] = f"{user_agent} {python_version}" if self._grpc_options is not None: self._grpc_options["grpc.primary_user_agent"] = f"{user_agent} {python_version}" else: diff --git a/qdrant_client/qdrant_remote.py b/qdrant_client/qdrant_remote.py index 2e9fb810..d858bf59 100644 --- a/qdrant_client/qdrant_remote.py +++ b/qdrant_client/qdrant_remote.py @@ -137,8 +137,8 @@ def __init__( client_version = importlib.metadata.version("qdrant-client") user_agent = f"qdrant-client/{client_version}" - python_version = f"python{platform.python_version()}" - self._rest_headers["User-Agent"] = user_agent + python_version = f"python/{platform.python_version()}" + self._rest_headers["User-Agent"] = f"{user_agent} {python_version}" if self._grpc_options is not None: self._grpc_options["grpc.primary_user_agent"] = f"{user_agent} {python_version}" else: diff --git a/tests/test_qdrant_client.py b/tests/test_qdrant_client.py index 06bc9bbb..4cc6292d 100644 --- a/tests/test_qdrant_client.py +++ b/tests/test_qdrant_client.py @@ -1968,7 +1968,7 @@ def test_timeout_propagation(): def test_grpc_options(): client_version = importlib.metadata.version("qdrant-client") user_agent = f"qdrant-client/{client_version}" - python_version = f"python{platform.python_version()}" + python_version = f"python/{platform.python_version()}" client = QdrantClient(prefer_grpc=True) assert client._client._grpc_options == { From e4d12e9160e07a5d4663229756a204ff39e942b5 Mon Sep 17 00:00:00 2001 From: tellet-q Date: Wed, 4 Dec 2024 12:12:15 +0100 Subject: [PATCH 6/7] Refactoring --- qdrant_client/async_qdrant_remote.py | 10 +++++----- qdrant_client/qdrant_remote.py | 10 +++++----- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/qdrant_client/async_qdrant_remote.py b/qdrant_client/async_qdrant_remote.py index cf183c77..f474a1c2 100644 --- a/qdrant_client/async_qdrant_remote.py +++ b/qdrant_client/async_qdrant_remote.py @@ -119,13 +119,13 @@ def __init__( self._rest_headers["api-key"] = api_key self._grpc_headers.append(("api-key", api_key)) client_version = importlib.metadata.version("qdrant-client") - user_agent = f"qdrant-client/{client_version}" - python_version = f"python/{platform.python_version()}" - self._rest_headers["User-Agent"] = f"{user_agent} {python_version}" + python_version = platform.python_version() + user_agent = f"qdrant-client/{client_version} python/{python_version}" + self._rest_headers["User-Agent"] = user_agent if self._grpc_options is not None: - self._grpc_options["grpc.primary_user_agent"] = f"{user_agent} {python_version}" + self._grpc_options["grpc.primary_user_agent"] = user_agent else: - self._grpc_options = {"grpc.primary_user_agent": f"{user_agent} {python_version}"} + self._grpc_options = {"grpc.primary_user_agent": user_agent} grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None) if grpc_compression is not None and (not isinstance(grpc_compression, Compression)): raise TypeError( diff --git a/qdrant_client/qdrant_remote.py b/qdrant_client/qdrant_remote.py index d858bf59..527c7775 100644 --- a/qdrant_client/qdrant_remote.py +++ b/qdrant_client/qdrant_remote.py @@ -136,13 +136,13 @@ def __init__( self._grpc_headers.append(("api-key", api_key)) client_version = importlib.metadata.version("qdrant-client") - user_agent = f"qdrant-client/{client_version}" - python_version = f"python/{platform.python_version()}" - self._rest_headers["User-Agent"] = f"{user_agent} {python_version}" + python_version = platform.python_version() + user_agent = f"qdrant-client/{client_version} python/{python_version}" + self._rest_headers["User-Agent"] = user_agent if self._grpc_options is not None: - self._grpc_options["grpc.primary_user_agent"] = f"{user_agent} {python_version}" + self._grpc_options["grpc.primary_user_agent"] = user_agent else: - self._grpc_options = {"grpc.primary_user_agent": f"{user_agent} {python_version}"} + self._grpc_options = {"grpc.primary_user_agent": user_agent} # GRPC Channel-Level Compression grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None) From 7b6a6a34640f0c4e720e7711f95ddbf6c8ffd70d Mon Sep 17 00:00:00 2001 From: tellet-q Date: Wed, 4 Dec 2024 13:57:49 +0100 Subject: [PATCH 7/7] Refactoring --- qdrant_client/async_qdrant_remote.py | 7 ++----- qdrant_client/qdrant_remote.py | 7 ++----- 2 files changed, 4 insertions(+), 10 deletions(-) diff --git a/qdrant_client/async_qdrant_remote.py b/qdrant_client/async_qdrant_remote.py index f474a1c2..c9fc7933 100644 --- a/qdrant_client/async_qdrant_remote.py +++ b/qdrant_client/async_qdrant_remote.py @@ -73,7 +73,7 @@ def __init__( super().__init__(**kwargs) self._prefer_grpc = prefer_grpc self._grpc_port = grpc_port - self._grpc_options = grpc_options + self._grpc_options = grpc_options or {} self._https = https if https is not None else api_key is not None self._scheme = "https" if self._https else "http" self._prefix = prefix or "" @@ -122,10 +122,7 @@ def __init__( python_version = platform.python_version() user_agent = f"qdrant-client/{client_version} python/{python_version}" self._rest_headers["User-Agent"] = user_agent - if self._grpc_options is not None: - self._grpc_options["grpc.primary_user_agent"] = user_agent - else: - self._grpc_options = {"grpc.primary_user_agent": user_agent} + self._grpc_options["grpc.primary_user_agent"] = user_agent grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None) if grpc_compression is not None and (not isinstance(grpc_compression, Compression)): raise TypeError( diff --git a/qdrant_client/qdrant_remote.py b/qdrant_client/qdrant_remote.py index 527c7775..b237a7c3 100644 --- a/qdrant_client/qdrant_remote.py +++ b/qdrant_client/qdrant_remote.py @@ -65,7 +65,7 @@ def __init__( super().__init__(**kwargs) self._prefer_grpc = prefer_grpc self._grpc_port = grpc_port - self._grpc_options = grpc_options + self._grpc_options = grpc_options or {} self._https = https if https is not None else api_key is not None self._scheme = "https" if self._https else "http" @@ -139,10 +139,7 @@ def __init__( python_version = platform.python_version() user_agent = f"qdrant-client/{client_version} python/{python_version}" self._rest_headers["User-Agent"] = user_agent - if self._grpc_options is not None: - self._grpc_options["grpc.primary_user_agent"] = user_agent - else: - self._grpc_options = {"grpc.primary_user_agent": user_agent} + self._grpc_options["grpc.primary_user_agent"] = user_agent # GRPC Channel-Level Compression grpc_compression: Optional[Compression] = kwargs.pop("grpc_compression", None)